@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
@@ -104,12 +104,29 @@ export class Frame {
104
104
  } catch (e) { throw e; }
105
105
  })()`;
106
106
  }
107
- const res = await this.session.send("Runtime.evaluate", {
108
- expression,
109
- contextId,
110
- awaitPromise: true,
111
- returnByValue: true,
112
- });
107
+ let res;
108
+ try {
109
+ res = await this.session.send("Runtime.evaluate", {
110
+ expression,
111
+ contextId,
112
+ awaitPromise: true,
113
+ returnByValue: true,
114
+ });
115
+ }
116
+ catch (error) {
117
+ // Execution contexts can be recreated between context lookup and
118
+ // Runtime.evaluate during popup/navigate churn. Retry once with a fresh id.
119
+ const msg = error instanceof Error ? error.message : String(error);
120
+ if (!msg.includes("Cannot find context with specified id"))
121
+ throw error;
122
+ const freshContextId = await this.getMainWorldExecutionContextId();
123
+ res = await this.session.send("Runtime.evaluate", {
124
+ expression,
125
+ contextId: freshContextId,
126
+ awaitPromise: true,
127
+ returnByValue: true,
128
+ });
129
+ }
113
130
  if (res.exceptionDetails) {
114
131
  throw new StagehandEvalError(res.exceptionDetails.text ?? "Evaluation failed");
115
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/frame.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/frame.ts\nimport { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport { Locator } from \"./locator.js\";\nimport { StagehandEvalError } from \"../types/public/sdkErrors.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\n\ninterface FrameManager {\n session: CDPSessionLike;\n frameId: string;\n pageId: string;\n}\n\n/**\n * Frame\n *\n * A thin, session-bound handle to a specific DOM frame (by frameId).\n * All CDP calls in this class go through `this.session`, which MUST be the\n * owning session for `this.frameId`. Page is responsible for constructing\n * Frames with the correct session.\n */\nexport class Frame implements FrameManager {\n /** Owning CDP session id (useful for logs); null for root connection (should not happen for targets) */\n public readonly sessionId: string | null;\n\n constructor(\n public session: CDPSessionLike,\n public frameId: string,\n public pageId: string,\n private readonly remoteBrowser: boolean,\n ) {\n this.sessionId = this.session.id ?? null;\n }\n\n /** True when the controlled browser runs on a different machine. */\n public isBrowserRemote(): boolean {\n return this.remoteBrowser;\n }\n\n /** DOM.getNodeForLocation → DOM.describeNode */\n async getNodeAtLocation(x: number, y: number): Promise<Protocol.DOM.Node> {\n await this.session.send(\"DOM.enable\");\n const { backendNodeId } = await this.session.send<{\n backendNodeId: Protocol.DOM.BackendNodeId;\n }>(\"DOM.getNodeForLocation\", {\n x,\n y,\n includeUserAgentShadowDOM: true,\n ignorePointerEventsNone: false,\n });\n\n const { node } = await this.session.send<{\n node: Protocol.DOM.Node;\n }>(\"DOM.describeNode\", { backendNodeId });\n\n return node;\n }\n\n /** CSS selector → DOM.querySelector → DOM.getBoxModel */\n async getLocationForSelector(\n selector: string,\n ): Promise<{ x: number; y: number; width: number; height: number }> {\n await this.session.send(\"DOM.enable\");\n\n const { root } = await this.session.send<{ root: Protocol.DOM.Node }>(\n \"DOM.getDocument\",\n );\n\n const { nodeId } = await this.session.send<{ nodeId: Protocol.DOM.NodeId }>(\n \"DOM.querySelector\",\n { nodeId: root.nodeId, selector },\n );\n\n const { model } = await this.session.send<{ model: Protocol.DOM.BoxModel }>(\n \"DOM.getBoxModel\",\n { nodeId },\n );\n\n const x = model.content[0];\n const y = model.content[1];\n const width = model.width;\n const height = model.height;\n return { x, y, width, height };\n }\n\n /** Accessibility.getFullAXTree (+ recurse into child frames if requested) */\n async getAccessibilityTree(\n withFrames = false,\n ): Promise<Protocol.Accessibility.AXNode[]> {\n await this.session.send(\"Accessibility.enable\");\n let nodes: Protocol.Accessibility.AXNode[];\n try {\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\", { frameId: this.frameId }));\n } catch (e) {\n const msg = String((e as Error)?.message ?? e ?? \"\");\n const isFrameScopeError =\n msg.includes(\"Frame with the given\") ||\n msg.includes(\"does not belong to the target\") ||\n msg.includes(\"is not found\");\n if (!isFrameScopeError) throw e;\n // Retry unscoped: on OOPIF sessions, returns the child doc's AX tree.\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\"));\n }\n\n if (!withFrames) return nodes;\n\n const children = await this.childFrames();\n for (const child of children) {\n const childNodes = await child.getAccessibilityTree(false);\n nodes.push(...childNodes);\n }\n return nodes;\n }\n\n /**\n * Evaluate a function or expression in this frame's main world.\n * - If a string is provided, treated as a JS expression.\n * - If a function is provided, it is stringified and invoked with the optional argument.\n */\n async evaluate<R = unknown, Arg = unknown>(\n pageFunctionOrExpression: string | ((arg: Arg) => R | Promise<R>),\n arg?: Arg,\n ): Promise<R> {\n await this.session.send(\"Runtime.enable\").catch(() => {});\n const contextId = await this.getMainWorldExecutionContextId();\n\n const isString = typeof pageFunctionOrExpression === \"string\";\n let expression: string;\n\n if (isString) {\n expression = String(pageFunctionOrExpression);\n } else {\n const fnSrc = pageFunctionOrExpression.toString();\n const argJson = JSON.stringify(arg);\n expression = `(() => {\n const __fn = ${fnSrc};\n const __arg = ${argJson};\n try {\n const __res = __fn(__arg);\n return Promise.resolve(__res).then(v => {\n try { return JSON.parse(JSON.stringify(v)); } catch { return v; }\n });\n } catch (e) { throw e; }\n })()`;\n }\n\n const res = await this.session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId,\n awaitPromise: true,\n returnByValue: true,\n },\n );\n if (res.exceptionDetails) {\n throw new StagehandEvalError(\n res.exceptionDetails.text ?? \"Evaluation failed\",\n );\n }\n return res.result.value as R;\n }\n\n /** Page.captureScreenshot (frame-scoped session) */\n async screenshot(options?: {\n fullPage?: boolean;\n clip?: { x: number; y: number; width: number; height: number };\n type?: \"png\" | \"jpeg\";\n quality?: number;\n scale?: number;\n }): Promise<Buffer> {\n await this.session.send(\"Page.enable\");\n const format = options?.type ?? \"png\";\n const params: Protocol.Page.CaptureScreenshotRequest & { scale?: number } =\n {\n format,\n fromSurface: true,\n captureBeyondViewport: options?.fullPage,\n };\n\n const clampScale = (value: number): number =>\n Math.min(2, Math.max(0.1, value));\n\n const normalizedScale =\n typeof options?.scale === \"number\"\n ? clampScale(options.scale)\n : undefined;\n\n if (options?.clip) {\n const clip = {\n x: options.clip.x,\n y: options.clip.y,\n width: options.clip.width,\n height: options.clip.height,\n scale: normalizedScale ?? 1,\n };\n params.clip = clip;\n } else if (normalizedScale !== undefined && normalizedScale !== 1) {\n params.scale = normalizedScale;\n }\n\n if (format === \"jpeg\" && typeof options?.quality === \"number\") {\n const q = Math.round(options.quality);\n params.quality = Math.min(100, Math.max(0, q));\n }\n\n const { data } =\n await this.session.send<Protocol.Page.CaptureScreenshotResponse>(\n \"Page.captureScreenshot\",\n params,\n );\n return Buffer.from(data, \"base64\");\n }\n\n /** Child frames via Page.getFrameTree */\n async childFrames(): Promise<Frame[]> {\n const { frameTree } = await this.session.send<{\n frameTree: Protocol.Page.FrameTree;\n }>(\"Page.getFrameTree\");\n const frames: Frame[] = [];\n\n const collect = (tree: Protocol.Page.FrameTree) => {\n if (tree.frame.parentId === this.frameId) {\n frames.push(\n new Frame(\n this.session,\n tree.frame.id,\n this.pageId,\n this.remoteBrowser,\n ),\n );\n }\n tree.childFrames?.forEach(collect);\n };\n\n collect(frameTree);\n return frames;\n }\n\n /** Wait for a lifecycle state (load/domcontentloaded/networkidle) */\n async waitForLoadState(\n state: \"load\" | \"domcontentloaded\" | \"networkidle\" = \"load\",\n timeoutMs: number = 15_000,\n ): Promise<void> {\n await this.session.send(\"Page.enable\");\n const targetState = state.toLowerCase();\n const timeout = Math.max(0, timeoutMs);\n await new Promise<void>((resolve, reject) => {\n let done = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const finish = () => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n resolve();\n };\n const handler = (evt: Protocol.Page.LifecycleEventEvent) => {\n const sameFrame = evt.frameId === this.frameId;\n // need to normalize here because CDP lifecycle names look like 'DOMContentLoaded'\n // but we accept 'domcontentloaded'\n const lifecycleName = String(evt.name ?? \"\").toLowerCase();\n if (sameFrame && lifecycleName === targetState) {\n finish();\n }\n };\n this.session.on(\"Page.lifecycleEvent\", handler);\n\n timer = setTimeout(() => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n reject(\n new Error(\n `waitForLoadState(${state}) timed out after ${timeout}ms for frame ${this.frameId}`,\n ),\n );\n }, timeout);\n });\n }\n\n /** Simple placeholder for your own locator abstraction */\n locator(\n selector: string,\n options?: { deep?: boolean; depth?: number },\n ): Locator {\n return new Locator(this, selector, options);\n }\n\n /** Resolve the main-world execution context id for this frame. */\n private async getMainWorldExecutionContextId(): Promise<number> {\n return executionContexts.waitForMainWorld(this.session, this.frameId, 1000);\n }\n}\n"]}
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/frame.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/frame.ts\nimport { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport { Locator } from \"./locator.js\";\nimport { StagehandEvalError } from \"../types/public/sdkErrors.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\n\ninterface FrameManager {\n session: CDPSessionLike;\n frameId: string;\n pageId: string;\n}\n\n/**\n * Frame\n *\n * A thin, session-bound handle to a specific DOM frame (by frameId).\n * All CDP calls in this class go through `this.session`, which MUST be the\n * owning session for `this.frameId`. Page is responsible for constructing\n * Frames with the correct session.\n */\nexport class Frame implements FrameManager {\n /** Owning CDP session id (useful for logs); null for root connection (should not happen for targets) */\n public readonly sessionId: string | null;\n\n constructor(\n public session: CDPSessionLike,\n public frameId: string,\n public pageId: string,\n private readonly remoteBrowser: boolean,\n ) {\n this.sessionId = this.session.id ?? null;\n }\n\n /** True when the controlled browser runs on a different machine. */\n public isBrowserRemote(): boolean {\n return this.remoteBrowser;\n }\n\n /** DOM.getNodeForLocation → DOM.describeNode */\n async getNodeAtLocation(x: number, y: number): Promise<Protocol.DOM.Node> {\n await this.session.send(\"DOM.enable\");\n const { backendNodeId } = await this.session.send<{\n backendNodeId: Protocol.DOM.BackendNodeId;\n }>(\"DOM.getNodeForLocation\", {\n x,\n y,\n includeUserAgentShadowDOM: true,\n ignorePointerEventsNone: false,\n });\n\n const { node } = await this.session.send<{\n node: Protocol.DOM.Node;\n }>(\"DOM.describeNode\", { backendNodeId });\n\n return node;\n }\n\n /** CSS selector → DOM.querySelector → DOM.getBoxModel */\n async getLocationForSelector(\n selector: string,\n ): Promise<{ x: number; y: number; width: number; height: number }> {\n await this.session.send(\"DOM.enable\");\n\n const { root } = await this.session.send<{ root: Protocol.DOM.Node }>(\n \"DOM.getDocument\",\n );\n\n const { nodeId } = await this.session.send<{ nodeId: Protocol.DOM.NodeId }>(\n \"DOM.querySelector\",\n { nodeId: root.nodeId, selector },\n );\n\n const { model } = await this.session.send<{ model: Protocol.DOM.BoxModel }>(\n \"DOM.getBoxModel\",\n { nodeId },\n );\n\n const x = model.content[0];\n const y = model.content[1];\n const width = model.width;\n const height = model.height;\n return { x, y, width, height };\n }\n\n /** Accessibility.getFullAXTree (+ recurse into child frames if requested) */\n async getAccessibilityTree(\n withFrames = false,\n ): Promise<Protocol.Accessibility.AXNode[]> {\n await this.session.send(\"Accessibility.enable\");\n let nodes: Protocol.Accessibility.AXNode[];\n try {\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\", { frameId: this.frameId }));\n } catch (e) {\n const msg = String((e as Error)?.message ?? e ?? \"\");\n const isFrameScopeError =\n msg.includes(\"Frame with the given\") ||\n msg.includes(\"does not belong to the target\") ||\n msg.includes(\"is not found\");\n if (!isFrameScopeError) throw e;\n // Retry unscoped: on OOPIF sessions, returns the child doc's AX tree.\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\"));\n }\n\n if (!withFrames) return nodes;\n\n const children = await this.childFrames();\n for (const child of children) {\n const childNodes = await child.getAccessibilityTree(false);\n nodes.push(...childNodes);\n }\n return nodes;\n }\n\n /**\n * Evaluate a function or expression in this frame's main world.\n * - If a string is provided, treated as a JS expression.\n * - If a function is provided, it is stringified and invoked with the optional argument.\n */\n async evaluate<R = unknown, Arg = unknown>(\n pageFunctionOrExpression: string | ((arg: Arg) => R | Promise<R>),\n arg?: Arg,\n ): Promise<R> {\n await this.session.send(\"Runtime.enable\").catch(() => {});\n const contextId = await this.getMainWorldExecutionContextId();\n\n const isString = typeof pageFunctionOrExpression === \"string\";\n let expression: string;\n\n if (isString) {\n expression = String(pageFunctionOrExpression);\n } else {\n const fnSrc = pageFunctionOrExpression.toString();\n const argJson = JSON.stringify(arg);\n expression = `(() => {\n const __fn = ${fnSrc};\n const __arg = ${argJson};\n try {\n const __res = __fn(__arg);\n return Promise.resolve(__res).then(v => {\n try { return JSON.parse(JSON.stringify(v)); } catch { return v; }\n });\n } catch (e) { throw e; }\n })()`;\n }\n\n let res: Protocol.Runtime.EvaluateResponse;\n try {\n res = await this.session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId,\n awaitPromise: true,\n returnByValue: true,\n },\n );\n } catch (error) {\n // Execution contexts can be recreated between context lookup and\n // Runtime.evaluate during popup/navigate churn. Retry once with a fresh id.\n const msg = error instanceof Error ? error.message : String(error);\n if (!msg.includes(\"Cannot find context with specified id\")) throw error;\n const freshContextId = await this.getMainWorldExecutionContextId();\n res = await this.session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId: freshContextId,\n awaitPromise: true,\n returnByValue: true,\n },\n );\n }\n if (res.exceptionDetails) {\n throw new StagehandEvalError(\n res.exceptionDetails.text ?? \"Evaluation failed\",\n );\n }\n return res.result.value as R;\n }\n\n /** Page.captureScreenshot (frame-scoped session) */\n async screenshot(options?: {\n fullPage?: boolean;\n clip?: { x: number; y: number; width: number; height: number };\n type?: \"png\" | \"jpeg\";\n quality?: number;\n scale?: number;\n }): Promise<Buffer> {\n await this.session.send(\"Page.enable\");\n const format = options?.type ?? \"png\";\n const params: Protocol.Page.CaptureScreenshotRequest & { scale?: number } =\n {\n format,\n fromSurface: true,\n captureBeyondViewport: options?.fullPage,\n };\n\n const clampScale = (value: number): number =>\n Math.min(2, Math.max(0.1, value));\n\n const normalizedScale =\n typeof options?.scale === \"number\"\n ? clampScale(options.scale)\n : undefined;\n\n if (options?.clip) {\n const clip = {\n x: options.clip.x,\n y: options.clip.y,\n width: options.clip.width,\n height: options.clip.height,\n scale: normalizedScale ?? 1,\n };\n params.clip = clip;\n } else if (normalizedScale !== undefined && normalizedScale !== 1) {\n params.scale = normalizedScale;\n }\n\n if (format === \"jpeg\" && typeof options?.quality === \"number\") {\n const q = Math.round(options.quality);\n params.quality = Math.min(100, Math.max(0, q));\n }\n\n const { data } =\n await this.session.send<Protocol.Page.CaptureScreenshotResponse>(\n \"Page.captureScreenshot\",\n params,\n );\n return Buffer.from(data, \"base64\");\n }\n\n /** Child frames via Page.getFrameTree */\n async childFrames(): Promise<Frame[]> {\n const { frameTree } = await this.session.send<{\n frameTree: Protocol.Page.FrameTree;\n }>(\"Page.getFrameTree\");\n const frames: Frame[] = [];\n\n const collect = (tree: Protocol.Page.FrameTree) => {\n if (tree.frame.parentId === this.frameId) {\n frames.push(\n new Frame(\n this.session,\n tree.frame.id,\n this.pageId,\n this.remoteBrowser,\n ),\n );\n }\n tree.childFrames?.forEach(collect);\n };\n\n collect(frameTree);\n return frames;\n }\n\n /** Wait for a lifecycle state (load/domcontentloaded/networkidle) */\n async waitForLoadState(\n state: \"load\" | \"domcontentloaded\" | \"networkidle\" = \"load\",\n timeoutMs: number = 15_000,\n ): Promise<void> {\n await this.session.send(\"Page.enable\");\n const targetState = state.toLowerCase();\n const timeout = Math.max(0, timeoutMs);\n await new Promise<void>((resolve, reject) => {\n let done = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const finish = () => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n resolve();\n };\n const handler = (evt: Protocol.Page.LifecycleEventEvent) => {\n const sameFrame = evt.frameId === this.frameId;\n // need to normalize here because CDP lifecycle names look like 'DOMContentLoaded'\n // but we accept 'domcontentloaded'\n const lifecycleName = String(evt.name ?? \"\").toLowerCase();\n if (sameFrame && lifecycleName === targetState) {\n finish();\n }\n };\n this.session.on(\"Page.lifecycleEvent\", handler);\n\n timer = setTimeout(() => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n reject(\n new Error(\n `waitForLoadState(${state}) timed out after ${timeout}ms for frame ${this.frameId}`,\n ),\n );\n }, timeout);\n });\n }\n\n /** Simple placeholder for your own locator abstraction */\n locator(\n selector: string,\n options?: { deep?: boolean; depth?: number },\n ): Locator {\n return new Locator(this, selector, options);\n }\n\n /** Resolve the main-world execution context id for this frame. */\n private async getMainWorldExecutionContextId(): Promise<number> {\n return executionContexts.waitForMainWorld(this.session, this.frameId, 1000);\n }\n}\n"]}
@@ -39,6 +39,7 @@ export declare class Page {
39
39
  private readonly consoleHandlers;
40
40
  /** Document-start scripts installed across every session this page owns. */
41
41
  private readonly initScripts;
42
+ private extraHTTPHeaders;
42
43
  private constructor();
43
44
  private installInitScriptOnSession;
44
45
  private applyInitScriptsToSession;
@@ -118,6 +119,7 @@ export declare class Page {
118
119
  close(): Promise<void>;
119
120
  getFullFrameTree(): Protocol.Page.FrameTree;
120
121
  asProtocolFrameTree(rootMainFrameId: string): Protocol.Page.FrameTree;
122
+ private applyExtraHTTPHeadersToSession;
121
123
  private ensureOrdinal;
122
124
  /** Public getter for snapshot code / handlers. */
123
125
  getOrdinal(frameId: string): number;
@@ -202,6 +204,17 @@ export declare class Page {
202
204
  * @param options.type Image format (`"png"` by default).
203
205
  */
204
206
  screenshot(options?: ScreenshotOptions): Promise<Buffer>;
207
+ /**
208
+ * specifies additional HTTP headers to be included in every request sent by
209
+ * the root CDP session of the page, and all of its child CDP sessions.
210
+ *
211
+ * @param headers - the headers to be set.
212
+ * @throws {StagehandSetExtraHTTPHeadersError}
213
+ * Thrown when one or more CDP sessions fail to enable the Network domain or fail
214
+ * to apply the headers (i.e. `Network.enable` and/or `Network.setExtraHTTPHeaders` rejects).
215
+ * @return void
216
+ */
217
+ setExtraHTTPHeaders(headers: Record<string, string>): Promise<void>;
205
218
  /**
206
219
  * Create a locator bound to the current main frame.
207
220
  */
@@ -34,7 +34,7 @@ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn,
34
34
  };
35
35
  import { promises as fs } from "fs";
36
36
  import { v3Logger } from "../logger.js";
37
- import { logAction } from "../flowLogger.js";
37
+ import { FlowLogger } from "../flowlogger/FlowLogger.js";
38
38
  import { Frame } from "./frame.js";
39
39
  import { FrameLocator } from "./frameLocator.js";
40
40
  import { deepLocatorFromPage, resolveLocatorTarget } from "./deepLocator.js";
@@ -46,11 +46,12 @@ import { LifecycleWatcher } from "./lifecycleWatcher.js";
46
46
  import { NavigationResponseTracker } from "./navigationResponseTracker.js";
47
47
  import { Response, isSerializableResponse } from "./response.js";
48
48
  import { ConsoleMessage } from "./consoleMessage.js";
49
- import { StagehandSnapshotError, } from "../types/public/index.js";
49
+ import { StagehandSetExtraHTTPHeadersError, StagehandSnapshotError, } from "../types/public/index.js";
50
50
  import { StagehandInvalidArgumentError, StagehandEvalError, } from "../types/public/sdkErrors.js";
51
51
  import { normalizeInitScriptSource } from "./initScripts.js";
52
52
  import { buildLocatorInvocation } from "./locatorInvocation.js";
53
- import { applyMaskOverlays, applyStyleToFrames, collectFramesForScreenshot, computeScreenshotScale, disableAnimations, hideCaret, normalizeScreenshotClip, runScreenshotCleanups, setTransparentBackground, withScreenshotTimeout, } from "./screenshotUtils.js";
53
+ import { applyMaskOverlays, applyStyleToFrames, collectFramesForScreenshot, computeScreenshotScale, disableAnimations, hideCaret, normalizeScreenshotClip, runScreenshotCleanups, setTransparentBackground, } from "./screenshotUtils.js";
54
+ import { withTimeout } from "../timeoutConfig.js";
54
55
  /**
55
56
  * Page
56
57
  *
@@ -90,22 +91,32 @@ let Page = (() => {
90
91
  return class Page {
91
92
  static {
92
93
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
93
- _close_decorators = [logAction("Page.close")];
94
- _goto_decorators = [logAction("Page.goto")];
95
- _reload_decorators = [logAction("Page.reload")];
96
- _goBack_decorators = [logAction("Page.goBack")];
97
- _goForward_decorators = [logAction("Page.goForward")];
98
- _screenshot_decorators = [logAction("Page.screenshot")];
99
- _waitForLoadState_decorators = [logAction("Page.waitForLoadState")];
100
- _waitForSelector_decorators = [logAction("Page.waitForSelector")];
101
- _evaluate_decorators = [logAction("Page.evaluate")];
102
- _click_decorators = [logAction("Page.click")];
103
- _hover_decorators = [logAction("Page.hover")];
104
- _scroll_decorators = [logAction("Page.scroll")];
105
- _dragAndDrop_decorators = [logAction("Page.dragAndDrop")];
106
- _type_decorators = [logAction("Page.type")];
107
- _keyPress_decorators = [logAction("Page.keyPress")];
108
- _snapshot_decorators = [logAction("Page.snapshot")];
94
+ _close_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageClose" })];
95
+ _goto_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageGoto" })];
96
+ _reload_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageReload" })];
97
+ _goBack_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageGoBack" })];
98
+ _goForward_decorators = [FlowLogger.wrapWithLogging({
99
+ eventType: "PageGoForward",
100
+ })];
101
+ _screenshot_decorators = [FlowLogger.wrapWithLogging({
102
+ eventType: "PageScreenshot",
103
+ })];
104
+ _waitForLoadState_decorators = [FlowLogger.wrapWithLogging({
105
+ eventType: "PageWaitForLoadState",
106
+ })];
107
+ _waitForSelector_decorators = [FlowLogger.wrapWithLogging({
108
+ eventType: "PageWaitForSelector",
109
+ })];
110
+ _evaluate_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageEvaluate" })];
111
+ _click_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageClick" })];
112
+ _hover_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageHover" })];
113
+ _scroll_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageScroll" })];
114
+ _dragAndDrop_decorators = [FlowLogger.wrapWithLogging({
115
+ eventType: "PageDragAndDrop",
116
+ })];
117
+ _type_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageType" })];
118
+ _keyPress_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageKeyPress" })];
119
+ _snapshot_decorators = [FlowLogger.wrapWithLogging({ eventType: "PageSnapshot" })];
109
120
  __esDecorate(this, null, _close_decorators, { kind: "method", name: "close", static: false, private: false, access: { has: obj => "close" in obj, get: obj => obj.close }, metadata: _metadata }, null, _instanceExtraInitializers);
110
121
  __esDecorate(this, null, _goto_decorators, { kind: "method", name: "goto", static: false, private: false, access: { has: obj => "goto" in obj, get: obj => obj.goto }, metadata: _metadata }, null, _instanceExtraInitializers);
111
122
  __esDecorate(this, null, _reload_decorators, { kind: "method", name: "reload", static: false, private: false, access: { has: obj => "reload" in obj, get: obj => obj.reload }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -152,6 +163,7 @@ let Page = (() => {
152
163
  consoleHandlers = new Map();
153
164
  /** Document-start scripts installed across every session this page owns. */
154
165
  initScripts = [];
166
+ extraHTTPHeaders;
155
167
  constructor(conn, mainSession, _targetId, mainFrameId, apiClient, browserIsRemote = false) {
156
168
  this.conn = conn;
157
169
  this.mainSession = mainSession;
@@ -305,8 +317,12 @@ let Page = (() => {
305
317
  * Assumes Page domain is already enabled on the session passed in.
306
318
  */
307
319
  static async create(conn, session, targetId, apiClient, localBrowserLaunchOptions, browserIsRemote = false) {
308
- await session.send("Page.enable").catch(() => { });
309
- await session
320
+ // Context already issues Page.enable + lifecycle enable before resume.
321
+ // Re-issue here only as best-effort and do not block page registration on
322
+ // their acknowledgements; some remote CDP backends can delay these replies
323
+ // long after the target is otherwise ready.
324
+ void session.send("Page.enable").catch(() => { });
325
+ void session
310
326
  .send("Page.setLifecycleEventsEnabled", { enabled: true })
311
327
  .catch(() => { });
312
328
  const { frameTree } = await session.send("Page.getFrameTree");
@@ -390,6 +406,8 @@ let Page = (() => {
390
406
  if (childSession.id)
391
407
  this.sessions.set(childSession.id, childSession);
392
408
  this.networkManager.trackSession(childSession);
409
+ if (this.extraHTTPHeaders)
410
+ void this.applyExtraHTTPHeadersToSession(childSession, this.extraHTTPHeaders).catch(() => { });
393
411
  void this.applyInitScriptsToSession(childSession).catch(() => { });
394
412
  if (this.consoleListeners.size > 0) {
395
413
  this.installConsoleTap(childSession);
@@ -576,6 +594,12 @@ let Page = (() => {
576
594
  asProtocolFrameTree(rootMainFrameId) {
577
595
  return this.registry.asProtocolFrameTree(rootMainFrameId);
578
596
  }
597
+ async applyExtraHTTPHeadersToSession(session, headers) {
598
+ await session.send("Network.enable");
599
+ await session.send("Network.setExtraHTTPHeaders", {
600
+ headers: headers,
601
+ });
602
+ }
579
603
  ensureOrdinal(frameId) {
580
604
  const hit = this.frameOrdinals.get(frameId);
581
605
  if (hit !== undefined)
@@ -683,7 +707,7 @@ let Page = (() => {
683
707
  try {
684
708
  // Route to API if available
685
709
  if (this.apiClient) {
686
- const result = await this.apiClient.goto(url, { waitUntil: options?.waitUntil }, this.mainFrameId());
710
+ const result = await this.apiClient.goto(url, { waitUntil: options?.waitUntil, timeout: options?.timeoutMs }, this.mainFrameId());
687
711
  this._currentUrl = url;
688
712
  if (isSerializableResponse(result)) {
689
713
  return Response.fromSerializable(result, {
@@ -952,7 +976,46 @@ let Page = (() => {
952
976
  await runScreenshotCleanups(cleanupTasks);
953
977
  }
954
978
  };
955
- return withScreenshotTimeout(opts.timeout, exec);
979
+ return await withTimeout(exec(), opts.timeout, "screenshot");
980
+ }
981
+ /**
982
+ * specifies additional HTTP headers to be included in every request sent by
983
+ * the root CDP session of the page, and all of its child CDP sessions.
984
+ *
985
+ * @param headers - the headers to be set.
986
+ * @throws {StagehandSetExtraHTTPHeadersError}
987
+ * Thrown when one or more CDP sessions fail to enable the Network domain or fail
988
+ * to apply the headers (i.e. `Network.enable` and/or `Network.setExtraHTTPHeaders` rejects).
989
+ * @return void
990
+ */
991
+ async setExtraHTTPHeaders(headers) {
992
+ const headersToSet = { ...headers };
993
+ this.extraHTTPHeaders = headersToSet;
994
+ // get the session(s) for this page:
995
+ const sessions = [this.mainSession];
996
+ for (const session of this.sessions.values()) {
997
+ if (session === this.mainSession)
998
+ continue;
999
+ sessions.push(session);
1000
+ }
1001
+ const results = await Promise.allSettled(sessions.map(async (session) => {
1002
+ await this.applyExtraHTTPHeadersToSession(session, headersToSet);
1003
+ }));
1004
+ // get list of objects containing results & corresponding session IDs
1005
+ const pairs = results.map((result, index) => ({
1006
+ result,
1007
+ id: sessions[index].id,
1008
+ }));
1009
+ const filtered = pairs.filter((pair) => pair.result.status === "rejected");
1010
+ const errors = filtered.map((pair) => {
1011
+ const reason = pair.result.reason;
1012
+ const sessId = pair.id ?? "root";
1013
+ const message = reason?.message ?? String(reason);
1014
+ return `session=${sessId} error=${message}`;
1015
+ });
1016
+ if (errors.length > 0) {
1017
+ throw new StagehandSetExtraHTTPHeadersError(errors);
1018
+ }
956
1019
  }
957
1020
  /**
958
1021
  * Create a locator bound to the current main frame.
@@ -1079,7 +1142,7 @@ let Page = (() => {
1079
1142
  * Force the page viewport to an exact CSS size and device scale factor.
1080
1143
  * Ensures screenshots match width x height pixels when deviceScaleFactor = 1.
1081
1144
  */
1082
- // @logAction("Page.setViewportSize") // disabled because it's pretty noisy, can always re-enable if needed for debugging
1145
+ // @FlowLogger.wrapWithLogging({ eventType: "PageSetViewportSize" }) // disabled because it's pretty noisy, can always re-enable if needed for debugging
1083
1146
  async setViewportSize(width, height, options) {
1084
1147
  const dsf = Math.max(0.01, options?.deviceScaleFactor ?? 1);
1085
1148
  await this.mainSession