@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
@@ -0,0 +1,118 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { AISdkClient } from "../../lib/v3/llm/aisdk.js";
3
+ /**
4
+ * Creates a mock LanguageModelV2 that records doGenerate calls and returns
5
+ * a valid JSON response so generateObject / generateText succeed.
6
+ */
7
+ function createCapturingModel(modelId) {
8
+ const calls = [];
9
+ const model = {
10
+ provider: "mock",
11
+ modelId,
12
+ specificationVersion: "v2",
13
+ supportedUrls: {},
14
+ doGenerate: vi.fn(async (options) => {
15
+ calls.push(options);
16
+ return {
17
+ content: [{ type: "text", text: '{"value":"ok"}' }],
18
+ finishReason: "stop",
19
+ usage: {
20
+ inputTokens: 1,
21
+ outputTokens: 1,
22
+ totalTokens: 2,
23
+ reasoningTokens: 0,
24
+ cachedInputTokens: 0,
25
+ },
26
+ warnings: [],
27
+ };
28
+ }),
29
+ doStream: vi.fn(),
30
+ };
31
+ return { model, calls };
32
+ }
33
+ async function callWithSchema(client) {
34
+ const { z } = await import("zod");
35
+ await client.createChatCompletion({
36
+ options: {
37
+ messages: [{ role: "user", content: "test" }],
38
+ response_model: {
39
+ name: "Test",
40
+ schema: z.object({ value: z.string() }),
41
+ },
42
+ },
43
+ logger: () => { },
44
+ });
45
+ }
46
+ describe("AISdkClient reasoning effort resolution", () => {
47
+ it("defaults to 'none' for GPT-5.x sub-models", async () => {
48
+ const { model, calls } = createCapturingModel("gpt-5.1-nano");
49
+ const client = new AISdkClient({ model });
50
+ await callWithSchema(client);
51
+ expect(calls[0].providerOptions).toEqual({
52
+ openai: {
53
+ textVerbosity: "low",
54
+ reasoningEffort: "none",
55
+ },
56
+ });
57
+ });
58
+ it("does not set providerOptions for base gpt-5", async () => {
59
+ const { model, calls } = createCapturingModel("gpt-5");
60
+ const client = new AISdkClient({ model });
61
+ await callWithSchema(client);
62
+ expect(calls[0].providerOptions).toBeUndefined();
63
+ });
64
+ it("does not set providerOptions for codex models (gpt-5.x variant)", async () => {
65
+ const { model, calls } = createCapturingModel("codex-gpt-5.1");
66
+ const client = new AISdkClient({ model });
67
+ await callWithSchema(client);
68
+ expect(calls[0].providerOptions).toBeUndefined();
69
+ });
70
+ it("does not set providerOptions for non-GPT-5 models by default", async () => {
71
+ const { model, calls } = createCapturingModel("openai/gpt-4o");
72
+ const client = new AISdkClient({ model });
73
+ await callWithSchema(client);
74
+ expect(calls[0].providerOptions).toBeUndefined();
75
+ });
76
+ it("user override applies to GPT-5.x sub-models", async () => {
77
+ const { model, calls } = createCapturingModel("gpt-5.1-nano");
78
+ const client = new AISdkClient({
79
+ model,
80
+ clientOptions: { reasoningEffort: "medium" },
81
+ });
82
+ await callWithSchema(client);
83
+ expect(calls[0].providerOptions).toEqual({
84
+ openai: {
85
+ textVerbosity: "low",
86
+ reasoningEffort: "medium",
87
+ },
88
+ });
89
+ });
90
+ it("user override applies to non-GPT-5 models", async () => {
91
+ const { model, calls } = createCapturingModel("openai/o4-mini");
92
+ const client = new AISdkClient({
93
+ model,
94
+ clientOptions: { reasoningEffort: "high" },
95
+ });
96
+ await callWithSchema(client);
97
+ expect(calls[0].providerOptions).toEqual({
98
+ openai: {
99
+ reasoningEffort: "high",
100
+ },
101
+ });
102
+ });
103
+ it("user override applies to base gpt-5", async () => {
104
+ const { model, calls } = createCapturingModel("gpt-5");
105
+ const client = new AISdkClient({
106
+ model,
107
+ clientOptions: { reasoningEffort: "low" },
108
+ });
109
+ await callWithSchema(client);
110
+ expect(calls[0].providerOptions).toEqual({
111
+ openai: {
112
+ textVerbosity: "low",
113
+ reasoningEffort: "low",
114
+ },
115
+ });
116
+ });
117
+ });
118
+ //# sourceMappingURL=aisdk-reasoning-effort.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aisdk-reasoning-effort.test.js","sourceRoot":"","sources":["../../../../tests/unit/aisdk-reasoning-effort.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n} from \"@ai-sdk/provider\";\nimport { AISdkClient } from \"../../lib/v3/llm/aisdk.js\";\n\n/**\n * Creates a mock LanguageModelV2 that records doGenerate calls and returns\n * a valid JSON response so generateObject / generateText succeed.\n */\nfunction createCapturingModel(modelId: string) {\n const calls: LanguageModelV2CallOptions[] = [];\n\n const model: LanguageModelV2 = {\n provider: \"mock\",\n modelId,\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: vi.fn(async (options: LanguageModelV2CallOptions) => {\n calls.push(options);\n return {\n content: [{ type: \"text\" as const, text: '{\"value\":\"ok\"}' }],\n finishReason: \"stop\" as const,\n usage: {\n inputTokens: 1,\n outputTokens: 1,\n totalTokens: 2,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n },\n warnings: [],\n };\n }),\n doStream: vi.fn(),\n } as unknown as LanguageModelV2;\n\n return { model, calls };\n}\n\nasync function callWithSchema(client: AISdkClient) {\n const { z } = await import(\"zod\");\n await client.createChatCompletion({\n options: {\n messages: [{ role: \"user\", content: \"test\" }],\n response_model: {\n name: \"Test\",\n schema: z.object({ value: z.string() }),\n },\n },\n logger: () => {},\n });\n}\n\ndescribe(\"AISdkClient reasoning effort resolution\", () => {\n it(\"defaults to 'none' for GPT-5.x sub-models\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5.1-nano\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"none\",\n },\n });\n });\n\n it(\"does not set providerOptions for base gpt-5\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"does not set providerOptions for codex models (gpt-5.x variant)\", async () => {\n const { model, calls } = createCapturingModel(\"codex-gpt-5.1\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"does not set providerOptions for non-GPT-5 models by default\", async () => {\n const { model, calls } = createCapturingModel(\"openai/gpt-4o\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"user override applies to GPT-5.x sub-models\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5.1-nano\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"medium\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"medium\",\n },\n });\n });\n\n it(\"user override applies to non-GPT-5 models\", async () => {\n const { model, calls } = createCapturingModel(\"openai/o4-mini\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"high\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n reasoningEffort: \"high\",\n },\n });\n });\n\n it(\"user override applies to base gpt-5\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"low\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"low\",\n },\n });\n });\n});\n"]}
@@ -0,0 +1,84 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { StagehandAPIClient } from "../../lib/v3/api.js";
3
+ describe("StagehandAPIClient variable serialization", () => {
4
+ it("preserves rich variables when sending the act request", async () => {
5
+ const client = new StagehandAPIClient({
6
+ apiKey: "bb-test",
7
+ logger: vi.fn(),
8
+ });
9
+ const executeMock = vi.fn().mockResolvedValue({
10
+ success: true,
11
+ message: "ok",
12
+ actionDescription: "typed",
13
+ actions: [],
14
+ });
15
+ client.execute = executeMock;
16
+ await client.act({
17
+ input: "type %username% into the email field",
18
+ options: {
19
+ variables: {
20
+ username: {
21
+ value: "john@example.com",
22
+ description: "The login email",
23
+ },
24
+ password: "secret",
25
+ },
26
+ },
27
+ });
28
+ expect(executeMock).toHaveBeenCalledWith({
29
+ method: "act",
30
+ args: {
31
+ input: "type %username% into the email field",
32
+ options: {
33
+ variables: {
34
+ username: {
35
+ value: "john@example.com",
36
+ description: "The login email",
37
+ },
38
+ password: "secret",
39
+ },
40
+ },
41
+ frameId: undefined,
42
+ },
43
+ serverCache: undefined,
44
+ });
45
+ });
46
+ it("preserves rich variables when sending the observe request", async () => {
47
+ const client = new StagehandAPIClient({
48
+ apiKey: "bb-test",
49
+ logger: vi.fn(),
50
+ });
51
+ const executeMock = vi.fn().mockResolvedValue([]);
52
+ client.execute = executeMock;
53
+ await client.observe({
54
+ instruction: "find the field where %username% should be entered",
55
+ options: {
56
+ variables: {
57
+ username: {
58
+ value: "john@example.com",
59
+ description: "The login email",
60
+ },
61
+ password: "secret",
62
+ },
63
+ },
64
+ });
65
+ expect(executeMock).toHaveBeenCalledWith({
66
+ method: "observe",
67
+ args: {
68
+ instruction: "find the field where %username% should be entered",
69
+ options: {
70
+ variables: {
71
+ username: {
72
+ value: "john@example.com",
73
+ description: "The login email",
74
+ },
75
+ password: "secret",
76
+ },
77
+ },
78
+ frameId: undefined,
79
+ },
80
+ serverCache: undefined,
81
+ });
82
+ });
83
+ });
84
+ //# sourceMappingURL=api-client-observe-variables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client-observe-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/api-client-observe-variables.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,OAAO;YAC1B,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QAGD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,GAAG,CAAC;YACf,KAAK,EAAE,sCAAsC;YAC7C,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE;gBACJ,KAAK,EAAE,sCAAsC;gBAC7C,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAGhD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE;gBACJ,WAAW,EAAE,mDAAmD;gBAChE,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { StagehandAPIClient } from \"../../lib/v3/api.js\";\n\ndescribe(\"StagehandAPIClient variable serialization\", () => {\n it(\"preserves rich variables when sending the act request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue({\n success: true,\n message: \"ok\",\n actionDescription: \"typed\",\n actions: [],\n });\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.act({\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"act\",\n args: {\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n\n it(\"preserves rich variables when sending the observe request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue([]);\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.observe({\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"observe\",\n args: {\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Api } from "../../lib/v3/types/public/index.js";
3
+ describe("API variable schemas", () => {
4
+ it("accepts rich variables for act requests", () => {
5
+ const result = Api.ActRequestSchema.safeParse({
6
+ input: "type %username% into the email field",
7
+ options: {
8
+ variables: {
9
+ username: {
10
+ value: "john@example.com",
11
+ description: "The login email",
12
+ },
13
+ rememberMe: true,
14
+ },
15
+ },
16
+ });
17
+ expect(result.success).toBe(true);
18
+ });
19
+ it("accepts rich variables for observe requests", () => {
20
+ const result = Api.ObserveRequestSchema.safeParse({
21
+ instruction: "find the field where %username% should be entered",
22
+ options: {
23
+ variables: {
24
+ username: {
25
+ value: "john@example.com",
26
+ description: "The login email",
27
+ },
28
+ rememberMe: true,
29
+ },
30
+ },
31
+ });
32
+ expect(result.success).toBe(true);
33
+ });
34
+ });
35
+ //# sourceMappingURL=api-variables-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-variables-schema.test.js","sourceRoot":"","sources":["../../../../tests/unit/api-variables-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAEzD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAC5C,KAAK,EAAE,sCAAsC;YAC7C,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,UAAU,EAAE,IAAI;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC;YAChD,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,UAAU,EAAE,IAAI;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { Api } from \"../../lib/v3/types/public/index.js\";\n\ndescribe(\"API variable schemas\", () => {\n it(\"accepts rich variables for act requests\", () => {\n const result = Api.ActRequestSchema.safeParse({\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n rememberMe: true,\n },\n },\n });\n\n expect(result.success).toBe(true);\n });\n\n it(\"accepts rich variables for observe requests\", () => {\n const result = Api.ObserveRequestSchema.safeParse({\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n rememberMe: true,\n },\n },\n });\n\n expect(result.success).toBe(true);\n });\n});\n"]}
@@ -60,6 +60,7 @@ describe("browserbase accessors", () => {
60
60
  await v3.init();
61
61
  expect(v3.browserbaseSessionURL).toBe(MOCK_SESSION_URL);
62
62
  expect(v3.browserbaseDebugURL).toBe(MOCK_DEBUG_URL);
63
+ expect(v3.isCaptchaAutoSolveEnabled).toBe(true);
63
64
  }
64
65
  finally {
65
66
  await v3.close().catch(() => { });
@@ -76,6 +77,25 @@ describe("browserbase accessors", () => {
76
77
  expect(v3.browserbaseSessionURL).toBeUndefined();
77
78
  expect(v3.browserbaseDebugURL).toBeUndefined();
78
79
  });
80
+ it("disables captcha solving when solveCaptchas is explicitly false", async () => {
81
+ const v3 = new V3({
82
+ env: "BROWSERBASE",
83
+ disableAPI: true,
84
+ verbose: 0,
85
+ browserbaseSessionCreateParams: {
86
+ browserSettings: {
87
+ solveCaptchas: false,
88
+ },
89
+ },
90
+ });
91
+ try {
92
+ await v3.init();
93
+ expect(v3.isCaptchaAutoSolveEnabled).toBe(false);
94
+ }
95
+ finally {
96
+ await v3.close().catch(() => { });
97
+ }
98
+ });
79
99
  });
