@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
@@ -7,21 +7,21 @@ exports.CdpSession = exports.CdpConnection = void 0;
7
7
  // lib/v3/understudy/cdp.ts
8
8
  const ws_1 = __importDefault(require("ws"));
9
9
  const version_js_1 = require("../../version.js");
10
+ const FlowLogger_js_1 = require("../flowlogger/FlowLogger.js");
10
11
  const sdkErrors_js_1 = require("../types/public/sdkErrors.js");
11
12
  class CdpConnection {
12
13
  ws;
13
14
  nextId = 1;
14
- inflight = new Map();
15
+ inflight = new Map(); // Outstanding request records; `_sendViaSession()` inserts and `onMessage()` removes/resolves them.
16
+ latestCdpCallEvent = new Map();
15
17
  eventHandlers = new Map();
16
18
  sessions = new Map();
17
19
  /** Maps sessionId -> targetId (1:1 mapping) */
18
20
  sessionToTarget = new Map();
21
+ sessionDispatchWaiters = new Set();
19
22
  id = null; // root
20
23
  transportCloseHandlers = new Set();
21
- /** Optional CDP logger - set this to receive all outgoing CDP method calls */
22
- cdpLogger;
23
- /** Optional CDP event logger - set this to receive all incoming CDP events */
24
- cdpEventLogger;
24
+ flowLoggerContext; // Instance-owned fallback flow context; V3 sets this once and later sends/callbacks re-enter it when ALS is absent.
25
25
  onTransportClosed(handler) {
26
26
  this.transportCloseHandlers.add(handler);
27
27
  }
@@ -53,13 +53,14 @@ class CdpConnection {
53
53
  });
54
54
  this.ws.on("message", (data) => this.onMessage(data.toString()));
55
55
  }