80
100
  describe("local accessors", () => {
81
101
  it("stay empty for LOCAL environments", async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"browserbase-session-accessors.test.js","sourceRoot":"","sources":["../../../../tests/unit/browserbase-session-accessors.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach, afterEach } from \"vitest\";\nimport { V3 } from \"../../lib/v3/v3.js\";\n\nconst MOCK_SESSION_ID = \"session-123\";\nconst MOCK_SESSION_URL = `https://www.browserbase.com/sessions/${MOCK_SESSION_ID}`;\nconst MOCK_DEBUG_URL = `https://debug.browserbase.com/${MOCK_SESSION_ID}`;\n\nvi.mock(\"../../lib/v3/understudy/context\", () => {\n class MockConnection {\n onTransportClosed = vi.fn();\n offTransportClosed = vi.fn();\n send = vi.fn(async () => {});\n }\n\n class MockV3Context {\n static async create(): Promise<MockV3Context> {\n return new MockV3Context();\n }\n\n conn = new MockConnection();\n\n pages(): never[] {\n return [];\n }\n\n async close(): Promise<void> {\n // noop\n }\n }\n\n return { V3Context: MockV3Context };\n});\n\nvi.mock(\"../../lib/v3/launch/browserbase\", () => ({\n createBrowserbaseSession: vi.fn(async () => ({\n ws: \"wss://mock-browserbase\",\n sessionId: MOCK_SESSION_ID,\n bb: {\n sessions: {\n debug: vi.fn(async () => ({ debuggerUrl: MOCK_DEBUG_URL })),\n },\n },\n })),\n}));\n\nvi.mock(\"../../lib/v3/launch/local\", () => ({\n launchLocalChrome: vi.fn(async () => ({\n ws: \"ws://local-cdp\",\n chrome: { kill: vi.fn(async () => {}) },\n })),\n}));\n\ndescribe(\"browserbase accessors\", () => {\n beforeEach(() => {\n process.env.BROWSERBASE_API_KEY = \"fake-key\";\n process.env.BROWSERBASE_PROJECT_ID = \"fake-project\";\n });\n\n afterEach(() => {\n delete process.env.BROWSERBASE_API_KEY;\n delete process.env.BROWSERBASE_PROJECT_ID;\n vi.clearAllMocks();\n });\n\n it(\"exposes Browserbase session and debug URLs after init\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n });\n\n try {\n await v3.init();\n\n expect(v3.browserbaseSessionURL).toBe(MOCK_SESSION_URL);\n expect(v3.browserbaseDebugURL).toBe(MOCK_DEBUG_URL);\n } finally {\n await v3.close().catch(() => {});\n }\n });\n\n it(\"clears stored URLs after close\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n });\n\n await v3.init();\n await v3.close();\n\n expect(v3.browserbaseSessionURL).toBeUndefined();\n expect(v3.browserbaseDebugURL).toBeUndefined();\n });\n});\n\ndescribe(\"local accessors\", () => {\n it(\"stay empty for LOCAL environments\", async () => {\n const v3 = new V3({\n env: \"LOCAL\",\n disableAPI: true,\n verbose: 0,\n localBrowserLaunchOptions: {\n cdpUrl: \"ws://local-existing-session\",\n },\n });\n\n try {\n await v3.init();\n expect(v3.browserbaseSessionURL).toBeUndefined();\n expect(v3.browserbaseDebugURL).toBeUndefined();\n } finally {\n await v3.close().catch(() => {});\n }\n });\n});\n"]}
1
+ {"version":3,"file":"browserbase-session-accessors.test.js","sourceRoot":"","sources":["../../../../tests/unit/browserbase-session-accessors.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach, afterEach } from \"vitest\";\nimport { V3 } from \"../../lib/v3/v3.js\";\n\nconst MOCK_SESSION_ID = \"session-123\";\nconst MOCK_SESSION_URL = `https://www.browserbase.com/sessions/${MOCK_SESSION_ID}`;\nconst MOCK_DEBUG_URL = `https://debug.browserbase.com/${MOCK_SESSION_ID}`;\n\nvi.mock(\"../../lib/v3/understudy/context\", () => {\n class MockConnection {\n onTransportClosed = vi.fn();\n offTransportClosed = vi.fn();\n send = vi.fn(async () => {});\n }\n\n class MockV3Context {\n static async create(): Promise<MockV3Context> {\n return new MockV3Context();\n }\n\n conn = new MockConnection();\n\n pages(): never[] {\n return [];\n }\n\n async close(): Promise<void> {\n // noop\n }\n }\n\n return { V3Context: MockV3Context };\n});\n\nvi.mock(\"../../lib/v3/launch/browserbase\", () => ({\n createBrowserbaseSession: vi.fn(async () => ({\n ws: \"wss://mock-browserbase\",\n sessionId: MOCK_SESSION_ID,\n bb: {\n sessions: {\n debug: vi.fn(async () => ({ debuggerUrl: MOCK_DEBUG_URL })),\n },\n },\n })),\n}));\n\nvi.mock(\"../../lib/v3/launch/local\", () => ({\n launchLocalChrome: vi.fn(async () => ({\n ws: \"ws://local-cdp\",\n chrome: { kill: vi.fn(async () => {}) },\n })),\n}));\n\ndescribe(\"browserbase accessors\", () => {\n beforeEach(() => {\n process.env.BROWSERBASE_API_KEY = \"fake-key\";\n process.env.BROWSERBASE_PROJECT_ID = \"fake-project\";\n });\n\n afterEach(() => {\n delete process.env.BROWSERBASE_API_KEY;\n delete process.env.BROWSERBASE_PROJECT_ID;\n vi.clearAllMocks();\n });\n\n it(\"exposes Browserbase session and debug URLs after init\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n });\n\n try {\n await v3.init();\n\n expect(v3.browserbaseSessionURL).toBe(MOCK_SESSION_URL);\n expect(v3.browserbaseDebugURL).toBe(MOCK_DEBUG_URL);\n expect(v3.isCaptchaAutoSolveEnabled).toBe(true);\n } finally {\n await v3.close().catch(() => {});\n }\n });\n\n it(\"clears stored URLs after close\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n });\n\n await v3.init();\n await v3.close();\n\n expect(v3.browserbaseSessionURL).toBeUndefined();\n expect(v3.browserbaseDebugURL).toBeUndefined();\n });\n\n it(\"disables captcha solving when solveCaptchas is explicitly false\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n browserbaseSessionCreateParams: {\n browserSettings: {\n solveCaptchas: false,\n },\n },\n });\n\n try {\n await v3.init();\n expect(v3.isCaptchaAutoSolveEnabled).toBe(false);\n } finally {\n await v3.close().catch(() => {});\n }\n });\n});\n\ndescribe(\"local accessors\", () => {\n it(\"stay empty for LOCAL environments\", async () => {\n const v3 = new V3({\n env: \"LOCAL\",\n disableAPI: true,\n verbose: 0,\n localBrowserLaunchOptions: {\n cdpUrl: \"ws://local-existing-session\",\n },\n });\n\n try {\n await v3.init();\n expect(v3.browserbaseSessionURL).toBeUndefined();\n expect(v3.browserbaseDebugURL).toBeUndefined();\n } finally {\n await v3.close().catch(() => {});\n }\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,152 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { CaptchaSolver } from "../../lib/v3/agent/utils/captchaSolver.js";
3
+ const SOLVING_STARTED = "browserbase-solving-started";
4
+ const SOLVING_FINISHED = "browserbase-solving-finished";
5
+ const SOLVING_ERRORED = "browserbase-solving-errored";
6
+ class MockPage {
7
+ listeners = new Set();
8
+ onCalls = 0;
9
+ offCalls = 0;
10
+ on(event, listener) {
11
+ if (event !== "console")
12
+ return;
13
+ this.onCalls++;
14
+ this.listeners.add(listener);
15
+ }
16
+ off(event, listener) {
17
+ if (event !== "console")
18
+ return;
19
+ this.offCalls++;
20
+ this.listeners.delete(listener);
21
+ }
22
+ emitConsole(text) {
23
+ const message = { text: () => text };
24
+ for (const listener of this.listeners) {
25
+ listener(message);
26
+ }
27
+ }
28
+ listenerCount() {
29
+ return this.listeners.size;
30
+ }
31
+ }
32
+ describe("CaptchaSolver", () => {
33
+ it("resolves all concurrent waiters when a solve finishes", async () => {
34
+ const page = new MockPage();
35
+ const solver = new CaptchaSolver();
36
+ solver.init(async () => page);
37
+ await solver.ensureAttached();
38
+ page.emitConsole(SOLVING_STARTED);
39
+ const firstWait = solver.waitIfSolving();
40
+ const secondWait = solver.waitIfSolving();
41
+ await new Promise((resolve) => setTimeout(resolve, 0));
42
+ const sharedWaitPromise = solver.waitPromise;
43
+ expect(sharedWaitPromise).not.toBeNull();
44
+ expect(solver.waitPromise).toBe(sharedWaitPromise);
45
+ let firstResolved = false;
46
+ let secondResolved = false;
47
+ void firstWait.then(() => {
48
+ firstResolved = true;
49
+ });
50
+ void secondWait.then(() => {
51
+ secondResolved = true;
52
+ });
53
+ await Promise.resolve();
54
+ expect(firstResolved).toBe(false);
55
+ expect(secondResolved).toBe(false);
56
+ page.emitConsole(SOLVING_FINISHED);
57
+ await Promise.all([firstWait, secondWait]);
58
+ expect(firstResolved).toBe(true);
59
+ expect(secondResolved).toBe(true);
60
+ expect(solver.consumeSolveResult()).toEqual({
61
+ solved: true,
62
+ errored: false,
63
+ });
64
+ expect(solver.consumeSolveResult()).toEqual({
65
+ solved: false,
66
+ errored: false,
67
+ });
68
+ });
69
+ it("re-attaches to a new page and settles stale waiters when the active page changes", async () => {
70
+ const firstPage = new MockPage();
71
+ const secondPage = new MockPage();
72
+ let activePage = firstPage;
73
+ const solver = new CaptchaSolver();
74
+ solver.init(async () => activePage);
75
+ await solver.ensureAttached();
76
+ firstPage.emitConsole(SOLVING_STARTED);
77
+ const pendingWait = solver.waitIfSolving();
78
+ let settled = false;
79
+ void pendingWait.then(() => {
80
+ settled = true;
81
+ });
82
+ activePage = secondPage;
83
+ await solver.waitIfSolving();
84
+ await pendingWait;
85
+ expect(settled).toBe(true);
86
+ expect(firstPage.offCalls).toBe(1);
87
+ expect(firstPage.listenerCount()).toBe(0);
88
+ expect(secondPage.onCalls).toBe(1);
89
+ expect(secondPage.listenerCount()).toBe(1);
90
+ expect(solver.isSolving()).toBe(false);
91
+ });
92
+ it("surfaces solver errors exactly once per consume", async () => {
93
+ const page = new MockPage();
94
+ const solver = new CaptchaSolver();
95
+ solver.init(async () => page);
96
+ await solver.ensureAttached();
97
+ page.emitConsole(SOLVING_STARTED);
98
+ const wait = solver.waitIfSolving();
99
+ page.emitConsole(SOLVING_ERRORED);
100
+ await wait;
101
+ expect(solver.consumeSolveResult()).toEqual({
102
+ solved: false,
103
+ errored: true,
104
+ });
105
+ expect(solver.consumeSolveResult()).toEqual({
106
+ solved: false,
107
+ errored: false,
108
+ });
109
+ });
110
+ it("disposes cleanly while a solve is in progress", async () => {
111
+ const page = new MockPage();
112
+ const solver = new CaptchaSolver();
113
+ solver.init(async () => page);
114
+ await solver.ensureAttached();
115
+ page.emitConsole(SOLVING_STARTED);
116
+ const wait = solver.waitIfSolving();
117
+ await new Promise((resolve) => setTimeout(resolve, 0));
118
+ let settled = false;
119
+ void wait.then(() => {
120
+ settled = true;
121
+ });
122
+ solver.dispose();
123
+ await wait;
124
+ expect(settled).toBe(true);
125
+ expect(solver.isSolving()).toBe(false);
126
+ expect(page.listenerCount()).toBe(0);
127
+ expect(solver.consumeSolveResult()).toEqual({
128
+ solved: false,
129
+ errored: false,
130
+ });
131
+ });
132
+ it("marks errored when detached mid-solve due to page change", async () => {
133
+ const firstPage = new MockPage();
134
+ const secondPage = new MockPage();
135
+ let activePage = firstPage;
136
+ const solver = new CaptchaSolver();
137
+ solver.init(async () => activePage);
138
+ await solver.ensureAttached();
139
+ firstPage.emitConsole(SOLVING_STARTED);
140
+ const wait = solver.waitIfSolving();
141
+ // Switch to a new page while the solve is in progress
142
+ activePage = secondPage;
143
+ await solver.waitIfSolving();
144
+ await wait;
145
+ // The interrupted solve should be reported as errored
146
+ expect(solver.consumeSolveResult()).toEqual({
147
+ solved: false,
148
+ errored: true,
149
+ });
150
+ });
151
+ });
152
+ //# sourceMappingURL=captcha-solver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha-solver.test.js","sourceRoot":"","sources":["../../../../tests/unit/captcha-solver.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { CaptchaSolver } from \"../../lib/v3/agent/utils/captchaSolver.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 onCalls = 0;\n public offCalls = 0;\n\n on(event: string, listener: ConsoleListener): void {\n if (event !== \"console\") return;\n this.onCalls++;\n this.listeners.add(listener);\n }\n\n off(event: string, listener: ConsoleListener): void {\n if (event !== \"console\") return;\n this.offCalls++;\n this.listeners.delete(listener);\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 listenerCount(): number {\n return this.listeners.size;\n }\n}\n\ndescribe(\"CaptchaSolver\", () => {\n it(\"resolves all concurrent waiters when a solve finishes\", async () => {\n const page = new MockPage();\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n await solver.ensureAttached();\n page.emitConsole(SOLVING_STARTED);\n\n const firstWait = solver.waitIfSolving();\n const secondWait = solver.waitIfSolving();\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n const sharedWaitPromise = (\n solver as unknown as { waitPromise: Promise<void> | null }\n ).waitPromise;\n\n expect(sharedWaitPromise).not.toBeNull();\n expect(\n (solver as unknown as { waitPromise: Promise<void> | null }).waitPromise,\n ).toBe(sharedWaitPromise);\n\n let firstResolved = false;\n let secondResolved = false;\n void firstWait.then(() => {\n firstResolved = true;\n });\n void secondWait.then(() => {\n secondResolved = true;\n });\n\n await Promise.resolve();\n expect(firstResolved).toBe(false);\n expect(secondResolved).toBe(false);\n\n page.emitConsole(SOLVING_FINISHED);\n await Promise.all([firstWait, secondWait]);\n\n expect(firstResolved).toBe(true);\n expect(secondResolved).toBe(true);\n expect(solver.consumeSolveResult()).toEqual({\n solved: true,\n errored: false,\n });\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: false,\n });\n });\n\n it(\"re-attaches to a new page and settles stale waiters when the active page changes\", async () => {\n const firstPage = new MockPage();\n const secondPage = new MockPage();\n let activePage = firstPage;\n\n const solver = new CaptchaSolver();\n solver.init(async () => activePage as never);\n\n await solver.ensureAttached();\n firstPage.emitConsole(SOLVING_STARTED);\n\n const pendingWait = solver.waitIfSolving();\n let settled = false;\n void pendingWait.then(() => {\n settled = true;\n });\n\n activePage = secondPage;\n await solver.waitIfSolving();\n await pendingWait;\n\n expect(settled).toBe(true);\n expect(firstPage.offCalls).toBe(1);\n expect(firstPage.listenerCount()).toBe(0);\n expect(secondPage.onCalls).toBe(1);\n expect(secondPage.listenerCount()).toBe(1);\n expect(solver.isSolving()).toBe(false);\n });\n\n it(\"surfaces solver errors exactly once per consume\", async () => {\n const page = new MockPage();\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n await solver.ensureAttached();\n page.emitConsole(SOLVING_STARTED);\n\n const wait = solver.waitIfSolving();\n page.emitConsole(SOLVING_ERRORED);\n await wait;\n\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: true,\n });\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: false,\n });\n });\n\n it(\"disposes cleanly while a solve is in progress\", async () => {\n const page = new MockPage();\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n await solver.ensureAttached();\n page.emitConsole(SOLVING_STARTED);\n\n const wait = solver.waitIfSolving();\n await new Promise((resolve) => setTimeout(resolve, 0));\n let settled = false;\n void wait.then(() => {\n settled = true;\n });\n\n solver.dispose();\n await wait;\n\n expect(settled).toBe(true);\n expect(solver.isSolving()).toBe(false);\n expect(page.listenerCount()).toBe(0);\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: false,\n });\n });\n\n it(\"marks errored when detached mid-solve due to page change\", async () => {\n const firstPage = new MockPage();\n const secondPage = new MockPage();\n let activePage = firstPage;\n\n const solver = new CaptchaSolver();\n solver.init(async () => activePage as never);\n\n await solver.ensureAttached();\n firstPage.emitConsole(SOLVING_STARTED);\n\n const wait = solver.waitIfSolving();\n\n // Switch to a new page while the solve is in progress\n activePage = secondPage;\n await solver.waitIfSolving();\n await wait;\n\n // The interrupted solve should be reported as errored\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: true,\n });\n });\n});\n"]}
@@ -0,0 +1,93 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { describe, it, expect } from "vitest";
3
+ import { CdpConnection } from "../../lib/v3/understudy/cdp.js";
4
+ import { InMemoryEventSink } from "../../lib/v3/flowlogger/EventSink.js";
5
+ import { EventEmitterWithWildcardSupport } from "../../lib/v3/flowlogger/EventEmitter.js";
6
+ import { EventStore } from "../../lib/v3/flowlogger/EventStore.js";
7
+ import { FlowEvent, FlowLogger } from "../../lib/v3/flowlogger/FlowLogger.js";
8
+ function attachEventStoreToBus(store, bus) {
9
+ const onFlowEvent = (event) => {
10
+ if (event instanceof FlowEvent) {
11
+ void store.emit(event);
12
+ }
13
+ };
14
+ bus.on("*", onFlowEvent);
15
+ return () => {
16
+ bus.off("*", onFlowEvent);
17
+ };
18
+ }
19
+ class FakeSocket extends EventEmitter {
20
+ sentPayloads = [];
21
+ readyState = 1;
22
+ send(payload) {
23
+ this.sentPayloads.push(payload);
24
+ }
25
+ close() {
26
+ this.readyState = 3;
27
+ this.emit("close", 1000, "");
28
+ }
29
+ }
30
+ function createConnection(socket) {
31
+ // The production constructor is private; tests instantiate it directly so
32
+ // they can drive raw websocket messages without a real browser.
33
+ const ConnectionCtor = CdpConnection;
34
+ return new ConnectionCtor(socket);
35
+ }
36
+ function requireEvent(events, predicate, description) {
37
+ const match = events.find(predicate);
38
+ expect(match, `missing ${description}`).toBeDefined();
39
+ return match;
40
+ }
41
+ describe("flow logger cdp context", () => {
42
+ it("preserves the active parent chain when a session event handler issues a nested CDP call", async () => {
43
+ const sessionId = "session-test";
44
+ const socket = new FakeSocket();
45
+ const eventBus = new EventEmitterWithWildcardSupport();
46
+ const sink = new InMemoryEventSink();
47
+ const eventStore = new EventStore(sessionId, undefined, sink);
48
+ const detachBus = attachEventStoreToBus(eventStore, eventBus);
49
+ const conn = createConnection(socket);
50
+ conn.flowLoggerContext = FlowLogger.init(sessionId, eventBus);
51
+ // Seed the target/session mapping the same way a real attach flow would
52
+ // before any session-scoped messages are dispatched.
53
+ conn.onMessage(JSON.stringify({
54
+ method: "Target.attachedToTarget",
55
+ params: {
56
+ sessionId: "target-session",
57
+ targetInfo: { targetId: "target-1" },
58
+ },
59
+ }));
60
+ const session = conn.getSession("target-session");
61
+ expect(session).toBeDefined();
62
+ session.on("Runtime.consoleAPICalled", () => {
63
+ // This nested send used to lose its parent chain because the callback ran
64
+ // after the original ALS scope had already unwound.
65
+ void session.send("Runtime.evaluate", {
66
+ expression: "2 + 2",
67
+ });
68
+ });
69
+ await FlowLogger.runWithLogging({
70
+ context: conn.flowLoggerContext,
71
+ eventType: "SyntheticParentEvent",
72
+ }, async () => {
73
+ void session.send("Page.navigate", {
74
+ url: "https://example.com",
75
+ });
76
+ }, []);
77
+ conn.onMessage(JSON.stringify({
78
+ method: "Runtime.consoleAPICalled",
79
+ sessionId: "target-session",
80
+ params: { type: "log" },
81
+ }));
82
+ // The nested Runtime.evaluate call should still attach under the synthetic
83
+ // parent event even though it was triggered by a later session callback.
84
+ const events = await eventStore.query({});
85
+ const parentEvent = requireEvent(events, (event) => event.eventType === "SyntheticParentEvent", "SyntheticParentEvent");
86
+ const nestedCallEvent = requireEvent(events, (event) => event.eventType === "CdpCallEvent" &&
87
+ String(event.data.method) === "Runtime.evaluate", "nested Runtime.evaluate CdpCallEvent");
88
+ expect(nestedCallEvent.eventParentIds).toEqual([parentEvent.eventId]);
89
+ detachBus();
90
+ await eventStore.destroy();
91
+ });
92
+ });
93
+ //# sourceMappingURL=flowlogger-capturing-cdp.test.js.map