56
- static async connect(wsUrl) {
56
+ static async connect(wsUrl, options) {
57
57
  // Include User-Agent header for server-side observability and version tracking
58
- const ws = new ws_1.default(wsUrl, {
59
- headers: {
60
- "User-Agent": `Stagehand/${version_js_1.STAGEHAND_VERSION}`,
61
- },
62
- });
58
+ // Merge user-provided headers, letting them override defaults
59
+ const headers = {
60
+ "User-Agent": `Stagehand/${version_js_1.STAGEHAND_VERSION}`,
61
+ ...options?.headers,
62
+ };
63
+ const ws = new ws_1.default(wsUrl, { headers });
63
64
  await new Promise((resolve, reject) => {
64
65
  ws.once("open", () => resolve());
65
66
  ws.once("error", (e) => reject(e));
@@ -78,6 +79,20 @@ class CdpConnection {
78
79
  const id = this.nextId++;
79
80
  const payload = { id, method, params };
80
81
  const stack = new Error().stack?.split("\n").slice(1, 4).join("\n");
82
+ const flowLoggerContext = FlowLogger_js_1.FlowLogger.resolveContext(this.flowLoggerContext);
83
+ const cdpCallEvent = flowLoggerContext
84
+ ? FlowLogger_js_1.FlowLogger.logCdpCallEvent(flowLoggerContext, {
85
+ method,
86
+ params,
87
+ targetId: null,
88
+ })
89
+ : null;
90
+ if (flowLoggerContext && cdpCallEvent) {
91
+ this.latestCdpCallEvent.set(null, {
92
+ flowLoggerContext,
93
+ cdpCallEvent,
94
+ });
95
+ }
81
96
  const p = new Promise((resolve, reject) => {
82
97
  this.inflight.set(id, {
83
98
  resolve,
@@ -87,11 +102,12 @@ class CdpConnection {
87
102
  params,
88
103
  stack,
89
104
  ts: Date.now(),
105
+ flowLoggerContext,
106
+ cdpCallEvent,
90
107
  });
91
108
  });
92
109
  // Prevent unhandledRejection if a session detaches before the caller awaits.
93
110
  void p.catch(() => { });
94
- this.cdpLogger?.({ method, params, targetId: null });
95
111
  this.ws.send(JSON.stringify(payload));
96
112
  return p;
97
113
  }
@@ -118,10 +134,32 @@ class CdpConnection {
118
134
  entry.reject(new sdkErrors_js_1.CdpConnectionClosedError(why));
119
135
  this.inflight.delete(id);
120
136
  }
137
+ this.latestCdpCallEvent.clear();
138
+ for (const waiter of Array.from(this.sessionDispatchWaiters)) {
139
+ waiter.reject(new sdkErrors_js_1.CdpConnectionClosedError(why));
140
+ }
121
141
  }
122
142
  getSession(sessionId) {
123
143
  return this.sessions.get(sessionId);
124
144
  }
145
+ waitForSessionDispatch(sessionId, method, match) {
146
+ return new Promise((resolve, reject) => {
147
+ const waiter = {
148
+ sessionId,
149
+ method,
150
+ match,
151
+ resolve: () => {
152
+ this.sessionDispatchWaiters.delete(waiter);
153
+ resolve();
154
+ },
155
+ reject: (error) => {
156
+ this.sessionDispatchWaiters.delete(waiter);
157
+ reject(error);
158
+ },
159
+ };
160
+ this.sessionDispatchWaiters.add(waiter);
161
+ });
162
+ }
125
163
  async attachToTarget(targetId) {
126
164
  const { sessionId } = (await this.send("Target.attachToTarget", { targetId, flatten: true }));
127
165
  let session = this.sessions.get(sessionId);
@@ -144,9 +182,54 @@ class CdpConnection {
144
182
  return;
145
183
  this.inflight.delete(msg.id);
146
184
  if ("error" in msg && msg.error) {
185
+ // Response/error events only make sense if the original send captured
186
+ // both a flow context to re-enter and the emitted CdpCallEvent to hang
187
+ // the terminal edge under.
188
+ if (rec.flowLoggerContext && rec.cdpCallEvent) {
189
+ let targetId;
190
+ if (rec.sessionId) {
191
+ const mappedTargetId = this.sessionToTarget.get(rec.sessionId);
192
+ if (mappedTargetId) {
193
+ targetId = mappedTargetId;
194
+ }
195
+ else {
196
+ targetId = rec.sessionId;
197
+ }
198
+ }
199
+ else {
200
+ targetId = null;
201
+ }
202
+ FlowLogger_js_1.FlowLogger.logCdpResponseEvent(rec.flowLoggerContext, rec.cdpCallEvent, {
203
+ method: rec.method,
204
+ error: `${msg.error.code} ${msg.error.message}`,
205
+ targetId,
206
+ });
207
+ }
147
208
  rec.reject(new Error(`${msg.error.code} ${msg.error.message}`));
148
209
  }
149
210
  else {
211
+ // Successful responses reuse the same cached call context so the
212
+ // response lands under the exact CdpCallEvent emitted at send time.
213
+ if (rec.flowLoggerContext && rec.cdpCallEvent) {
214
+ let targetId;
215
+ if (rec.sessionId) {
216
+ const mappedTargetId = this.sessionToTarget.get(rec.sessionId);
217
+ if (mappedTargetId) {
218
+ targetId = mappedTargetId;
219
+ }
220
+ else {
221
+ targetId = rec.sessionId;
222
+ }
223
+ }
224
+ else {
225
+ targetId = null;
226
+ }
227
+ FlowLogger_js_1.FlowLogger.logCdpResponseEvent(rec.flowLoggerContext, rec.cdpCallEvent, {
228
+ method: rec.method,
229
+ result: msg.result,
230
+ targetId,
231
+ });
232
+ }
150
233
  rec.resolve(msg.result);
151
234
  }
152
235
  return;
@@ -165,12 +248,18 @@ class CdpConnection {
165
248
  .params;
166
249
  for (const [id, entry] of this.inflight.entries()) {
167
250
  if (entry.sessionId === p.sessionId) {
168
- entry.reject(new Error("CDP session detached"));
251
+ entry.reject(new sdkErrors_js_1.PageNotFoundError(`target closed before CDP response (sessionId=${p.sessionId}, targetId=${p.targetId})`));
169
252
  this.inflight.delete(id);
170
253
  }
171
254
  }
255
+ for (const waiter of Array.from(this.sessionDispatchWaiters)) {
256
+ if (waiter.sessionId === p.sessionId) {
257
+ waiter.reject(new sdkErrors_js_1.PageNotFoundError(`target closed before CDP send (sessionId=${p.sessionId}, targetId=${p.targetId})`));
258
+ }
259
+ }
172
260
  this.sessions.delete(p.sessionId);
173
261
  this.sessionToTarget.delete(p.sessionId);
262
+ this.latestCdpCallEvent.delete(p.sessionId);
174
263
  }
175
264
  else if (msg.method === "Target.targetDestroyed") {
176
265
  const p = msg.params;
@@ -178,23 +267,62 @@ class CdpConnection {
178
267
  for (const [sessionId, targetId] of this.sessionToTarget.entries()) {
179
268
  if (targetId === p.targetId) {
180
269
  this.sessionToTarget.delete(sessionId);
270
+ this.latestCdpCallEvent.delete(sessionId);
181
271
  break;
182
272
  }
183
273
  }
184
274
  }
185
275
  const { method, params, sessionId } = msg;
186
- // Log incoming CDP events
187
- const targetId = this.sessionToTarget.get(sessionId) || sessionId;
188
- this.cdpEventLogger?.({ method, params, targetId });
276
+ const latestCdpCallEvent = this.latestCdpCallEvent.get(sessionId ?? null) ??
277
+ (sessionId ? this.latestCdpCallEvent.get(null) : null);
278
+ let targetId;
189
279
  if (sessionId) {
190
- const session = this.sessions.get(sessionId);
191
- session?.dispatch(method, params);
280
+ const mappedTargetId = this.sessionToTarget.get(sessionId);
281
+ if (mappedTargetId) {
282
+ targetId = mappedTargetId;
283
+ }
284
+ else {
285
+ targetId = sessionId;
286
+ }
192
287
  }
193
288
  else {
289
+ targetId = null;
290
+ }
291
+ // Unsolicited protocol messages are attached under the most recent call on
292
+ // that session/root when one is known, so later callbacks still show up
293
+ // in the same flow subtree.
294
+ if (latestCdpCallEvent) {
295
+ FlowLogger_js_1.FlowLogger.logCdpMessageEvent(latestCdpCallEvent.flowLoggerContext, latestCdpCallEvent.cdpCallEvent, {
296
+ method,
297
+ params,
298
+ targetId,
299
+ });
300
+ }
301
+ const dispatch = () => {
302
+ if (sessionId) {
303
+ const session = this.sessions.get(sessionId);
304
+ session?.dispatch(method, params);
305
+ // Forward target lifecycle events to root listeners as well.
306
+ // Some browsers emit these via a parent session rather than the root
307
+ // connection; fan-out keeps target tracking consistent.
308
+ if (method.startsWith("Target.")) {
309
+ const handlers = this.eventHandlers.get(method);
310
+ if (handlers)
311
+ for (const h of handlers)
312
+ h(params);
313
+ }
314
+ return;
315
+ }
194
316
  const handlers = this.eventHandlers.get(method);
195
317
  if (handlers)
196
318
  for (const h of handlers)
197
319
  h(params);
320
+ };
321
+ if (latestCdpCallEvent) {
322
+ FlowLogger_js_1.FlowLogger.withContext(latestCdpCallEvent.flowLoggerContext, dispatch);
323
+ }
324
+ else {
325
+ dispatch();
198
326
  }
199
327
  }
200
328
  }
@@ -202,6 +330,28 @@ class CdpConnection {
202
330
  const id = this.nextId++;
203
331
  const payload = { id, method, params, sessionId };
204
332
  const stack = new Error().stack?.split("\n").slice(1, 4).join("\n");
333
+ const flowLoggerContext = FlowLogger_js_1.FlowLogger.resolveContext(this.flowLoggerContext);
334
+ let targetId;
335
+ const mappedTargetId = this.sessionToTarget.get(sessionId);
336
+ if (mappedTargetId) {
337
+ targetId = mappedTargetId;
338
+ }
339
+ else {
340
+ targetId = null;
341
+ }
342
+ const cdpCallEvent = flowLoggerContext
343
+ ? FlowLogger_js_1.FlowLogger.logCdpCallEvent(flowLoggerContext, {
344
+ method,
345
+ params,
346
+ targetId,
347
+ })
348
+ : null;
349
+ if (flowLoggerContext && cdpCallEvent) {
350
+ this.latestCdpCallEvent.set(sessionId, {
351
+ flowLoggerContext,
352
+ cdpCallEvent,
353
+ });
354
+ }
205
355
  const p = new Promise((resolve, reject) => {
206
356
  this.inflight.set(id, {
207
357
  resolve,
@@ -211,12 +361,22 @@ class CdpConnection {
211
361
  params,
212
362
  stack,
213
363
  ts: Date.now(),
364
+ flowLoggerContext,
365
+ cdpCallEvent,
214
366
  });
215
367
  });
216
368
  // Prevent unhandledRejection if a session detaches before the caller awaits.
217
369
  void p.catch(() => { });
218
- const targetId = this.sessionToTarget.get(sessionId) ?? null;
219
- this.cdpLogger?.({ method, params, targetId });
370
+ for (const waiter of Array.from(this.sessionDispatchWaiters)) {
371
+ if (waiter.sessionId !== sessionId)
372
+ continue;
373
+ if (waiter.method !== method)
374
+ continue;
375
+ if (waiter.match && !waiter.match(params))
376
+ continue;
377
+ waiter.resolve();
378
+ break;
379
+ }
220
380
  this.ws.send(JSON.stringify(payload));
221
381
  return p;
222
382
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cdp.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/cdp.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/cdp.ts\nimport WebSocket from \"ws\";\nimport type { Protocol } from \"devtools-protocol\";\nimport { STAGEHAND_VERSION } from \"../../version.js\";\nimport { CdpConnectionClosedError } from \"../types/public/sdkErrors.js\";\n\n/**\n * CDP transport & session multiplexer\n *\n * Owns the browser WebSocket and multiplexes flattened Target sessions.\n * Tracks inflight CDP calls, routes responses to the right session, and forwards events.\n *\n * This does not interpret Page/DOM/Runtime semantics — callers own that logic.\n */\nexport interface CDPSessionLike {\n send<R = unknown>(method: string, params?: object): Promise<R>;\n on<P = unknown>(event: string, handler: (params: P) => void): void;\n off<P = unknown>(event: string, handler: (params: P) => void): void;\n close(): Promise<void>;\n readonly id: string | null;\n}\n\ntype Inflight = {\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n sessionId?: string | null;\n method: string;\n params?: object;\n stack?: string;\n ts: number;\n};\n\ntype EventHandler = (params: unknown) => void;\n\ntype RawMessage =\n | {\n id: number;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n sessionId?: string;\n }\n | { method: string; params?: unknown; sessionId?: string };\n\nexport class CdpConnection implements CDPSessionLike {\n private ws: WebSocket;\n private nextId = 1;\n private inflight = new Map<number, Inflight>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private sessions = new Map<string, CdpSession>();\n /** Maps sessionId -> targetId (1:1 mapping) */\n private sessionToTarget = new Map<string, string>();\n public readonly id: string | null = null; // root\n private transportCloseHandlers = new Set<(why: string) => void>();\n\n /** Optional CDP logger - set this to receive all outgoing CDP method calls */\n public cdpLogger?: (info: {\n method: string;\n params?: object;\n targetId?: string | null;\n }) => void;\n\n /** Optional CDP event logger - set this to receive all incoming CDP events */\n public cdpEventLogger?: (info: {\n method: string;\n params?: unknown;\n targetId?: string | null;\n }) => void;\n\n public onTransportClosed(handler: (why: string) => void): void {\n this.transportCloseHandlers.add(handler);\n }\n public offTransportClosed(handler: (why: string) => void): void {\n this.transportCloseHandlers.delete(handler);\n }\n\n private emitTransportClosed(why: string) {\n for (const h of this.transportCloseHandlers) {\n try {\n h(why);\n } catch {\n //\n }\n }\n }\n\n private constructor(ws: WebSocket) {\n this.ws = ws;\n this.ws.on(\"close\", (code, reason) => {\n // Reason is a Buffer in ws; stringify defensively\n const why = `socket-close code=${code} reason=${String(reason || \"\")}`;\n this.rejectAllInflight(why);\n this.emitTransportClosed(why);\n });\n\n this.ws.on(\"error\", (err) => {\n const why = `socket-error ${err?.message ?? String(err)}`;\n this.rejectAllInflight(why);\n this.emitTransportClosed(why);\n });\n this.ws.on(\"message\", (data) => this.onMessage(data.toString()));\n }\n\n static async connect(wsUrl: string): Promise<CdpConnection> {\n // Include User-Agent header for server-side observability and version tracking\n const ws = new WebSocket(wsUrl, {\n headers: {\n \"User-Agent\": `Stagehand/${STAGEHAND_VERSION}`,\n },\n });\n await new Promise<void>((resolve, reject) => {\n ws.once(\"open\", () => resolve());\n ws.once(\"error\", (e) => reject(e));\n });\n return new CdpConnection(ws);\n }\n\n async enableAutoAttach(): Promise<void> {\n await this.send(\"Target.setAutoAttach\", {\n autoAttach: true,\n flatten: true,\n waitForDebuggerOnStart: true,\n });\n await this.send(\"Target.setDiscoverTargets\", { discover: true });\n }\n\n async send<R = unknown>(method: string, params?: object): Promise<R> {\n const id = this.nextId++;\n const payload = { id, method, params };\n const stack = new Error().stack?.split(\"\\n\").slice(1, 4).join(\"\\n\");\n const p = new Promise<R>((resolve, reject) => {\n this.inflight.set(id, {\n resolve,\n reject,\n sessionId: null,\n method,\n params,\n stack,\n ts: Date.now(),\n });\n });\n // Prevent unhandledRejection if a session detaches before the caller awaits.\n void p.catch(() => {});\n this.cdpLogger?.({ method, params, targetId: null });\n this.ws.send(JSON.stringify(payload));\n return p;\n }\n\n on<P = unknown>(event: string, handler: (params: P) => void): void {\n const set = this.eventHandlers.get(event) ?? new Set<EventHandler>();\n set.add(handler as EventHandler);\n this.eventHandlers.set(event, set);\n }\n\n off<P = unknown>(event: string, handler: (params: P) => void): void {\n const set = this.eventHandlers.get(event);\n if (set) set.delete(handler as EventHandler);\n }\n\n async close(): Promise<void> {\n if (this.ws.readyState === WebSocket.CLOSED) return;\n await new Promise<void>((resolve) => {\n this.ws.once(\"close\", () => resolve());\n this.ws.close();\n });\n }\n\n private rejectAllInflight(why: string): void {\n for (const [id, entry] of this.inflight.entries()) {\n entry.reject(new CdpConnectionClosedError(why));\n this.inflight.delete(id);\n }\n }\n\n getSession(sessionId: string): CdpSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n async attachToTarget(targetId: string): Promise<CdpSession> {\n const { sessionId } = (await this.send<{ sessionId: string }>(\n \"Target.attachToTarget\",\n { targetId, flatten: true },\n )) as { sessionId: string };\n\n let session = this.sessions.get(sessionId);\n if (!session) {\n session = new CdpSession(this, sessionId);\n this.sessions.set(sessionId, session);\n }\n this.sessionToTarget.set(sessionId, targetId);\n return session;\n }\n\n async getTargets(): Promise<Protocol.Target.TargetInfo[]> {\n const res = await this.send<{\n targetInfos: Protocol.Target.TargetInfo[];\n }>(\"Target.getTargets\");\n return res.targetInfos;\n }\n\n private onMessage(json: string): void {\n const msg = JSON.parse(json) as RawMessage;\n\n if (\"id\" in msg) {\n const rec = this.inflight.get(msg.id);\n if (!rec) return;\n\n this.inflight.delete(msg.id);\n\n if (\"error\" in msg && msg.error) {\n rec.reject(new Error(`${msg.error.code} ${msg.error.message}`));\n } else {\n rec.resolve((msg as { result?: unknown }).result);\n }\n return;\n }\n\n if (\"method\" in msg) {\n if (msg.method === \"Target.attachedToTarget\") {\n const p = (msg as { params: Protocol.Target.AttachedToTargetEvent })\n .params;\n if (!this.sessions.has(p.sessionId)) {\n this.sessions.set(p.sessionId, new CdpSession(this, p.sessionId));\n }\n this.sessionToTarget.set(p.sessionId, p.targetInfo.targetId);\n } else if (msg.method === \"Target.detachedFromTarget\") {\n const p = (msg as { params: Protocol.Target.DetachedFromTargetEvent })\n .params;\n for (const [id, entry] of this.inflight.entries()) {\n if (entry.sessionId === p.sessionId) {\n entry.reject(new Error(\"CDP session detached\"));\n this.inflight.delete(id);\n }\n }\n this.sessions.delete(p.sessionId);\n this.sessionToTarget.delete(p.sessionId);\n } else if (msg.method === \"Target.targetDestroyed\") {\n const p = (msg as { params: { targetId: string } }).params;\n // Remove any session mapping for this target\n for (const [sessionId, targetId] of this.sessionToTarget.entries()) {\n if (targetId === p.targetId) {\n this.sessionToTarget.delete(sessionId);\n break;\n }\n }\n }\n\n const { method, params, sessionId } = msg;\n\n // Log incoming CDP events\n const targetId = this.sessionToTarget.get(sessionId) || sessionId;\n this.cdpEventLogger?.({ method, params, targetId });\n\n if (sessionId) {\n const session = this.sessions.get(sessionId);\n session?.dispatch(method, params);\n } else {\n const handlers = this.eventHandlers.get(method);\n if (handlers) for (const h of handlers) h(params);\n }\n }\n }\n\n _sendViaSession<R = unknown>(\n sessionId: string,\n method: string,\n params?: object,\n ): Promise<R> {\n const id = this.nextId++;\n const payload = { id, method, params, sessionId };\n const stack = new Error().stack?.split(\"\\n\").slice(1, 4).join(\"\\n\");\n\n const p = new Promise<R>((resolve, reject) => {\n this.inflight.set(id, {\n resolve,\n reject,\n sessionId,\n method,\n params,\n stack,\n ts: Date.now(),\n });\n });\n // Prevent unhandledRejection if a session detaches before the caller awaits.\n void p.catch(() => {});\n const targetId = this.sessionToTarget.get(sessionId) ?? null;\n this.cdpLogger?.({ method, params, targetId });\n this.ws.send(JSON.stringify(payload));\n return p;\n }\n\n _onSessionEvent(\n sessionId: string,\n event: string,\n handler: EventHandler,\n ): void {\n const key = `${sessionId}:${event}`;\n const set = this.eventHandlers.get(key) ?? new Set<EventHandler>();\n set.add(handler);\n this.eventHandlers.set(key, set);\n }\n\n _offSessionEvent(\n sessionId: string,\n event: string,\n handler: EventHandler,\n ): void {\n const key = `${sessionId}:${event}`;\n const set = this.eventHandlers.get(key);\n if (set) set.delete(handler);\n }\n\n _dispatchToSession(sessionId: string, event: string, params: unknown): void {\n const key = `${sessionId}:${event}`;\n const handlers = this.eventHandlers.get(key);\n if (handlers) for (const h of handlers) h(params);\n }\n}\n\nexport class CdpSession implements CDPSessionLike {\n constructor(\n private readonly root: CdpConnection,\n public readonly id: string,\n ) {}\n\n send<R = unknown>(method: string, params?: object): Promise<R> {\n return this.root._sendViaSession<R>(this.id, method, params);\n }\n\n on<P = unknown>(event: string, handler: (params: P) => void): void {\n this.root._onSessionEvent(this.id, event, handler as EventHandler);\n }\n\n off<P = unknown>(event: string, handler: (params: P) => void): void {\n this.root._offSessionEvent(this.id, event, handler as EventHandler);\n }\n\n async close(): Promise<void> {\n await this.root.send<void>(\"Target.detachFromTarget\", {\n sessionId: this.id,\n });\n }\n\n dispatch(event: string, params: unknown): void {\n this.root._dispatchToSession(this.id, event, params);\n }\n}\n"]}
1
+ {"version":3,"file":"cdp.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/cdp.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/cdp.ts\nimport WebSocket from \"ws\";\nimport type { Protocol } from \"devtools-protocol\";\nimport { STAGEHAND_VERSION } from \"../../version.js\";\nimport {\n FlowLogger,\n type FlowEvent,\n type FlowLoggerContext,\n} from \"../flowlogger/FlowLogger.js\";\nimport {\n CdpConnectionClosedError,\n PageNotFoundError,\n} from \"../types/public/sdkErrors.js\";\n\n/**\n * CDP transport & session multiplexer\n *\n * Owns the browser WebSocket and multiplexes flattened Target sessions.\n * Tracks inflight CDP calls, routes responses to the right session, and forwards events.\n *\n * This does not interpret Page/DOM/Runtime semantics — callers own that logic.\n */\nexport interface CDPSessionLike {\n send<R = unknown>(method: string, params?: object): Promise<R>;\n on<P = unknown>(event: string, handler: (params: P) => void): void;\n off<P = unknown>(event: string, handler: (params: P) => void): void;\n close(): Promise<void>;\n readonly id: string | null;\n}\n\ntype Inflight = {\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n sessionId?: string | null;\n method: string;\n params?: object;\n stack?: string;\n ts: number;\n flowLoggerContext?: FlowLoggerContext | null; // Snapshot of the flow context captured when the request was sent; response handling re-enters this if ALS is gone.\n cdpCallEvent?: Pick<FlowEvent, \"eventId\" | \"eventParentIds\"> | null; // The emitted CdpCallEvent identity; later response/error events attach under this exact parent.\n};\n\ntype EventHandler = (params: unknown) => void;\ntype SessionDispatchWaiter = {\n sessionId: string;\n method: string;\n match?: (params?: object) => boolean;\n resolve: () => void;\n reject: (error: Error) => void;\n};\n\ntype RawMessage =\n | {\n id: number;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n sessionId?: string;\n }\n | { method: string; params?: unknown; sessionId?: string };\n\nexport class CdpConnection implements CDPSessionLike {\n private ws: WebSocket;\n private nextId = 1;\n private inflight = new Map<number, Inflight>(); // Outstanding request records; `_sendViaSession()` inserts and `onMessage()` removes/resolves them.\n private latestCdpCallEvent = new Map<\n // Most recent CDP call per session/root; `_sendViaSession()` refreshes it and later unsolicited messages reuse it as their parent anchor.\n string | null,\n {\n flowLoggerContext: FlowLoggerContext; // Flow context captured when the latest call on this session/root was emitted.\n cdpCallEvent: Pick<FlowEvent, \"eventId\" | \"eventParentIds\">; // Identity of that latest call event; unsolicited messages reuse it as their parent.\n }\n >();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private sessions = new Map<string, CdpSession>();\n /** Maps sessionId -> targetId (1:1 mapping) */\n private sessionToTarget = new Map<string, string>();\n private sessionDispatchWaiters = new Set<SessionDispatchWaiter>();\n public readonly id: string | null = null; // root\n private transportCloseHandlers = new Set<(why: string) => void>();\n\n public flowLoggerContext?: FlowLoggerContext; // Instance-owned fallback flow context; V3 sets this once and later sends/callbacks re-enter it when ALS is absent.\n\n public onTransportClosed(handler: (why: string) => void): void {\n this.transportCloseHandlers.add(handler);\n }\n public offTransportClosed(handler: (why: string) => void): void {\n this.transportCloseHandlers.delete(handler);\n }\n\n private emitTransportClosed(why: string) {\n for (const h of this.transportCloseHandlers) {\n try {\n h(why);\n } catch {\n //\n }\n }\n }\n\n private constructor(ws: WebSocket) {\n this.ws = ws;\n this.ws.on(\"close\", (code, reason) => {\n // Reason is a Buffer in ws; stringify defensively\n const why = `socket-close code=${code} reason=${String(reason || \"\")}`;\n this.rejectAllInflight(why);\n this.emitTransportClosed(why);\n });\n\n this.ws.on(\"error\", (err) => {\n const why = `socket-error ${err?.message ?? String(err)}`;\n this.rejectAllInflight(why);\n this.emitTransportClosed(why);\n });\n this.ws.on(\"message\", (data) => this.onMessage(data.toString()));\n }\n\n static async connect(\n wsUrl: string,\n options?: { headers?: Record<string, string> },\n ): Promise<CdpConnection> {\n // Include User-Agent header for server-side observability and version tracking\n // Merge user-provided headers, letting them override defaults\n const headers = {\n \"User-Agent\": `Stagehand/${STAGEHAND_VERSION}`,\n ...options?.headers,\n };\n const ws = new WebSocket(wsUrl, { headers });\n await new Promise<void>((resolve, reject) => {\n ws.once(\"open\", () => resolve());\n ws.once(\"error\", (e) => reject(e));\n });\n return new CdpConnection(ws);\n }\n\n async enableAutoAttach(): Promise<void> {\n await this.send(\"Target.setAutoAttach\", {\n autoAttach: true,\n flatten: true,\n waitForDebuggerOnStart: true,\n });\n await this.send(\"Target.setDiscoverTargets\", { discover: true });\n }\n\n async send<R = unknown>(method: string, params?: object): Promise<R> {\n const id = this.nextId++;\n const payload = { id, method, params };\n const stack = new Error().stack?.split(\"\\n\").slice(1, 4).join(\"\\n\");\n const flowLoggerContext = FlowLogger.resolveContext(this.flowLoggerContext);\n const cdpCallEvent = flowLoggerContext\n ? FlowLogger.logCdpCallEvent(flowLoggerContext, {\n method,\n params,\n targetId: null,\n })\n : null;\n if (flowLoggerContext && cdpCallEvent) {\n this.latestCdpCallEvent.set(null, {\n flowLoggerContext,\n cdpCallEvent,\n });\n }\n const p = new Promise<R>((resolve, reject) => {\n this.inflight.set(id, {\n resolve,\n reject,\n sessionId: null,\n method,\n params,\n stack,\n ts: Date.now(),\n flowLoggerContext,\n cdpCallEvent,\n });\n });\n // Prevent unhandledRejection if a session detaches before the caller awaits.\n void p.catch(() => {});\n this.ws.send(JSON.stringify(payload));\n return p;\n }\n\n on<P = unknown>(event: string, handler: (params: P) => void): void {\n const set = this.eventHandlers.get(event) ?? new Set<EventHandler>();\n set.add(handler as EventHandler);\n this.eventHandlers.set(event, set);\n }\n\n off<P = unknown>(event: string, handler: (params: P) => void): void {\n const set = this.eventHandlers.get(event);\n if (set) set.delete(handler as EventHandler);\n }\n\n async close(): Promise<void> {\n if (this.ws.readyState === WebSocket.CLOSED) return;\n await new Promise<void>((resolve) => {\n this.ws.once(\"close\", () => resolve());\n this.ws.close();\n });\n }\n\n private rejectAllInflight(why: string): void {\n for (const [id, entry] of this.inflight.entries()) {\n entry.reject(new CdpConnectionClosedError(why));\n this.inflight.delete(id);\n }\n this.latestCdpCallEvent.clear();\n for (const waiter of Array.from(this.sessionDispatchWaiters)) {\n waiter.reject(new CdpConnectionClosedError(why));\n }\n }\n\n getSession(sessionId: string): CdpSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n waitForSessionDispatch(\n sessionId: string,\n method: string,\n match?: (params?: object) => boolean,\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const waiter: SessionDispatchWaiter = {\n sessionId,\n method,\n match,\n resolve: () => {\n this.sessionDispatchWaiters.delete(waiter);\n resolve();\n },\n reject: (error: Error) => {\n this.sessionDispatchWaiters.delete(waiter);\n reject(error);\n },\n };\n this.sessionDispatchWaiters.add(waiter);\n });\n }\n\n async attachToTarget(targetId: string): Promise<CdpSession> {\n const { sessionId } = (await this.send<{ sessionId: string }>(\n \"Target.attachToTarget\",\n { targetId, flatten: true },\n )) as { sessionId: string };\n\n let session = this.sessions.get(sessionId);\n if (!session) {\n session = new CdpSession(this, sessionId);\n this.sessions.set(sessionId, session);\n }\n this.sessionToTarget.set(sessionId, targetId);\n return session;\n }\n\n async getTargets(): Promise<Protocol.Target.TargetInfo[]> {\n const res = await this.send<{\n targetInfos: Protocol.Target.TargetInfo[];\n }>(\"Target.getTargets\");\n return res.targetInfos;\n }\n\n private onMessage(json: string): void {\n const msg = JSON.parse(json) as RawMessage;\n\n if (\"id\" in msg) {\n const rec = this.inflight.get(msg.id);\n if (!rec) return;\n\n this.inflight.delete(msg.id);\n\n if (\"error\" in msg && msg.error) {\n // Response/error events only make sense if the original send captured\n // both a flow context to re-enter and the emitted CdpCallEvent to hang\n // the terminal edge under.\n if (rec.flowLoggerContext && rec.cdpCallEvent) {\n let targetId: string | null;\n if (rec.sessionId) {\n const mappedTargetId = this.sessionToTarget.get(rec.sessionId);\n if (mappedTargetId) {\n targetId = mappedTargetId;\n } else {\n targetId = rec.sessionId;\n }\n } else {\n targetId = null;\n }\n FlowLogger.logCdpResponseEvent(\n rec.flowLoggerContext,\n rec.cdpCallEvent,\n {\n method: rec.method,\n error: `${msg.error.code} ${msg.error.message}`,\n targetId,\n },\n );\n }\n rec.reject(new Error(`${msg.error.code} ${msg.error.message}`));\n } else {\n // Successful responses reuse the same cached call context so the\n // response lands under the exact CdpCallEvent emitted at send time.\n if (rec.flowLoggerContext && rec.cdpCallEvent) {\n let targetId: string | null;\n if (rec.sessionId) {\n const mappedTargetId = this.sessionToTarget.get(rec.sessionId);\n if (mappedTargetId) {\n targetId = mappedTargetId;\n } else {\n targetId = rec.sessionId;\n }\n } else {\n targetId = null;\n }\n FlowLogger.logCdpResponseEvent(\n rec.flowLoggerContext,\n rec.cdpCallEvent,\n {\n method: rec.method,\n result: (msg as { result?: unknown }).result,\n targetId,\n },\n );\n }\n rec.resolve((msg as { result?: unknown }).result);\n }\n return;\n }\n\n if (\"method\" in msg) {\n if (msg.method === \"Target.attachedToTarget\") {\n const p = (msg as { params: Protocol.Target.AttachedToTargetEvent })\n .params;\n if (!this.sessions.has(p.sessionId)) {\n this.sessions.set(p.sessionId, new CdpSession(this, p.sessionId));\n }\n this.sessionToTarget.set(p.sessionId, p.targetInfo.targetId);\n } else if (msg.method === \"Target.detachedFromTarget\") {\n const p = (msg as { params: Protocol.Target.DetachedFromTargetEvent })\n .params;\n for (const [id, entry] of this.inflight.entries()) {\n if (entry.sessionId === p.sessionId) {\n entry.reject(\n new PageNotFoundError(\n `target closed before CDP response (sessionId=${p.sessionId}, targetId=${p.targetId})`,\n ),\n );\n this.inflight.delete(id);\n }\n }\n for (const waiter of Array.from(this.sessionDispatchWaiters)) {\n if (waiter.sessionId === p.sessionId) {\n waiter.reject(\n new PageNotFoundError(\n `target closed before CDP send (sessionId=${p.sessionId}, targetId=${p.targetId})`,\n ),\n );\n }\n }\n this.sessions.delete(p.sessionId);\n this.sessionToTarget.delete(p.sessionId);\n this.latestCdpCallEvent.delete(p.sessionId);\n } else if (msg.method === \"Target.targetDestroyed\") {\n const p = (msg as { params: { targetId: string } }).params;\n // Remove any session mapping for this target\n for (const [sessionId, targetId] of this.sessionToTarget.entries()) {\n if (targetId === p.targetId) {\n this.sessionToTarget.delete(sessionId);\n this.latestCdpCallEvent.delete(sessionId);\n break;\n }\n }\n }\n\n const { method, params, sessionId } = msg;\n const latestCdpCallEvent =\n this.latestCdpCallEvent.get(sessionId ?? null) ??\n (sessionId ? this.latestCdpCallEvent.get(null) : null);\n let targetId: string | null;\n if (sessionId) {\n const mappedTargetId = this.sessionToTarget.get(sessionId);\n if (mappedTargetId) {\n targetId = mappedTargetId;\n } else {\n targetId = sessionId;\n }\n } else {\n targetId = null;\n }\n\n // Unsolicited protocol messages are attached under the most recent call on\n // that session/root when one is known, so later callbacks still show up\n // in the same flow subtree.\n if (latestCdpCallEvent) {\n FlowLogger.logCdpMessageEvent(\n latestCdpCallEvent.flowLoggerContext,\n latestCdpCallEvent.cdpCallEvent,\n {\n method,\n params,\n targetId,\n },\n );\n }\n\n const dispatch = () => {\n if (sessionId) {\n const session = this.sessions.get(sessionId);\n session?.dispatch(method, params);\n\n // Forward target lifecycle events to root listeners as well.\n // Some browsers emit these via a parent session rather than the root\n // connection; fan-out keeps target tracking consistent.\n if (method.startsWith(\"Target.\")) {\n const handlers = this.eventHandlers.get(method);\n if (handlers) for (const h of handlers) h(params);\n }\n return;\n }\n\n const handlers = this.eventHandlers.get(method);\n if (handlers) for (const h of handlers) h(params);\n };\n\n if (latestCdpCallEvent) {\n FlowLogger.withContext(latestCdpCallEvent.flowLoggerContext, dispatch);\n } else {\n dispatch();\n }\n }\n }\n\n _sendViaSession<R = unknown>(\n sessionId: string,\n method: string,\n params?: object,\n ): Promise<R> {\n const id = this.nextId++;\n const payload = { id, method, params, sessionId };\n const stack = new Error().stack?.split(\"\\n\").slice(1, 4).join(\"\\n\");\n const flowLoggerContext = FlowLogger.resolveContext(this.flowLoggerContext);\n let targetId: string | null;\n const mappedTargetId = this.sessionToTarget.get(sessionId);\n if (mappedTargetId) {\n targetId = mappedTargetId;\n } else {\n targetId = null;\n }\n const cdpCallEvent = flowLoggerContext\n ? FlowLogger.logCdpCallEvent(flowLoggerContext, {\n method,\n params,\n targetId,\n })\n : null;\n if (flowLoggerContext && cdpCallEvent) {\n this.latestCdpCallEvent.set(sessionId, {\n flowLoggerContext,\n cdpCallEvent,\n });\n }\n\n const p = new Promise<R>((resolve, reject) => {\n this.inflight.set(id, {\n resolve,\n reject,\n sessionId,\n method,\n params,\n stack,\n ts: Date.now(),\n flowLoggerContext,\n cdpCallEvent,\n });\n });\n // Prevent unhandledRejection if a session detaches before the caller awaits.\n void p.catch(() => {});\n for (const waiter of Array.from(this.sessionDispatchWaiters)) {\n if (waiter.sessionId !== sessionId) continue;\n if (waiter.method !== method) continue;\n if (waiter.match && !waiter.match(params)) continue;\n waiter.resolve();\n break;\n }\n this.ws.send(JSON.stringify(payload));\n return p;\n }\n\n _onSessionEvent(\n sessionId: string,\n event: string,\n handler: EventHandler,\n ): void {\n const key = `${sessionId}:${event}`;\n const set = this.eventHandlers.get(key) ?? new Set<EventHandler>();\n set.add(handler);\n this.eventHandlers.set(key, set);\n }\n\n _offSessionEvent(\n sessionId: string,\n event: string,\n handler: EventHandler,\n ): void {\n const key = `${sessionId}:${event}`;\n const set = this.eventHandlers.get(key);\n if (set) set.delete(handler);\n }\n\n _dispatchToSession(sessionId: string, event: string, params: unknown): void {\n const key = `${sessionId}:${event}`;\n const handlers = this.eventHandlers.get(key);\n if (handlers) for (const h of handlers) h(params);\n }\n}\n\nexport class CdpSession implements CDPSessionLike {\n constructor(\n private readonly root: CdpConnection,\n public readonly id: string,\n ) {}\n\n send<R = unknown>(method: string, params?: object): Promise<R> {\n return this.root._sendViaSession<R>(this.id, method, params);\n }\n\n on<P = unknown>(event: string, handler: (params: P) => void): void {\n this.root._onSessionEvent(this.id, event, handler as EventHandler);\n }\n\n off<P = unknown>(event: string, handler: (params: P) => void): void {\n this.root._offSessionEvent(this.id, event, handler as EventHandler);\n }\n\n async close(): Promise<void> {\n await this.root.send<void>(\"Target.detachFromTarget\", {\n sessionId: this.id,\n });\n }\n\n dispatch(event: string, params: unknown): void {\n this.root._dispatchToSession(this.id, event, params);\n }\n}\n"]}
@@ -45,6 +45,7 @@ export declare class V3Context {
45
45
  env?: "LOCAL" | "BROWSERBASE";
46
46
  apiClient?: StagehandAPIClient | null;
47
47
  localBrowserLaunchOptions?: LocalBrowserLaunchOptions | null;
48
+ cdpHeaders?: Record<string, string>;
48
49
  }): Promise<V3Context>;
49
50
  private hasTopLevelPage;
50
51
  private ensureFirstTopLevelPage;