@browserbasehq/orca 3.0.9-alpha-4 → 3.1.0-patch.1
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.
- package/dist/cjs/cli.js +183 -0
- package/dist/cjs/cli.js.map +7 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +24956 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/lib/inference.d.ts +65 -0
- package/dist/cjs/lib/inferenceLogUtils.d.ts +12 -0
- package/dist/cjs/lib/logger.d.ts +69 -0
- package/dist/cjs/lib/modelUtils.d.ts +11 -0
- package/dist/cjs/lib/prompt.d.ts +14 -0
- package/dist/cjs/lib/utils.d.ts +68 -0
- package/dist/cjs/lib/v3/agent/AgentClient.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/AgentProvider.d.ts +20 -0
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +57 -0
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.d.ts +74 -0
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.d.ts +71 -0
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +69 -0
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/tools/click.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/clickAndHold.d.ts +14 -0
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.d.ts +7 -0
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +20 -0
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/goto.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +92 -0
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +24 -0
- package/dist/cjs/lib/v3/agent/tools/navback.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/scroll.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/tools/search.d.ts +15 -0
- package/dist/cjs/lib/v3/agent/tools/think.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/type.d.ts +7 -0
- package/dist/cjs/lib/v3/agent/tools/wait.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/utils/actionMapping.d.ts +3 -0
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.d.ts +13 -0
- package/dist/cjs/lib/v3/agent/utils/cuaKeyMapping.d.ts +10 -0
- package/dist/cjs/lib/v3/agent/utils/googleCustomToolHandler.d.ts +25 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.d.ts +22 -0
- package/dist/cjs/lib/v3/agent/utils/imageCompression.d.ts +53 -0
- package/dist/cjs/lib/v3/agent/utils/messageProcessing.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/utils/screenshotHandler.d.ts +10 -0
- package/dist/cjs/lib/v3/agent/utils/validateExperimentalFeatures.d.ts +26 -0
- package/dist/cjs/lib/v3/agent/utils/xpath.d.ts +11 -0
- package/dist/cjs/lib/v3/api.d.ts +86 -0
- package/dist/cjs/lib/v3/cache/ActCache.d.ts +23 -0
- package/dist/cjs/lib/v3/cache/AgentCache.d.ts +109 -0
- package/dist/cjs/lib/v3/cache/CacheStorage.d.ts +17 -0
- package/dist/cjs/lib/v3/cache/serverAgentCache.d.ts +7 -0
- package/dist/cjs/lib/v3/cache/utils.d.ts +15 -0
- package/dist/cjs/lib/v3/cli.d.ts +2 -0
- package/dist/cjs/lib/v3/dom/a11yScripts/index.d.ts +11 -0
- package/dist/cjs/lib/v3/dom/build/a11yScripts.generated.d.ts +16 -0
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.d.ts +52 -0
- package/dist/cjs/lib/v3/dom/build/reRenderScriptContent.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/build/rerender-index.d.ts +0 -0
- package/dist/cjs/lib/v3/dom/build/rerender-index.js +1 -0
- package/dist/cjs/lib/v3/dom/build/screenshotScripts.generated.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/build/scriptV3Content.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/build/v3-index.d.ts +0 -0
- package/dist/cjs/lib/v3/dom/build/v3-index.js +1 -0
- package/dist/cjs/lib/v3/dom/genA11yScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genDomScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genLocatorScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genScreenshotScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/index.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/counts.d.ts +15 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/index.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/scripts.d.ts +37 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/selectors.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/waitForSelector.d.ts +19 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathParser.d.ts +76 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.d.ts +9 -0
- package/dist/cjs/lib/v3/dom/piercer.entry.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/piercer.runtime.d.ts +23 -0
- package/dist/cjs/lib/v3/dom/rerenderMissingShadows.entry.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/rerenderMissingShadows.runtime.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/screenshotScripts/index.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/screenshotScripts/resolveMaskRect.d.ts +8 -0
- package/dist/cjs/lib/v3/external_clients/aisdk.d.ts +11 -0
- package/dist/cjs/lib/v3/external_clients/customOpenAI.d.ts +18 -0
- package/dist/cjs/lib/v3/flowLogger.d.ts +139 -0
- package/dist/cjs/lib/v3/handlers/actHandler.d.ts +21 -0
- package/dist/cjs/lib/v3/handlers/extractHandler.d.ts +31 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +24 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/timeoutGuard.d.ts +2 -0
- package/dist/cjs/lib/v3/handlers/observeHandler.d.ts +17 -0
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +32 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +33 -0
- package/dist/cjs/lib/v3/index.d.ts +18 -0
- package/dist/cjs/lib/v3/launch/browserbase.d.ts +7 -0
- package/dist/cjs/lib/v3/launch/local.d.ts +15 -0
- package/dist/cjs/lib/v3/llm/AnthropicClient.d.ts +16 -0
- package/dist/cjs/lib/v3/llm/CerebrasClient.d.ts +17 -0
- package/dist/cjs/lib/v3/llm/GoogleClient.d.ts +19 -0
- package/dist/cjs/lib/v3/llm/GroqClient.d.ts +17 -0
- package/dist/cjs/lib/v3/llm/LLMClient.d.ts +121 -0
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +13 -0
- package/dist/cjs/lib/v3/llm/OpenAIClient.d.ts +15 -0
- package/dist/cjs/lib/v3/llm/aisdk.d.ts +15 -0
- package/dist/cjs/lib/v3/logger.d.ts +9 -0
- package/dist/cjs/lib/v3/mcp/connection.d.ts +11 -0
- package/dist/cjs/lib/v3/mcp/utils.d.ts +3 -0
- package/dist/cjs/lib/v3/shutdown/cleanupLocal.d.ts +14 -0
- package/dist/cjs/lib/v3/shutdown/supervisor.d.ts +11 -0
- package/dist/cjs/lib/v3/shutdown/supervisorClient.d.ts +15 -0
- package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js +113 -0
- package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js +102 -0
- package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +374 -0
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js +354 -0
- package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js +247 -0
- package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js +105 -0
- package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-streaming.spec.js +126 -0
- package/dist/cjs/lib/v3/tests/agent-streaming.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js +44 -0
- package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/click-count.spec.js +147 -0
- package/dist/cjs/lib/v3/tests/click-count.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js +54 -0
- package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +176 -0
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js +53 -0
- package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/downloads.spec.js +80 -0
- package/dist/cjs/lib/v3/tests/downloads.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js +53 -0
- package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js +493 -0
- package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.child.js +92 -0
- package/dist/cjs/lib/v3/tests/keep-alive.child.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.helpers.js +568 -0
- package/dist/cjs/lib/v3/tests/keep-alive.helpers.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.spec.js +15 -0
- package/dist/cjs/lib/v3/tests/keep-alive.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keyboard.spec.js +296 -0
- package/dist/cjs/lib/v3/tests/keyboard.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js +159 -0
- package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +191 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js +108 -0
- package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-count.spec.js +71 -0
- package/dist/cjs/lib/v3/tests/locator-count.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js +118 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +136 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-nth.spec.js +157 -0
- package/dist/cjs/lib/v3/tests/locator-nth.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +242 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/logger-initialization.spec.js +547 -0
- package/dist/cjs/lib/v3/tests/logger-initialization.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js +269 -0
- package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/nested-div.spec.js +23 -0
- package/dist/cjs/lib/v3/tests/nested-div.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +90 -0
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-console.spec.js +56 -0
- package/dist/cjs/lib/v3/tests/page-console.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js +418 -0
- package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-goto-response.spec.js +35 -0
- package/dist/cjs/lib/v3/tests/page-goto-response.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-hover.spec.js +167 -0
- package/dist/cjs/lib/v3/tests/page-hover.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-screenshot.spec.js +295 -0
- package/dist/cjs/lib/v3/tests/page-screenshot.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-scroll.spec.js +182 -0
- package/dist/cjs/lib/v3/tests/page-scroll.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js +46 -0
- package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js +98 -0
- package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/setinputfiles.spec.js +148 -0
- package/dist/cjs/lib/v3/tests/setinputfiles.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js +156 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js +156 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/testUtils.js +54 -0
- package/dist/cjs/lib/v3/tests/testUtils.js.map +7 -0
- package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js +100 -0
- package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/timeouts.spec.js +32 -0
- package/dist/cjs/lib/v3/tests/timeouts.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/user-data-dir.spec.js +65 -0
- package/dist/cjs/lib/v3/tests/user-data-dir.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.config.js +36 -0
- package/dist/cjs/lib/v3/tests/v3.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.dynamic.config.js +67 -0
- package/dist/cjs/lib/v3/tests/v3.dynamic.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.playwright.config.js +61 -0
- package/dist/cjs/lib/v3/tests/v3.playwright.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js +593 -0
- package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js +97 -0
- package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js +77 -0
- package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js.map +7 -0
- package/dist/cjs/lib/v3/timeoutConfig.d.ts +2 -0
- package/dist/cjs/lib/v3/types/private/agent.d.ts +6 -0
- package/dist/cjs/lib/v3/types/private/api.d.ts +11 -0
- package/dist/cjs/lib/v3/types/private/cache.d.ts +128 -0
- package/dist/cjs/lib/v3/types/private/evaluator.d.ts +40 -0
- package/dist/cjs/lib/v3/types/private/handlers.d.ts +38 -0
- package/dist/cjs/lib/v3/types/private/index.d.ts +7 -0
- package/dist/cjs/lib/v3/types/private/internal.d.ts +39 -0
- package/dist/cjs/lib/v3/types/private/locator.d.ts +9 -0
- package/dist/cjs/lib/v3/types/private/network.d.ts +34 -0
- package/dist/cjs/lib/v3/types/private/shutdown.d.ts +19 -0
- package/dist/cjs/lib/v3/types/private/shutdownErrors.d.ts +12 -0
- package/dist/cjs/lib/v3/types/private/snapshot.d.ts +117 -0
- package/dist/cjs/lib/v3/types/public/agent.d.ts +595 -0
- package/dist/cjs/lib/v3/types/public/api.d.ts +1211 -0
- package/dist/cjs/lib/v3/types/public/apiErrors.d.ts +18 -0
- package/dist/cjs/lib/v3/types/public/index.d.ts +12 -0
- package/dist/cjs/lib/v3/types/public/locator.d.ts +9 -0
- package/dist/cjs/lib/v3/types/public/logs.d.ts +23 -0
- package/dist/cjs/lib/v3/types/public/methods.d.ts +56 -0
- package/dist/cjs/lib/v3/types/public/metrics.d.ts +27 -0
- package/dist/cjs/lib/v3/types/public/model.d.ts +65 -0
- package/dist/cjs/lib/v3/types/public/options.d.ts +70 -0
- package/dist/cjs/lib/v3/types/public/page.d.ts +18 -0
- package/dist/cjs/lib/v3/types/public/screenshotTypes.d.ts +25 -0
- package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +152 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/a11yTree.d.ts +15 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/activeElement.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.d.ts +77 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/coordinateResolver.d.ts +7 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/domTree.d.ts +46 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/focusSelectors.d.ts +24 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/index.d.ts +4 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/sessions.d.ts +16 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/treeFormatUtils.d.ts +28 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/xpathUtils.d.ts +26 -0
- package/dist/cjs/lib/v3/understudy/a11yInvocation.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +69 -0
- package/dist/cjs/lib/v3/understudy/consoleMessage.d.ts +22 -0
- package/dist/cjs/lib/v3/understudy/context.d.ts +132 -0
- package/dist/cjs/lib/v3/understudy/deepLocator.d.ts +87 -0
- package/dist/cjs/lib/v3/understudy/executionContextRegistry.d.ts +15 -0
- package/dist/cjs/lib/v3/understudy/fileUploadUtils.d.ts +13 -0
- package/dist/cjs/lib/v3/understudy/frame.d.ts +69 -0
- package/dist/cjs/lib/v3/understudy/frameLocator.d.ts +50 -0
- package/dist/cjs/lib/v3/understudy/frameRegistry.d.ts +101 -0
- package/dist/cjs/lib/v3/understudy/initScripts.d.ts +2 -0
- package/dist/cjs/lib/v3/understudy/lifecycleWatcher.d.ts +64 -0
- package/dist/cjs/lib/v3/understudy/locator.d.ts +194 -0
- package/dist/cjs/lib/v3/understudy/locatorInvocation.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/navigationResponseTracker.d.ts +84 -0
- package/dist/cjs/lib/v3/understudy/networkManager.d.ts +53 -0
- package/dist/cjs/lib/v3/understudy/page.d.ts +354 -0
- package/dist/cjs/lib/v3/understudy/piercer.d.ts +4 -0
- package/dist/cjs/lib/v3/understudy/response.d.ts +137 -0
- package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +16 -0
- package/dist/cjs/lib/v3/understudy/selectorResolver.d.ts +38 -0
- package/dist/cjs/lib/v3/v3.d.ts +191 -0
- package/dist/cjs/lib/v3/zodCompat.d.ts +12 -0
- package/dist/cjs/lib/v3Evaluator.d.ts +19 -0
- package/dist/cjs/lib/version.d.ts +5 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/tests/browserbase-session-accessors.test.js +101 -0
- package/dist/cjs/tests/browserbase-session-accessors.test.js.map +7 -0
- package/dist/cjs/tests/cache-llm-resolution.test.js +187 -0
- package/dist/cjs/tests/cache-llm-resolution.test.js.map +7 -0
- package/dist/cjs/tests/helpers/mockCDPSession.js +50 -0
- package/dist/cjs/tests/helpers/mockCDPSession.js.map +7 -0
- package/dist/cjs/tests/llm-provider.test.js +57 -0
- package/dist/cjs/tests/llm-provider.test.js.map +7 -0
- package/dist/cjs/tests/model-deprecation.test.js +132 -0
- package/dist/cjs/tests/model-deprecation.test.js.map +7 -0
- package/dist/cjs/tests/page-snapshot.test.js +58 -0
- package/dist/cjs/tests/page-snapshot.test.js.map +7 -0
- package/dist/cjs/tests/public-api/export-surface.test.js +76 -0
- package/dist/cjs/tests/public-api/export-surface.test.js.map +7 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js +150 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +7 -0
- package/dist/cjs/tests/public-api/public-error-types.test.js +104 -0
- package/dist/cjs/tests/public-api/public-error-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/public-types.test.js +74 -0
- package/dist/cjs/tests/public-api/public-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/runtime-utils.test.js +53 -0
- package/dist/cjs/tests/public-api/runtime-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/schema-utils.test.js +100 -0
- package/dist/cjs/tests/public-api/schema-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/timeout-error-types.test.js +103 -0
- package/dist/cjs/tests/public-api/timeout-error-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/tool-type-export.test.js +47 -0
- package/dist/cjs/tests/public-api/tool-type-export.test.js.map +7 -0
- package/dist/cjs/tests/public-api/v3-core.test.js +104 -0
- package/dist/cjs/tests/public-api/v3-core.test.js.map +7 -0
- package/dist/cjs/tests/safety-confirmation.test.js +134 -0
- package/dist/cjs/tests/safety-confirmation.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-a11y-resolvers.test.js +370 -0
- package/dist/cjs/tests/snapshot-a11y-resolvers.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js +294 -0
- package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js +403 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-cbor.test.js +197 -0
- package/dist/cjs/tests/snapshot-cbor.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-dom-session-builders.test.js +246 -0
- package/dist/cjs/tests/snapshot-dom-session-builders.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-dom-tree-utils.test.js +104 -0
- package/dist/cjs/tests/snapshot-dom-tree-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js +45 -0
- package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-frame-merge.test.js +388 -0
- package/dist/cjs/tests/snapshot-frame-merge.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-tree-format-utils.test.js +106 -0
- package/dist/cjs/tests/snapshot-tree-format-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-xpath-utils.test.js +74 -0
- package/dist/cjs/tests/snapshot-xpath-utils.test.js.map +7 -0
- package/dist/cjs/tests/timeout-handlers.test.js +864 -0
- package/dist/cjs/tests/timeout-handlers.test.js.map +7 -0
- package/dist/cjs/tests/xpath-parser.test.js +314 -0
- package/dist/cjs/tests/xpath-parser.test.js.map +7 -0
- package/dist/cjs/tests/xpath-resolver.test.js +70 -0
- package/dist/cjs/tests/xpath-resolver.test.js.map +7 -0
- package/dist/cjs/tests/zod-enum-compatibility.test.js +119 -0
- package/dist/cjs/tests/zod-enum-compatibility.test.js.map +7 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/lib/inference.d.ts +65 -0
- package/dist/esm/lib/inference.js +333 -0
- package/dist/esm/lib/inference.js.map +1 -0
- package/dist/esm/lib/inferenceLogUtils.d.ts +12 -0
- package/dist/esm/lib/inferenceLogUtils.js +92 -0
- package/dist/esm/lib/inferenceLogUtils.js.map +1 -0
- package/dist/esm/lib/logger.d.ts +69 -0
- package/dist/esm/lib/logger.js +323 -0
- package/dist/esm/lib/logger.js.map +1 -0
- package/dist/esm/lib/modelUtils.d.ts +11 -0
- package/dist/esm/lib/modelUtils.js +43 -0
- package/dist/esm/lib/modelUtils.js.map +1 -0
- package/dist/esm/lib/prompt.d.ts +14 -0
- package/dist/esm/lib/prompt.js +230 -0
- package/dist/esm/lib/prompt.js.map +1 -0
- package/dist/esm/lib/utils.d.ts +68 -0
- package/dist/esm/lib/utils.js +654 -0
- package/dist/esm/lib/utils.js.map +1 -0
- package/dist/esm/lib/v3/agent/AgentClient.d.ts +19 -0
- package/dist/esm/lib/v3/agent/AgentClient.js +17 -0
- package/dist/esm/lib/v3/agent/AgentClient.js.map +1 -0
- package/dist/esm/lib/v3/agent/AgentProvider.d.ts +20 -0
- package/dist/esm/lib/v3/agent/AgentProvider.js +77 -0
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -0
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.d.ts +57 -0
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +822 -0
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -0
- package/dist/esm/lib/v3/agent/GoogleCUAClient.d.ts +74 -0
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +799 -0
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -0
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.d.ts +71 -0
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +770 -0
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -0
- package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +69 -0
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +615 -0
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -0
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +12 -0
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +186 -0
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/act.d.ts +12 -0
- package/dist/esm/lib/v3/agent/tools/act.js +49 -0
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/ariaTree.d.ts +5 -0
- package/dist/esm/lib/v3/agent/tools/ariaTree.js +31 -0
- package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/click.d.ts +6 -0
- package/dist/esm/lib/v3/agent/tools/click.js +104 -0
- package/dist/esm/lib/v3/agent/tools/click.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/clickAndHold.d.ts +14 -0
- package/dist/esm/lib/v3/agent/tools/clickAndHold.js +68 -0
- package/dist/esm/lib/v3/agent/tools/clickAndHold.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.d.ts +7 -0
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +105 -0
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +20 -0
- package/dist/esm/lib/v3/agent/tools/extract.js +93 -0
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/fillFormVision.d.ts +12 -0
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js +143 -0
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +12 -0
- package/dist/esm/lib/v3/agent/tools/fillform.js +56 -0
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/goto.d.ts +12 -0
- package/dist/esm/lib/v3/agent/tools/goto.js +31 -0
- package/dist/esm/lib/v3/agent/tools/goto.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/index.d.ts +92 -0
- package/dist/esm/lib/v3/agent/tools/index.js +74 -0
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/keys.d.ts +24 -0
- package/dist/esm/lib/v3/agent/tools/keys.js +60 -0
- package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/navback.d.ts +6 -0
- package/dist/esm/lib/v3/agent/tools/navback.js +23 -0
- package/dist/esm/lib/v3/agent/tools/navback.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/screenshot.d.ts +6 -0
- package/dist/esm/lib/v3/agent/tools/screenshot.js +26 -0
- package/dist/esm/lib/v3/agent/tools/screenshot.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/scroll.d.ts +19 -0
- package/dist/esm/lib/v3/agent/tools/scroll.js +142 -0
- package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/search.d.ts +15 -0
- package/dist/esm/lib/v3/agent/tools/search.js +73 -0
- package/dist/esm/lib/v3/agent/tools/search.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/think.d.ts +6 -0
- package/dist/esm/lib/v3/agent/tools/think.js +24 -0
- package/dist/esm/lib/v3/agent/tools/think.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/type.d.ts +7 -0
- package/dist/esm/lib/v3/agent/tools/type.js +106 -0
- package/dist/esm/lib/v3/agent/tools/type.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/wait.d.ts +5 -0
- package/dist/esm/lib/v3/agent/tools/wait.js +53 -0
- package/dist/esm/lib/v3/agent/tools/wait.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/actionMapping.d.ts +3 -0
- package/dist/esm/lib/v3/agent/utils/actionMapping.js +100 -0
- package/dist/esm/lib/v3/agent/utils/actionMapping.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.d.ts +13 -0
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js +28 -0
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/cuaKeyMapping.d.ts +10 -0
- package/dist/esm/lib/v3/agent/utils/cuaKeyMapping.js +62 -0
- package/dist/esm/lib/v3/agent/utils/cuaKeyMapping.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/googleCustomToolHandler.d.ts +25 -0
- package/dist/esm/lib/v3/agent/utils/googleCustomToolHandler.js +145 -0
- package/dist/esm/lib/v3/agent/utils/googleCustomToolHandler.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.d.ts +22 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +101 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/imageCompression.d.ts +53 -0
- package/dist/esm/lib/v3/agent/utils/imageCompression.js +204 -0
- package/dist/esm/lib/v3/agent/utils/imageCompression.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/messageProcessing.d.ts +12 -0
- package/dist/esm/lib/v3/agent/utils/messageProcessing.js +164 -0
- package/dist/esm/lib/v3/agent/utils/messageProcessing.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/screenshotHandler.d.ts +10 -0
- package/dist/esm/lib/v3/agent/utils/screenshotHandler.js +26 -0
- package/dist/esm/lib/v3/agent/utils/screenshotHandler.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/validateExperimentalFeatures.d.ts +26 -0
- package/dist/esm/lib/v3/agent/utils/validateExperimentalFeatures.js +79 -0
- package/dist/esm/lib/v3/agent/utils/validateExperimentalFeatures.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/xpath.d.ts +11 -0
- package/dist/esm/lib/v3/agent/utils/xpath.js +19 -0
- package/dist/esm/lib/v3/agent/utils/xpath.js.map +1 -0
- package/dist/esm/lib/v3/api.d.ts +86 -0
- package/dist/esm/lib/v3/api.js +484 -0
- package/dist/esm/lib/v3/api.js.map +1 -0
- package/dist/esm/lib/v3/cache/ActCache.d.ts +23 -0
- package/dist/esm/lib/v3/cache/ActCache.js +292 -0
- package/dist/esm/lib/v3/cache/ActCache.js.map +1 -0
- package/dist/esm/lib/v3/cache/AgentCache.d.ts +109 -0
- package/dist/esm/lib/v3/cache/AgentCache.js +640 -0
- package/dist/esm/lib/v3/cache/AgentCache.js.map +1 -0
- package/dist/esm/lib/v3/cache/CacheStorage.d.ts +17 -0
- package/dist/esm/lib/v3/cache/CacheStorage.js +98 -0
- package/dist/esm/lib/v3/cache/CacheStorage.js.map +1 -0
- package/dist/esm/lib/v3/cache/serverAgentCache.d.ts +7 -0
- package/dist/esm/lib/v3/cache/serverAgentCache.js +49 -0
- package/dist/esm/lib/v3/cache/serverAgentCache.js.map +1 -0
- package/dist/esm/lib/v3/cache/utils.d.ts +15 -0
- package/dist/esm/lib/v3/cache/utils.js +39 -0
- package/dist/esm/lib/v3/cache/utils.js.map +1 -0
- package/dist/esm/lib/v3/cli.d.ts +2 -0
- package/dist/esm/lib/v3/cli.js +10 -0
- package/dist/esm/lib/v3/cli.js.map +1 -0
- package/dist/esm/lib/v3/dom/a11yScripts/index.d.ts +11 -0
- package/dist/esm/lib/v3/dom/a11yScripts/index.js +117 -0
- package/dist/esm/lib/v3/dom/a11yScripts/index.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/a11yScripts.generated.d.ts +16 -0
- package/dist/esm/lib/v3/dom/build/a11yScripts.generated.js +20 -0
- package/dist/esm/lib/v3/dom/build/a11yScripts.generated.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.d.ts +52 -0
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js +56 -0
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/reRenderScriptContent.d.ts +1 -0
- package/dist/esm/lib/v3/dom/build/reRenderScriptContent.js +2 -0
- package/dist/esm/lib/v3/dom/build/reRenderScriptContent.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/rerender-index.d.ts +0 -0
- package/dist/esm/lib/v3/dom/build/rerender-index.js +1 -0
- package/dist/esm/lib/v3/dom/build/rerender-index.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/screenshotScripts.generated.d.ts +4 -0
- package/dist/esm/lib/v3/dom/build/screenshotScripts.generated.js +8 -0
- package/dist/esm/lib/v3/dom/build/screenshotScripts.generated.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/scriptV3Content.d.ts +1 -0
- package/dist/esm/lib/v3/dom/build/scriptV3Content.js +2 -0
- package/dist/esm/lib/v3/dom/build/scriptV3Content.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/v3-index.d.ts +0 -0
- package/dist/esm/lib/v3/dom/build/v3-index.js +1 -0
- package/dist/esm/lib/v3/dom/build/v3-index.js.map +1 -0
- package/dist/esm/lib/v3/dom/genA11yScripts.d.ts +1 -0
- package/dist/esm/lib/v3/dom/genA11yScripts.js +54 -0
- package/dist/esm/lib/v3/dom/genA11yScripts.js.map +1 -0
- package/dist/esm/lib/v3/dom/genDomScripts.d.ts +1 -0
- package/dist/esm/lib/v3/dom/genDomScripts.js +38 -0
- package/dist/esm/lib/v3/dom/genDomScripts.js.map +1 -0
- package/dist/esm/lib/v3/dom/genLocatorScripts.d.ts +1 -0
- package/dist/esm/lib/v3/dom/genLocatorScripts.js +51 -0
- package/dist/esm/lib/v3/dom/genLocatorScripts.js.map +1 -0
- package/dist/esm/lib/v3/dom/genScreenshotScripts.d.ts +1 -0
- package/dist/esm/lib/v3/dom/genScreenshotScripts.js +37 -0
- package/dist/esm/lib/v3/dom/genScreenshotScripts.js.map +1 -0
- package/dist/esm/lib/v3/dom/index.d.ts +1 -0
- package/dist/esm/lib/v3/dom/index.js +2 -0
- package/dist/esm/lib/v3/dom/index.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/counts.d.ts +15 -0
- package/dist/esm/lib/v3/dom/locatorScripts/counts.js +272 -0
- package/dist/esm/lib/v3/dom/locatorScripts/counts.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/index.d.ts +4 -0
- package/dist/esm/lib/v3/dom/locatorScripts/index.js +5 -0
- package/dist/esm/lib/v3/dom/locatorScripts/index.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/scripts.d.ts +37 -0
- package/dist/esm/lib/v3/dom/locatorScripts/scripts.js +458 -0
- package/dist/esm/lib/v3/dom/locatorScripts/scripts.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/selectors.d.ts +4 -0
- package/dist/esm/lib/v3/dom/locatorScripts/selectors.js +283 -0
- package/dist/esm/lib/v3/dom/locatorScripts/selectors.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/waitForSelector.d.ts +19 -0
- package/dist/esm/lib/v3/dom/locatorScripts/waitForSelector.js +283 -0
- package/dist/esm/lib/v3/dom/locatorScripts/waitForSelector.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/xpathParser.d.ts +76 -0
- package/dist/esm/lib/v3/dom/locatorScripts/xpathParser.js +376 -0
- package/dist/esm/lib/v3/dom/locatorScripts/xpathParser.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.d.ts +9 -0
- package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js +196 -0
- package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js.map +1 -0
- package/dist/esm/lib/v3/dom/piercer.entry.d.ts +1 -0
- package/dist/esm/lib/v3/dom/piercer.entry.js +3 -0
- package/dist/esm/lib/v3/dom/piercer.entry.js.map +1 -0
- package/dist/esm/lib/v3/dom/piercer.runtime.d.ts +23 -0
- package/dist/esm/lib/v3/dom/piercer.runtime.js +90 -0
- package/dist/esm/lib/v3/dom/piercer.runtime.js.map +1 -0
- package/dist/esm/lib/v3/dom/rerenderMissingShadows.entry.d.ts +1 -0
- package/dist/esm/lib/v3/dom/rerenderMissingShadows.entry.js +3 -0
- package/dist/esm/lib/v3/dom/rerenderMissingShadows.entry.js.map +1 -0
- package/dist/esm/lib/v3/dom/rerenderMissingShadows.runtime.d.ts +1 -0
- package/dist/esm/lib/v3/dom/rerenderMissingShadows.runtime.js +40 -0
- package/dist/esm/lib/v3/dom/rerenderMissingShadows.runtime.js.map +1 -0
- package/dist/esm/lib/v3/dom/screenshotScripts/index.d.ts +1 -0
- package/dist/esm/lib/v3/dom/screenshotScripts/index.js +2 -0
- package/dist/esm/lib/v3/dom/screenshotScripts/index.js.map +1 -0
- package/dist/esm/lib/v3/dom/screenshotScripts/resolveMaskRect.d.ts +8 -0
- package/dist/esm/lib/v3/dom/screenshotScripts/resolveMaskRect.js +82 -0
- package/dist/esm/lib/v3/dom/screenshotScripts/resolveMaskRect.js.map +1 -0
- package/dist/esm/lib/v3/external_clients/aisdk.d.ts +11 -0
- package/dist/esm/lib/v3/external_clients/aisdk.js +103 -0
- package/dist/esm/lib/v3/external_clients/aisdk.js.map +1 -0
- package/dist/esm/lib/v3/external_clients/customOpenAI.d.ts +18 -0
- package/dist/esm/lib/v3/external_clients/customOpenAI.js +220 -0
- package/dist/esm/lib/v3/external_clients/customOpenAI.js.map +1 -0
- package/dist/esm/lib/v3/flowLogger.d.ts +139 -0
- package/dist/esm/lib/v3/flowLogger.js +868 -0
- package/dist/esm/lib/v3/flowLogger.js.map +1 -0
- package/dist/esm/lib/v3/handlers/actHandler.d.ts +21 -0
- package/dist/esm/lib/v3/handlers/actHandler.js +340 -0
- package/dist/esm/lib/v3/handlers/actHandler.js.map +1 -0
- package/dist/esm/lib/v3/handlers/extractHandler.d.ts +31 -0
- package/dist/esm/lib/v3/handlers/extractHandler.js +139 -0
- package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +24 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +623 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/timeoutGuard.d.ts +2 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/timeoutGuard.js +14 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/timeoutGuard.js.map +1 -0
- package/dist/esm/lib/v3/handlers/observeHandler.d.ts +17 -0
- package/dist/esm/lib/v3/handlers/observeHandler.js +156 -0
- package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -0
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +32 -0
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +461 -0
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +33 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +528 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -0
- package/dist/esm/lib/v3/index.d.ts +18 -0
- package/dist/esm/lib/v3/index.js +14 -0
- package/dist/esm/lib/v3/index.js.map +1 -0
- package/dist/esm/lib/v3/launch/browserbase.d.ts +7 -0
- package/dist/esm/lib/v3/launch/browserbase.js +46 -0
- package/dist/esm/lib/v3/launch/browserbase.js.map +1 -0
- package/dist/esm/lib/v3/launch/local.d.ts +15 -0
- package/dist/esm/lib/v3/launch/local.js +98 -0
- package/dist/esm/lib/v3/launch/local.js.map +1 -0
- package/dist/esm/lib/v3/llm/AnthropicClient.d.ts +16 -0
- package/dist/esm/lib/v3/llm/AnthropicClient.js +239 -0
- package/dist/esm/lib/v3/llm/AnthropicClient.js.map +1 -0
- package/dist/esm/lib/v3/llm/CerebrasClient.d.ts +17 -0
- package/dist/esm/lib/v3/llm/CerebrasClient.js +235 -0
- package/dist/esm/lib/v3/llm/CerebrasClient.js.map +1 -0
- package/dist/esm/lib/v3/llm/GoogleClient.d.ts +19 -0
- package/dist/esm/lib/v3/llm/GoogleClient.js +369 -0
- package/dist/esm/lib/v3/llm/GoogleClient.js.map +1 -0
- package/dist/esm/lib/v3/llm/GroqClient.d.ts +17 -0
- package/dist/esm/lib/v3/llm/GroqClient.js +236 -0
- package/dist/esm/lib/v3/llm/GroqClient.js.map +1 -0
- package/dist/esm/lib/v3/llm/LLMClient.d.ts +121 -0
- package/dist/esm/lib/v3/llm/LLMClient.js +23 -0
- package/dist/esm/lib/v3/llm/LLMClient.js.map +1 -0
- package/dist/esm/lib/v3/llm/LLMProvider.d.ts +13 -0
- package/dist/esm/lib/v3/llm/LLMProvider.js +194 -0
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -0
- package/dist/esm/lib/v3/llm/OpenAIClient.d.ts +15 -0
- package/dist/esm/lib/v3/llm/OpenAIClient.js +329 -0
- package/dist/esm/lib/v3/llm/OpenAIClient.js.map +1 -0
- package/dist/esm/lib/v3/llm/aisdk.d.ts +15 -0
- package/dist/esm/lib/v3/llm/aisdk.js +348 -0
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -0
- package/dist/esm/lib/v3/logger.d.ts +9 -0
- package/dist/esm/lib/v3/logger.js +96 -0
- package/dist/esm/lib/v3/logger.js.map +1 -0
- package/dist/esm/lib/v3/mcp/connection.d.ts +11 -0
- package/dist/esm/lib/v3/mcp/connection.js +49 -0
- package/dist/esm/lib/v3/mcp/connection.js.map +1 -0
- package/dist/esm/lib/v3/mcp/utils.d.ts +3 -0
- package/dist/esm/lib/v3/mcp/utils.js +36 -0
- package/dist/esm/lib/v3/mcp/utils.js.map +1 -0
- package/dist/esm/lib/v3/shutdown/cleanupLocal.d.ts +14 -0
- package/dist/esm/lib/v3/shutdown/cleanupLocal.js +30 -0
- package/dist/esm/lib/v3/shutdown/cleanupLocal.js.map +1 -0
- package/dist/esm/lib/v3/shutdown/supervisor.d.ts +11 -0
- package/dist/esm/lib/v3/shutdown/supervisor.js +166 -0
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -0
- package/dist/esm/lib/v3/shutdown/supervisorClient.d.ts +15 -0
- package/dist/esm/lib/v3/shutdown/supervisorClient.js +93 -0
- package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -0
- package/dist/esm/lib/v3/tests/agent-abort-signal.spec.js +113 -0
- package/dist/esm/lib/v3/tests/agent-abort-signal.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/agent-cache-self-heal.spec.js +80 -0
- package/dist/esm/lib/v3/tests/agent-cache-self-heal.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/agent-callbacks.spec.js +374 -0
- package/dist/esm/lib/v3/tests/agent-callbacks.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/agent-experimental-validation.spec.js +357 -0
- package/dist/esm/lib/v3/tests/agent-experimental-validation.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/agent-hybrid-mode.spec.js +247 -0
- package/dist/esm/lib/v3/tests/agent-hybrid-mode.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/agent-message-continuation.spec.js +105 -0
- package/dist/esm/lib/v3/tests/agent-message-continuation.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/agent-streaming.spec.js +126 -0
- package/dist/esm/lib/v3/tests/agent-streaming.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/cdp-session-detached.spec.js +44 -0
- package/dist/esm/lib/v3/tests/cdp-session-detached.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/click-count.spec.js +147 -0
- package/dist/esm/lib/v3/tests/click-count.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/connect-to-existing-browser.spec.js +54 -0
- package/dist/esm/lib/v3/tests/connect-to-existing-browser.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/context-addInitScript.spec.js +176 -0
- package/dist/esm/lib/v3/tests/context-addInitScript.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/default-page-tracking.spec.js +53 -0
- package/dist/esm/lib/v3/tests/default-page-tracking.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/downloads.spec.js +58 -0
- package/dist/esm/lib/v3/tests/downloads.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/frame-get-location-and-click.spec.js +53 -0
- package/dist/esm/lib/v3/tests/frame-get-location-and-click.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js +493 -0
- package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/keep-alive.child.js +92 -0
- package/dist/esm/lib/v3/tests/keep-alive.child.js.map +7 -0
- package/dist/esm/lib/v3/tests/keep-alive.helpers.js +532 -0
- package/dist/esm/lib/v3/tests/keep-alive.helpers.js.map +7 -0
- package/dist/esm/lib/v3/tests/keep-alive.spec.js +19 -0
- package/dist/esm/lib/v3/tests/keep-alive.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/keyboard.spec.js +296 -0
- package/dist/esm/lib/v3/tests/keyboard.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-backend-node-id.spec.js +159 -0
- package/dist/esm/lib/v3/tests/locator-backend-node-id.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-content-methods.spec.js +191 -0
- package/dist/esm/lib/v3/tests/locator-content-methods.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-count-iframe.spec.js +108 -0
- package/dist/esm/lib/v3/tests/locator-count-iframe.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-count.spec.js +71 -0
- package/dist/esm/lib/v3/tests/locator-count.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-fill.spec.js +118 -0
- package/dist/esm/lib/v3/tests/locator-fill.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-input-methods.spec.js +136 -0
- package/dist/esm/lib/v3/tests/locator-input-methods.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-nth.spec.js +157 -0
- package/dist/esm/lib/v3/tests/locator-nth.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/locator-select-option.spec.js +242 -0
- package/dist/esm/lib/v3/tests/locator-select-option.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/logger-initialization.spec.js +552 -0
- package/dist/esm/lib/v3/tests/logger-initialization.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/multi-instance-logger.spec.js +269 -0
- package/dist/esm/lib/v3/tests/multi-instance-logger.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/nested-div.spec.js +23 -0
- package/dist/esm/lib/v3/tests/nested-div.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-addInitScript.spec.js +90 -0
- package/dist/esm/lib/v3/tests/page-addInitScript.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-console.spec.js +56 -0
- package/dist/esm/lib/v3/tests/page-console.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-drag-and-drop.spec.js +418 -0
- package/dist/esm/lib/v3/tests/page-drag-and-drop.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-goto-response.spec.js +35 -0
- package/dist/esm/lib/v3/tests/page-goto-response.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-hover.spec.js +167 -0
- package/dist/esm/lib/v3/tests/page-hover.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-screenshot.spec.js +273 -0
- package/dist/esm/lib/v3/tests/page-screenshot.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-scroll.spec.js +182 -0
- package/dist/esm/lib/v3/tests/page-scroll.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/page-send-cdp.spec.js +46 -0
- package/dist/esm/lib/v3/tests/page-send-cdp.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/perform-understudy-method.spec.js +98 -0
- package/dist/esm/lib/v3/tests/perform-understudy-method.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/setinputfiles.spec.js +126 -0
- package/dist/esm/lib/v3/tests/setinputfiles.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/shadow-iframe-oopif.spec.js +134 -0
- package/dist/esm/lib/v3/tests/shadow-iframe-oopif.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/shadow-iframe-spif.spec.js +134 -0
- package/dist/esm/lib/v3/tests/shadow-iframe-spif.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/testUtils.js +31 -0
- package/dist/esm/lib/v3/tests/testUtils.js.map +7 -0
- package/dist/esm/lib/v3/tests/text-selector-innermost.spec.js +100 -0
- package/dist/esm/lib/v3/tests/text-selector-innermost.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/timeouts.spec.js +32 -0
- package/dist/esm/lib/v3/tests/timeouts.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/user-data-dir.spec.js +43 -0
- package/dist/esm/lib/v3/tests/user-data-dir.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/v3.config.js +15 -0
- package/dist/esm/lib/v3/tests/v3.config.js.map +7 -0
- package/dist/esm/lib/v3/tests/v3.dynamic.config.js +43 -0
- package/dist/esm/lib/v3/tests/v3.dynamic.config.js.map +7 -0
- package/dist/esm/lib/v3/tests/v3.playwright.config.js +41 -0
- package/dist/esm/lib/v3/tests/v3.playwright.config.js.map +7 -0
- package/dist/esm/lib/v3/tests/wait-for-selector.spec.js +593 -0
- package/dist/esm/lib/v3/tests/wait-for-selector.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/wait-for-timeout.spec.js +97 -0
- package/dist/esm/lib/v3/tests/wait-for-timeout.spec.js.map +7 -0
- package/dist/esm/lib/v3/tests/xpath-for-location-deep.spec.js +77 -0
- package/dist/esm/lib/v3/tests/xpath-for-location-deep.spec.js.map +7 -0
- package/dist/esm/lib/v3/timeoutConfig.d.ts +2 -0
- package/dist/esm/lib/v3/timeoutConfig.js +27 -0
- package/dist/esm/lib/v3/timeoutConfig.js.map +1 -0
- package/dist/esm/lib/v3/types/private/agent.d.ts +6 -0
- package/dist/esm/lib/v3/types/private/agent.js +2 -0
- package/dist/esm/lib/v3/types/private/agent.js.map +1 -0
- package/dist/esm/lib/v3/types/private/api.d.ts +11 -0
- package/dist/esm/lib/v3/types/private/api.js +2 -0
- package/dist/esm/lib/v3/types/private/api.js.map +1 -0
- package/dist/esm/lib/v3/types/private/cache.d.ts +128 -0
- package/dist/esm/lib/v3/types/private/cache.js +2 -0
- package/dist/esm/lib/v3/types/private/cache.js.map +1 -0
- package/dist/esm/lib/v3/types/private/evaluator.d.ts +40 -0
- package/dist/esm/lib/v3/types/private/evaluator.js +2 -0
- package/dist/esm/lib/v3/types/private/evaluator.js.map +1 -0
- package/dist/esm/lib/v3/types/private/handlers.d.ts +38 -0
- package/dist/esm/lib/v3/types/private/handlers.js +16 -0
- package/dist/esm/lib/v3/types/private/handlers.js.map +1 -0
- package/dist/esm/lib/v3/types/private/index.d.ts +7 -0
- package/dist/esm/lib/v3/types/private/index.js +8 -0
- package/dist/esm/lib/v3/types/private/index.js.map +1 -0
- package/dist/esm/lib/v3/types/private/internal.d.ts +39 -0
- package/dist/esm/lib/v3/types/private/internal.js +2 -0
- package/dist/esm/lib/v3/types/private/internal.js.map +1 -0
- package/dist/esm/lib/v3/types/private/locator.d.ts +9 -0
- package/dist/esm/lib/v3/types/private/locator.js +2 -0
- package/dist/esm/lib/v3/types/private/locator.js.map +1 -0
- package/dist/esm/lib/v3/types/private/network.d.ts +34 -0
- package/dist/esm/lib/v3/types/private/network.js +3 -0
- package/dist/esm/lib/v3/types/private/network.js.map +1 -0
- package/dist/esm/lib/v3/types/private/shutdown.d.ts +19 -0
- package/dist/esm/lib/v3/types/private/shutdown.js +5 -0
- package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -0
- package/dist/esm/lib/v3/types/private/shutdownErrors.d.ts +12 -0
- package/dist/esm/lib/v3/types/private/shutdownErrors.js +22 -0
- package/dist/esm/lib/v3/types/private/shutdownErrors.js.map +1 -0
- package/dist/esm/lib/v3/types/private/snapshot.d.ts +117 -0
- package/dist/esm/lib/v3/types/private/snapshot.js +2 -0
- package/dist/esm/lib/v3/types/private/snapshot.js.map +1 -0
- package/dist/esm/lib/v3/types/public/agent.d.ts +595 -0
- package/dist/esm/lib/v3/types/public/agent.js +15 -0
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -0
- package/dist/esm/lib/v3/types/public/api.d.ts +1211 -0
- package/dist/esm/lib/v3/types/public/api.js +915 -0
- package/dist/esm/lib/v3/types/public/api.js.map +1 -0
- package/dist/esm/lib/v3/types/public/apiErrors.d.ts +18 -0
- package/dist/esm/lib/v3/types/public/apiErrors.js +32 -0
- package/dist/esm/lib/v3/types/public/apiErrors.js.map +1 -0
- package/dist/esm/lib/v3/types/public/index.d.ts +12 -0
- package/dist/esm/lib/v3/types/public/index.js +14 -0
- package/dist/esm/lib/v3/types/public/index.js.map +1 -0
- package/dist/esm/lib/v3/types/public/locator.d.ts +9 -0
- package/dist/esm/lib/v3/types/public/locator.js +2 -0
- package/dist/esm/lib/v3/types/public/locator.js.map +1 -0
- package/dist/esm/lib/v3/types/public/logs.d.ts +23 -0
- package/dist/esm/lib/v3/types/public/logs.js +13 -0
- package/dist/esm/lib/v3/types/public/logs.js.map +1 -0
- package/dist/esm/lib/v3/types/public/methods.d.ts +56 -0
- package/dist/esm/lib/v3/types/public/methods.js +15 -0
- package/dist/esm/lib/v3/types/public/methods.js.map +1 -0
- package/dist/esm/lib/v3/types/public/metrics.d.ts +27 -0
- package/dist/esm/lib/v3/types/public/metrics.js +2 -0
- package/dist/esm/lib/v3/types/public/metrics.js.map +1 -0
- package/dist/esm/lib/v3/types/public/model.d.ts +65 -0
- package/dist/esm/lib/v3/types/public/model.js +2 -0
- package/dist/esm/lib/v3/types/public/model.js.map +1 -0
- package/dist/esm/lib/v3/types/public/options.d.ts +70 -0
- package/dist/esm/lib/v3/types/public/options.js +4 -0
- package/dist/esm/lib/v3/types/public/options.js.map +1 -0
- package/dist/esm/lib/v3/types/public/page.d.ts +18 -0
- package/dist/esm/lib/v3/types/public/page.js +3 -0
- package/dist/esm/lib/v3/types/public/page.js.map +1 -0
- package/dist/esm/lib/v3/types/public/screenshotTypes.d.ts +25 -0
- package/dist/esm/lib/v3/types/public/screenshotTypes.js +2 -0
- package/dist/esm/lib/v3/types/public/screenshotTypes.js.map +1 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +152 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js +305 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/a11yTree.d.ts +15 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/a11yTree.js +196 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/a11yTree.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/activeElement.d.ts +8 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/activeElement.js +121 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/activeElement.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.d.ts +77 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.js +336 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/coordinateResolver.d.ts +7 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/coordinateResolver.js +129 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/coordinateResolver.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/domTree.d.ts +46 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/domTree.js +274 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/domTree.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/focusSelectors.d.ts +24 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/focusSelectors.js +216 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/focusSelectors.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/index.d.ts +4 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/index.js +5 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/index.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/sessions.d.ts +16 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/sessions.js +22 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/sessions.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/treeFormatUtils.d.ts +28 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/treeFormatUtils.js +135 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/treeFormatUtils.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/xpathUtils.d.ts +26 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/xpathUtils.js +102 -0
- package/dist/esm/lib/v3/understudy/a11y/snapshot/xpathUtils.js.map +1 -0
- package/dist/esm/lib/v3/understudy/a11yInvocation.d.ts +8 -0
- package/dist/esm/lib/v3/understudy/a11yInvocation.js +12 -0
- package/dist/esm/lib/v3/understudy/a11yInvocation.js.map +1 -0
- package/dist/esm/lib/v3/understudy/cdp.d.ts +69 -0
- package/dist/esm/lib/v3/understudy/cdp.js +251 -0
- package/dist/esm/lib/v3/understudy/cdp.js.map +1 -0
- package/dist/esm/lib/v3/understudy/consoleMessage.d.ts +22 -0
- package/dist/esm/lib/v3/understudy/consoleMessage.js +66 -0
- package/dist/esm/lib/v3/understudy/consoleMessage.js.map +1 -0
- package/dist/esm/lib/v3/understudy/context.d.ts +132 -0
- package/dist/esm/lib/v3/understudy/context.js +696 -0
- package/dist/esm/lib/v3/understudy/context.js.map +1 -0
- package/dist/esm/lib/v3/understudy/deepLocator.d.ts +87 -0
- package/dist/esm/lib/v3/understudy/deepLocator.js +218 -0
- package/dist/esm/lib/v3/understudy/deepLocator.js.map +1 -0
- package/dist/esm/lib/v3/understudy/executionContextRegistry.d.ts +15 -0
- package/dist/esm/lib/v3/understudy/executionContextRegistry.js +83 -0
- package/dist/esm/lib/v3/understudy/executionContextRegistry.js.map +1 -0
- package/dist/esm/lib/v3/understudy/fileUploadUtils.d.ts +13 -0
- package/dist/esm/lib/v3/understudy/fileUploadUtils.js +81 -0
- package/dist/esm/lib/v3/understudy/fileUploadUtils.js.map +1 -0
- package/dist/esm/lib/v3/understudy/frame.d.ts +69 -0
- package/dist/esm/lib/v3/understudy/frame.js +211 -0
- package/dist/esm/lib/v3/understudy/frame.js.map +1 -0
- package/dist/esm/lib/v3/understudy/frameLocator.d.ts +50 -0
- package/dist/esm/lib/v3/understudy/frameLocator.js +255 -0
- package/dist/esm/lib/v3/understudy/frameLocator.js.map +1 -0
- package/dist/esm/lib/v3/understudy/frameRegistry.d.ts +101 -0
- package/dist/esm/lib/v3/understudy/frameRegistry.js +298 -0
- package/dist/esm/lib/v3/understudy/frameRegistry.js.map +1 -0
- package/dist/esm/lib/v3/understudy/initScripts.d.ts +2 -0
- package/dist/esm/lib/v3/understudy/initScripts.js +33 -0
- package/dist/esm/lib/v3/understudy/initScripts.js.map +1 -0
- package/dist/esm/lib/v3/understudy/lifecycleWatcher.d.ts +64 -0
- package/dist/esm/lib/v3/understudy/lifecycleWatcher.js +245 -0
- package/dist/esm/lib/v3/understudy/lifecycleWatcher.js.map +1 -0
- package/dist/esm/lib/v3/understudy/locator.d.ts +194 -0
- package/dist/esm/lib/v3/understudy/locator.js +753 -0
- package/dist/esm/lib/v3/understudy/locator.js.map +1 -0
- package/dist/esm/lib/v3/understudy/locatorInvocation.d.ts +8 -0
- package/dist/esm/lib/v3/understudy/locatorInvocation.js +12 -0
- package/dist/esm/lib/v3/understudy/locatorInvocation.js.map +1 -0
- package/dist/esm/lib/v3/understudy/navigationResponseTracker.d.ts +84 -0
- package/dist/esm/lib/v3/understudy/navigationResponseTracker.js +224 -0
- package/dist/esm/lib/v3/understudy/navigationResponseTracker.js.map +1 -0
- package/dist/esm/lib/v3/understudy/networkManager.d.ts +53 -0
- package/dist/esm/lib/v3/understudy/networkManager.js +306 -0
- package/dist/esm/lib/v3/understudy/networkManager.js.map +1 -0
- package/dist/esm/lib/v3/understudy/page.d.ts +354 -0
- package/dist/esm/lib/v3/understudy/page.js +1942 -0
- package/dist/esm/lib/v3/understudy/page.js.map +1 -0
- package/dist/esm/lib/v3/understudy/piercer.d.ts +4 -0
- package/dist/esm/lib/v3/understudy/piercer.js +61 -0
- package/dist/esm/lib/v3/understudy/piercer.js.map +1 -0
- package/dist/esm/lib/v3/understudy/response.d.ts +137 -0
- package/dist/esm/lib/v3/understudy/response.js +330 -0
- package/dist/esm/lib/v3/understudy/response.js.map +1 -0
- package/dist/esm/lib/v3/understudy/screenshotUtils.d.ts +16 -0
- package/dist/esm/lib/v3/understudy/screenshotUtils.js +352 -0
- package/dist/esm/lib/v3/understudy/screenshotUtils.js.map +1 -0
- package/dist/esm/lib/v3/understudy/selectorResolver.d.ts +38 -0
- package/dist/esm/lib/v3/understudy/selectorResolver.js +296 -0
- package/dist/esm/lib/v3/understudy/selectorResolver.js.map +1 -0
- package/dist/esm/lib/v3/v3.d.ts +191 -0
- package/dist/esm/lib/v3/v3.js +1569 -0
- package/dist/esm/lib/v3/v3.js.map +1 -0
- package/dist/esm/lib/v3/zodCompat.d.ts +12 -0
- package/dist/esm/lib/v3/zodCompat.js +17 -0
- package/dist/esm/lib/v3/zodCompat.js.map +1 -0
- package/dist/esm/lib/v3Evaluator.d.ts +19 -0
- package/dist/esm/lib/v3Evaluator.js +210 -0
- package/dist/esm/lib/v3Evaluator.js.map +1 -0
- package/dist/esm/lib/version.d.ts +5 -0
- package/dist/esm/lib/version.js +6 -0
- package/dist/esm/lib/version.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/tests/browserbase-session-accessors.test.js +101 -0
- package/dist/esm/tests/browserbase-session-accessors.test.js.map +7 -0
- package/dist/esm/tests/cache-llm-resolution.test.js +187 -0
- package/dist/esm/tests/cache-llm-resolution.test.js.map +7 -0
- package/dist/esm/tests/helpers/mockCDPSession.js +27 -0
- package/dist/esm/tests/helpers/mockCDPSession.js.map +7 -0
- package/dist/esm/tests/llm-provider.test.js +57 -0
- package/dist/esm/tests/llm-provider.test.js.map +7 -0
- package/dist/esm/tests/model-deprecation.test.js +135 -0
- package/dist/esm/tests/model-deprecation.test.js.map +7 -0
- package/dist/esm/tests/page-snapshot.test.js +36 -0
- package/dist/esm/tests/page-snapshot.test.js.map +7 -0
- package/dist/esm/tests/public-api/export-surface.test.js +54 -0
- package/dist/esm/tests/public-api/export-surface.test.js.map +7 -0
- package/dist/esm/tests/public-api/llm-and-agents.test.js +128 -0
- package/dist/esm/tests/public-api/llm-and-agents.test.js.map +7 -0
- package/dist/esm/tests/public-api/public-error-types.test.js +71 -0
- package/dist/esm/tests/public-api/public-error-types.test.js.map +7 -0
- package/dist/esm/tests/public-api/public-types.test.js +74 -0
- package/dist/esm/tests/public-api/public-types.test.js.map +7 -0
- package/dist/esm/tests/public-api/runtime-utils.test.js +31 -0
- package/dist/esm/tests/public-api/runtime-utils.test.js.map +7 -0
- package/dist/esm/tests/public-api/schema-utils.test.js +78 -0
- package/dist/esm/tests/public-api/schema-utils.test.js.map +7 -0
- package/dist/esm/tests/public-api/timeout-error-types.test.js +81 -0
- package/dist/esm/tests/public-api/timeout-error-types.test.js.map +7 -0
- package/dist/esm/tests/public-api/tool-type-export.test.js +25 -0
- package/dist/esm/tests/public-api/tool-type-export.test.js.map +7 -0
- package/dist/esm/tests/public-api/v3-core.test.js +82 -0
- package/dist/esm/tests/public-api/v3-core.test.js.map +7 -0
- package/dist/esm/tests/safety-confirmation.test.js +134 -0
- package/dist/esm/tests/safety-confirmation.test.js.map +7 -0
- package/dist/esm/tests/snapshot-a11y-resolvers.test.js +348 -0
- package/dist/esm/tests/snapshot-a11y-resolvers.test.js.map +7 -0
- package/dist/esm/tests/snapshot-a11y-tree-utils.test.js +300 -0
- package/dist/esm/tests/snapshot-a11y-tree-utils.test.js.map +7 -0
- package/dist/esm/tests/snapshot-capture-orchestration.test.js +381 -0
- package/dist/esm/tests/snapshot-capture-orchestration.test.js.map +7 -0
- package/dist/esm/tests/snapshot-cbor.test.js +197 -0
- package/dist/esm/tests/snapshot-cbor.test.js.map +7 -0
- package/dist/esm/tests/snapshot-dom-session-builders.test.js +251 -0
- package/dist/esm/tests/snapshot-dom-session-builders.test.js.map +7 -0
- package/dist/esm/tests/snapshot-dom-tree-utils.test.js +109 -0
- package/dist/esm/tests/snapshot-dom-tree-utils.test.js.map +7 -0
- package/dist/esm/tests/snapshot-focus-selectors-utils.test.js +49 -0
- package/dist/esm/tests/snapshot-focus-selectors-utils.test.js.map +7 -0
- package/dist/esm/tests/snapshot-frame-merge.test.js +391 -0
- package/dist/esm/tests/snapshot-frame-merge.test.js.map +7 -0
- package/dist/esm/tests/snapshot-tree-format-utils.test.js +113 -0
- package/dist/esm/tests/snapshot-tree-format-utils.test.js.map +7 -0
- package/dist/esm/tests/snapshot-xpath-utils.test.js +79 -0
- package/dist/esm/tests/snapshot-xpath-utils.test.js.map +7 -0
- package/dist/esm/tests/timeout-handlers.test.js +850 -0
- package/dist/esm/tests/timeout-handlers.test.js.map +7 -0
- package/dist/esm/tests/xpath-parser.test.js +317 -0
- package/dist/esm/tests/xpath-parser.test.js.map +7 -0
- package/dist/esm/tests/xpath-resolver.test.js +73 -0
- package/dist/esm/tests/xpath-resolver.test.js.map +7 -0
- package/dist/esm/tests/zod-enum-compatibility.test.js +97 -0
- package/dist/esm/tests/zod-enum-compatibility.test.js.map +7 -0
- package/package.json +41 -24
- package/dist/index.d.ts +0 -4363
- package/dist/index.js +0 -76530
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/v3/zodCompat.ts", "../../lib/version.ts", "../../lib/v3/types/public/sdkErrors.ts", "../../lib/utils.ts", "../../lib/v3/logger.ts", "../../lib/v3/types/public/methods.ts", "../../lib/v3/understudy/executionContextRegistry.ts", "../../lib/v3/dom/build/locatorScripts.generated.ts", "../../lib/v3/understudy/locatorInvocation.ts", "../../lib/v3/dom/build/a11yScripts.generated.ts", "../../lib/v3/understudy/a11y/snapshot/xpathUtils.ts", "../../lib/v3/understudy/a11y/snapshot/focusSelectors.ts", "../../lib/v3/understudy/a11y/snapshot/treeFormatUtils.ts", "../../lib/v3/understudy/a11y/snapshot/a11yTree.ts", "../../lib/v3/understudy/a11y/snapshot/domTree.ts", "../../lib/v3/understudy/a11y/snapshot/sessions.ts", "../../lib/v3/understudy/a11y/snapshot/capture.ts", "../../lib/v3/understudy/a11yInvocation.ts", "../../lib/v3/understudy/a11y/snapshot/activeElement.ts", "../../lib/v3/understudy/a11y/snapshot/coordinateResolver.ts", "../../lib/v3/understudy/a11y/snapshot/index.ts", "../../lib/v3/understudy/selectorResolver.ts", "../../lib/v3/understudy/fileUploadUtils.ts", "../../lib/v3/understudy/locator.ts", "../../lib/v3/understudy/frameLocator.ts", "../../lib/v3/understudy/deepLocator.ts", "../../lib/v3/flowLogger.ts", "../../lib/v3/llm/LLMClient.ts", "../../lib/v3/types/public/agent.ts", "../../lib/v3/types/public/api.ts", "../../lib/v3/types/public/apiErrors.ts", "../../lib/v3/types/public/logs.ts", "../../lib/v3/types/public/metrics.ts", "../../lib/v3/types/public/model.ts", "../../lib/v3/types/public/options.ts", "../../lib/v3/understudy/consoleMessage.ts", "../../lib/v3/understudy/response.ts", "../../lib/v3/types/public/page.ts", "../../lib/v3/external_clients/aisdk.ts", "../../lib/v3/external_clients/customOpenAI.ts", "../../lib/v3/types/public/index.ts", "../../lib/v3/understudy/frame.ts", "../../lib/v3/understudy/frameRegistry.ts", "../../lib/v3/types/private/network.ts", "../../lib/v3/understudy/networkManager.ts", "../../lib/v3/understudy/lifecycleWatcher.ts", "../../lib/v3/understudy/navigationResponseTracker.ts", "../../lib/v3/understudy/initScripts.ts", "../../lib/v3/dom/build/screenshotScripts.generated.ts", "../../lib/v3/understudy/screenshotUtils.ts", "../../lib/v3/understudy/page.ts", "../../lib/v3/index.ts", "../../lib/v3/v3.ts", "../../lib/logger.ts", "../../lib/v3/cache/ActCache.ts", "../../lib/v3/cache/utils.ts", "../../lib/v3/cache/AgentCache.ts", "../../lib/v3/cache/CacheStorage.ts", "../../lib/inference.ts", "../../lib/v3/timeoutConfig.ts", "../../lib/prompt.ts", "../../lib/inferenceLogUtils.ts", "../../lib/v3/types/private/handlers.ts", "../../lib/v3/handlers/actHandler.ts", "../../lib/v3/handlers/handlerUtils/actHandlerUtils.ts", "../../lib/v3/handlers/handlerUtils/timeoutGuard.ts", "../../lib/v3/handlers/extractHandler.ts", "../../lib/v3/handlers/observeHandler.ts", "../../lib/v3/agent/tools/goto.ts", "../../lib/v3/agent/tools/act.ts", "../../lib/v3/agent/tools/screenshot.ts", "../../lib/v3/agent/tools/wait.ts", "../../lib/v3/agent/utils/screenshotHandler.ts", "../../lib/v3/agent/tools/navback.ts", "../../lib/v3/agent/tools/ariaTree.ts", "../../lib/v3/agent/tools/fillform.ts", "../../lib/v3/agent/tools/scroll.ts", "../../lib/v3/agent/utils/coordinateNormalization.ts", "../../lib/v3/agent/tools/extract.ts", "../../lib/v3/agent/tools/click.ts", "../../lib/v3/agent/utils/xpath.ts", "../../lib/v3/agent/tools/type.ts", "../../lib/v3/agent/tools/dragAndDrop.ts", "../../lib/v3/agent/tools/clickAndHold.ts", "../../lib/v3/agent/tools/keys.ts", "../../lib/v3/agent/tools/fillFormVision.ts", "../../lib/v3/agent/tools/think.ts", "../../lib/v3/agent/tools/search.ts", "../../lib/v3/agent/tools/index.ts", "../../lib/v3/agent/prompts/agentSystemPrompt.ts", "../../lib/v3/handlers/v3AgentHandler.ts", "../../lib/v3/agent/utils/messageProcessing.ts", "../../lib/v3/agent/utils/actionMapping.ts", "../../lib/v3/agent/utils/handleDoneToolCall.ts", "../../lib/v3/handlers/v3CuaAgentHandler.ts", "../../lib/v3/agent/AgentProvider.ts", "../../lib/v3/agent/AnthropicCUAClient.ts", "../../lib/v3/agent/AgentClient.ts", "../../lib/v3/agent/utils/imageCompression.ts", "../../lib/v3/agent/OpenAICUAClient.ts", "../../lib/v3/agent/GoogleCUAClient.ts", "../../lib/v3/agent/utils/cuaKeyMapping.ts", "../../lib/v3/agent/utils/googleCustomToolHandler.ts", "../../lib/v3/agent/MicrosoftCUAClient.ts", "../../lib/v3/launch/browserbase.ts", "../../lib/v3/launch/local.ts", "../../lib/v3/llm/LLMProvider.ts", "../../lib/v3/llm/aisdk.ts", "../../lib/v3/llm/AnthropicClient.ts", "../../lib/v3/llm/CerebrasClient.ts", "../../lib/v3/llm/GoogleClient.ts", "../../lib/v3/llm/GroqClient.ts", "../../lib/v3/llm/OpenAIClient.ts", "../../lib/v3/shutdown/cleanupLocal.ts", "../../lib/v3/shutdown/supervisorClient.ts", "../../lib/v3/types/private/shutdownErrors.ts", "../../lib/v3/mcp/utils.ts", "../../lib/v3/mcp/connection.ts", "../../lib/v3/understudy/context.ts", "../../lib/v3/understudy/cdp.ts", "../../lib/v3/understudy/piercer.ts", "../../lib/v3/dom/build/scriptV3Content.ts", "../../lib/v3/dom/build/reRenderScriptContent.ts", "../../lib/modelUtils.ts", "../../lib/v3/api.ts", "../../lib/v3/agent/utils/validateExperimentalFeatures.ts", "../../lib/v3Evaluator.ts", "../../lib/v3/cache/serverAgentCache.ts", "../../lib/v3/shutdown/supervisor.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport type {\n ZodObject as Zod4Object,\n ZodRawShape as Zod4RawShape,\n ZodTypeAny as Zod4TypeAny,\n} from \"zod\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport type * as z3 from \"zod/v3\";\nexport type StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny;\n\nexport type StagehandZodObject =\n | Zod4Object<Zod4RawShape>\n | z3.ZodObject<z3.ZodRawShape>;\n\nexport type InferStagehandSchema<T extends StagehandZodSchema> =\n T extends z3.ZodTypeAny\n ? z3.infer<T>\n : T extends Zod4TypeAny\n ? z.infer<T>\n : never;\n\nexport const isZod4Schema = (\n schema: StagehandZodSchema,\n): schema is Zod4TypeAny & { _zod: unknown } =>\n typeof (schema as { _zod?: unknown })._zod !== \"undefined\";\n\nexport const isZod3Schema = (\n schema: StagehandZodSchema,\n): schema is z3.ZodTypeAny => !isZod4Schema(schema);\n\nexport type JsonSchemaDocument = Record<string, unknown>;\n\nexport function toJsonSchema(schema: StagehandZodSchema): JsonSchemaDocument {\n if (!isZod4Schema(schema)) {\n return zodToJsonSchema(schema);\n }\n\n // For v4 schemas, use built-in z.toJSONSchema() method\n const zodWithJsonSchema = z as typeof z & {\n toJSONSchema?: (schema: Zod4TypeAny) => JsonSchemaDocument;\n };\n\n if (zodWithJsonSchema.toJSONSchema) {\n return zodWithJsonSchema.toJSONSchema(schema as Zod4TypeAny);\n }\n\n // This should never happen with Zod v4.1+\n throw new Error(\"Zod v4 toJSONSchema method not found\");\n}\n", "/**\n * AUTO-GENERATED \u2014 DO NOT EDIT BY HAND\n * Run `pnpm run gen-version` to refresh.\n */\nexport const STAGEHAND_VERSION = \"3.0.8\" as const;\n", "import { ZodError } from \"zod\";\n// Avoid .js extension so bundlers resolve TS source\nimport { STAGEHAND_VERSION } from \"../../../version.js\";\n\nexport class StagehandError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = this.constructor.name;\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nexport class StagehandDefaultError extends StagehandError {\n constructor(error?: unknown) {\n if (error instanceof Error || error instanceof StagehandError) {\n super(\n `\\nHey! We're sorry you ran into an error. \\nStagehand version: ${STAGEHAND_VERSION} \\nIf you need help, please open a Github issue or reach out to us on Discord: https://stagehand.dev/discord\\n\\nFull error:\\n${error.message}`,\n );\n }\n }\n}\n\nexport class StagehandEnvironmentError extends StagehandError {\n constructor(\n currentEnvironment: string,\n requiredEnvironment: string,\n feature: string,\n ) {\n super(\n `You seem to be setting the current environment to ${currentEnvironment}.` +\n `Ensure the environment is set to ${requiredEnvironment} if you want to use ${feature}.`,\n );\n }\n}\n\nexport class MissingEnvironmentVariableError extends StagehandError {\n constructor(missingEnvironmentVariable: string, feature: string) {\n super(\n `${missingEnvironmentVariable} is required to use ${feature}.` +\n `Please set ${missingEnvironmentVariable} in your environment.`,\n );\n }\n}\n\nexport class UnsupportedModelError extends StagehandError {\n constructor(supportedModels: string[], feature?: string) {\n const message = feature\n ? `${feature} requires a valid model.`\n : `Unsupported model.`;\n\n const guidance =\n `\\n\\nPlease use the provider/model format (e.g., \"openai/gpt-4o\", \"anthropic/claude-sonnet-4-5\", \"google/gemini-3-flash-preview\").` +\n `\\n\\nFor a complete list of supported models and providers, see: https://docs.stagehand.dev/v3/configuration/models#configuration-setup`;\n\n super(`${message}${guidance}`);\n }\n}\n\nexport class UnsupportedModelProviderError extends StagehandError {\n constructor(supportedProviders: string[], feature?: string) {\n super(\n feature\n ? `${feature} requires one of the following model providers: ${supportedProviders}`\n : `please use one of the supported model providers: ${supportedProviders}`,\n );\n }\n}\n\nexport class UnsupportedAISDKModelProviderError extends StagehandError {\n constructor(provider: string, supportedProviders: string[]) {\n super(\n `${provider} is not currently supported for aiSDK. please use one of the supported model providers: ${supportedProviders}`,\n );\n }\n}\n\nexport class InvalidAISDKModelFormatError extends StagehandError {\n constructor(modelName: string) {\n super(\n `${modelName} does not follow correct format for specifying aiSDK models. Please define your model as 'provider/model-name'. For example: \\`model: 'openai/gpt-4o-mini'\\``,\n );\n }\n}\n\nexport class StagehandNotInitializedError extends StagehandError {\n constructor(prop: string) {\n super(\n `You seem to be calling \\`${prop}\\` on a page in an uninitialized \\`Stagehand\\` object. ` +\n `Ensure you are running \\`await stagehand.init()\\` on the Stagehand object before ` +\n `referencing the \\`page\\` object.`,\n );\n }\n}\n\nexport class BrowserbaseSessionNotFoundError extends StagehandError {\n constructor() {\n super(\"No Browserbase session ID found\");\n }\n}\n\nexport class CaptchaTimeoutError extends StagehandError {\n constructor() {\n super(\"Captcha timeout\");\n }\n}\n\nexport class MissingLLMConfigurationError extends StagehandError {\n constructor() {\n super(\n \"No LLM API key or LLM Client configured. An LLM API key or a custom LLM Client \" +\n \"is required to use act, extract, or observe.\",\n );\n }\n}\n\nexport class HandlerNotInitializedError extends StagehandError {\n constructor(handlerType: string) {\n super(`${handlerType} handler not initialized`);\n }\n}\n\nexport class StagehandInvalidArgumentError extends StagehandError {\n constructor(message: string) {\n super(`InvalidArgumentError: ${message}`);\n }\n}\n\nexport class StagehandElementNotFoundError extends StagehandError {\n constructor(xpaths: string[]) {\n super(`Could not find an element for the given xPath(s): ${xpaths}`);\n }\n}\n\nexport class AgentScreenshotProviderError extends StagehandError {\n constructor(message: string) {\n super(`ScreenshotProviderError: ${message}`);\n }\n}\n\nexport class StagehandMissingArgumentError extends StagehandError {\n constructor(message: string) {\n super(`MissingArgumentError: ${message}`);\n }\n}\n\nexport class CreateChatCompletionResponseError extends StagehandError {\n constructor(message: string) {\n super(`CreateChatCompletionResponseError: ${message}`);\n }\n}\n\nexport class StagehandEvalError extends StagehandError {\n constructor(message: string) {\n super(`StagehandEvalError: ${message}`);\n }\n}\n\nexport class StagehandDomProcessError extends StagehandError {\n constructor(message: string) {\n super(`Error Processing Dom: ${message}`);\n }\n}\n\nexport class StagehandLocatorError extends StagehandError {\n constructor(action: string, selector: string, message: string) {\n super(\n `Error ${action} Element with selector: ${selector} Reason: ${message}`,\n );\n }\n}\n\nexport class StagehandClickError extends StagehandError {\n constructor(message: string, selector: string) {\n super(\n `Error Clicking Element with selector: ${selector} Reason: ${message}`,\n );\n }\n}\n\nexport class LLMResponseError extends StagehandError {\n constructor(primitive: string, message: string) {\n super(`${primitive} LLM response error: ${message}`);\n }\n}\n\nexport class StagehandIframeError extends StagehandError {\n constructor(frameUrl: string, message: string) {\n super(\n `Unable to resolve frameId for iframe with URL: ${frameUrl} Full error: ${message}`,\n );\n }\n}\n\nexport class ContentFrameNotFoundError extends StagehandError {\n constructor(selector: string) {\n super(`Unable to obtain a content frame for selector: ${selector}`);\n }\n}\n\nexport class XPathResolutionError extends StagehandError {\n constructor(xpath: string) {\n super(`XPath \"${xpath}\" does not resolve in the current page or frames`);\n }\n}\n\nexport class ExperimentalApiConflictError extends StagehandError {\n constructor() {\n super(\n \"`experimental` mode cannot be used together with the Stagehand API. \" +\n \"To use experimental features, set experimental: true, and useApi: false in the stagehand constructor. \" +\n \"To use the Stagehand API, set experimental: false and useApi: true in the stagehand constructor. \",\n );\n }\n}\n\nexport class ExperimentalNotConfiguredError extends StagehandError {\n constructor(featureName: string) {\n super(`Feature \"${featureName}\" is an experimental feature, and cannot be configured when useAPI: true. \n Please set experimental: true and useAPI: false in the stagehand constructor to use this feature. \n If you wish to use the Stagehand API, please ensure ${featureName} is not defined in your function call, \n and set experimental: false, useAPI: true in the Stagehand constructor. `);\n }\n}\n\nexport class CuaModelRequiredError extends StagehandError {\n constructor(availableModels: readonly string[]) {\n super(\n `To use the computer use agent (CUA), please provide a CUA model in the agent constructor or stagehand config. ` +\n `Try one of our supported CUA models: ${availableModels.join(\", \")}`,\n );\n }\n}\n\nexport class ZodSchemaValidationError extends Error {\n constructor(\n public readonly received: unknown,\n public readonly issues: ReturnType<ZodError[\"format\"]>,\n ) {\n super(`Zod schema validation failed\n\n\u2014 Received \u2014\n${JSON.stringify(received, null, 2)}\n\n\u2014 Issues \u2014\n${JSON.stringify(issues, null, 2)}`);\n this.name = \"ZodSchemaValidationError\";\n }\n}\n\nexport class StagehandInitError extends StagehandError {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class MCPConnectionError extends StagehandError {\n public readonly serverUrl: string;\n public readonly originalError: unknown;\n\n constructor(serverUrl: string, originalError: unknown) {\n const errorMessage =\n originalError instanceof Error\n ? originalError.message\n : String(originalError);\n\n super(\n `Failed to connect to MCP server at \"${serverUrl}\". ${errorMessage}. ` +\n `Please verify the server URL is correct and the server is running.`,\n );\n\n this.serverUrl = serverUrl;\n this.originalError = originalError;\n }\n}\n\nexport class StagehandShadowRootMissingError extends StagehandError {\n constructor(detail?: string) {\n super(\n `No shadow root present on the resolved host` +\n (detail ? `: ${detail}` : \"\"),\n );\n }\n}\n\nexport class StagehandShadowSegmentEmptyError extends StagehandError {\n constructor() {\n super(`Empty selector segment after shadow-DOM hop (\"//\")`);\n }\n}\n\nexport class StagehandShadowSegmentNotFoundError extends StagehandError {\n constructor(segment: string, hint?: string) {\n super(\n `Shadow segment '${segment}' matched no element inside shadow root` +\n (hint ? ` ${hint}` : \"\"),\n );\n }\n}\n\nexport class ElementNotVisibleError extends StagehandError {\n constructor(selector: string) {\n super(`Element not visible (no box model): ${selector}`);\n }\n}\n\nexport class ResponseBodyError extends StagehandError {\n constructor(message: string) {\n super(`Failed to retrieve response body: ${message}`);\n }\n}\n\nexport class ResponseParseError extends StagehandError {\n constructor(message: string) {\n super(`Failed to parse response: ${message}`);\n }\n}\n\nexport class TimeoutError extends StagehandError {\n constructor(operation: string, timeoutMs: number) {\n super(`${operation} timed out after ${timeoutMs}ms`);\n }\n}\n\nexport class ActTimeoutError extends TimeoutError {\n constructor(timeoutMs: number) {\n super(\"act()\", timeoutMs);\n this.name = \"ActTimeoutError\";\n }\n}\n\nexport class ExtractTimeoutError extends TimeoutError {\n constructor(timeoutMs: number) {\n super(\"extract()\", timeoutMs);\n this.name = \"ExtractTimeoutError\";\n }\n}\n\nexport class ObserveTimeoutError extends TimeoutError {\n constructor(timeoutMs: number) {\n super(\"observe()\", timeoutMs);\n this.name = \"ObserveTimeoutError\";\n }\n}\n\nexport class PageNotFoundError extends StagehandError {\n constructor(identifier: string) {\n super(`No Page found for ${identifier}`);\n }\n}\n\nexport class ConnectionTimeoutError extends StagehandError {\n constructor(message: string) {\n super(`Connection timeout: ${message}`);\n }\n}\n\nexport class StreamingCallbacksInNonStreamingModeError extends StagehandError {\n public readonly invalidCallbacks: string[];\n\n constructor(invalidCallbacks: string[]) {\n super(\n `Streaming-only callback(s) \"${invalidCallbacks.join('\", \"')}\" cannot be used in non-streaming mode. ` +\n `Set 'stream: true' in AgentConfig to use these callbacks.`,\n );\n this.invalidCallbacks = invalidCallbacks;\n }\n}\n\nexport class AgentAbortError extends StagehandError {\n public readonly reason: string;\n\n constructor(reason?: string) {\n const message = reason\n ? `Agent execution was aborted: ${reason}`\n : \"Agent execution was aborted\";\n super(message);\n this.reason = reason || \"aborted\";\n }\n}\n\nexport class StagehandClosedError extends StagehandError {\n constructor() {\n super(\"Stagehand session was closed\");\n }\n}\n\nexport class StagehandSnapshotError extends StagehandError {\n constructor(cause?: unknown) {\n const suffix =\n cause instanceof Error\n ? `: ${cause.message}`\n : cause\n ? `: ${String(cause)}`\n : \"\";\n super(`error taking snapshot${suffix}`, cause);\n }\n}\n", "import { ZodSchemaValidationError } from \"./v3/types/public/sdkErrors.js\";\nimport { Schema, Type } from \"@google/genai\";\nimport { z, ZodTypeAny } from \"zod\";\nimport z3 from \"zod/v3\";\nimport { LogLine } from \"./v3/types/public/logs.js\";\nimport { ModelProvider } from \"./v3/types/public/model.js\";\nimport { ZodPathSegments } from \"./v3/types/private/internal.js\";\nimport type { StagehandZodSchema } from \"./v3/zodCompat.js\";\nimport { isZod4Schema } from \"./v3/zodCompat.js\";\n\nconst ID_PATTERN = /^\\d+-\\d+$/;\n\nconst zFactories = {\n v4: z,\n v3: z3 as unknown as typeof z,\n};\n\nexport function getZFactory(schema: StagehandZodSchema): typeof z {\n return isZod4Schema(schema) ? zFactories.v4 : zFactories.v3;\n}\n\nconst TYPE_NAME_MAP: Record<string, string> = {\n ZodString: \"string\",\n string: \"string\",\n ZodNumber: \"number\",\n number: \"number\",\n ZodBoolean: \"boolean\",\n boolean: \"boolean\",\n ZodObject: \"object\",\n object: \"object\",\n ZodArray: \"array\",\n array: \"array\",\n ZodUnion: \"union\",\n union: \"union\",\n ZodIntersection: \"intersection\",\n intersection: \"intersection\",\n ZodOptional: \"optional\",\n optional: \"optional\",\n ZodNullable: \"nullable\",\n nullable: \"nullable\",\n ZodLiteral: \"literal\",\n literal: \"literal\",\n ZodEnum: \"enum\",\n enum: \"enum\",\n ZodDefault: \"default\",\n default: \"default\",\n ZodEffects: \"effects\",\n effects: \"effects\",\n pipe: \"pipe\",\n};\n\nfunction getZ4Def(schema: StagehandZodSchema) {\n return (schema as SchemaInternals)._zod?.def as\n | Record<string, unknown>\n | undefined;\n}\n\nfunction getZ4Bag(schema: StagehandZodSchema) {\n return (schema as SchemaInternals)._zod?.bag as\n | Record<string, unknown>\n | undefined;\n}\n\nfunction getZ3Def(schema: StagehandZodSchema) {\n return (schema as SchemaInternals)._def as\n | Record<string, unknown>\n | undefined;\n}\n\nfunction getObjectShape(\n schema: StagehandZodSchema,\n): Record<string, StagehandZodSchema> | undefined {\n const z4Shape = getZ4Def(schema)?.shape as\n | Record<string, StagehandZodSchema>\n | undefined;\n if (z4Shape) {\n return z4Shape;\n }\n\n const z3Shape = getZ3Def(schema)?.shape;\n if (!z3Shape) {\n return undefined;\n }\n\n if (typeof z3Shape === \"function\") {\n return (z3Shape as () => Record<string, StagehandZodSchema>)();\n }\n\n return z3Shape as Record<string, StagehandZodSchema>;\n}\n\nfunction getArrayElement(\n schema: StagehandZodSchema,\n): StagehandZodSchema | undefined {\n return (getZ4Def(schema)?.element ?? getZ3Def(schema)?.type) as\n | StagehandZodSchema\n | undefined;\n}\n\nfunction getInnerType(\n schema: StagehandZodSchema,\n): StagehandZodSchema | undefined {\n return (getZ4Def(schema)?.innerType ?? getZ3Def(schema)?.innerType) as\n | StagehandZodSchema\n | undefined;\n}\n\nfunction getUnionOptions(\n schema: StagehandZodSchema,\n): StagehandZodSchema[] | undefined {\n const z4Options = getZ4Def(schema)?.options;\n if (Array.isArray(z4Options)) {\n return z4Options as StagehandZodSchema[];\n }\n const z3Options = getZ3Def(schema)?.options;\n return Array.isArray(z3Options)\n ? (z3Options as StagehandZodSchema[])\n : undefined;\n}\n\nfunction getIntersectionSides(schema: StagehandZodSchema): {\n left?: StagehandZodSchema;\n right?: StagehandZodSchema;\n} {\n const z4Def = getZ4Def(schema);\n if (z4Def?.left || z4Def?.right) {\n return {\n left: z4Def?.left as StagehandZodSchema | undefined,\n right: z4Def?.right as StagehandZodSchema | undefined,\n };\n }\n const z3Def = getZ3Def(schema);\n return {\n left: z3Def?.left as StagehandZodSchema | undefined,\n right: z3Def?.right as StagehandZodSchema | undefined,\n };\n}\n\nfunction getEnumValues(schema: StagehandZodSchema): string[] | undefined {\n const z4Entries = getZ4Def(schema)?.entries;\n if (z4Entries && typeof z4Entries === \"object\") {\n return Object.values(z4Entries as Record<string, string>);\n }\n const z3Values = getZ3Def(schema)?.values;\n return Array.isArray(z3Values) ? (z3Values as string[]) : undefined;\n}\n\nfunction getLiteralValues(schema: StagehandZodSchema): unknown[] {\n const z4Values = getZ4Def(schema)?.values;\n if (Array.isArray(z4Values)) {\n return z4Values as unknown[];\n }\n const value = getZ3Def(schema)?.value;\n return typeof value !== \"undefined\" ? [value] : [];\n}\n\nfunction getStringChecks(schema: StagehandZodSchema): unknown[] {\n const z4Checks = getZ4Def(schema)?.checks;\n if (Array.isArray(z4Checks)) {\n return z4Checks;\n }\n const z3Checks = getZ3Def(schema)?.checks;\n return Array.isArray(z3Checks) ? z3Checks : [];\n}\n\nfunction getStringFormat(schema: StagehandZodSchema): string | undefined {\n const bagFormat = getZ4Bag(schema)?.format;\n if (typeof bagFormat === \"string\") {\n return bagFormat;\n }\n const z4Format = getZ4Def(schema)?.format;\n if (typeof z4Format === \"string\") {\n return z4Format;\n }\n const z3Format = getZ3Def(schema)?.format;\n return typeof z3Format === \"string\" ? z3Format : undefined;\n}\n\nfunction getPipeEndpoints(schema: StagehandZodSchema): {\n in?: StagehandZodSchema;\n out?: StagehandZodSchema;\n} {\n const z4Def = getZ4Def(schema);\n if (z4Def?.in || z4Def?.out) {\n return {\n in: z4Def?.in as StagehandZodSchema | undefined,\n out: z4Def?.out as StagehandZodSchema | undefined,\n };\n }\n return {};\n}\n\nfunction getEffectsBaseSchema(\n schema: StagehandZodSchema,\n): StagehandZodSchema | undefined {\n return getZ3Def(schema)?.schema as StagehandZodSchema | undefined;\n}\n\ntype SchemaInternals = {\n _zod?: { def?: Record<string, unknown>; bag?: Record<string, unknown> };\n _def?: Record<string, unknown>;\n};\n\nexport function validateZodSchema(schema: StagehandZodSchema, data: unknown) {\n const result = schema.safeParse(data);\n\n if (result.success) {\n return true;\n }\n throw new ZodSchemaValidationError(data, result.error.format());\n}\n\n/**\n * Detects if the code is running in the Bun runtime environment.\n * @returns {boolean} True if running in Bun, false otherwise.\n */\nexport function isRunningInBun(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof process.versions !== \"undefined\" &&\n \"bun\" in process.versions\n );\n}\n\n/*\n * Helper functions for converting between Gemini and Zod schemas\n */\nfunction decorateGeminiSchema(\n geminiSchema: Schema,\n zodSchema: z.ZodTypeAny,\n): Schema {\n if (geminiSchema.nullable === undefined) {\n geminiSchema.nullable = zodSchema.isOptional();\n }\n\n if (zodSchema.description) {\n geminiSchema.description = zodSchema.description;\n }\n\n return geminiSchema;\n}\n\nexport function toGeminiSchema(zodSchema: StagehandZodSchema): Schema {\n const normalizedSchema = zodSchema as z.ZodTypeAny;\n const zodType = getZodType(zodSchema);\n switch (zodType) {\n case \"array\": {\n const element = getArrayElement(zodSchema) ?? z.any();\n return decorateGeminiSchema(\n {\n type: Type.ARRAY,\n items: toGeminiSchema(element),\n },\n normalizedSchema,\n );\n }\n case \"object\": {\n const properties: Record<string, Schema> = {};\n const required: string[] = [];\n\n const shape = getObjectShape(zodSchema);\n if (shape) {\n Object.entries(shape).forEach(\n ([key, value]: [string, StagehandZodSchema]) => {\n properties[key] = toGeminiSchema(value);\n if (getZodType(value) !== \"optional\") {\n required.push(key);\n }\n },\n );\n }\n\n return decorateGeminiSchema(\n {\n type: Type.OBJECT,\n properties,\n required: required.length > 0 ? required : undefined,\n },\n normalizedSchema,\n );\n }\n case \"string\":\n return decorateGeminiSchema(\n {\n type: Type.STRING,\n },\n normalizedSchema,\n );\n case \"number\":\n return decorateGeminiSchema(\n {\n type: Type.NUMBER,\n },\n normalizedSchema,\n );\n case \"boolean\":\n return decorateGeminiSchema(\n {\n type: Type.BOOLEAN,\n },\n normalizedSchema,\n );\n case \"enum\": {\n const values = getEnumValues(zodSchema);\n return decorateGeminiSchema(\n {\n type: Type.STRING,\n enum: values,\n },\n normalizedSchema,\n );\n }\n case \"default\":\n case \"nullable\":\n case \"optional\": {\n const innerType = getInnerType(zodSchema) ?? z.any();\n const innerSchema = toGeminiSchema(innerType);\n return decorateGeminiSchema(\n {\n ...innerSchema,\n nullable: true,\n },\n normalizedSchema,\n );\n }\n case \"literal\": {\n const values = getLiteralValues(zodSchema);\n return decorateGeminiSchema(\n {\n type: Type.STRING,\n enum: values as string[],\n },\n normalizedSchema,\n );\n }\n case \"pipe\": {\n const endpoints = getPipeEndpoints(zodSchema);\n if (endpoints.in) {\n return toGeminiSchema(endpoints.in);\n }\n return decorateGeminiSchema(\n {\n type: Type.STRING,\n },\n normalizedSchema,\n );\n }\n // Standalone transforms and any unknown types fall through to default\n default:\n return decorateGeminiSchema(\n {\n type: Type.STRING,\n },\n normalizedSchema,\n );\n }\n}\n\n// Helper function to check the type of Zod schema\nexport function getZodType(schema: StagehandZodSchema): string {\n const schemaWithDef = schema as SchemaInternals & {\n _zod?: { def?: { type?: string } };\n };\n const rawType =\n (schemaWithDef._zod?.def?.type as string | undefined) ??\n (schemaWithDef._def?.typeName as string | undefined) ??\n (schemaWithDef._def?.type as string | undefined);\n\n if (!rawType) {\n return \"unknown\";\n }\n\n return TYPE_NAME_MAP[rawType] ?? rawType;\n}\n\n/**\n * Recursively traverses a given Zod schema, scanning for any fields of type `z.string().url()`.\n * For each such field, it replaces the `z.string().url()` with `z.number()`.\n *\n * This function is used internally by higher-level utilities (e.g., transforming entire object schemas)\n * and handles nested objects, arrays, unions, intersections, optionals.\n *\n * @param schema - The Zod schema to transform.\n * @param currentPath - An array of string/number keys representing the current schema path (used internally for recursion).\n * @returns A two-element tuple:\n * 1. The updated Zod schema, with any `.url()` fields replaced by `z.number()`.\n * 2. An array of {@link ZodPathSegments} objects representing each replaced field, including the path segments.\n */\nexport function transformSchema(\n schema: StagehandZodSchema,\n currentPath: Array<string | number>,\n): [StagehandZodSchema, ZodPathSegments[]] {\n if (isKind(schema, \"string\")) {\n const checks = getStringChecks(schema);\n const format = getStringFormat(schema);\n const hasUrlCheck =\n checks.some((check) => {\n const candidate = check as {\n kind?: string;\n format?: string;\n _zod?: { def?: { check?: string; format?: string } };\n };\n return (\n candidate.kind === \"url\" ||\n candidate.format === \"url\" ||\n candidate._zod?.def?.check === \"url\" ||\n candidate._zod?.def?.format === \"url\"\n );\n }) || format === \"url\";\n\n if (hasUrlCheck) {\n return [makeIdStringSchema(schema), [{ segments: [] }]];\n }\n return [schema, []];\n }\n\n if (isKind(schema, \"object\")) {\n const shape = getObjectShape(schema);\n if (!shape) {\n return [schema, []];\n }\n const newShape: Record<string, StagehandZodSchema> = {};\n const urlPaths: ZodPathSegments[] = [];\n let changed = false;\n\n for (const key of Object.keys(shape)) {\n const child = shape[key];\n const [transformedChild, childPaths] = transformSchema(child, [\n ...currentPath,\n key,\n ]);\n if (transformedChild !== child) {\n changed = true;\n }\n newShape[key] = transformedChild;\n childPaths.forEach((cp) => {\n urlPaths.push({ segments: [key, ...cp.segments] });\n });\n }\n\n if (changed) {\n const factory = getZFactory(schema);\n return [\n factory.object(newShape as Record<string, z.ZodTypeAny>),\n urlPaths,\n ];\n }\n return [schema, urlPaths];\n }\n\n if (isKind(schema, \"array\")) {\n const itemType = getArrayElement(schema);\n if (!itemType) {\n return [schema, []];\n }\n const [transformedItem, childPaths] = transformSchema(itemType, [\n ...currentPath,\n \"*\",\n ]);\n const arrayPaths: ZodPathSegments[] = childPaths.map((cp) => ({\n segments: [\"*\", ...cp.segments],\n }));\n if (transformedItem !== itemType) {\n const factory = getZFactory(schema);\n return [\n factory.array(transformedItem as unknown as z.ZodTypeAny),\n arrayPaths,\n ];\n }\n return [schema, arrayPaths];\n }\n\n if (isKind(schema, \"union\")) {\n const unionOptions = getUnionOptions(schema);\n if (!unionOptions || unionOptions.length === 0) {\n return [schema, []];\n }\n const newOptions: StagehandZodSchema[] = [];\n let changed = false;\n let allPaths: ZodPathSegments[] = [];\n\n unionOptions.forEach((option, idx) => {\n const [newOption, childPaths] = transformSchema(option, [\n ...currentPath,\n `union_${idx}`,\n ]);\n if (newOption !== option) {\n changed = true;\n }\n newOptions.push(newOption);\n allPaths = [...allPaths, ...childPaths];\n });\n\n if (changed) {\n const factory = getZFactory(schema);\n return [\n factory.union(\n newOptions as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ],\n ),\n allPaths,\n ];\n }\n return [schema, allPaths];\n }\n\n if (isKind(schema, \"intersection\")) {\n const { left, right } = getIntersectionSides(schema);\n if (!left || !right) {\n return [schema, []];\n }\n const [newLeft, leftPaths] = transformSchema(left, [\n ...currentPath,\n \"intersection_left\",\n ]);\n const [newRight, rightPaths] = transformSchema(right, [\n ...currentPath,\n \"intersection_right\",\n ]);\n const changed = newLeft !== left || newRight !== right;\n const allPaths = [...leftPaths, ...rightPaths];\n if (changed) {\n const factory = getZFactory(schema);\n return [\n factory.intersection(\n newLeft as unknown as z.ZodTypeAny,\n newRight as unknown as z.ZodTypeAny,\n ),\n allPaths,\n ];\n }\n return [schema, allPaths];\n }\n\n if (isKind(schema, \"optional\")) {\n const innerType = getInnerType(schema);\n if (!innerType) {\n return [schema, []];\n }\n const [inner, innerPaths] = transformSchema(innerType, currentPath);\n if (inner !== innerType) {\n return [\n (inner as z.ZodTypeAny).optional() as unknown as StagehandZodSchema,\n innerPaths,\n ];\n }\n return [schema, innerPaths];\n }\n\n if (isKind(schema, \"nullable\")) {\n const innerType = getInnerType(schema);\n if (!innerType) {\n return [schema, []];\n }\n const [inner, innerPaths] = transformSchema(innerType, currentPath);\n if (inner !== innerType) {\n return [\n (inner as z.ZodTypeAny).nullable() as unknown as StagehandZodSchema,\n innerPaths,\n ];\n }\n return [schema, innerPaths];\n }\n\n if (isKind(schema, \"pipe\") && isZod4Schema(schema)) {\n const { in: inSchema, out: outSchema } = getPipeEndpoints(schema);\n if (!inSchema || !outSchema) {\n return [schema, []];\n }\n\n const [newIn, inPaths] = transformSchema(inSchema, currentPath);\n const [newOut, outPaths] = transformSchema(outSchema, currentPath);\n const allPaths = [...inPaths, ...outPaths];\n\n if (newIn !== inSchema || newOut !== outSchema) {\n const result = z.pipe(\n newIn as unknown as z.ZodTypeAny,\n newOut as unknown as z.ZodTypeAny,\n ) as StagehandZodSchema;\n return [result, allPaths];\n }\n return [schema, allPaths];\n }\n\n if (isKind(schema, \"effects\")) {\n const baseSchema = getEffectsBaseSchema(schema);\n if (!baseSchema) {\n return [schema, []];\n }\n return transformSchema(baseSchema, currentPath);\n }\n\n return [schema, []];\n}\n\n/**\n * Once we get the final extracted object that has numeric IDs in place of URLs,\n * use `injectUrls` to walk the object and replace numeric IDs\n * with the real URL strings from idToUrlMapping. The `path` may include `*`\n * for array indices (indicating \"all items in the array\").\n */\nexport function injectUrls(\n obj: unknown,\n path: Array<string | number>,\n idToUrlMapping: Record<string, string>,\n): void {\n if (path.length === 0) return;\n const toId = (value: unknown): string | undefined => {\n if (typeof value === \"number\") {\n return String(value);\n }\n if (typeof value === \"string\" && ID_PATTERN.test(value)) {\n return value;\n }\n return undefined;\n };\n const [key, ...rest] = path;\n\n if (key === \"*\") {\n if (Array.isArray(obj)) {\n if (rest.length === 0) {\n for (let i = 0; i < obj.length; i += 1) {\n const id = toId(obj[i]);\n if (id !== undefined) {\n obj[i] = idToUrlMapping[id] ?? \"\";\n }\n }\n } else {\n for (const item of obj) injectUrls(item, rest, idToUrlMapping);\n }\n }\n return;\n }\n\n if (obj && typeof obj === \"object\") {\n const record = obj as Record<string | number, unknown>;\n if (path.length === 1) {\n const fieldValue = record[key];\n const id = toId(fieldValue);\n if (id !== undefined) {\n record[key] = idToUrlMapping[id] ?? \"\";\n }\n } else {\n injectUrls(record[key], rest, idToUrlMapping);\n }\n }\n}\n\n// Helper to check if a schema is of a specific type\nfunction isKind(s: StagehandZodSchema, kind: string): boolean {\n try {\n return getZodType(s) === kind;\n } catch {\n return false;\n }\n}\n\nfunction makeIdStringSchema(orig: StagehandZodSchema): StagehandZodSchema {\n const userDesc =\n (orig as unknown as { description?: string }).description ?? \"\";\n\n const base =\n \"This field must be the element-ID in the form 'frameId-backendId' \" +\n '(e.g. \"0-432\").';\n const composed =\n userDesc.trim().length > 0\n ? `${base} that follows this user-defined description: ${userDesc}`\n : base;\n\n const factory = getZFactory(orig);\n return factory.string().regex(ID_PATTERN).describe(composed);\n}\n\n/**\n * Mapping from LLM provider names to their corresponding environment variable names for API keys.\n */\nexport const providerEnvVarMap: Partial<\n Record<ModelProvider | string, string | Array<string>>\n> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n google: [\"GEMINI_API_KEY\", \"GOOGLE_GENERATIVE_AI_API_KEY\", \"GOOGLE_API_KEY\"],\n vertex: \"GOOGLE_VERTEX_AI_API_KEY\",\n groq: \"GROQ_API_KEY\",\n cerebras: \"CEREBRAS_API_KEY\",\n togetherai: \"TOGETHER_AI_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n perplexity: \"PERPLEXITY_API_KEY\",\n azure: \"AZURE_API_KEY\",\n xai: \"XAI_API_KEY\",\n google_legacy: \"GOOGLE_API_KEY\",\n};\n\nconst providersWithoutApiKey = new Set([\"bedrock\", \"ollama\"]);\n\n/**\n * Loads an API key for a provider, checking environment variables.\n * @param provider The name of the provider (e.g., 'openai', 'anthropic')\n * @param logger Optional logger for info/error messages\n * @returns The API key if found, undefined otherwise\n */\nexport function loadApiKeyFromEnv(\n provider: string | undefined,\n logger: (logLine: LogLine) => void,\n): string | undefined {\n if (!provider) {\n return undefined;\n }\n\n const envVarName = providerEnvVarMap[provider];\n if (!envVarName) {\n if (!providersWithoutApiKey.has(provider)) {\n logger({\n category: \"init\",\n message: `No known environment variable for provider '${provider}'`,\n level: 0,\n });\n }\n return undefined;\n }\n\n const apiKeyFromEnv = Array.isArray(envVarName)\n ? envVarName\n .map((name) => process.env[name])\n .find((key) => key && key.length > 0)\n : process.env[envVarName as string];\n if (typeof apiKeyFromEnv === \"string\" && apiKeyFromEnv.length > 0) {\n return apiKeyFromEnv;\n }\n\n // Don't log - this is expected when llmClient is provided or API key will be set later\n return undefined;\n}\n\nexport function trimTrailingTextNode(\n path: string | undefined,\n): string | undefined {\n return path?.replace(/\\/text\\(\\)(\\[\\d+\\])?$/iu, \"\");\n}\n\n// TODO: move to separate types file\nexport interface JsonSchemaProperty {\n type: string;\n enum?: unknown[];\n items?: JsonSchemaProperty;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n minimum?: number;\n maximum?: number;\n description?: string;\n format?: string; // JSON Schema format field (e.g., \"uri\", \"url\", \"email\", etc.)\n}\nexport interface JsonSchema extends JsonSchemaProperty {\n type: string;\n}\n\n/**\n * Converts a JSON Schema object to a Zod schema\n * @param schema The JSON Schema object to convert\n * @returns A Zod schema equivalent to the input JSON Schema\n */\nexport function jsonSchemaToZod(schema: JsonSchema): ZodTypeAny {\n switch (schema.type) {\n case \"object\":\n if (schema.properties) {\n const shape: Record<string, ZodTypeAny> = {};\n for (const key in schema.properties) {\n shape[key] = jsonSchemaToZod(schema.properties[key]);\n }\n let zodObject = z.object(shape);\n if (schema.required && Array.isArray(schema.required)) {\n const requiredFields = schema.required.reduce<Record<string, true>>(\n (acc, field) => ({ ...acc, [field]: true }),\n {},\n );\n zodObject = zodObject.partial().required(requiredFields);\n }\n if (schema.description) {\n zodObject = zodObject.describe(schema.description);\n }\n return zodObject;\n } else {\n return z.object({});\n }\n case \"array\":\n if (schema.items) {\n let zodArray = z.array(jsonSchemaToZod(schema.items));\n if (schema.description) {\n zodArray = zodArray.describe(schema.description);\n }\n return zodArray;\n } else {\n return z.array(z.any());\n }\n case \"string\": {\n if (schema.enum) {\n return z.string().refine((val) => schema.enum!.includes(val));\n }\n let zodString = z.string();\n\n // Handle JSON Schema format field\n if (schema.format === \"uri\" || schema.format === \"url\") {\n zodString = zodString.url();\n } else if (schema.format === \"email\") {\n zodString = zodString.email();\n } else if (schema.format === \"uuid\") {\n zodString = zodString.uuid();\n }\n // Add more format handlers as needed\n\n if (schema.description) {\n zodString = zodString.describe(schema.description);\n }\n return zodString;\n }\n case \"number\": {\n let zodNumber = z.number();\n if (schema.minimum !== undefined) {\n zodNumber = zodNumber.min(schema.minimum);\n }\n if (schema.maximum !== undefined) {\n zodNumber = zodNumber.max(schema.maximum);\n }\n if (schema.description) {\n zodNumber = zodNumber.describe(schema.description);\n }\n return zodNumber;\n }\n case \"boolean\": {\n let zodBoolean = z.boolean();\n if (schema.description) {\n zodBoolean = zodBoolean.describe(schema.description);\n }\n return zodBoolean;\n }\n default:\n return z.any();\n }\n}\n", "import type { LogLine } from \"./types/public/logs.js\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\n/**\n * Stagehand V3 Logging\n *\n * Design goals:\n * - Support concurrent V3 instances with independent logger configuration\n * - Each V3 instance has its own StagehandLogger (handles usePino, verbose, externalLogger)\n * - Provide AsyncLocalStorage-based routing for backward compatibility with handler code\n * - Prevent cross-talk between concurrent instances\n *\n * How it works:\n * - Each V3 instance creates a StagehandLogger in its constructor (per-instance config)\n * - bindInstanceLogger()/unbindInstanceLogger(): registers logger callback per instance ID\n * - withInstanceLogContext(): establishes AsyncLocalStorage context for an async operation\n * - v3Logger(): routes logs using AsyncLocalStorage with console fallback\n *\n * \u26A0\uFE0F CONTEXT LOSS SCENARIOS:\n * 1. setTimeout/setInterval callbacks lose context (runs outside AsyncLocalStorage scope)\n * 2. Event emitters (EventEmitter.on) lose context (callback invoked outside scope)\n * 3. Fire-and-forget promises (void promise) lose context if they don't complete synchronously\n * 4. Third-party library callbacks may lose context depending on implementation\n *\n * WORKAROUND for context loss:\n * - Use explicit logger parameter instead of v3Logger()\n * - Wrap callback in withInstanceLogContext() manually\n * - Or let logs fall back to console (acceptable for edge cases)\n */\n\n// Per-instance routing using AsyncLocalStorage\nconst logContext = new AsyncLocalStorage<string>();\nconst instanceLoggers = new Map<string, (line: LogLine) => void>();\n\nexport function bindInstanceLogger(\n instanceId: string,\n logger: (line: LogLine) => void,\n): void {\n instanceLoggers.set(instanceId, logger);\n}\n\nexport function unbindInstanceLogger(instanceId: string): void {\n instanceLoggers.delete(instanceId);\n}\n\nexport function withInstanceLogContext<T>(instanceId: string, fn: () => T): T {\n return logContext.run(instanceId, fn);\n}\n\n/**\n * Routes logs to the appropriate instance logger based on AsyncLocalStorage context.\n * Falls back to console output if no instance context is available.\n */\nexport function v3Logger(line: LogLine): void {\n const id = logContext.getStore();\n if (id) {\n const fn = instanceLoggers.get(id);\n if (fn) {\n const enriched: LogLine = {\n ...line,\n auxiliary: {\n ...(line.auxiliary || {}),\n },\n };\n try {\n fn(enriched);\n return;\n } catch {\n // fallback to console below\n }\n }\n }\n\n // Fallback: log to console when no instance context\n const ts = line.timestamp ?? new Date().toISOString();\n const lvl = line.level ?? 1;\n const levelStr = lvl === 0 ? \"ERROR\" : lvl === 2 ? \"DEBUG\" : \"INFO\";\n let output = `[${ts}] ${levelStr}: ${line.message}`;\n\n if (line.auxiliary) {\n for (const [key, { value, type }] of Object.entries(line.auxiliary)) {\n let formattedValue = value;\n if (type === \"object\") {\n try {\n formattedValue = JSON.stringify(JSON.parse(value), null, 2)\n .split(\"\\n\")\n .map((line, i) => (i === 0 ? line : ` ${line}`))\n .join(\"\\n\");\n } catch {\n formattedValue = value;\n }\n }\n output += `\\n ${key}: ${formattedValue}`;\n }\n }\n\n if (lvl === 0) {\n console.error(output);\n } else if (lvl === 2) {\n (console.debug ?? console.log)(output);\n } else {\n console.log(output);\n }\n}\n", "import { Page as PatchrightPage } from \"patchright-core\";\nimport { Page as PlaywrightPage } from \"playwright-core\";\nimport { Page as PuppeteerPage } from \"puppeteer-core\";\nimport { z } from \"zod\";\nimport type {\n InferStagehandSchema,\n StagehandZodSchema,\n} from \"../../zodCompat.js\";\nimport { Page } from \"../../understudy/page.js\";\nimport { ModelConfiguration } from \"../public/model.js\";\n\nexport interface ActOptions {\n model?: ModelConfiguration;\n variables?: Record<string, string>;\n timeout?: number;\n page?: PlaywrightPage | PuppeteerPage | PatchrightPage | Page;\n}\n\nexport interface ActResult {\n success: boolean;\n message: string;\n actionDescription: string;\n actions: Action[];\n}\n\nexport type ExtractResult<T extends StagehandZodSchema> =\n InferStagehandSchema<T>;\n\nexport interface Action {\n selector: string;\n description: string;\n method?: string;\n arguments?: string[];\n}\n\nexport interface HistoryEntry {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"agent\";\n parameters: unknown;\n result: unknown;\n timestamp: string;\n}\n\nexport interface ExtractOptions {\n model?: ModelConfiguration;\n timeout?: number;\n selector?: string;\n page?: PlaywrightPage | PuppeteerPage | PatchrightPage | Page;\n}\n\nexport const defaultExtractSchema = z.object({\n extraction: z.string(),\n});\n\nexport const pageTextSchema = z.object({\n pageText: z.string(),\n});\n\nexport interface ObserveOptions {\n model?: ModelConfiguration;\n timeout?: number;\n selector?: string;\n page?: PlaywrightPage | PuppeteerPage | PatchrightPage | Page;\n}\n\nexport enum V3FunctionName {\n ACT = \"ACT\",\n EXTRACT = \"EXTRACT\",\n OBSERVE = \"OBSERVE\",\n AGENT = \"AGENT\",\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\n\ntype FrameId = Protocol.Page.FrameId;\ntype ExecId = Protocol.Runtime.ExecutionContextId;\n\nexport class ExecutionContextRegistry {\n private readonly byFrame = new WeakMap<\n CDPSessionLike,\n Map<FrameId, ExecId>\n >();\n private readonly byExec = new WeakMap<CDPSessionLike, Map<ExecId, FrameId>>();\n\n /** Wire listeners for this session. Call BEFORE Runtime.enable. */\n attachSession(session: CDPSessionLike): void {\n const onCreated = (\n evt: Protocol.Runtime.ExecutionContextCreatedEvent,\n ): void => {\n const aux = (evt.context.auxData ?? {}) as {\n frameId?: string;\n isDefault?: boolean;\n };\n if (aux.isDefault === true && typeof aux.frameId === \"string\") {\n this.register(session, aux.frameId as FrameId, evt.context.id);\n }\n };\n const onDestroyed = (\n evt: Protocol.Runtime.ExecutionContextDestroyedEvent,\n ): void => {\n const rev = this.byExec.get(session);\n const fwd = this.byFrame.get(session);\n if (!rev || !fwd) return;\n const frameId = rev.get(evt.executionContextId);\n if (!frameId) return;\n rev.delete(evt.executionContextId);\n if (fwd.get(frameId) === evt.executionContextId) fwd.delete(frameId);\n };\n const onCleared = (): void => {\n this.byFrame.delete(session);\n this.byExec.delete(session);\n };\n\n session.on(\"Runtime.executionContextCreated\", onCreated);\n session.on(\"Runtime.executionContextDestroyed\", onDestroyed);\n session.on(\"Runtime.executionContextsCleared\", onCleared);\n }\n\n getMainWorld(session: CDPSessionLike, frameId: FrameId): ExecId | null {\n return this.byFrame.get(session)?.get(frameId) ?? null;\n }\n\n async waitForMainWorld(\n session: CDPSessionLike,\n frameId: FrameId,\n timeoutMs: number = 800,\n ): Promise<ExecId> {\n const cached = this.getMainWorld(session, frameId);\n if (cached) return cached;\n\n await session.send(\"Runtime.enable\").catch(() => {});\n const after = this.getMainWorld(session, frameId);\n if (after) return after;\n\n return await new Promise<ExecId>((resolve, reject) => {\n let done = false;\n const onCreated = (\n evt: Protocol.Runtime.ExecutionContextCreatedEvent,\n ): void => {\n const aux = (evt.context.auxData ?? {}) as {\n frameId?: string;\n isDefault?: boolean;\n };\n if (aux.isDefault === true && aux.frameId === frameId) {\n this.register(session, frameId, evt.context.id);\n if (!done) {\n done = true;\n clearTimeout(timer);\n session.off(\"Runtime.executionContextCreated\", onCreated);\n resolve(evt.context.id);\n }\n }\n };\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n session.off(\"Runtime.executionContextCreated\", onCreated);\n reject(new Error(`main world not ready for frame ${frameId}`));\n }\n }, timeoutMs);\n session.on(\"Runtime.executionContextCreated\", onCreated);\n });\n }\n\n private register(\n session: CDPSessionLike,\n frameId: FrameId,\n ctxId: ExecId,\n ): void {\n let fwd = this.byFrame.get(session);\n if (!fwd) {\n fwd = new Map<FrameId, ExecId>();\n this.byFrame.set(session, fwd);\n }\n let rev = this.byExec.get(session);\n if (!rev) {\n rev = new Map<ExecId, FrameId>();\n this.byExec.set(session, rev);\n }\n fwd.set(frameId, ctxId);\n rev.set(ctxId, frameId);\n }\n}\n\nexport const executionContexts = new ExecutionContextRegistry();\n", "/*\n * AUTO-GENERATED FILE. DO NOT EDIT.\n * Update sources in lib/v3/dom/locatorScripts and run genLocatorScripts.ts.\n */\nexport const locatorScriptBootstrap = \"if (!globalThis.__stagehandLocatorScripts) { var __stagehandLocatorScriptsFactory=(()=>{var M=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var Z=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0})},j=(e,t,n,o)=>{if(t&&typeof t==\\\"object\\\"||typeof t==\\\"function\\\")for(let r of U(t))!Q.call(e,r)&&r!==n&&M(e,r,{get:()=>t[r],enumerable:!(o=K(t,r))||o.enumerable});return e};var J=e=>j(M({},\\\"__esModule\\\",{value:!0}),e);var Oe={};Z(Oe,{assignFilePayloadsToInputElement:()=>te,countCssMatchesPierce:()=>Me,countCssMatchesPrimary:()=>Ce,countTextMatches:()=>Le,countXPathMatchesMainWorld:()=>Pe,dispatchDomClick:()=>ne,ensureFileInputElement:()=>ee,fillElementValue:()=>se,focusElement:()=>le,isElementChecked:()=>ce,isElementVisible:()=>ae,prepareElementForTyping:()=>v,readElementInnerHTML:()=>me,readElementInnerText:()=>fe,readElementInputValue:()=>ue,readElementTextContent:()=>de,resolveCssSelector:()=>ve,resolveCssSelectorPierce:()=>Te,resolveTextSelector:()=>Re,resolveXPathMainWorld:()=>Ne,scrollElementToPercent:()=>oe,selectElementOptions:()=>ie,waitForSelector:()=>_e});function ee(){try{return(this.tagName?.toLowerCase()??\\\"\\\")!==\\\"input\\\"?!1:String(this.type??\\\"\\\").toLowerCase()===\\\"file\\\"}catch{return!1}}function te(e){try{let t=this;if(!t||t.tagName?.toLowerCase()!==\\\"input\\\"||(t.type??\\\"\\\").toLowerCase()!==\\\"file\\\")return!1;let n=(()=>{try{return new DataTransfer}catch{return null}})();if(!n)return!1;let o=Array.isArray(e)?e:[];for(let r of o){if(!r)continue;let l=r.name||\\\"upload.bin\\\",s=r.mimeType||\\\"application/octet-stream\\\",i=typeof r.lastModified==\\\"number\\\"?r.lastModified:Date.now(),a=window.atob(r.base64??\\\"\\\"),d=new Uint8Array(a.length);for(let p=0;p<a.length;p+=1)d[p]=a.charCodeAt(p);let f=new Blob([d],{type:s}),c=new File([f],l,{type:s,lastModified:i});n.items.add(c)}return t.files=n.files,t.dispatchEvent(new Event(\\\"input\\\",{bubbles:!0})),t.dispatchEvent(new Event(\\\"change\\\",{bubbles:!0})),!0}catch{return!1}}function ne(e){let t=e??{};try{let n=new MouseEvent(\\\"click\\\",{bubbles:!!t.bubbles,cancelable:!!t.cancelable,composed:!!t.composed,detail:typeof t.detail==\\\"number\\\"?t.detail:1,view:this?.ownerDocument?.defaultView??window});this.dispatchEvent(n)}catch{try{this.click()}catch{}}}function oe(e){let t=n=>{if(typeof n==\\\"number\\\"&&Number.isFinite(n))return n;let o=String(n??\\\"\\\").trim();if(!o)return 0;let r=parseFloat(o.replace(\\\"%\\\",\\\"\\\"));return Number.isNaN(r)||!Number.isFinite(r)?0:r};try{let n=Math.max(0,Math.min(t(e),100)),o=this,r=o.tagName?.toLowerCase()??\\\"\\\";if(r===\\\"html\\\"||r===\\\"body\\\"){let c=(o.ownerDocument?.scrollingElement||o.ownerDocument?.documentElement||o.ownerDocument?.body||document.scrollingElement||document.documentElement||document.body)?.scrollHeight??document.body.scrollHeight??0,p=o.ownerDocument?.defaultView?.innerHeight??window.innerHeight,w=Math.max(0,c-p)*(n/100);return o.ownerDocument?.defaultView?.scrollTo({top:w,left:o.ownerDocument?.defaultView?.scrollX??window.scrollX??0,behavior:\\\"smooth\\\"}),!0}let s=o.scrollHeight??0,i=o.clientHeight??0,d=Math.max(0,s-i)*(n/100);return o.scrollTo({top:d,left:o.scrollLeft??0,behavior:\\\"smooth\\\"}),!0}catch{return!1}}var H=new Set([\\\"color\\\",\\\"date\\\",\\\"datetime-local\\\",\\\"month\\\",\\\"range\\\",\\\"time\\\",\\\"week\\\"]),re=new Set([\\\"\\\",\\\"email\\\",\\\"number\\\",\\\"password\\\",\\\"search\\\",\\\"tel\\\",\\\"text\\\",\\\"url\\\"]);function v(){try{let e=this;if(!e.isConnected)return!1;let t=e.ownerDocument||document,n=t.defaultView||window;try{typeof e.focus==\\\"function\\\"&&e.focus()}catch{}if(e instanceof n.HTMLInputElement||e instanceof n.HTMLTextAreaElement){try{if(typeof e.select==\\\"function\\\")return e.select(),!0}catch{}try{let o=(e.value??\\\"\\\").length;if(typeof e.setSelectionRange==\\\"function\\\")return e.setSelectionRange(0,o),!0}catch{}return!0}if(e.isContentEditable){let o=t.getSelection?.(),r=t.createRange?.();if(o&&r)try{r.selectNodeContents(e),o.removeAllRanges(),o.addRange(r)}catch{}return!0}return!1}catch{return!1}}function se(e){let t=this;if(!t.isConnected)return{status:\\\"error\\\",reason:\\\"notconnected\\\"};let o=(t.ownerDocument||document).defaultView||window,r=e??\\\"\\\";try{let l=s=>{let i;if(typeof o.InputEvent==\\\"function\\\")try{i=new o.InputEvent(\\\"input\\\",{bubbles:!0,composed:!0,data:s,inputType:\\\"insertText\\\"})}catch{i=new o.Event(\\\"input\\\",{bubbles:!0,composed:!0})}else i=new o.Event(\\\"input\\\",{bubbles:!0,composed:!0});t.dispatchEvent(i);let a=new o.Event(\\\"change\\\",{bubbles:!0});t.dispatchEvent(a)};if(t instanceof o.HTMLInputElement){let s=(t.type||\\\"\\\").toLowerCase();if(!re.has(s)&&!H.has(s))return{status:\\\"error\\\",reason:`unsupported-input-type:${s}`};let i=e;if(s===\\\"number\\\"){let a=e.trim();if(a!==\\\"\\\"&&Number.isNaN(Number(a)))return{status:\\\"error\\\",reason:\\\"invalid-number-value\\\"};i=a}if(r=i,H.has(s)){let a=e.trim();r=a,v.call(t);let d=o.HTMLInputElement.prototype,c=Object.getOwnPropertyDescriptor(d,\\\"value\\\")?.set;return typeof c==\\\"function\\\"?c.call(t,a):t.value=a,t._valueTracker?.setValue?.(a),t.value!==a?{status:\\\"error\\\",reason:\\\"malformed-value\\\"}:(l(a),{status:\\\"done\\\"})}return v.call(t),{status:\\\"needsinput\\\",value:i}}return t instanceof o.HTMLTextAreaElement?(v.call(t),r=e,{status:\\\"needsinput\\\",value:e}):t instanceof o.HTMLSelectElement?{status:\\\"error\\\",reason:\\\"unsupported-element\\\"}:t.isContentEditable?(v.call(t),r=e,{status:\\\"needsinput\\\",value:e}):{status:\\\"error\\\",reason:\\\"unsupported-element\\\"}}catch(l){let s=\\\"exception\\\";if(l&&typeof l==\\\"object\\\"){let i=l.message;typeof i==\\\"string\\\"&&i.trim().length>0&&(s=`exception:${i}`)}return{status:\\\"needsinput\\\",value:r,reason:s}}}function le(){try{typeof this.focus==\\\"function\\\"&&this.focus()}catch{}}function ie(e){try{if(!(this instanceof HTMLSelectElement))return[];let t=Array.isArray(e)?e:[e],n=new Set(t.map(s=>String(s??\\\"\\\").trim())),o=s=>{let i=(s.label||s.textContent||\\\"\\\").trim(),a=String(s.value??\\\"\\\").trim();return n.has(i)||n.has(a)};if(this.multiple)for(let s of Array.from(this.options))s.selected=o(s);else{let s=!1;for(let i of Array.from(this.options))!s&&o(i)?(i.selected=!0,this.value=i.value,s=!0):i.selected=!1}let r=new Event(\\\"input\\\",{bubbles:!0}),l=new Event(\\\"change\\\",{bubbles:!0});return this.dispatchEvent(r),this.dispatchEvent(l),Array.from(this.selectedOptions).map(s=>s.value)}catch{return[]}}function ae(){try{let e=this;if(!e.isConnected)return!1;let t=e.ownerDocument?.defaultView?.getComputedStyle(e)??window.getComputedStyle(e);if(!t||t.display===\\\"none\\\"||t.visibility===\\\"hidden\\\")return!1;let n=parseFloat(t.opacity??\\\"1\\\");if(!Number.isFinite(n)||n===0)return!1;let o=e.getBoundingClientRect();return!(!o||Math.max(o.width,o.height)===0||e.getClientRects().length===0)}catch{return!1}}function ce(){try{let e=this;if((e.tagName||\\\"\\\").toLowerCase()===\\\"input\\\"){let o=e.type?.toLowerCase()??\\\"\\\";if(o===\\\"checkbox\\\"||o===\\\"radio\\\")return!!e.checked}let n=e.getAttribute?.(\\\"aria-checked\\\");return n!=null?n===\\\"true\\\":!1}catch{return!1}}function ue(){try{let e=this,t=(e.tagName||\\\"\\\").toLowerCase();return t===\\\"input\\\"||t===\\\"textarea\\\"||t===\\\"select\\\"?String(e.value??\\\"\\\"):e.isContentEditable?String(e.textContent??\\\"\\\"):\\\"\\\"}catch{return\\\"\\\"}}function de(){try{return String(this.textContent??\\\"\\\")}catch{return\\\"\\\"}}function me(){try{return String(this.innerHTML??\\\"\\\")}catch{return\\\"\\\"}}function fe(){try{let e=this,t=e.innerText;if(typeof t==\\\"string\\\"&&t.length>0)return t;let n=e.textContent;return typeof n==\\\"string\\\"?n:\\\"\\\"}catch{return\\\"\\\"}}function O(e){let t=String(e||\\\"\\\").trim().replace(/^xpath=/i,\\\"\\\");if(!t)return[];let n=[],o=0;for(;o<t.length;){let r=\\\"child\\\";t.startsWith(\\\"//\\\",o)?(r=\\\"desc\\\",o+=2):t[o]===\\\"/\\\"&&(r=\\\"child\\\",o+=1);let l=o,s=0,i=null;for(;o<t.length;){let c=t[o];if(i)c===i&&(i=null);else if(c===\\\"'\\\"||c==='\\\"')i=c;else if(c===\\\"[\\\")s++;else if(c===\\\"]\\\")s--;else if(c===\\\"/\\\"&&s===0)break;o+=1}let a=t.slice(l,o).trim();if(!a)continue;let{tag:d,predicates:f}=pe(a);n.push({axis:r,tag:d,predicates:f})}return n}function he(e){let t=[],n=0;for(;n<e.length;){if(e[n]!==\\\"[\\\"){n++;continue}n++;let o=n,r=null;for(;n<e.length;){let l=e[n];if(r)l===r&&(r=null);else if(l===\\\"'\\\"||l==='\\\"')r=l;else if(l===\\\"]\\\")break;n++}t.push(e.slice(o,n).trim()),n++}return t}function pe(e){let t=e.indexOf(\\\"[\\\");if(t===-1)return{tag:e===\\\"\\\"?\\\"*\\\":e.toLowerCase(),predicates:[]};let n=e.slice(0,t).trim(),o=n===\\\"\\\"?\\\"*\\\":n.toLowerCase(),r=e.slice(t),l=[];for(let s of he(r)){let i=T(s);i&&l.push(i)}return{tag:o,predicates:l}}function T(e){let t=e.trim();if(!t)return null;let n=A(t,\\\"or\\\");if(n.length>1){let l=n.map(s=>T(s)).filter(Boolean);return l.length!==n.length?null:{type:\\\"or\\\",predicates:l}}let o=A(t,\\\"and\\\");if(o.length>1){let l=o.map(s=>T(s)).filter(Boolean);return l.length!==o.length?null:{type:\\\"and\\\",predicates:l}}let r=we(t,\\\"not\\\");if(r!=null){let l=T(r);return l?{type:\\\"not\\\",predicate:l}:null}return ge(t)}function ge(e){let t=/^(?:'([^']*)'|\\\"([^\\\"]*)\\\")$/,n=\\\"[a-zA-Z_][\\\\\\\\w.-]*\\\",o=`(?:'([^']*)'|\\\"([^\\\"]*)\\\")`;if(/^\\\\d+$/.test(e))return{type:\\\"index\\\",index:Math.max(1,Number(e))};let r=e.match(new RegExp(`^normalize-space\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*\\\\\\\\)\\\\\\\\s*=\\\\\\\\s*${o}$`));if(r)return{type:\\\"attrEquals\\\",name:r[1],value:r[2]??r[3]??\\\"\\\",normalize:!0};let l=e.match(new RegExp(`^normalize-space\\\\\\\\(\\\\\\\\s*(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*\\\\\\\\)\\\\\\\\s*=\\\\\\\\s*${o}$`));if(l)return{type:\\\"textEquals\\\",value:l[1]??l[2]??\\\"\\\",normalize:!0};let s=e.match(new RegExp(`^@(${n})\\\\\\\\s*=\\\\\\\\s*${o}$`));if(s)return{type:\\\"attrEquals\\\",name:s[1],value:s[2]??s[3]??\\\"\\\"};let i=e.match(new RegExp(`^@(${n})$`));if(i)return{type:\\\"attrExists\\\",name:i[1]};let a=e.match(new RegExp(`^contains\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*,\\\\\\\\s*${o}\\\\\\\\s*\\\\\\\\)$`));if(a)return{type:\\\"attrContains\\\",name:a[1],value:a[2]??a[3]??\\\"\\\"};let d=e.match(new RegExp(`^starts-with\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*,\\\\\\\\s*${o}\\\\\\\\s*\\\\\\\\)$`));if(d)return{type:\\\"attrStartsWith\\\",name:d[1],value:d[2]??d[3]??\\\"\\\"};let f=e.match(new RegExp(`^(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*=\\\\\\\\s*${o}$`));if(f)return{type:\\\"textEquals\\\",value:f[1]??f[2]??\\\"\\\"};let c=e.match(new RegExp(`^contains\\\\\\\\(\\\\\\\\s*(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*,\\\\\\\\s*${o}\\\\\\\\s*\\\\\\\\)$`));return c?{type:\\\"textContains\\\",value:c[1]??c[2]??\\\"\\\"}:(t.test(e),null)}function A(e,t){let n=[],o=0,r=0,l=null,s=0;for(;s<e.length;){let i=e[s];if(l){i===l&&(l=null),s+=1;continue}if(i===\\\"'\\\"||i==='\\\"'){l=i,s+=1;continue}if(i===\\\"(\\\"){r+=1,s+=1;continue}if(i===\\\")\\\"){r=Math.max(0,r-1),s+=1;continue}if(r===0&&Ee(e,s,t)){n.push(e.slice(o,s).trim()),s+=t.length,o=s;continue}s+=1}return n.push(e.slice(o).trim()),n.filter(i=>i.length>0)}function Ee(e,t,n){if(!e.startsWith(n,t))return!1;let o=t>0?e[t-1]:\\\" \\\";if(o===\\\"@\\\")return!1;let r=t+n.length<e.length?e[t+n.length]:\\\" \\\";return W(o)&&W(r)}function W(e){return!/[a-zA-Z0-9_.-]/.test(e)}function we(e,t){let n=`${t}(`;if(!e.startsWith(n)||!e.endsWith(\\\")\\\"))return null;let o=e.slice(n.length,-1);return ye(o)?o:null}function ye(e){let t=0,n=null;for(let o=0;o<e.length;o+=1){let r=e[o];if(n){r===n&&(n=null);continue}if(r===\\\"'\\\"||r==='\\\"'){n=r;continue}if(r===\\\"(\\\"?t+=1:r===\\\")\\\"&&(t-=1),t<0)return!1}return t===0}var be=e=>e.replace(/\\\\s+/g,\\\" \\\").trim();function _(e){return String(e.textContent??\\\"\\\")}function S(e,t){return t?be(e):e}function R(e,t){switch(t.type){case\\\"and\\\":return t.predicates.every(n=>R(e,n));case\\\"or\\\":return t.predicates.some(n=>R(e,n));case\\\"not\\\":return!R(e,t.predicate);case\\\"attrExists\\\":return e.getAttribute(t.name)!==null;case\\\"attrEquals\\\":{let n=e.getAttribute(t.name);return n===null?!1:S(n,t.normalize)===S(t.value,t.normalize)}case\\\"attrContains\\\":{let n=e.getAttribute(t.name);return n===null?!1:S(n,t.normalize).includes(S(t.value,t.normalize))}case\\\"attrStartsWith\\\":{let n=e.getAttribute(t.name);return n===null?!1:S(n,t.normalize).startsWith(S(t.value,t.normalize))}case\\\"textEquals\\\":return S(_(e),t.normalize)===S(t.value,t.normalize);case\\\"textContains\\\":return S(_(e),t.normalize).includes(S(t.value,t.normalize));case\\\"index\\\":return!0;default:return!0}}function q(e,t){let n=e;for(let o of t){if(!n.length)return[];if(o.type===\\\"index\\\"){let r=o.index-1;n=r>=0&&r<n.length?[n[r]]:[];continue}n=n.filter(r=>R(r,o))}return n}var P=e=>{let t=String(e??\\\"\\\").trim();return t?t.replace(/^xpath=/i,\\\"\\\").trim():\\\"\\\"};function I(e,t){return k(e,0,t)}function k(e,t,n){if(!Number.isFinite(t)||t<0)return null;let o=P(e);if(!o)return null;let r=Math.floor(t),l=n?.pierceShadow!==!1,s=l?z():null;if(!l)return X(o,r).value;if(!s?.hasShadow){let a=X(o,r);return a.error?N(o,s?.getClosedRoot)[r]??null:a.value}return N(o,s.getClosedRoot)[r]??null}function $(e,t){let n=P(e);if(!n)return 0;let o=t?.pierceShadow!==!1,r=o?z():null;if(!o)return F(n).count;if(!r?.hasShadow){let l=F(n);return l.error?N(n,r?.getClosedRoot).length:l.count}return N(n,r.getClosedRoot).length}function N(e,t){let n=P(e);if(!n)return[];let o=O(n);if(!o.length)return[];let r=t??null,l=[document];for(let s of o){let i=[],a=new Set;for(let d of l){if(!d)continue;let f=s.axis===\\\"child\\\"?L(d,r):Se(d,r);if(!f.length)continue;let c=f.filter(g=>xe(g,s)),p=q(c,s.predicates);for(let g of p)a.has(g)||(a.add(g),i.push(g))}if(!i.length)return[];l=i}return l}function xe(e,t){return t.tag===\\\"*\\\"?!0:e.localName===t.tag}function z(){let e=window.__stagehandV3__,t=e&&typeof e.getClosedRoot==\\\"function\\\"?o=>{try{return e.getClosedRoot(o)??null}catch{return null}}:null,n=!1;try{if(e&&typeof e.stats==\\\"function\\\"){let o=e.stats();n=(o?.open??0)>0||(o?.closed??0)>0}}catch{}if(!n)try{let o=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT);for(;o.nextNode();)if(o.currentNode.shadowRoot){n=!0;break}}catch{}return{getClosedRoot:t,hasShadow:n}}function L(e,t){let n=[];if(!e)return n;if(e instanceof Document)return e.documentElement&&n.push(e.documentElement),n;if(e instanceof ShadowRoot||e instanceof DocumentFragment)return n.push(...Array.from(e.children??[])),n;if(e instanceof Element){n.push(...Array.from(e.children??[]));let o=e.shadowRoot;if(o&&n.push(...Array.from(o.children??[])),t){let r=t(e);r&&n.push(...Array.from(r.children??[]))}return n}return n}function Se(e,t){let n=[],o=new Set,r=[...L(e,t)].reverse();for(;r.length;){let l=r.pop();if(!l||o.has(l))continue;o.add(l),n.push(l);let s=L(l,t);for(let i=s.length-1;i>=0;i-=1)r.push(s[i])}return n}function X(e,t){try{return{value:document.evaluate(e,document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotItem(t),error:!1}}catch{return{value:null,error:!0}}}function F(e){try{return{count:document.evaluate(e,document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength,error:!1}}catch{return{count:0,error:!0}}}var C=e=>{let t=Number(e??0);return!Number.isFinite(t)||t<0?0:Math.floor(t)},V=(e,t)=>{if(!e)return[];let n=new WeakSet,o=new Set,r=[],l=[document],s=i=>{if(!(!i||n.has(i)||r.length>=t)){n.add(i);try{let a=i.querySelectorAll(e);for(let d of a)if(!o.has(d)&&(o.add(d),r.push(d),r.length>=t))return}catch{}try{let d=(i instanceof Document?i:i.host?.ownerDocument??document).createTreeWalker(i,NodeFilter.SHOW_ELEMENT),f;for(;f=d.nextNode();){if(!(f instanceof Element))continue;let c=f.shadowRoot;c&&l.push(c)}}catch{}}};for(;l.length&&r.length<t;){let i=l.shift();i&&s(i)}return r};function ve(e,t){let n=String(e??\\\"\\\").trim();if(!n)return null;let o=C(t);return V(n,o+1)[o]??null}function Te(e,t){let n=String(e??\\\"\\\").trim();if(!n)return null;let o=C(t),r=window.__stagehandV3__;if(!r||typeof r.getClosedRoot!=\\\"function\\\")return V(n,o+1)[o]??null;let l=c=>{try{return r.getClosedRoot(c)??null}catch{return null}},s=new WeakSet,i=new Set,a=[],d=[document],f=c=>{if(!(!c||s.has(c)||a.length>=o+1)){s.add(c);try{let p=c.querySelectorAll(n);for(let g of p)if(!i.has(g)&&(i.add(g),a.push(g),a.length>=o+1))return}catch{}try{let g=(c instanceof Document?c:c.host?.ownerDocument??document).createTreeWalker(c,NodeFilter.SHOW_ELEMENT),w;for(;w=g.nextNode();){if(!(w instanceof Element))continue;let x=w.shadowRoot;x&&d.push(x);let y=l(w);y&&d.push(y)}}catch{}}};for(;d.length&&a.length<o+1;){let c=d.shift();c&&f(c)}return a[o]??null}function Re(e,t){let n=String(e??\\\"\\\");if(!n)return null;let o=n.toLowerCase(),r=C(t),l=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),s=u=>{if(!u)return!1;let h=u.tagName?.toUpperCase()??\\\"\\\";return l.has(h)},i=u=>{try{if(s(u))return\\\"\\\";let h=u.innerText;if(typeof h==\\\"string\\\"&&h.trim())return h.trim()}catch{}try{let h=u.textContent;if(typeof h==\\\"string\\\")return h.trim()}catch{}return\\\"\\\"},a=u=>{let h=i(u);return!!h&&h.toLowerCase().includes(o)},d=window.__stagehandV3__,f=d&&typeof d.getClosedRoot==\\\"function\\\"?u=>{try{return d.getClosedRoot(u)??null}catch{return null}}:u=>null,c=new WeakSet,p=[],g=[],w=u=>{!u||c.has(u)||(c.add(u),p.push(u))},x=u=>{try{return(u instanceof Document?u:u?.ownerDocument??document).createTreeWalker(u,NodeFilter.SHOW_ELEMENT)}catch{return null}};for(w(document);p.length;){let u=p.shift();if(!u)continue;u instanceof Element&&a(u)&&g.push({element:u,tag:u.tagName??\\\"\\\",id:u.id??\\\"\\\",className:u.className??\\\"\\\",text:i(u)});let h=x(u);if(!h)continue;let E;for(;E=h.nextNode();){if(!(E instanceof Element))continue;a(E)&&g.push({element:E,tag:E.tagName??\\\"\\\",id:E.id??\\\"\\\",className:E.className??\\\"\\\",text:i(E)});let b=E.shadowRoot;b&&w(b);let D=f(E);D&&w(D)}}let y=[];for(let u of g){let h=u.element,E=!1;for(let b of g)if(u!==b)try{if(h.contains(b.element)){E=!0;break}}catch{}E||y.push(u)}return y[r]?.element??null}function Ne(e,t){let n=C(t);return k(e,n,{pierceShadow:!0})}function Ce(e){let t=String(e??\\\"\\\").trim();if(!t)return 0;let n=new WeakSet,o=r=>{if(!r||n.has(r))return 0;n.add(r);let l=0;try{let s=r;typeof s.querySelectorAll==\\\"function\\\"&&(l+=s.querySelectorAll(t).length)}catch{}try{let i=(r instanceof Document?r:r?.ownerDocument??document).createTreeWalker(r,NodeFilter.SHOW_ELEMENT),a;for(;a=i.nextNode();)a instanceof Element&&a.shadowRoot&&(l+=o(a.shadowRoot))}catch{}return l};try{return o(document)}catch{try{return document.querySelectorAll(t).length}catch{return 0}}}function Me(e){let t=String(e??\\\"\\\").trim();if(!t)return 0;let n=window.__stagehandV3__;if(!n||typeof n.getClosedRoot!=\\\"function\\\")try{return document.querySelectorAll(t).length}catch{return 0}let o=new WeakSet,r=[],l=a=>{!a||o.has(a)||(o.add(a),r.push(a))};l(document);let s=0,i=a=>{let d=a.shadowRoot;d&&l(d);try{let f=n.getClosedRoot(a);f&&l(f)}catch{}};for(;r.length;){let a=r.shift();if(a){try{let d=a;typeof d.querySelectorAll==\\\"function\\\"&&(s+=d.querySelectorAll(t).length)}catch{}try{let f=(a instanceof Document?a:a instanceof ShadowRoot?a.host?.ownerDocument??document:a.ownerDocument??document).createTreeWalker(a,NodeFilter.SHOW_ELEMENT),c;for(;c=f.nextNode();)c instanceof Element&&i(c)}catch{}}}return s}function Le(e){let t=String(e??\\\"\\\");if(!t)return{count:0,sample:[],error:null};let n=t.toLowerCase(),o=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),r=m=>{if(!m)return!1;let u=m.tagName?.toUpperCase()??\\\"\\\";return o.has(u)},l=m=>{try{if(r(m))return\\\"\\\";let u=m.innerText;if(typeof u==\\\"string\\\"&&u.trim())return u.trim()}catch{}try{let u=m.textContent;if(typeof u==\\\"string\\\")return u.trim()}catch{}return\\\"\\\"},s=m=>{let u=l(m);return!!u&&u.toLowerCase().includes(n)},i=window.__stagehandV3__,a=i&&typeof i.getClosedRoot==\\\"function\\\"?m=>{try{return i.getClosedRoot(m)??null}catch{return null}}:m=>null,d=new WeakSet,f=[],c=m=>{!m||d.has(m)||(d.add(m),f.push(m))},p=m=>{try{return(m instanceof Document?m:m?.ownerDocument??document).createTreeWalker(m,NodeFilter.SHOW_ELEMENT)}catch{return null}},g=[];for(c(document);f.length;){let m=f.shift();if(!m)continue;m instanceof Element&&s(m)&&g.push({element:m,tag:m.tagName??\\\"\\\",id:m.id??\\\"\\\",className:m.className??\\\"\\\",text:l(m)});let u=p(m);if(!u)continue;let h;for(;h=u.nextNode();){if(!(h instanceof Element))continue;s(h)&&g.push({element:h,tag:h.tagName??\\\"\\\",id:h.id??\\\"\\\",className:h.className??\\\"\\\",text:l(h)});let E=h.shadowRoot;E&&c(E);let b=a(h);b&&c(b)}}let w=[];for(let m of g){let u=m.element,h=!1;for(let E of g)if(m!==E)try{if(u.contains(E.element)){h=!0;break}}catch{}h||w.push(m)}let x=w.length,y=w.slice(0,5).map(m=>({tag:m.tag,id:m.id,class:m.className,text:m.text}));return{count:x,sample:y,error:null}}function Pe(e){return $(e,{pierceShadow:!0})}var ke=e=>e.startsWith(\\\"xpath=\\\")||e.startsWith(\\\"/\\\"),De=e=>{try{let t=window.__stagehandV3__;if(t&&typeof t.getClosedRoot==\\\"function\\\")return t.getClosedRoot(e)??null}catch{}return null},Y=e=>e.shadowRoot?e.shadowRoot:De(e),He=(e,t,n)=>{try{let l=e.querySelector(t);if(l)return l}catch{}if(!n)return null;let o=new WeakSet,r=[e];for(;r.length>0;){let l=r.shift();if(!(!l||o.has(l))){o.add(l);try{let s=l.querySelector(t);if(s)return s}catch{}try{let i=(l instanceof Document?l:l.host?.ownerDocument??document).createTreeWalker(l,NodeFilter.SHOW_ELEMENT),a;for(;a=i.nextNode();){if(!(a instanceof Element))continue;let d=Y(a);d&&!o.has(d)&&r.push(d)}}catch{}}}return null},Ae=(e,t)=>I(e,{pierceShadow:t}),B=(e,t)=>ke(e)?Ae(e,t):He(document,e,t),G=(e,t)=>{if(t===\\\"detached\\\")return e===null;if(t===\\\"attached\\\")return e!==null;if(e===null)return!1;if(t===\\\"hidden\\\")try{let n=window.getComputedStyle(e),o=e.getBoundingClientRect();return n.display===\\\"none\\\"||n.visibility===\\\"hidden\\\"||n.opacity===\\\"0\\\"||o.width===0||o.height===0}catch{return!1}try{let n=window.getComputedStyle(e),o=e.getBoundingClientRect();return n.display!==\\\"none\\\"&&n.visibility!==\\\"hidden\\\"&&n.opacity!==\\\"0\\\"&&o.width>0&&o.height>0}catch{return!1}},We=(e,t)=>{let n=new WeakSet,o=l=>{let s=Y(l);if(s&&!n.has(s)){n.add(s);let i=new MutationObserver(e);i.observe(s,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[\\\"style\\\",\\\"class\\\",\\\"hidden\\\",\\\"disabled\\\"]}),t.push(i);for(let a of Array.from(s.children))o(a)}for(let i of Array.from(l.children))o(i)},r=document.documentElement||document.body;r&&o(r)};function _e(e,t,n,o){let r=String(e??\\\"\\\").trim(),l=String(t??\\\"visible\\\")||\\\"visible\\\",s=typeof n==\\\"number\\\"&&n>0?n:3e4,i=o!==!1;return new Promise((a,d)=>{let f=null,c=null,p=!1,g=()=>{f!==null&&(clearTimeout(f),f=null)},w=B(r,i);if(G(w,l)){p=!0,a(!0);return}let x=[],y=()=>{for(let E of x)E.disconnect();c&&(document.removeEventListener(\\\"DOMContentLoaded\\\",c),c=null)},m=()=>{if(p)return;let E=B(r,i);G(E,l)&&(p=!0,g(),y(),a(!0))};if(!(document.body||document.documentElement)){c=()=>{document.removeEventListener(\\\"DOMContentLoaded\\\",c),c=null,m(),h()},document.addEventListener(\\\"DOMContentLoaded\\\",c),f=setTimeout(()=>{p||(p=!0,g(),y(),d(new Error(`waitForSelector: Timeout ${s}ms exceeded waiting for \\\"${r}\\\" to be ${l}`)))},s);return}let h=()=>{let E=document.body||document.documentElement;if(!E)return;let b=new MutationObserver(m);b.observe(E,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[\\\"style\\\",\\\"class\\\",\\\"hidden\\\",\\\"disabled\\\"]}),x.push(b),i&&We(m,x)};h(),f=setTimeout(()=>{p||(p=!0,g(),y(),d(new Error(`waitForSelector: Timeout ${s}ms exceeded waiting for \\\"${r}\\\" to be ${l}`)))},s)})}return J(Oe);})();\\n globalThis.__stagehandLocatorScripts = __stagehandLocatorScriptsFactory;\\n}\";\nexport const locatorScriptSources = {\n \"assignFilePayloadsToInputElement\": \"function ce(e){try{let t=this;if(!t||t.tagName?.toLowerCase()!==\\\"input\\\"||(t.type??\\\"\\\").toLowerCase()!==\\\"file\\\")return!1;let n=(()=>{try{return new DataTransfer}catch{return null}})();if(!n)return!1;let o=Array.isArray(e)?e:[];for(let r of o){if(!r)continue;let l=r.name||\\\"upload.bin\\\",s=r.mimeType||\\\"application/octet-stream\\\",i=typeof r.lastModified==\\\"number\\\"?r.lastModified:Date.now(),a=window.atob(r.base64??\\\"\\\"),d=new Uint8Array(a.length);for(let p=0;p<a.length;p+=1)d[p]=a.charCodeAt(p);let f=new Blob([d],{type:s}),c=new File([f],l,{type:s,lastModified:i});n.items.add(c)}return t.files=n.files,t.dispatchEvent(new Event(\\\"input\\\",{bubbles:!0})),t.dispatchEvent(new Event(\\\"change\\\",{bubbles:!0})),!0}catch{return!1}}\",\n \"countCssMatchesPierce\": \"function He(e){let t=String(e??\\\"\\\").trim();if(!t)return 0;let n=window.__stagehandV3__;if(!n||typeof n.getClosedRoot!=\\\"function\\\")try{return document.querySelectorAll(t).length}catch{return 0}let o=new WeakSet,r=[],l=a=>{!a||o.has(a)||(o.add(a),r.push(a))};l(document);let s=0,i=a=>{let d=a.shadowRoot;d&&l(d);try{let f=n.getClosedRoot(a);f&&l(f)}catch{}};for(;r.length;){let a=r.shift();if(a){try{let d=a;typeof d.querySelectorAll==\\\"function\\\"&&(s+=d.querySelectorAll(t).length)}catch{}try{let f=(a instanceof Document?a:a instanceof ShadowRoot?a.host?.ownerDocument??document:a.ownerDocument??document).createTreeWalker(a,NodeFilter.SHOW_ELEMENT),c;for(;c=f.nextNode();)c instanceof Element&&i(c)}catch{}}}return s}\",\n \"countCssMatchesPrimary\": \"function De(e){let t=String(e??\\\"\\\").trim();if(!t)return 0;let n=new WeakSet,o=r=>{if(!r||n.has(r))return 0;n.add(r);let l=0;try{let s=r;typeof s.querySelectorAll==\\\"function\\\"&&(l+=s.querySelectorAll(t).length)}catch{}try{let i=(r instanceof Document?r:r?.ownerDocument??document).createTreeWalker(r,NodeFilter.SHOW_ELEMENT),a;for(;a=i.nextNode();)a instanceof Element&&a.shadowRoot&&(l+=o(a.shadowRoot))}catch{}return l};try{return o(document)}catch{try{return document.querySelectorAll(t).length}catch{return 0}}}\",\n \"countTextMatches\": \"function Ae(e){let t=String(e??\\\"\\\");if(!t)return{count:0,sample:[],error:null};let n=t.toLowerCase(),o=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),r=m=>{if(!m)return!1;let u=m.tagName?.toUpperCase()??\\\"\\\";return o.has(u)},l=m=>{try{if(r(m))return\\\"\\\";let u=m.innerText;if(typeof u==\\\"string\\\"&&u.trim())return u.trim()}catch{}try{let u=m.textContent;if(typeof u==\\\"string\\\")return u.trim()}catch{}return\\\"\\\"},s=m=>{let u=l(m);return!!u&&u.toLowerCase().includes(n)},i=window.__stagehandV3__,a=i&&typeof i.getClosedRoot==\\\"function\\\"?m=>{try{return i.getClosedRoot(m)??null}catch{return null}}:m=>null,d=new WeakSet,f=[],c=m=>{!m||d.has(m)||(d.add(m),f.push(m))},p=m=>{try{return(m instanceof Document?m:m?.ownerDocument??document).createTreeWalker(m,NodeFilter.SHOW_ELEMENT)}catch{return null}},g=[];for(c(document);f.length;){let m=f.shift();if(!m)continue;m instanceof Element&&s(m)&&g.push({element:m,tag:m.tagName??\\\"\\\",id:m.id??\\\"\\\",className:m.className??\\\"\\\",text:l(m)});let u=p(m);if(!u)continue;let h;for(;h=u.nextNode();){if(!(h instanceof Element))continue;s(h)&&g.push({element:h,tag:h.tagName??\\\"\\\",id:h.id??\\\"\\\",className:h.className??\\\"\\\",text:l(h)});let E=h.shadowRoot;E&&c(E);let b=a(h);b&&c(b)}}let w=[];for(let m of g){let u=m.element,h=!1;for(let E of g)if(m!==E)try{if(u.contains(E.element)){h=!0;break}}catch{}h||w.push(m)}let x=w.length,y=w.slice(0,5).map(m=>({tag:m.tag,id:m.id,class:m.className,text:m.text}));return{count:x,sample:y,error:null}}\",\n \"countXPathMatchesMainWorld\": \"function We(e){return I(e,{pierceShadow:!0})}\",\n \"dispatchDomClick\": \"function ue(e){let t=e??{};try{let n=new MouseEvent(\\\"click\\\",{bubbles:!!t.bubbles,cancelable:!!t.cancelable,composed:!!t.composed,detail:typeof t.detail==\\\"number\\\"?t.detail:1,view:this?.ownerDocument?.defaultView??window});this.dispatchEvent(n)}catch{try{this.click()}catch{}}}\",\n \"ensureFileInputElement\": \"function ae(){try{return(this.tagName?.toLowerCase()??\\\"\\\")!==\\\"input\\\"?!1:String(this.type??\\\"\\\").toLowerCase()===\\\"file\\\"}catch{return!1}}\",\n \"fillElementValue\": \"function me(e){let t=this;if(!t.isConnected)return{status:\\\"error\\\",reason:\\\"notconnected\\\"};let o=(t.ownerDocument||document).defaultView||window,r=e??\\\"\\\";try{let l=s=>{let i;if(typeof o.InputEvent==\\\"function\\\")try{i=new o.InputEvent(\\\"input\\\",{bubbles:!0,composed:!0,data:s,inputType:\\\"insertText\\\"})}catch{i=new o.Event(\\\"input\\\",{bubbles:!0,composed:!0})}else i=new o.Event(\\\"input\\\",{bubbles:!0,composed:!0});t.dispatchEvent(i);let a=new o.Event(\\\"change\\\",{bubbles:!0});t.dispatchEvent(a)};if(t instanceof o.HTMLInputElement){let s=(t.type||\\\"\\\").toLowerCase();if(!Y.has(s)&&!D.has(s))return{status:\\\"error\\\",reason:`unsupported-input-type:${s}`};let i=e;if(s===\\\"number\\\"){let a=e.trim();if(a!==\\\"\\\"&&Number.isNaN(Number(a)))return{status:\\\"error\\\",reason:\\\"invalid-number-value\\\"};i=a}if(r=i,D.has(s)){let a=e.trim();r=a,v.call(t);let d=o.HTMLInputElement.prototype,c=Object.getOwnPropertyDescriptor(d,\\\"value\\\")?.set;return typeof c==\\\"function\\\"?c.call(t,a):t.value=a,t._valueTracker?.setValue?.(a),t.value!==a?{status:\\\"error\\\",reason:\\\"malformed-value\\\"}:(l(a),{status:\\\"done\\\"})}return v.call(t),{status:\\\"needsinput\\\",value:i}}return t instanceof o.HTMLTextAreaElement?(v.call(t),r=e,{status:\\\"needsinput\\\",value:e}):t instanceof o.HTMLSelectElement?{status:\\\"error\\\",reason:\\\"unsupported-element\\\"}:t.isContentEditable?(v.call(t),r=e,{status:\\\"needsinput\\\",value:e}):{status:\\\"error\\\",reason:\\\"unsupported-element\\\"}}catch(l){let s=\\\"exception\\\";if(l&&typeof l==\\\"object\\\"){let i=l.message;typeof i==\\\"string\\\"&&i.trim().length>0&&(s=`exception:${i}`)}return{status:\\\"needsinput\\\",value:r,reason:s}}}\",\n \"focusElement\": \"function fe(){try{typeof this.focus==\\\"function\\\"&&this.focus()}catch{}}\",\n \"isElementChecked\": \"function ge(){try{let e=this;if((e.tagName||\\\"\\\").toLowerCase()===\\\"input\\\"){let o=e.type?.toLowerCase()??\\\"\\\";if(o===\\\"checkbox\\\"||o===\\\"radio\\\")return!!e.checked}let n=e.getAttribute?.(\\\"aria-checked\\\");return n!=null?n===\\\"true\\\":!1}catch{return!1}}\",\n \"isElementVisible\": \"function pe(){try{let e=this;if(!e.isConnected)return!1;let t=e.ownerDocument?.defaultView?.getComputedStyle(e)??window.getComputedStyle(e);if(!t||t.display===\\\"none\\\"||t.visibility===\\\"hidden\\\")return!1;let n=parseFloat(t.opacity??\\\"1\\\");if(!Number.isFinite(n)||n===0)return!1;let o=e.getBoundingClientRect();return!(!o||Math.max(o.width,o.height)===0||e.getClientRects().length===0)}catch{return!1}}\",\n \"prepareElementForTyping\": \"function v(){try{let e=this;if(!e.isConnected)return!1;let t=e.ownerDocument||document,n=t.defaultView||window;try{typeof e.focus==\\\"function\\\"&&e.focus()}catch{}if(e instanceof n.HTMLInputElement||e instanceof n.HTMLTextAreaElement){try{if(typeof e.select==\\\"function\\\")return e.select(),!0}catch{}try{let o=(e.value??\\\"\\\").length;if(typeof e.setSelectionRange==\\\"function\\\")return e.setSelectionRange(0,o),!0}catch{}return!0}if(e.isContentEditable){let o=t.getSelection?.(),r=t.createRange?.();if(o&&r)try{r.selectNodeContents(e),o.removeAllRanges(),o.addRange(r)}catch{}return!0}return!1}catch{return!1}}\",\n \"readElementInnerHTML\": \"function ye(){try{return String(this.innerHTML??\\\"\\\")}catch{return\\\"\\\"}}\",\n \"readElementInnerText\": \"function be(){try{let e=this,t=e.innerText;if(typeof t==\\\"string\\\"&&t.length>0)return t;let n=e.textContent;return typeof n==\\\"string\\\"?n:\\\"\\\"}catch{return\\\"\\\"}}\",\n \"readElementInputValue\": \"function Ee(){try{let e=this,t=(e.tagName||\\\"\\\").toLowerCase();return t===\\\"input\\\"||t===\\\"textarea\\\"||t===\\\"select\\\"?String(e.value??\\\"\\\"):e.isContentEditable?String(e.textContent??\\\"\\\"):\\\"\\\"}catch{return\\\"\\\"}}\",\n \"readElementTextContent\": \"function we(){try{return String(this.textContent??\\\"\\\")}catch{return\\\"\\\"}}\",\n \"resolveCssSelector\": \"function Ne(e,t){let n=String(e??\\\"\\\").trim();if(!n)return null;let o=C(t);return z(n,o+1)[o]??null}\",\n \"resolveCssSelectorPierce\": \"function Ce(e,t){let n=String(e??\\\"\\\").trim();if(!n)return null;let o=C(t),r=window.__stagehandV3__;if(!r||typeof r.getClosedRoot!=\\\"function\\\")return z(n,o+1)[o]??null;let l=c=>{try{return r.getClosedRoot(c)??null}catch{return null}},s=new WeakSet,i=new Set,a=[],d=[document],f=c=>{if(!(!c||s.has(c)||a.length>=o+1)){s.add(c);try{let p=c.querySelectorAll(n);for(let g of p)if(!i.has(g)&&(i.add(g),a.push(g),a.length>=o+1))return}catch{}try{let g=(c instanceof Document?c:c.host?.ownerDocument??document).createTreeWalker(c,NodeFilter.SHOW_ELEMENT),w;for(;w=g.nextNode();){if(!(w instanceof Element))continue;let x=w.shadowRoot;x&&d.push(x);let y=l(w);y&&d.push(y)}}catch{}}};for(;d.length&&a.length<o+1;){let c=d.shift();c&&f(c)}return a[o]??null}\",\n \"resolveTextSelector\": \"function Me(e,t){let n=String(e??\\\"\\\");if(!n)return null;let o=n.toLowerCase(),r=C(t),l=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),s=u=>{if(!u)return!1;let h=u.tagName?.toUpperCase()??\\\"\\\";return l.has(h)},i=u=>{try{if(s(u))return\\\"\\\";let h=u.innerText;if(typeof h==\\\"string\\\"&&h.trim())return h.trim()}catch{}try{let h=u.textContent;if(typeof h==\\\"string\\\")return h.trim()}catch{}return\\\"\\\"},a=u=>{let h=i(u);return!!h&&h.toLowerCase().includes(o)},d=window.__stagehandV3__,f=d&&typeof d.getClosedRoot==\\\"function\\\"?u=>{try{return d.getClosedRoot(u)??null}catch{return null}}:u=>null,c=new WeakSet,p=[],g=[],w=u=>{!u||c.has(u)||(c.add(u),p.push(u))},x=u=>{try{return(u instanceof Document?u:u?.ownerDocument??document).createTreeWalker(u,NodeFilter.SHOW_ELEMENT)}catch{return null}};for(w(document);p.length;){let u=p.shift();if(!u)continue;u instanceof Element&&a(u)&&g.push({element:u,tag:u.tagName??\\\"\\\",id:u.id??\\\"\\\",className:u.className??\\\"\\\",text:i(u)});let h=x(u);if(!h)continue;let E;for(;E=h.nextNode();){if(!(E instanceof Element))continue;a(E)&&g.push({element:E,tag:E.tagName??\\\"\\\",id:E.id??\\\"\\\",className:E.className??\\\"\\\",text:i(E)});let b=E.shadowRoot;b&&w(b);let k=f(E);k&&w(k)}}let y=[];for(let u of g){let h=u.element,E=!1;for(let b of g)if(u!==b)try{if(h.contains(b.element)){E=!0;break}}catch{}E||y.push(u)}return y[r]?.element??null}\",\n \"resolveXPathMainWorld\": \"function Le(e,t){let n=C(t);return P(e,n,{pierceShadow:!0})}\",\n \"scrollElementToPercent\": \"function de(e){let t=n=>{if(typeof n==\\\"number\\\"&&Number.isFinite(n))return n;let o=String(n??\\\"\\\").trim();if(!o)return 0;let r=parseFloat(o.replace(\\\"%\\\",\\\"\\\"));return Number.isNaN(r)||!Number.isFinite(r)?0:r};try{let n=Math.max(0,Math.min(t(e),100)),o=this,r=o.tagName?.toLowerCase()??\\\"\\\";if(r===\\\"html\\\"||r===\\\"body\\\"){let c=(o.ownerDocument?.scrollingElement||o.ownerDocument?.documentElement||o.ownerDocument?.body||document.scrollingElement||document.documentElement||document.body)?.scrollHeight??document.body.scrollHeight??0,p=o.ownerDocument?.defaultView?.innerHeight??window.innerHeight,w=Math.max(0,c-p)*(n/100);return o.ownerDocument?.defaultView?.scrollTo({top:w,left:o.ownerDocument?.defaultView?.scrollX??window.scrollX??0,behavior:\\\"smooth\\\"}),!0}let s=o.scrollHeight??0,i=o.clientHeight??0,d=Math.max(0,s-i)*(n/100);return o.scrollTo({top:d,left:o.scrollLeft??0,behavior:\\\"smooth\\\"}),!0}catch{return!1}}\",\n \"selectElementOptions\": \"function he(e){try{if(!(this instanceof HTMLSelectElement))return[];let t=Array.isArray(e)?e:[e],n=new Set(t.map(s=>String(s??\\\"\\\").trim())),o=s=>{let i=(s.label||s.textContent||\\\"\\\").trim(),a=String(s.value??\\\"\\\").trim();return n.has(i)||n.has(a)};if(this.multiple)for(let s of Array.from(this.options))s.selected=o(s);else{let s=!1;for(let i of Array.from(this.options))!s&&o(i)?(i.selected=!0,this.value=i.value,s=!0):i.selected=!1}let r=new Event(\\\"input\\\",{bubbles:!0}),l=new Event(\\\"change\\\",{bubbles:!0});return this.dispatchEvent(r),this.dispatchEvent(l),Array.from(this.selectedOptions).map(s=>s.value)}catch{return[]}}\",\n \"waitForSelector\": \"function qe(e,t,n,o){let r=String(e??\\\"\\\").trim(),l=String(t??\\\"visible\\\")||\\\"visible\\\",s=typeof n==\\\"number\\\"&&n>0?n:3e4,i=o!==!1;return new Promise((a,d)=>{let f=null,c=null,p=!1,g=()=>{f!==null&&(clearTimeout(f),f=null)},w=V(r,i);if(B(w,l)){p=!0,a(!0);return}let x=[],y=()=>{for(let E of x)E.disconnect();c&&(document.removeEventListener(\\\"DOMContentLoaded\\\",c),c=null)},m=()=>{if(p)return;let E=V(r,i);B(E,l)&&(p=!0,g(),y(),a(!0))};if(!(document.body||document.documentElement)){c=()=>{document.removeEventListener(\\\"DOMContentLoaded\\\",c),c=null,m(),h()},document.addEventListener(\\\"DOMContentLoaded\\\",c),f=setTimeout(()=>{p||(p=!0,g(),y(),d(new Error(`waitForSelector: Timeout ${s}ms exceeded waiting for \\\"${r}\\\" to be ${l}`)))},s);return}let h=()=>{let E=document.body||document.documentElement;if(!E)return;let b=new MutationObserver(m);b.observe(E,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[\\\"style\\\",\\\"class\\\",\\\"hidden\\\",\\\"disabled\\\"]}),x.push(b),i&&ie(m,x)};h(),f=setTimeout(()=>{p||(p=!0,g(),y(),d(new Error(`waitForSelector: Timeout ${s}ms exceeded waiting for \\\"${r}\\\" to be ${l}`)))},s)})}\"\n} as const;\nexport const locatorScriptGlobalRefs = {\n \"assignFilePayloadsToInputElement\": \"globalThis.__stagehandLocatorScripts.assignFilePayloadsToInputElement\",\n \"countCssMatchesPierce\": \"globalThis.__stagehandLocatorScripts.countCssMatchesPierce\",\n \"countCssMatchesPrimary\": \"globalThis.__stagehandLocatorScripts.countCssMatchesPrimary\",\n \"countTextMatches\": \"globalThis.__stagehandLocatorScripts.countTextMatches\",\n \"countXPathMatchesMainWorld\": \"globalThis.__stagehandLocatorScripts.countXPathMatchesMainWorld\",\n \"dispatchDomClick\": \"globalThis.__stagehandLocatorScripts.dispatchDomClick\",\n \"ensureFileInputElement\": \"globalThis.__stagehandLocatorScripts.ensureFileInputElement\",\n \"fillElementValue\": \"globalThis.__stagehandLocatorScripts.fillElementValue\",\n \"focusElement\": \"globalThis.__stagehandLocatorScripts.focusElement\",\n \"isElementChecked\": \"globalThis.__stagehandLocatorScripts.isElementChecked\",\n \"isElementVisible\": \"globalThis.__stagehandLocatorScripts.isElementVisible\",\n \"prepareElementForTyping\": \"globalThis.__stagehandLocatorScripts.prepareElementForTyping\",\n \"readElementInnerHTML\": \"globalThis.__stagehandLocatorScripts.readElementInnerHTML\",\n \"readElementInnerText\": \"globalThis.__stagehandLocatorScripts.readElementInnerText\",\n \"readElementInputValue\": \"globalThis.__stagehandLocatorScripts.readElementInputValue\",\n \"readElementTextContent\": \"globalThis.__stagehandLocatorScripts.readElementTextContent\",\n \"resolveCssSelector\": \"globalThis.__stagehandLocatorScripts.resolveCssSelector\",\n \"resolveCssSelectorPierce\": \"globalThis.__stagehandLocatorScripts.resolveCssSelectorPierce\",\n \"resolveTextSelector\": \"globalThis.__stagehandLocatorScripts.resolveTextSelector\",\n \"resolveXPathMainWorld\": \"globalThis.__stagehandLocatorScripts.resolveXPathMainWorld\",\n \"scrollElementToPercent\": \"globalThis.__stagehandLocatorScripts.scrollElementToPercent\",\n \"selectElementOptions\": \"globalThis.__stagehandLocatorScripts.selectElementOptions\",\n \"waitForSelector\": \"globalThis.__stagehandLocatorScripts.waitForSelector\"\n} as const;\nexport type LocatorScriptName = keyof typeof locatorScriptSources;\n", "import {\n locatorScriptBootstrap,\n locatorScriptGlobalRefs,\n type LocatorScriptName,\n} from \"../dom/build/locatorScripts.generated.js\";\n\n/**\n * Build an expression that injects the locator bundle (if needed) and invokes a\n * specific helper via its stable global reference. This keeps Runtime.evaluate\n * payloads tiny while guaranteeing our selector utilities are present in any\n * execution context.\n */\nexport function buildLocatorInvocation(\n name: LocatorScriptName,\n args: string[],\n): string {\n const invocation = `${locatorScriptGlobalRefs[name]}(${args.join(\", \")})`;\n return `(() => { ${locatorScriptBootstrap}; return ${invocation}; })()`;\n}\n", "/*\n * AUTO-GENERATED FILE. DO NOT EDIT.\n * Update sources in lib/v3/dom/a11yScripts and run genA11yScripts.ts.\n */\nexport const a11yScriptBootstrap = \"if (!globalThis.__stagehandA11yScripts) { var __stagehandA11yScriptsFactory=(()=>{var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var N=(o,t)=>{for(var n in t)i(o,n,{get:t[n],enumerable:!0})},h=(o,t,n,d)=>{if(t&&typeof t==\\\"object\\\"||typeof t==\\\"function\\\")for(let u of f(t))!p.call(o,u)&&u!==n&&i(o,u,{get:()=>t[u],enumerable:!(d=a(t,u))||d.enumerable});return o};var E=o=>h(i({},\\\"__esModule\\\",{value:!0}),o);var b={};N(b,{documentHasFocusStrict:()=>g,getBoundingRectLite:()=>w,getScrollOffsets:()=>y,nodeToAbsoluteXPath:()=>$,resolveDeepActiveElement:()=>T});function y(){try{let o=window.scrollX??window.pageXOffset??document.documentElement?.scrollLeft??0,t=window.scrollY??window.pageYOffset??document.documentElement?.scrollTop??0;return{sx:Number(o)||0,sy:Number(t)||0}}catch{return{sx:0,sy:0}}}function w(){try{let o=this.getBoundingClientRect();return{left:Number(o?.left??0)||0,top:Number(o?.top??0)||0}}catch{return{left:0,top:0}}}function T(){try{return(t=>{let n=t.activeElement??null;for(;n&&n.shadowRoot&&n.shadowRoot.activeElement;)n=n.shadowRoot.activeElement;return n??null})(document)}catch{return null}}function $(){return(t=>{try{let n=e=>{if(!e||!e.parentNode)return 1;let l=1,m=`${e.nodeType}:${(e.nodeName||\\\"\\\").toLowerCase()}`;for(let c=e.previousSibling;c;c=c.previousSibling)`${c.nodeType}:${(c.nodeName||\\\"\\\").toLowerCase()}`===m&&(l+=1);return l},d=e=>{if(!e||e.nodeType===Node.DOCUMENT_NODE)return\\\"\\\";if(e.nodeType===Node.DOCUMENT_FRAGMENT_NODE)return\\\"//\\\";if(e.nodeType===Node.TEXT_NODE)return`text()[${n(e)}]`;if(e.nodeType===Node.COMMENT_NODE)return`comment()[${n(e)}]`;let l=(e.nodeName||\\\"\\\").toLowerCase();return`${l.includes(\\\":\\\")?`*[name()='${l}']`:l}[${n(e)}]`},u=[],s=t;for(;s;){if(s.nodeType===Node.DOCUMENT_FRAGMENT_NODE){u.push(\\\"//\\\"),s=s.host??null;continue}let e=d(s);e&&u.push(e),s=s.parentNode}u.reverse();let r=\\\"\\\";for(let e of u)e===\\\"//\\\"?r=r?r.endsWith(\\\"/\\\")?`${r}/`:`${r}//`:\\\"//\\\":r=r?r.endsWith(\\\"/\\\")?`${r}${e}`:`${r}/${e}`:`/${e}`;return r||\\\"/\\\"}catch{return\\\"/\\\"}})(this)}function g(){try{return document.hasFocus()===!0}catch{return!1}}return E(b);})();\\n globalThis.__stagehandA11yScripts = __stagehandA11yScriptsFactory;\\n}\";\nexport const a11yScriptSources = {\n \"documentHasFocusStrict\": \"function h(){try{return document.hasFocus()===!0}catch{return!1}}\",\n \"getBoundingRectLite\": \"function f(){try{let r=this.getBoundingClientRect();return{left:Number(r?.left??0)||0,top:Number(r?.top??0)||0}}catch{return{left:0,top:0}}}\",\n \"getScrollOffsets\": \"function a(){try{let r=window.scrollX??window.pageXOffset??document.documentElement?.scrollLeft??0,s=window.scrollY??window.pageYOffset??document.documentElement?.scrollTop??0;return{sx:Number(r)||0,sy:Number(s)||0}}catch{return{sx:0,sy:0}}}\",\n \"nodeToAbsoluteXPath\": \"function N(){return(s=>{try{let n=e=>{if(!e||!e.parentNode)return 1;let u=1,d=`${e.nodeType}:${(e.nodeName||\\\"\\\").toLowerCase()}`;for(let l=e.previousSibling;l;l=l.previousSibling)`${l.nodeType}:${(l.nodeName||\\\"\\\").toLowerCase()}`===d&&(u+=1);return u},i=e=>{if(!e||e.nodeType===Node.DOCUMENT_NODE)return\\\"\\\";if(e.nodeType===Node.DOCUMENT_FRAGMENT_NODE)return\\\"//\\\";if(e.nodeType===Node.TEXT_NODE)return`text()[${n(e)}]`;if(e.nodeType===Node.COMMENT_NODE)return`comment()[${n(e)}]`;let u=(e.nodeName||\\\"\\\").toLowerCase();return`${u.includes(\\\":\\\")?`*[name()='${u}']`:u}[${n(e)}]`},c=[],o=s;for(;o;){if(o.nodeType===Node.DOCUMENT_FRAGMENT_NODE){c.push(\\\"//\\\"),o=o.host??null;continue}let e=i(o);e&&c.push(e),o=o.parentNode}c.reverse();let t=\\\"\\\";for(let e of c)e===\\\"//\\\"?t=t?t.endsWith(\\\"/\\\")?`${t}/`:`${t}//`:\\\"//\\\":t=t?t.endsWith(\\\"/\\\")?`${t}${e}`:`${t}/${e}`:`/${e}`;return t||\\\"/\\\"}catch{return\\\"/\\\"}})(this)}\",\n \"resolveDeepActiveElement\": \"function p(){try{return(s=>{let n=s.activeElement??null;for(;n&&n.shadowRoot&&n.shadowRoot.activeElement;)n=n.shadowRoot.activeElement;return n??null})(document)}catch{return null}}\"\n} as const;\nexport const a11yScriptGlobalRefs = {\n \"documentHasFocusStrict\": \"globalThis.__stagehandA11yScripts.documentHasFocusStrict\",\n \"getBoundingRectLite\": \"globalThis.__stagehandA11yScripts.getBoundingRectLite\",\n \"getScrollOffsets\": \"globalThis.__stagehandA11yScripts.getScrollOffsets\",\n \"nodeToAbsoluteXPath\": \"globalThis.__stagehandA11yScripts.nodeToAbsoluteXPath\",\n \"resolveDeepActiveElement\": \"globalThis.__stagehandA11yScripts.resolveDeepActiveElement\"\n} as const;\nexport type A11yScriptName = keyof typeof a11yScriptSources;\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport { a11yScriptSources } from \"../../../dom/build/a11yScripts.generated.js\";\n\n/**\n * Build the absolute XPath for a node by walking through every iframe host\n * we've traversed so far followed by the leaf backend node.\n */\nexport async function buildAbsoluteXPathFromChain(\n chain: Array<{\n parentSession: CDPSessionLike;\n iframeBackendNodeId: number;\n }>,\n leafSession: CDPSessionLike,\n leafBackendNodeId: number,\n): Promise<string | null> {\n let prefix = \"\";\n for (const step of chain) {\n const xp = await absoluteXPathForBackendNode(\n step.parentSession,\n step.iframeBackendNodeId,\n );\n if (!xp) continue;\n prefix = prefix ? prefixXPath(prefix, xp) : normalizeXPath(xp);\n }\n const leaf = await absoluteXPathForBackendNode(\n leafSession,\n leafBackendNodeId,\n );\n if (!leaf) return prefix || \"/\";\n return prefix ? prefixXPath(prefix, leaf) : normalizeXPath(leaf);\n}\n\n/**\n * Resolve a backend node to an absolute XPath within the provided session.\n * The CDP Runtime is used so we can invoke a small helper that walks the DOM.\n */\nexport async function absoluteXPathForBackendNode(\n session: CDPSessionLike,\n backendNodeId: number,\n): Promise<string | null> {\n try {\n const { object } = await session.send<{ object: { objectId?: string } }>(\n \"DOM.resolveNode\",\n { backendNodeId },\n );\n const objectId = object?.objectId;\n if (!objectId) return null;\n\n const { result } = await session.send<{ result: { value?: string } }>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: a11yScriptSources.nodeToAbsoluteXPath,\n returnByValue: true,\n },\n );\n await session.send(\"Runtime.releaseObject\", { objectId }).catch(() => {});\n return typeof result?.value === \"string\" && result.value\n ? result.value\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Prefix `child` XPath with an absolute iframe path `parentAbs`.\n * Handles root slashes and shadow hops (\u201C//\u201D) cleanly.\n */\nexport function prefixXPath(parentAbs: string, child: string): string {\n const p = parentAbs === \"/\" ? \"\" : parentAbs.replace(/\\/$/, \"\");\n if (!child || child === \"/\") return p || \"/\";\n if (child.startsWith(\"//\"))\n return p ? `${p}//${child.slice(2)}` : `//${child.slice(2)}`;\n const c = child.replace(/^\\//, \"\");\n return p ? `${p}/${c}` : `/${c}`;\n}\n\n/** Normalize an XPath: strip `xpath=`, ensure leading '/', remove trailing '/'. */\nexport function normalizeXPath(x?: string): string {\n if (!x) return \"\";\n let s = x.trim().replace(/^xpath=/i, \"\");\n if (!s.startsWith(\"/\")) s = \"/\" + s;\n if (s.length > 1 && s.endsWith(\"/\")) s = s.slice(0, -1);\n return s;\n}\n\n/** Build per-sibling XPath steps for DOM traversal. */\nexport function buildChildXPathSegments(kids: Protocol.DOM.Node[]): string[] {\n const segs: string[] = [];\n const ctr: Record<string, number> = {};\n for (const child of kids) {\n const tag = String(child.nodeName).toLowerCase();\n const key = `${child.nodeType}:${tag}`;\n const idx = (ctr[key] = (ctr[key] ?? 0) + 1);\n if (child.nodeType === 3) {\n segs.push(`text()[${idx}]`);\n } else if (child.nodeType === 8) {\n segs.push(`comment()[${idx}]`);\n } else {\n segs.push(\n tag.includes(\":\") ? `*[name()='${tag}'][${idx}]` : `${tag}[${idx}]`,\n );\n }\n }\n return segs;\n}\n\n/** Join two XPath fragments while preserving special shadow-root hops. */\nexport function joinXPath(base: string, step: string): string {\n if (step === \"//\") {\n if (!base || base === \"/\") return \"//\";\n return base.endsWith(\"/\") ? `${base}/` : `${base}//`;\n }\n if (!base || base === \"/\") return step ? `/${step}` : \"/\";\n if (base.endsWith(\"//\")) return `${base}${step}`;\n if (!step) return base;\n return `${base}/${step}`;\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport { Page } from \"../../page.js\";\nimport { executionContexts } from \"../../executionContextRegistry.js\";\nimport { buildLocatorInvocation } from \"../../locatorInvocation.js\";\nimport { StagehandIframeError } from \"../../../types/public/sdkErrors.js\";\nimport type {\n Axis,\n FrameParentIndex,\n ResolvedCssFocus,\n ResolvedFocusFrame,\n Step,\n} from \"../../../types/private/snapshot.js\";\nimport { prefixXPath } from \"./xpathUtils.js\";\n\n/**\n * Parse a cross-frame XPath into discrete steps. Each step tracks whether it\n * represents a descendant hop (\u201C//\u201D) or a single-child hop (\u201C/\u201D).\n */\nexport function parseXPathToSteps(path: string): Step[] {\n const s = path.trim();\n let i = 0;\n const steps: Step[] = [];\n while (i < s.length) {\n let axis: Axis = \"child\";\n if (s.startsWith(\"//\", i)) {\n axis = \"desc\";\n i += 2;\n } else if (s[i] === \"/\") {\n axis = \"child\";\n i += 1;\n }\n\n const start = i;\n while (i < s.length && s[i] !== \"/\") i++;\n const raw = s.slice(start, i).trim();\n if (!raw) continue;\n const name = raw.replace(/\\[\\d+\\]\\s*$/u, \"\").toLowerCase();\n steps.push({ axis, raw, name });\n }\n return steps;\n}\n\n/** Rebuild an XPath string from parsed steps. */\nexport function buildXPathFromSteps(steps: ReadonlyArray<Step>): string {\n let out = \"\";\n for (const st of steps) {\n out += st.axis === \"desc\" ? \"//\" : \"/\";\n out += st.raw;\n }\n return out || \"/\";\n}\n\nconst IFRAME_STEP_RE = /^iframe(?:\\[\\d+])?$/i;\n\n/**\n * Given a cross-frame XPath, walk iframe steps to resolve:\n * - the target frameId (last iframe hop)\n * - the tail XPath (within the target frame)\n * - the absolute XPath prefix up to the iframe element hosting that frame\n */\nexport async function resolveFocusFrameAndTail(\n page: Page,\n absoluteXPath: string,\n parentByFrame: FrameParentIndex,\n rootId: string,\n): Promise<ResolvedFocusFrame> {\n const steps = parseXPathToSteps(absoluteXPath);\n let ctxFrameId = rootId;\n let buf: Step[] = [];\n let absPrefix = \"\";\n\n const flushIntoChild = async (): Promise<void> => {\n if (!buf.length) return;\n const selectorForIframe = buildXPathFromSteps(buf);\n const parentSess = page.getSessionForFrame(ctxFrameId);\n const objectId = await resolveObjectIdForXPath(\n parentSess,\n selectorForIframe,\n ctxFrameId,\n );\n if (!objectId)\n throw new StagehandIframeError(\n selectorForIframe,\n \"Failed to resolve iframe element by XPath\",\n );\n\n try {\n await parentSess.send(\"DOM.enable\").catch(() => {});\n const desc = await parentSess.send<Protocol.DOM.DescribeNodeResponse>(\n \"DOM.describeNode\",\n { objectId },\n );\n const iframeBackendNodeId = desc.node.backendNodeId;\n\n let childFrameId: string | undefined;\n for (const fid of listChildrenOf(parentByFrame, ctxFrameId)) {\n try {\n const { backendNodeId } = await parentSess.send<{\n backendNodeId: number;\n }>(\"DOM.getFrameOwner\", { frameId: fid });\n if (backendNodeId === iframeBackendNodeId) {\n childFrameId = fid;\n break;\n }\n } catch {\n continue;\n }\n }\n if (!childFrameId)\n throw new StagehandIframeError(\n selectorForIframe,\n \"Could not map iframe to child frameId\",\n );\n\n absPrefix = prefixXPath(absPrefix || \"/\", selectorForIframe);\n ctxFrameId = childFrameId;\n } finally {\n await parentSess\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n\n buf = [];\n };\n\n for (const st of steps) {\n buf.push(st);\n if (IFRAME_STEP_RE.test(st.name)) {\n await flushIntoChild();\n }\n }\n\n const tailXPath = buildXPathFromSteps(buf);\n return { targetFrameId: ctxFrameId, tailXPath, absPrefix };\n}\n\n/** Resolve focus frame and tail CSS selector using '>>' to hop iframes. */\nexport async function resolveCssFocusFrameAndTail(\n page: Page,\n rawSelector: string,\n parentByFrame: FrameParentIndex,\n rootId: string,\n): Promise<ResolvedCssFocus> {\n const parts = rawSelector\n .split(\">>\")\n .map((s) => s.trim())\n .filter(Boolean);\n let ctxFrameId = rootId;\n const absPrefix = \"\";\n\n for (let i = 0; i < Math.max(0, parts.length - 1); i++) {\n const parentSess = page.getSessionForFrame(ctxFrameId);\n const objectId = await resolveObjectIdForCss(\n parentSess,\n parts[i]!,\n ctxFrameId,\n );\n if (!objectId)\n throw new StagehandIframeError(\n parts[i]!,\n \"Failed to resolve iframe via CSS hop\",\n );\n try {\n await parentSess.send(\"DOM.enable\").catch(() => {});\n const desc = await parentSess.send<Protocol.DOM.DescribeNodeResponse>(\n \"DOM.describeNode\",\n { objectId },\n );\n const iframeBackendNodeId = desc.node.backendNodeId;\n let childFrameId: string | undefined;\n for (const fid of listChildrenOf(parentByFrame, ctxFrameId)) {\n try {\n const { backendNodeId } = await parentSess.send<{\n backendNodeId: number;\n }>(\"DOM.getFrameOwner\", { frameId: fid });\n if (backendNodeId === iframeBackendNodeId) {\n childFrameId = fid;\n break;\n }\n } catch {\n continue;\n }\n }\n if (!childFrameId)\n throw new StagehandIframeError(\n parts[i]!,\n \"Could not map CSS iframe hop to child frameId\",\n );\n ctxFrameId = childFrameId;\n } finally {\n await parentSess\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n const tailSelector = parts[parts.length - 1] ?? \"*\";\n return { targetFrameId: ctxFrameId, tailSelector, absPrefix };\n}\n\n/** Resolve an XPath to a Runtime remoteObjectId in the given CDP session. */\nexport async function resolveObjectIdForXPath(\n session: CDPSessionLike,\n xpath: string,\n frameId?: string,\n): Promise<string | null> {\n let contextId: number | undefined;\n try {\n if (frameId) {\n contextId = await executionContexts\n .waitForMainWorld(session, frameId, 800)\n .catch(\n () => executionContexts.getMainWorld(session, frameId) ?? undefined,\n );\n }\n } catch {\n contextId = undefined;\n }\n const expr = buildLocatorInvocation(\"resolveXPathMainWorld\", [\n JSON.stringify(xpath),\n \"0\",\n ]);\n const { result, exceptionDetails } = await session.send<{\n result: { objectId?: string | undefined };\n exceptionDetails?: Protocol.Runtime.ExceptionDetails;\n }>(\"Runtime.evaluate\", {\n expression: expr,\n returnByValue: false,\n contextId,\n awaitPromise: true,\n });\n if (exceptionDetails) return null;\n return result?.objectId ?? null;\n}\n\n/** Resolve a CSS selector (supports '>>' within the same frame only) to a Runtime objectId. */\nexport async function resolveObjectIdForCss(\n session: CDPSessionLike,\n selector: string,\n frameId?: string,\n): Promise<string | null> {\n let contextId: number | undefined;\n try {\n if (frameId) {\n contextId = await executionContexts\n .waitForMainWorld(session, frameId, 800)\n .catch(\n () => executionContexts.getMainWorld(session, frameId) ?? undefined,\n );\n }\n } catch {\n contextId = undefined;\n }\n const primaryExpr = buildLocatorInvocation(\"resolveCssSelector\", [\n JSON.stringify(selector),\n \"0\",\n ]);\n const fallbackExpr = buildLocatorInvocation(\"resolveCssSelectorPierce\", [\n JSON.stringify(selector),\n \"0\",\n ]);\n\n const evaluate = async (expression: string): Promise<string | null> => {\n const { result, exceptionDetails } = await session.send<{\n result: { objectId?: string | undefined };\n exceptionDetails?: Protocol.Runtime.ExceptionDetails;\n }>(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n contextId,\n awaitPromise: true,\n });\n if (exceptionDetails) return null;\n return result?.objectId ?? null;\n };\n\n const primary = await evaluate(primaryExpr);\n if (primary) return primary;\n return evaluate(fallbackExpr);\n}\n\nexport function listChildrenOf(\n parentByFrame: FrameParentIndex,\n parentId: string,\n): string[] {\n const out: string[] = [];\n for (const [fid, p] of parentByFrame.entries()) {\n if (p === parentId) out.push(fid);\n }\n return out;\n}\n", "import type { A11yNode } from \"../../../types/private/snapshot.js\";\n\n/**\n * Render a formatted outline (with encoded ids) for the accessibility tree.\n * Keeps indentation logic shared between modules so unit tests can cover these\n * pure formatting helpers without a full snapshot pipeline.\n */\nexport function formatTreeLine(node: A11yNode, level = 0): string {\n const indent = \" \".repeat(level);\n const labelId = node.encodedId ?? node.nodeId;\n const label = `[${labelId}] ${node.role}${node.name ? `: ${cleanText(node.name)}` : \"\"}`;\n const kids =\n node.children?.map((c) => formatTreeLine(c, level + 1)).join(\"\\n\") ?? \"\";\n return kids ? `${indent}${label}\\n${kids}` : `${indent}${label}`;\n}\n\n/**\n * Inject each child frame outline under the parent's iframe node line.\n * Keys in `idToTree` are the parent's iframe encoded ids.\n */\nexport function injectSubtrees(\n rootOutline: string,\n idToTree: Map<string, string>,\n): string {\n type Frame = { lines: string[]; i: number };\n const out: string[] = [];\n const visited = new Set<string>();\n const stack: Frame[] = [{ lines: rootOutline.split(\"\\n\"), i: 0 }];\n\n while (stack.length) {\n const top = stack[stack.length - 1];\n if (top.i >= top.lines.length) {\n stack.pop();\n continue;\n }\n\n const raw = top.lines[top.i++];\n out.push(raw);\n\n const indent = raw.match(/^(\\s*)/)?.[1] ?? \"\";\n const content = raw.slice(indent.length);\n\n const m = content.match(/^\\[([^\\]]+)]/);\n if (!m) continue;\n\n const encId = m[1]!;\n const childOutline = idToTree.get(encId);\n if (!childOutline || visited.has(encId)) continue;\n\n visited.add(encId);\n\n const fullyInjectedChild = injectSubtrees(childOutline, idToTree);\n out.push(indentBlock(fullyInjectedChild.trimEnd(), indent + \" \"));\n }\n\n return out.join(\"\\n\");\n}\n\nexport function indentBlock(block: string, indent: string): string {\n if (!block) return \"\";\n return block\n .split(\"\\n\")\n .map((line) => (line.length ? indent + line : indent + line))\n .join(\"\\n\");\n}\n\n/**\n * Return the lines that appear in `nextTree` but not in `prevTree`.\n * Comparison is done line-by-line, ignoring leading whitespace in both trees.\n * The returned block is re-indented so the minimal indent becomes column 0.\n */\nexport function diffCombinedTrees(prevTree: string, nextTree: string): string {\n const prevSet = new Set(\n (prevTree || \"\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.length > 0),\n );\n\n const nextLines = (nextTree || \"\").split(\"\\n\");\n const added: string[] = [];\n for (const line of nextLines) {\n const core = line.trim();\n if (!core) continue;\n if (!prevSet.has(core)) added.push(line);\n }\n\n if (added.length === 0) return \"\";\n\n let minIndent = Infinity;\n for (const l of added) {\n if (!l.trim()) continue;\n const m = l.match(/^\\s*/);\n const indentLen = m ? m[0]!.length : 0;\n if (indentLen < minIndent) minIndent = indentLen;\n }\n if (!isFinite(minIndent)) minIndent = 0;\n\n const out = added.map((l) =>\n l.length >= minIndent ? l.slice(minIndent) : l,\n );\n return out.join(\"\\n\");\n}\n\n/**\n * Remove whitespace noise and invisible code points before rendering names.\n */\nexport function cleanText(input: string): string {\n const PUA_START = 0xe000;\n const PUA_END = 0xf8ff;\n const NBSP = new Set<number>([0x00a0, 0x202f, 0x2007, 0xfeff]);\n\n let out = \"\";\n let prevSpace = false;\n for (let i = 0; i < input.length; i++) {\n const code = input.charCodeAt(i);\n if (code >= PUA_START && code <= PUA_END) continue;\n if (NBSP.has(code)) {\n if (!prevSpace) {\n out += \" \";\n prevSpace = true;\n }\n continue;\n }\n out += input[i];\n prevSpace = input[i] === \" \";\n }\n return out.trim();\n}\n\n/**\n * Collapse all whitespace runs in a string to a single space without trimming.\n * Exported for pruning routines that need the same normalization.\n */\nexport function normaliseSpaces(s: string): string {\n let out = \"\";\n let inWs = false;\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]!;\n const isWs = /\\s/.test(ch);\n if (isWs) {\n if (!inWs) {\n out += \" \";\n inWs = true;\n }\n } else {\n out += ch;\n inWs = false;\n }\n }\n return out;\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport type {\n A11yNode,\n A11yOptions,\n AccessibilityTreeResult,\n} from \"../../../types/private/snapshot.js\";\nimport {\n resolveObjectIdForCss,\n resolveObjectIdForXPath,\n} from \"./focusSelectors.js\";\nimport { formatTreeLine, normaliseSpaces } from \"./treeFormatUtils.js\";\n\n/**\n * Fetch and prune the accessibility tree for a frame, optionally scoping the\n * output to a selector root for faster targeted snapshots.\n */\nexport async function a11yForFrame(\n session: CDPSessionLike,\n frameId: string | undefined,\n opts: A11yOptions,\n): Promise<AccessibilityTreeResult> {\n await session.send(\"Accessibility.enable\").catch(() => {});\n await session.send(\"Runtime.enable\").catch(() => {});\n await session.send(\"DOM.enable\").catch(() => {});\n\n let nodes: Protocol.Accessibility.AXNode[] = [];\n try {\n const params = frameId ? ({ frameId } as Record<string, unknown>) : {};\n ({ nodes } = await session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\", params));\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 || !frameId) throw e;\n ({ nodes } = await session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\"));\n }\n\n const urlMap: Record<string, string> = {};\n for (const n of nodes) {\n const be = n.backendDOMNodeId;\n if (typeof be !== \"number\") continue;\n const url = extractUrlFromAXNode(n);\n if (!url) continue;\n const enc = opts.encode(be);\n urlMap[enc] = url;\n }\n\n let scopeApplied = false;\n const nodesForOutline = await (async () => {\n const sel = opts.focusSelector?.trim();\n if (!sel) return nodes;\n try {\n const looksLikeXPath = /^xpath=/i.test(sel) || sel.startsWith(\"/\");\n const objectId = looksLikeXPath\n ? await resolveObjectIdForXPath(session, sel, frameId)\n : await resolveObjectIdForCss(session, sel, frameId);\n if (!objectId) return nodes;\n const desc = await session.send<{ node?: { backendNodeId?: number } }>(\n \"DOM.describeNode\",\n { objectId },\n );\n const be = desc.node?.backendNodeId;\n if (typeof be !== \"number\") return nodes;\n const target = nodes.find((n) => n.backendDOMNodeId === be);\n if (!target) return nodes;\n scopeApplied = true;\n const keep = new Set<string>([target.nodeId]);\n const queue: Protocol.Accessibility.AXNode[] = [target];\n while (queue.length) {\n const cur = queue.shift()!;\n for (const id of cur.childIds ?? []) {\n if (keep.has(id)) continue;\n keep.add(id);\n const child = nodes.find((n) => n.nodeId === id);\n if (child) queue.push(child);\n }\n }\n return nodes\n .filter((n) => keep.has(n.nodeId))\n .map((n) =>\n n.nodeId === target.nodeId ? { ...n, parentId: undefined } : n,\n );\n } catch {\n return nodes;\n }\n })();\n\n const decorated = decorateRoles(nodesForOutline, opts);\n const { tree } = await buildHierarchicalTree(decorated, opts);\n\n const simplified = tree.map((n) => formatTreeLine(n)).join(\"\\n\");\n return { outline: simplified.trimEnd(), urlMap, scopeApplied };\n}\n\nexport function decorateRoles(\n nodes: Protocol.Accessibility.AXNode[],\n opts: A11yOptions,\n): A11yNode[] {\n const asRole = (n: Protocol.Accessibility.AXNode) =>\n String(n.role?.value ?? \"\");\n\n return nodes.map((n) => {\n let encodedId: string | undefined;\n if (typeof n.backendDOMNodeId === \"number\") {\n try {\n encodedId = opts.encode(n.backendDOMNodeId);\n } catch {\n //\n }\n }\n\n let role = asRole(n);\n\n const domIsScrollable = encodedId\n ? opts.scrollableMap[encodedId] === true\n : false;\n const tag = encodedId ? opts.tagNameMap[encodedId] : undefined;\n const isHtmlElement = tag === \"html\";\n if ((domIsScrollable || isHtmlElement) && tag !== \"#document\") {\n const tagLabel = tag && tag.startsWith(\"#\") ? tag.slice(1) : tag;\n role = tagLabel\n ? `scrollable, ${tagLabel}`\n : `scrollable${role ? `, ${role}` : \"\"}`;\n }\n\n return {\n role,\n name: n.name?.value,\n description: n.description?.value,\n value: n.value?.value,\n nodeId: n.nodeId,\n backendDOMNodeId: n.backendDOMNodeId,\n parentId: n.parentId,\n childIds: n.childIds,\n encodedId,\n };\n });\n}\n\nexport async function buildHierarchicalTree(\n nodes: A11yNode[],\n opts: A11yOptions,\n): Promise<{ tree: A11yNode[] }> {\n const nodeMap = new Map<string, A11yNode>();\n\n for (const n of nodes) {\n const keep =\n !!(n.name && n.name.trim()) ||\n !!(n.childIds && n.childIds.length) ||\n !isStructural(n.role);\n if (!keep) continue;\n nodeMap.set(n.nodeId, { ...n });\n }\n\n for (const n of nodes) {\n if (!n.parentId) continue;\n const parent = nodeMap.get(n.parentId);\n const cur = nodeMap.get(n.nodeId);\n if (parent && cur) (parent.children ??= []).push(cur);\n }\n\n const roots = nodes\n .filter((n) => !n.parentId && nodeMap.has(n.nodeId))\n .map((n) => nodeMap.get(n.nodeId)!) as A11yNode[];\n\n const cleaned = (await Promise.all(roots.map(pruneStructuralSafe))).filter(\n Boolean,\n ) as A11yNode[];\n\n return { tree: cleaned };\n\n async function pruneStructuralSafe(node: A11yNode): Promise<A11yNode | null> {\n if (+node.nodeId < 0) return null;\n\n const children = node.children ?? [];\n if (!children.length) {\n return isStructural(node.role) ? null : node;\n }\n\n const cleanedKids = (\n await Promise.all(children.map(pruneStructuralSafe))\n ).filter(Boolean) as A11yNode[];\n\n const prunedStatic = removeRedundantStaticTextChildren(node, cleanedKids);\n\n if (isStructural(node.role)) {\n if (prunedStatic.length === 1) return prunedStatic[0]!;\n if (prunedStatic.length === 0) return null;\n }\n\n let newRole = node.role;\n if ((newRole === \"generic\" || newRole === \"none\") && node.encodedId) {\n const tagName = opts.tagNameMap[node.encodedId];\n if (tagName) newRole = tagName;\n }\n\n if (newRole === \"combobox\" && node.encodedId) {\n const tagName = opts.tagNameMap[node.encodedId];\n if (tagName === \"select\") newRole = \"select\";\n }\n\n return { ...node, role: newRole, children: prunedStatic };\n }\n}\n\nexport function isStructural(role: string): boolean {\n const r = role?.toLowerCase();\n return r === \"generic\" || r === \"none\" || r === \"inlinetextbox\";\n}\n\nexport function extractUrlFromAXNode(\n ax: Protocol.Accessibility.AXNode,\n): string | undefined {\n const props = ax.properties ?? [];\n const urlProp = props.find((p) => p.name === \"url\");\n const value = urlProp?.value?.value;\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nexport function removeRedundantStaticTextChildren(\n parent: A11yNode,\n children: A11yNode[],\n): A11yNode[] {\n if (!parent.name) return children;\n const parentNorm = normaliseSpaces(parent.name).trim();\n let combined = \"\";\n for (const c of children) {\n if (c.role === \"StaticText\" && c.name) {\n combined += normaliseSpaces(c.name).trim();\n }\n }\n if (combined === parentNorm) {\n return children.filter((c) => c.role !== \"StaticText\");\n }\n return children;\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport { StagehandDomProcessError } from \"../../../types/public/sdkErrors.js\";\nimport type { SessionDomIndex } from \"../../../types/private/snapshot.js\";\nimport {\n buildChildXPathSegments,\n joinXPath,\n normalizeXPath,\n} from \"./xpathUtils.js\";\n\n// starting from infinite depth (-1), exponentially shrink down to 1\nconst DOM_DEPTH_ATTEMPTS = [-1, 256, 128, 64, 32, 16, 8, 4, 2, 1];\nconst DESCRIBE_DEPTH_ATTEMPTS = [-1, 64, 32, 16, 8, 4, 2, 1];\n\n/** Identify CDP failures caused by deep DOM trees blowing the CBOR encoder stack. */\nfunction isCborStackError(message: string): boolean {\n return message.includes(\"CBOR: stack limit exceeded\");\n}\n\n/**\n * Determine if CDP truncated a node's children when streaming the DOM tree.\n * childNodeCount stays accurate even when `children` are omitted; we use this to\n * decide whether DOM.describeNode must be re-run for that node.\n */\nexport function shouldExpandNode(node: Protocol.DOM.Node): boolean {\n const declaredChildren = node.childNodeCount ?? 0;\n const realizedChildren = node.children?.length ?? 0;\n return declaredChildren > realizedChildren;\n}\n\n/** Merge an expanded DescribeNode payload back into the original shallow node. */\nexport function mergeDomNodes(\n target: Protocol.DOM.Node,\n source: Protocol.DOM.Node,\n): void {\n target.childNodeCount = source.childNodeCount ?? target.childNodeCount;\n target.children = source.children ?? target.children;\n target.shadowRoots = source.shadowRoots ?? target.shadowRoots;\n target.contentDocument = source.contentDocument ?? target.contentDocument;\n}\n\n/** Helper that returns every nested collection we recurse through uniformly. */\nexport function collectDomTraversalTargets(\n node: Protocol.DOM.Node,\n): Protocol.DOM.Node[] {\n const targets: Protocol.DOM.Node[] = [];\n if (node.children) targets.push(...node.children);\n if (node.shadowRoots) targets.push(...node.shadowRoots);\n if (node.contentDocument) targets.push(node.contentDocument);\n return targets;\n}\n\n/**\n * Rehydrate a truncated DOM tree by repeatedly calling DOM.describeNode with\n * decreasing depths. Any non-CBOR failure is surfaced as a StagehandDomProcessError.\n */\nexport async function hydrateDomTree(\n session: CDPSessionLike,\n root: Protocol.DOM.Node,\n pierce: boolean,\n): Promise<void> {\n const stack: Protocol.DOM.Node[] = [root];\n const expandedNodeIds = new Set<number>();\n const expandedBackendIds = new Set<number>();\n\n while (stack.length) {\n const node = stack.pop()!;\n const nodeId =\n typeof node.nodeId === \"number\" && node.nodeId > 0\n ? node.nodeId\n : undefined;\n const backendId =\n typeof node.backendNodeId === \"number\" && node.backendNodeId > 0\n ? node.backendNodeId\n : undefined;\n\n const seenByNode = nodeId ? expandedNodeIds.has(nodeId) : false;\n const seenByBackend =\n !nodeId && backendId ? expandedBackendIds.has(backendId) : false;\n if (seenByNode || seenByBackend) continue;\n if (nodeId) expandedNodeIds.add(nodeId);\n else if (backendId) expandedBackendIds.add(backendId);\n\n const needsExpansion = shouldExpandNode(node);\n if (needsExpansion && (nodeId || backendId)) {\n const describeParamsBase = nodeId\n ? { nodeId }\n : { backendNodeId: backendId! };\n let expanded = false;\n for (const depth of DESCRIBE_DEPTH_ATTEMPTS) {\n try {\n const described =\n await session.send<Protocol.DOM.DescribeNodeResponse>(\n \"DOM.describeNode\",\n {\n ...describeParamsBase,\n depth,\n pierce,\n },\n );\n mergeDomNodes(node, described.node);\n if (!nodeId && described.node.nodeId && described.node.nodeId > 0) {\n node.nodeId = described.node.nodeId;\n expandedNodeIds.add(described.node.nodeId);\n }\n expanded = true;\n break;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (isCborStackError(message)) {\n continue;\n }\n const identifier = nodeId ?? backendId ?? \"unknown\";\n throw new StagehandDomProcessError(\n `Failed to expand DOM node ${identifier}: ${String(err)}`,\n );\n }\n }\n if (!expanded) {\n const identifier = nodeId ?? backendId ?? \"unknown\";\n throw new StagehandDomProcessError(\n `Unable to expand DOM node ${identifier} after describeNode depth retries`,\n );\n }\n }\n\n for (const child of collectDomTraversalTargets(node)) {\n stack.push(child);\n }\n }\n}\n\n/**\n * Attempt DOM.getDocument with progressively shallower depths until CBOR stops\n * complaining. When a shallower snapshot is returned we hydrate the missing\n * branches so downstream DOM traversals see the full tree shape.\n */\nexport async function getDomTreeWithFallback(\n session: CDPSessionLike,\n pierce: boolean,\n): Promise<Protocol.DOM.Node> {\n let lastCborMessage = \"\";\n\n for (const depth of DOM_DEPTH_ATTEMPTS) {\n try {\n const { root } = await session.send<{ root: Protocol.DOM.Node }>(\n \"DOM.getDocument\",\n { depth, pierce },\n );\n\n if (depth !== -1) {\n await hydrateDomTree(session, root, pierce);\n }\n\n return root;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (isCborStackError(message)) {\n lastCborMessage = message;\n continue;\n }\n throw err;\n }\n }\n\n throw new StagehandDomProcessError(\n lastCborMessage\n ? `CDP DOM.getDocument failed after adaptive depth retries: ${lastCborMessage}`\n : \"CDP DOM.getDocument failed after adaptive depth retries.\",\n );\n}\n\n/**\n * Build tag name and XPath maps for a single frame session.\n * EncodedId is produced by a frame-aware encoder provided by the caller.\n */\nexport async function domMapsForSession(\n session: CDPSessionLike,\n frameId: string,\n pierce: boolean,\n encode: (fid: string, backendNodeId: number) => string,\n attemptOwnerLookup = true,\n): Promise<{\n tagNameMap: Record<string, string>;\n xpathMap: Record<string, string>;\n scrollableMap: Record<string, boolean>;\n}> {\n await session.send(\"DOM.enable\").catch(() => {});\n const root = await getDomTreeWithFallback(session, pierce);\n\n let startNode: Protocol.DOM.Node = root;\n if (attemptOwnerLookup) {\n try {\n const owner = await session.send<{ backendNodeId?: number }>(\n \"DOM.getFrameOwner\",\n { frameId },\n );\n const ownerBackendId = owner.backendNodeId;\n if (typeof ownerBackendId === \"number\") {\n const ownerEl = findNodeByBackendId(root, ownerBackendId);\n if (ownerEl?.contentDocument) {\n startNode = ownerEl.contentDocument;\n }\n }\n } catch {\n // OOPIF or race \u2192 keep startNode = root\n }\n }\n\n const tagNameMap: Record<string, string> = {};\n const xpathMap: Record<string, string> = {};\n const scrollableMap: Record<string, boolean> = {};\n\n type StackEntry = { node: Protocol.DOM.Node; xpath: string };\n const stack: StackEntry[] = [{ node: startNode, xpath: \"\" }];\n\n while (stack.length) {\n const { node, xpath } = stack.pop()!;\n\n if (node.backendNodeId) {\n const encId = encode(frameId, node.backendNodeId);\n tagNameMap[encId] = String(node.nodeName).toLowerCase();\n xpathMap[encId] = xpath || \"/\";\n const isScrollable = node?.isScrollable === true;\n if (isScrollable) scrollableMap[encId] = true;\n }\n\n const kids = node.children ?? [];\n if (kids.length) {\n const segs = buildChildXPathSegments(kids);\n for (let i = kids.length - 1; i >= 0; i--) {\n const child = kids[i]!;\n const step = segs[i]!;\n stack.push({\n node: child,\n xpath: joinXPath(xpath, step),\n });\n }\n }\n\n for (const sr of node.shadowRoots ?? []) {\n stack.push({\n node: sr,\n xpath: joinXPath(xpath, \"//\"),\n });\n }\n }\n\n return { tagNameMap, xpathMap, scrollableMap };\n}\n\n/**\n * Build an index of absolute XPath/tag metadata for an entire CDP session.\n * Once the index is cached, per-frame slices are derived without extra DOM\n * calls, which keeps snapshot capture linear in the number of frames.\n */\nexport async function buildSessionDomIndex(\n session: CDPSessionLike,\n pierce: boolean,\n): Promise<SessionDomIndex> {\n await session.send(\"DOM.enable\").catch(() => {});\n const root = await getDomTreeWithFallback(session, pierce);\n\n const absByBe = new Map<number, string>();\n const tagByBe = new Map<number, string>();\n const scrollByBe = new Map<number, boolean>();\n const docRootOf = new Map<number, number>();\n const contentDocRootByIframe = new Map<number, number>();\n\n type Entry = { node: Protocol.DOM.Node; xp: string; docRootBe: number };\n const rootBe = root.backendNodeId!;\n const stack: Entry[] = [{ node: root, xp: \"/\", docRootBe: rootBe }];\n\n while (stack.length) {\n const { node, xp, docRootBe } = stack.pop()!;\n if (node.backendNodeId) {\n absByBe.set(node.backendNodeId, xp || \"/\");\n tagByBe.set(node.backendNodeId, String(node.nodeName).toLowerCase());\n if (node?.isScrollable === true) scrollByBe.set(node.backendNodeId, true);\n docRootOf.set(node.backendNodeId, docRootBe);\n }\n\n const kids = node.children ?? [];\n if (kids.length) {\n const segs = buildChildXPathSegments(kids);\n for (let i = kids.length - 1; i >= 0; i--) {\n const child = kids[i]!;\n const step = segs[i]!;\n stack.push({ node: child, xp: joinXPath(xp, step), docRootBe });\n }\n }\n\n for (const sr of node.shadowRoots ?? []) {\n stack.push({ node: sr, xp: joinXPath(xp, \"//\"), docRootBe });\n }\n\n const cd = node.contentDocument as Protocol.DOM.Node | undefined;\n if (cd && typeof cd.backendNodeId === \"number\") {\n contentDocRootByIframe.set(node.backendNodeId!, cd.backendNodeId);\n stack.push({ node: cd, xp, docRootBe: cd.backendNodeId });\n }\n }\n\n return {\n rootBackend: rootBe,\n absByBe,\n tagByBe,\n scrollByBe,\n docRootOf,\n contentDocRootByIframe,\n };\n}\n\n/**\n * Relativize an absolute XPath against a document root's absolute path.\n * When the node lives outside the document we return the absolute path as-is.\n */\nexport function relativizeXPath(baseAbs: string, nodeAbs: string): string {\n const base = normalizeXPath(baseAbs);\n const abs = normalizeXPath(nodeAbs);\n if (abs === base) return \"/\";\n if (abs.startsWith(base)) {\n const tail = abs.slice(base.length);\n if (!tail) return \"/\";\n return tail.startsWith(\"/\") || tail.startsWith(\"//\") ? tail : `/${tail}`;\n }\n if (base === \"/\") return abs;\n return abs;\n}\n\n/** Find a node by backendNodeId inside a DOM.getDocument tree. */\nexport function findNodeByBackendId(\n root: Protocol.DOM.Node,\n backendNodeId: number,\n): Protocol.DOM.Node | undefined {\n const stack: Protocol.DOM.Node[] = [root];\n while (stack.length) {\n const n = stack.pop()!;\n if (n.backendNodeId === backendNodeId) return n;\n if (n.children) for (const c of n.children) stack.push(c);\n if (n.shadowRoots) for (const s of n.shadowRoots) stack.push(s);\n }\n return undefined;\n}\n", "import type { CDPSessionLike } from \"../../cdp.js\";\nimport { Page } from \"../../page.js\";\nimport type { FrameParentIndex } from \"../../../types/private/snapshot.js\";\n\n/**\n * Session helpers ensure DOM lookups are always executed against the session\n * that actually owns a frame. Keeping this logic centralized prevents subtle\n * bugs when OOPIF adoption changes session ownership mid-capture.\n */\n\n/** Return the owning session for a frame as registered on the Page. */\nexport function ownerSession(page: Page, frameId: string): CDPSessionLike {\n return page.getSessionForFrame(frameId);\n}\n\n/**\n * DOM.getFrameOwner must be called against the parent frame's session.\n * This helper hides the lookup (including main-frame fallback) so callers\n * always reach for the correct connection.\n */\nexport function parentSession(\n page: Page,\n parentByFrame: FrameParentIndex,\n frameId: string,\n): CDPSessionLike {\n const parentId = parentByFrame.get(frameId) ?? null;\n if (!parentId) {\n return page.getSessionForFrame(frameId);\n }\n return page.getSessionForFrame(parentId);\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport { Page } from \"../../page.js\";\nimport { v3Logger } from \"../../../logger.js\";\nimport type {\n FrameContext,\n FrameDomMaps,\n FrameParentIndex,\n HybridSnapshot,\n SnapshotOptions,\n SessionDomIndex,\n} from \"../../../types/private/index.js\";\nimport { a11yForFrame } from \"./a11yTree.js\";\nimport {\n resolveCssFocusFrameAndTail,\n resolveFocusFrameAndTail,\n} from \"./focusSelectors.js\";\nimport {\n buildSessionDomIndex,\n domMapsForSession,\n relativizeXPath,\n} from \"./domTree.js\";\nimport { injectSubtrees } from \"./treeFormatUtils.js\";\nimport { ownerSession, parentSession } from \"./sessions.js\";\nimport { normalizeXPath, prefixXPath } from \"./xpathUtils.js\";\n\n/**\n * Capture a hybrid DOM + Accessibility snapshot for the provided page.\n *\n * Flow overview:\n * 1. (Optional) Scope directly to a requested selector. We walk iframe hops to\n * find the owning frame, build just that frame\u2019s DOM + AX tree, and bail out\n * early when the subtree satisfies the caller.\n * 2. Build DOM indexes for every unique CDP session. DOM.getDocument is called\n * once per session and hydrated so per-frame slices can share the result.\n * 3. Slice each frame\u2019s DOM data from its session index and fetch its AX tree.\n * This yields relative XPath/tag/url maps for the document rooted at that frame.\n * 4. Walk the frame tree to compute absolute iframe prefixes. Every child frame\n * needs the XPath of the iframe element that hosts it so we can prefix maps.\n * 5. Merge all per-frame results into global combined maps and stitch the text\n * outline. The final payload mirrors the legacy shape but is built in layers.\n *\n * Each numbered block below references the step above for easier debugging.\n */\nexport async function captureHybridSnapshot(\n page: Page,\n options?: SnapshotOptions,\n): Promise<HybridSnapshot> {\n const pierce = options?.pierceShadow ?? true;\n const includeIframes = options?.includeIframes !== false;\n\n const context = buildFrameContext(page);\n\n const scopedSnapshot = await tryScopedSnapshot(\n page,\n options,\n context,\n pierce,\n );\n if (scopedSnapshot) return scopedSnapshot;\n\n const framesInScope = includeIframes ? [...context.frames] : [context.rootId];\n if (!framesInScope.includes(context.rootId)) {\n framesInScope.unshift(context.rootId);\n }\n\n const sessionToIndex = await buildSessionIndexes(page, framesInScope, pierce);\n const { perFrameMaps, perFrameOutlines } = await collectPerFrameMaps(\n page,\n context,\n sessionToIndex,\n options,\n pierce,\n framesInScope,\n );\n const { absPrefix, iframeHostEncByChild } = await computeFramePrefixes(\n page,\n context,\n perFrameMaps,\n framesInScope,\n );\n\n return mergeFramesIntoSnapshot(\n context,\n perFrameMaps,\n perFrameOutlines,\n absPrefix,\n iframeHostEncByChild,\n framesInScope,\n );\n}\n\n/**\n * Snapshot the current frame tree so downstream helpers have consistent topology\n * without re-querying CDP. The map is intentionally shallow (frameId \u2192 parentId)\n * so it is serializable/testable without holding on to CDP handles.\n */\nexport function buildFrameContext(page: Page): FrameContext {\n const rootId = page.mainFrameId();\n const frameTree = page.asProtocolFrameTree(rootId);\n const parentByFrame: FrameParentIndex = new Map();\n (function index(n: Protocol.Page.FrameTree, parent: string | null) {\n parentByFrame.set(n.frame.id, parent);\n for (const c of n.childFrames ?? []) index(c, n.frame.id);\n })(frameTree, null);\n const frames = page.listAllFrameIds();\n return { rootId, parentByFrame, frames };\n}\n\n/**\n * Step 1 \u2013 scoped snapshot fast-path. If a selector is provided we try to:\n * 1) Resolve the selector (XPath or CSS) across iframes.\n * 2) Build DOM + AX data only for the owning frame.\n * 3) Bail out early when the selector's subtree satisfies the request.\n *\n * Returns `null` when scoping fails (e.g., selector miss) so the caller can\n * fall back to the full multi-frame snapshot.\n */\nexport async function tryScopedSnapshot(\n page: Page,\n options: SnapshotOptions | undefined,\n context: FrameContext,\n pierce: boolean,\n): Promise<HybridSnapshot | null> {\n const requestedFocus = options?.focusSelector?.trim();\n if (!requestedFocus) return null;\n\n const logScopeFallback = () => {\n v3Logger({\n message: `Unable to narrow scope with selector. Falling back to using full DOM`,\n level: 1,\n auxiliary: {\n arguments: {\n value: `selector: ${options?.focusSelector?.trim()}`,\n type: \"string\",\n },\n },\n });\n };\n\n try {\n let targetFrameId: string;\n let tailSelector: string | undefined;\n let absPrefix: string | undefined;\n\n const looksLikeXPath =\n /^xpath=/i.test(requestedFocus) || requestedFocus.startsWith(\"/\");\n if (looksLikeXPath) {\n const focus = normalizeXPath(requestedFocus);\n const hit = await resolveFocusFrameAndTail(\n page,\n focus,\n context.parentByFrame,\n context.rootId,\n );\n targetFrameId = hit.targetFrameId;\n tailSelector = hit.tailXPath || undefined;\n absPrefix = hit.absPrefix;\n } else {\n const cssHit = await resolveCssFocusFrameAndTail(\n page,\n requestedFocus,\n context.parentByFrame,\n context.rootId,\n );\n targetFrameId = cssHit.targetFrameId;\n tailSelector = cssHit.tailSelector || undefined;\n absPrefix = cssHit.absPrefix;\n }\n\n const owningSess = ownerSession(page, targetFrameId);\n const parentId = context.parentByFrame.get(targetFrameId);\n const sameSessionAsParent =\n !!parentId &&\n ownerSession(page, parentId) === ownerSession(page, targetFrameId);\n const { tagNameMap, xpathMap, scrollableMap } = await domMapsForSession(\n owningSess,\n targetFrameId,\n pierce,\n (fid, be) => `${page.getOrdinal(fid)}-${be}`,\n sameSessionAsParent,\n );\n\n const { outline, urlMap, scopeApplied } = await a11yForFrame(\n owningSess,\n targetFrameId,\n {\n focusSelector: tailSelector || undefined,\n tagNameMap,\n experimental: options?.experimental ?? false,\n scrollableMap,\n encode: (backendNodeId) =>\n `${page.getOrdinal(targetFrameId)}-${backendNodeId}`,\n },\n );\n\n const scopedXpathMap: Record<string, string> = {};\n const abs = absPrefix ?? \"\";\n const isRoot = !abs || abs === \"/\";\n if (isRoot) {\n Object.assign(scopedXpathMap, xpathMap);\n } else {\n // Prefix relative XPaths so the scoped result matches the global encoding.\n for (const [encId, xp] of Object.entries(xpathMap)) {\n scopedXpathMap[encId] = prefixXPath(abs, xp);\n }\n }\n\n const scopedUrlMap: Record<string, string> = { ...urlMap };\n\n const snapshot: HybridSnapshot = {\n combinedTree: outline,\n combinedXpathMap: scopedXpathMap,\n combinedUrlMap: scopedUrlMap,\n perFrame: [\n {\n frameId: targetFrameId,\n outline,\n xpathMap,\n urlMap,\n },\n ],\n };\n\n if (scopeApplied) {\n return snapshot;\n }\n\n logScopeFallback();\n } catch {\n logScopeFallback();\n }\n return null;\n}\n\n/**\n * Step 2 \u2013 call DOM.getDocument once per unique CDP session and hydrate the\n * result so per-frame slices can share the structure. We key by session id\n * because same process iframes live inside the same session.\n */\nexport async function buildSessionIndexes(\n page: Page,\n frames: string[],\n pierce: boolean,\n): Promise<Map<string, SessionDomIndex>> {\n const sessionToIndex = new Map<string, SessionDomIndex>();\n const sessionById = new Map<string, CDPSessionLike>();\n for (const frameId of frames) {\n const sess = ownerSession(page, frameId);\n const sid = sess.id ?? \"root\";\n if (!sessionById.has(sid)) sessionById.set(sid, sess);\n }\n for (const [sid, sess] of sessionById.entries()) {\n const idx = await buildSessionDomIndex(sess, pierce);\n sessionToIndex.set(sid, idx);\n }\n return sessionToIndex;\n}\n\n/**\n * Step 3 \u2013 derive per-frame DOM maps and accessibility outlines.\n * Each frame:\n * - slices the shared session index down to its document root\n * - builds frame-aware encoded ids (ordinal-backendNodeId)\n * - collects tag/xpath/scrollability maps for DOM-based lookups\n * - fetches its AX tree to produce outlines and URL maps\n */\nexport async function collectPerFrameMaps(\n page: Page,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n options: SnapshotOptions | undefined,\n pierce: boolean,\n frameIds: string[],\n): Promise<{\n perFrameMaps: Map<string, FrameDomMaps>;\n perFrameOutlines: Array<{ frameId: string; outline: string }>;\n}> {\n const perFrameMaps = new Map<string, FrameDomMaps>();\n const perFrameOutlines: Array<{ frameId: string; outline: string }> = [];\n\n for (const frameId of frameIds) {\n const sess = ownerSession(page, frameId);\n const sid = sess.id ?? \"root\";\n let idx = sessionToIndex.get(sid);\n if (!idx) {\n idx = await buildSessionDomIndex(sess, pierce);\n sessionToIndex.set(sid, idx);\n }\n\n const parentId = context.parentByFrame.get(frameId);\n const sameSessionAsParent =\n !!parentId && ownerSession(page, parentId) === sess;\n let docRootBe = idx.rootBackend;\n if (sameSessionAsParent) {\n try {\n const { backendNodeId } = await sess.send<{ backendNodeId?: number }>(\n \"DOM.getFrameOwner\",\n { frameId },\n );\n if (typeof backendNodeId === \"number\") {\n const cdBe = idx.contentDocRootByIframe.get(backendNodeId);\n if (typeof cdBe === \"number\") docRootBe = cdBe;\n }\n } catch {\n //\n }\n }\n\n const tagNameMap: Record<string, string> = {};\n const xpathMap: Record<string, string> = {};\n const scrollableMap: Record<string, boolean> = {};\n const enc = (be: number) => `${page.getOrdinal(frameId)}-${be}`;\n const baseAbs = idx.absByBe.get(docRootBe) ?? \"/\";\n\n for (const [be, nodeAbs] of idx.absByBe.entries()) {\n const nodeDocRoot = idx.docRootOf.get(be);\n if (nodeDocRoot !== docRootBe) continue;\n\n // Translate absolute XPaths into document-relative ones for this frame.\n const rel = relativizeXPath(baseAbs, nodeAbs);\n const key = enc(be);\n xpathMap[key] = rel;\n const tag = idx.tagByBe.get(be);\n if (tag) tagNameMap[key] = tag;\n if (idx.scrollByBe.get(be)) scrollableMap[key] = true;\n }\n\n const { outline, urlMap } = await a11yForFrame(sess, frameId, {\n experimental: options?.experimental ?? false,\n tagNameMap,\n scrollableMap,\n encode: (backendNodeId) => `${page.getOrdinal(frameId)}-${backendNodeId}`,\n });\n\n perFrameOutlines.push({ frameId, outline });\n perFrameMaps.set(frameId, { tagNameMap, xpathMap, scrollableMap, urlMap });\n }\n\n return { perFrameMaps, perFrameOutlines };\n}\n\n/**\n * Step 4 \u2013 walk the frame tree (parent-first) to compute absolute prefixes for\n * every frame. The prefix is the absolute XPath of the iframe element hosting\n * the frame, so we can later convert relative XPaths into cross-frame ones.\n */\nexport async function computeFramePrefixes(\n page: Page,\n context: FrameContext,\n perFrameMaps: Map<string, FrameDomMaps>,\n frameIds: string[],\n): Promise<{\n absPrefix: Map<string, string>;\n iframeHostEncByChild: Map<string, string>;\n}> {\n const absPrefix = new Map<string, string>();\n const iframeHostEncByChild = new Map<string, string>();\n absPrefix.set(context.rootId, \"\");\n const included = new Set(frameIds);\n\n const queue: string[] = [];\n if (included.has(context.rootId)) {\n queue.push(context.rootId);\n }\n\n while (queue.length) {\n const parent = queue.shift()!;\n const parentAbs = absPrefix.get(parent)!;\n\n for (const child of context.frames) {\n if (!included.has(child)) continue;\n if (context.parentByFrame.get(child) !== parent) continue;\n queue.push(child);\n\n const parentSess = parentSession(page, context.parentByFrame, child);\n\n const ownerBackendNodeId = await (async () => {\n try {\n const { backendNodeId } = await parentSess.send<{\n backendNodeId?: number;\n }>(\"DOM.getFrameOwner\", { frameId: child });\n return backendNodeId;\n } catch {\n return undefined;\n }\n })();\n\n if (!ownerBackendNodeId) {\n // OOPIFs resolved via a different session inherit the parent prefix.\n absPrefix.set(child, parentAbs);\n continue;\n }\n\n const parentDom = perFrameMaps.get(parent);\n const iframeEnc = `${page.getOrdinal(parent)}-${ownerBackendNodeId}`;\n const iframeXPath = parentDom?.xpathMap[iframeEnc];\n\n const childAbs = iframeXPath\n ? prefixXPath(parentAbs || \"/\", iframeXPath)\n : parentAbs;\n\n absPrefix.set(child, childAbs);\n iframeHostEncByChild.set(child, iframeEnc);\n }\n }\n\n return { absPrefix, iframeHostEncByChild };\n}\n\n/**\n * Step 5 \u2013 merge per-frame maps into the combined snapshot payload. We prefix\n * each frame's relative XPaths with the absolute path collected in step 4,\n * merge URL maps, and stitch text outlines by nesting child trees under the\n * encoded id of their parent iframe host.\n */\nexport function mergeFramesIntoSnapshot(\n context: FrameContext,\n perFrameMaps: Map<string, FrameDomMaps>,\n perFrameOutlines: Array<{ frameId: string; outline: string }>,\n absPrefix: Map<string, string>,\n iframeHostEncByChild: Map<string, string>,\n frameIds: string[],\n): HybridSnapshot {\n const combinedXpathMap: Record<string, string> = {};\n const combinedUrlMap: Record<string, string> = {};\n\n for (const frameId of frameIds) {\n const maps = perFrameMaps.get(frameId);\n if (!maps) continue;\n\n const abs = absPrefix.get(frameId) ?? \"\";\n const isRoot = abs === \"\" || abs === \"/\";\n\n if (isRoot) {\n Object.assign(combinedXpathMap, maps.xpathMap);\n Object.assign(combinedUrlMap, maps.urlMap);\n continue;\n }\n\n for (const [encId, xp] of Object.entries(maps.xpathMap)) {\n combinedXpathMap[encId] = prefixXPath(abs, xp);\n }\n Object.assign(combinedUrlMap, maps.urlMap);\n }\n\n const idToTree = new Map<string, string>();\n for (const { frameId, outline } of perFrameOutlines) {\n const parentEnc = iframeHostEncByChild.get(frameId);\n // The key is the parent iframe's encoded id so injectSubtrees can nest lines.\n if (parentEnc) idToTree.set(parentEnc, outline);\n }\n\n const rootOutline =\n perFrameOutlines.find((o) => o.frameId === context.rootId)?.outline ??\n perFrameOutlines[0]?.outline ??\n \"\";\n const combinedTree = injectSubtrees(rootOutline, idToTree);\n\n return {\n combinedTree,\n combinedXpathMap,\n combinedUrlMap,\n perFrame: perFrameOutlines.map(({ frameId, outline }) => {\n const maps = perFrameMaps.get(frameId);\n return {\n frameId,\n outline,\n xpathMap: maps?.xpathMap ?? {},\n urlMap: maps?.urlMap ?? {},\n };\n }),\n };\n}\n", "import {\n a11yScriptBootstrap,\n a11yScriptGlobalRefs,\n type A11yScriptName,\n} from \"../dom/build/a11yScripts.generated.js\";\n\n/**\n * Wrap a generated a11y script in a self-invoking expression that first ensures\n * the bootstrap has run, then calls the requested helper via its global ref.\n * This mirrors the locator resolver\u2019s injection path so any CDP Runtime.evaluate\n * can reuse the shared bundle without inlining JS strings.\n */\nexport function buildA11yInvocation(\n name: A11yScriptName,\n args: string[],\n): string {\n const invocation = `${a11yScriptGlobalRefs[name]}(${args.join(\", \")})`;\n return `(() => { ${a11yScriptBootstrap}; return ${invocation}; })()`;\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport { Page } from \"../../page.js\";\nimport { executionContexts } from \"../../executionContextRegistry.js\";\nimport { buildA11yInvocation } from \"../../a11yInvocation.js\";\nimport { a11yScriptSources } from \"../../../dom/build/a11yScripts.generated.js\";\nimport {\n absoluteXPathForBackendNode,\n normalizeXPath,\n prefixXPath,\n} from \"./xpathUtils.js\";\n\n/**\n * Compute the absolute XPath for the currently focused element.\n * - Detects which frame has focus via document.hasFocus().\n * - Finds the deepest activeElement (dives into shadow DOM).\n * - Builds an absolute, cross-frame XPath by prefixing iframe hosts.\n */\nexport async function computeActiveElementXpath(\n page: Page,\n): Promise<string | null> {\n const tree = page.getFullFrameTree();\n const parentByFrame = new Map<string, string | null>();\n (function index(n: Protocol.Page.FrameTree, parent: string | null) {\n parentByFrame.set(n.frame.id, parent);\n for (const c of n.childFrames ?? []) index(c, n.frame.id);\n })(tree, null);\n\n const frames = page.listAllFrameIds();\n let focusedFrameId: string | null = null;\n for (const fid of frames) {\n const sess = page.getSessionForFrame(fid);\n try {\n await sess.send(\"Runtime.enable\").catch(() => {});\n const ctxId = await executionContexts\n .waitForMainWorld(sess, fid, 1000)\n .catch(() => {});\n const hasFocusExpr = buildA11yInvocation(\"documentHasFocusStrict\", []);\n const evalParams = ctxId\n ? {\n contextId: ctxId,\n expression: hasFocusExpr,\n returnByValue: true,\n }\n : { expression: hasFocusExpr, returnByValue: true };\n const { result } = await sess.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n evalParams,\n );\n if (result?.value === true) {\n focusedFrameId = fid;\n break;\n }\n } catch {\n //\n }\n }\n if (!focusedFrameId) focusedFrameId = page.mainFrameId();\n const focusedSession = page.getSessionForFrame(focusedFrameId);\n\n let objectId: string | undefined;\n try {\n await focusedSession.send(\"Runtime.enable\").catch(() => {});\n const ctxId = await executionContexts\n .waitForMainWorld(focusedSession, focusedFrameId, 1000)\n .catch(() => {});\n const activeExpr = buildA11yInvocation(\"resolveDeepActiveElement\", []);\n const evalParams = ctxId\n ? {\n contextId: ctxId,\n expression: activeExpr,\n returnByValue: false,\n }\n : { expression: activeExpr, returnByValue: false };\n const { result } =\n await focusedSession.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n evalParams,\n );\n objectId = result?.objectId as string | undefined;\n } catch {\n objectId = undefined;\n }\n if (!objectId) return null;\n\n const leafXPath = await (async () => {\n try {\n const { result } = await focusedSession.send<{\n result: { value?: string };\n }>(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: a11yScriptSources.nodeToAbsoluteXPath,\n returnByValue: true,\n });\n try {\n await focusedSession.send(\"Runtime.releaseObject\", { objectId });\n } catch {\n //\n }\n const xp = result?.value || \"\";\n return typeof xp === \"string\" && xp ? xp : null;\n } catch {\n try {\n await focusedSession.send(\"Runtime.releaseObject\", { objectId });\n } catch {\n //\n }\n return null;\n }\n })();\n\n if (!leafXPath) return null;\n\n let prefix = \"\";\n let cur: string | null | undefined = focusedFrameId;\n while (cur) {\n const parent = parentByFrame.get(cur) ?? null;\n if (!parent) break;\n const parentSess = page.getSessionForFrame(parent);\n try {\n const { backendNodeId } = await parentSess.send<{\n backendNodeId?: number;\n }>(\"DOM.getFrameOwner\", { frameId: cur });\n if (typeof backendNodeId === \"number\") {\n const xp = await absoluteXPathForBackendNode(parentSess, backendNodeId);\n if (xp) prefix = prefix ? prefixXPath(prefix, xp) : normalizeXPath(xp);\n }\n } catch {\n //\n }\n cur = parent;\n }\n\n return prefix ? prefixXPath(prefix, leafXPath) : normalizeXPath(leafXPath);\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport { Page } from \"../../page.js\";\nimport { executionContexts } from \"../../executionContextRegistry.js\";\nimport { a11yScriptSources } from \"../../../dom/build/a11yScripts.generated.js\";\nimport { buildA11yInvocation } from \"../../a11yInvocation.js\";\nimport type { ResolvedLocation } from \"../../../types/private/snapshot.js\";\nimport { listChildrenOf } from \"./focusSelectors.js\";\nimport { buildAbsoluteXPathFromChain } from \"./xpathUtils.js\";\n\n/**\n * Resolve deepest node for a page coordinate and compute its absolute XPath across frames.\n * More efficient than building a full hybrid snapshot when only a single node\u2019s XPath is needed.\n */\nexport async function resolveXpathForLocation(\n page: Page,\n x: number,\n y: number,\n): Promise<ResolvedLocation | null> {\n const tree = page.getFullFrameTree();\n const parentByFrame = new Map<string, string | null>();\n (function index(n: Protocol.Page.FrameTree, parent: string | null) {\n parentByFrame.set(n.frame.id, parent);\n for (const c of n.childFrames ?? []) index(c, n.frame.id);\n })(tree, null);\n\n const iframeChain: Array<{\n parentSession: CDPSessionLike;\n iframeBackendNodeId: number;\n }> = [];\n\n let curFrameId = page.mainFrameId();\n let curSession = page.getSessionForFrame(curFrameId);\n let curX = x;\n let curY = y;\n\n for (let depth = 0; depth < 8; depth++) {\n try {\n await curSession.send(\"DOM.enable\").catch(() => {});\n\n let sx = 0;\n let sy = 0;\n try {\n await curSession.send(\"Runtime.enable\").catch(() => {});\n const ctxId = await executionContexts\n .waitForMainWorld(curSession, curFrameId)\n .catch(() => {});\n const scrollExpr = buildA11yInvocation(\"getScrollOffsets\", []);\n const evalParams = ctxId\n ? {\n contextId: ctxId,\n expression: scrollExpr,\n returnByValue: true,\n }\n : { expression: scrollExpr, returnByValue: true };\n const { result } = await curSession.send<{\n result: { value?: { sx?: number; sy?: number } };\n }>(\"Runtime.evaluate\", evalParams);\n sx = Number(result?.value?.sx ?? 0);\n sy = Number(result?.value?.sy ?? 0);\n } catch {\n //\n }\n const xi = Math.max(0, Math.floor(curX + sx));\n const yi = Math.max(0, Math.floor(curY + sy));\n\n let res: { backendNodeId?: number; frameId?: string } | undefined;\n try {\n res = await curSession.send<{\n backendNodeId?: number;\n frameId?: string;\n }>(\"DOM.getNodeForLocation\", {\n x: xi,\n y: yi,\n includeUserAgentShadowDOM: false,\n ignorePointerEventsNone: false,\n });\n } catch {\n return null;\n }\n\n const be = res?.backendNodeId;\n const reportedFrameId = res?.frameId;\n if (\n typeof be === \"number\" &&\n reportedFrameId &&\n reportedFrameId !== curFrameId\n ) {\n const abs = await buildAbsoluteXPathFromChain(\n iframeChain,\n curSession,\n be,\n );\n return abs\n ? { frameId: reportedFrameId, backendNodeId: be, absoluteXPath: abs }\n : null;\n }\n\n if (typeof be !== \"number\") return null;\n\n let matchedChild: string | undefined;\n for (const fid of listChildrenOf(parentByFrame, curFrameId)) {\n try {\n const { backendNodeId } = await curSession.send<{\n backendNodeId?: number;\n }>(\"DOM.getFrameOwner\", { frameId: fid });\n if (backendNodeId === be) {\n matchedChild = fid;\n break;\n }\n } catch {\n continue;\n }\n }\n\n if (!matchedChild) {\n const abs = await buildAbsoluteXPathFromChain(\n iframeChain,\n curSession,\n be,\n );\n return abs\n ? { frameId: curFrameId, backendNodeId: be, absoluteXPath: abs }\n : null;\n }\n\n iframeChain.push({\n parentSession: curSession,\n iframeBackendNodeId: be,\n });\n\n let left = 0;\n let top = 0;\n try {\n const { object } = await curSession.send<{\n object: { objectId?: string };\n }>(\"DOM.resolveNode\", { backendNodeId: be });\n const objectId = object?.objectId;\n if (objectId) {\n const { result } = await curSession.send<{\n result: { value?: { left: number; top: number } };\n }>(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: a11yScriptSources.getBoundingRectLite,\n returnByValue: true,\n });\n left = Number(result?.value?.left ?? 0);\n top = Number(result?.value?.top ?? 0);\n await curSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n } catch {\n //\n }\n curX = Math.max(0, curX - left);\n curY = Math.max(0, curY - top);\n curFrameId = matchedChild;\n curSession = page.getSessionForFrame(curFrameId);\n } catch {\n return null;\n }\n }\n return null;\n}\n", "export { captureHybridSnapshot } from \"./capture.js\";\nexport { computeActiveElementXpath } from \"./activeElement.js\";\nexport { diffCombinedTrees } from \"./treeFormatUtils.js\";\nexport { resolveXpathForLocation } from \"./coordinateResolver.js\";\n", "import type { Protocol } from \"devtools-protocol\";\nimport {\n locatorScriptBootstrap,\n locatorScriptGlobalRefs,\n type LocatorScriptName,\n} from \"../dom/build/locatorScripts.generated.js\";\nimport { v3Logger } from \"../logger.js\";\nimport type { Frame } from \"./frame.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\n\nexport type SelectorQuery =\n | { kind: \"css\"; value: string }\n | { kind: \"text\"; value: string }\n | { kind: \"xpath\"; value: string };\n\nexport interface ResolvedNode {\n objectId: Protocol.Runtime.RemoteObjectId;\n nodeId: Protocol.DOM.NodeId | null;\n}\n\nexport interface ResolveManyOptions {\n limit?: number;\n}\n\nexport class FrameSelectorResolver {\n constructor(private readonly frame: Frame) {}\n\n public static parseSelector(raw: string): SelectorQuery {\n const trimmed = raw.trim();\n\n const isText = /^text=/i.test(trimmed);\n const looksLikeXPath =\n /^xpath=/i.test(trimmed) ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"(\");\n const isCssPrefixed = /^css=/i.test(trimmed);\n\n if (isText) {\n let value = trimmed.replace(/^text=/i, \"\").trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return { kind: \"text\", value };\n }\n\n if (looksLikeXPath) {\n const value = trimmed.replace(/^xpath=/i, \"\");\n return { kind: \"xpath\", value };\n }\n\n let selector = isCssPrefixed ? trimmed.replace(/^css=/i, \"\") : trimmed;\n if (selector.includes(\">>\")) {\n selector = selector\n .split(\">>\")\n .map((piece) => piece.trim())\n .filter(Boolean)\n .join(\" \");\n }\n\n return { kind: \"css\", value: selector };\n }\n\n public async resolveFirst(\n query: SelectorQuery,\n ): Promise<ResolvedNode | null> {\n return this.resolveAtIndex(query, 0);\n }\n\n public async resolveAll(\n query: SelectorQuery,\n { limit = Infinity }: ResolveManyOptions = {},\n ): Promise<ResolvedNode[]> {\n if (limit <= 0) return [];\n switch (query.kind) {\n case \"css\":\n return this.resolveCss(query.value, limit);\n case \"text\":\n return this.resolveText(query.value, limit);\n case \"xpath\":\n return this.resolveXPath(query.value, limit);\n default:\n return [];\n }\n }\n\n public async count(query: SelectorQuery): Promise<number> {\n switch (query.kind) {\n case \"css\":\n return this.countCss(query.value);\n case \"text\":\n return this.countText(query.value);\n case \"xpath\":\n return this.countXPath(query.value);\n default:\n return 0;\n }\n }\n\n public async resolveAtIndex(\n query: SelectorQuery,\n index: number,\n ): Promise<ResolvedNode | null> {\n if (index < 0 || !Number.isFinite(index)) return null;\n const results = await this.resolveAll(query, { limit: index + 1 });\n return results[index] ?? null;\n }\n\n private buildLocatorInvocation(\n name: LocatorScriptName,\n args: string[],\n ): string {\n const call = `${locatorScriptGlobalRefs[name]}(${args.join(\", \")})`;\n return `(() => { ${locatorScriptBootstrap}; return ${call}; })()`;\n }\n\n private async resolveCss(\n selector: string,\n limit: number,\n ): Promise<ResolvedNode[]> {\n if (limit <= 0) return [];\n\n const session = this.frame.session;\n const { executionContextId } = await session.send<{\n executionContextId: Protocol.Runtime.ExecutionContextId;\n }>(\"Page.createIsolatedWorld\", {\n frameId: this.frame.frameId,\n worldName: \"v3-world\",\n });\n\n const ctxId = await executionContexts.waitForMainWorld(\n session,\n this.frame.frameId,\n 1000,\n );\n\n const results: ResolvedNode[] = [];\n let loggedFallback = false;\n\n for (let index = 0; index < limit; index += 1) {\n const primaryExpr = this.buildLocatorInvocation(\"resolveCssSelector\", [\n JSON.stringify(selector),\n String(index),\n ]);\n const primary = await this.evaluateElement(\n primaryExpr,\n executionContextId,\n );\n if (primary) {\n results.push(primary);\n continue;\n }\n\n if (!loggedFallback) {\n v3Logger({\n category: \"locator\",\n message: \"css pierce-fallback\",\n level: 2,\n auxiliary: {\n frameId: { value: String(this.frame.frameId), type: \"string\" },\n selector: { value: selector, type: \"string\" },\n },\n });\n loggedFallback = true;\n }\n\n const fallbackExpr = this.buildLocatorInvocation(\n \"resolveCssSelectorPierce\",\n [JSON.stringify(selector), String(index)],\n );\n const fallback = await this.evaluateElement(fallbackExpr, ctxId);\n if (fallback) {\n results.push(fallback);\n continue;\n }\n\n break;\n }\n\n return results;\n }\n\n private async resolveText(\n value: string,\n limit: number,\n ): Promise<ResolvedNode[]> {\n if (limit <= 0) return [];\n\n const session = this.frame.session;\n const ctxId = await executionContexts.waitForMainWorld(\n session,\n this.frame.frameId,\n 1000,\n );\n\n const results: ResolvedNode[] = [];\n for (let index = 0; index < limit; index += 1) {\n const expr = this.buildLocatorInvocation(\"resolveTextSelector\", [\n JSON.stringify(value),\n String(index),\n ]);\n const resolved = await this.evaluateElement(expr, ctxId);\n if (!resolved) break;\n results.push(resolved);\n }\n\n return results;\n }\n\n private async resolveXPath(\n value: string,\n limit: number,\n ): Promise<ResolvedNode[]> {\n if (limit <= 0) return [];\n\n const session = this.frame.session;\n const ctxId = await executionContexts.waitForMainWorld(\n session,\n this.frame.frameId,\n 1000,\n );\n\n const results: ResolvedNode[] = [];\n for (let index = 0; index < limit; index += 1) {\n const expr = this.buildLocatorInvocation(\"resolveXPathMainWorld\", [\n JSON.stringify(value),\n String(index),\n ]);\n const resolved = await this.evaluateElement(expr, ctxId);\n if (!resolved) break;\n results.push(resolved);\n }\n\n return results;\n }\n\n private async countCss(selector: string): Promise<number> {\n const session = this.frame.session;\n\n const { executionContextId } = await session.send<{\n executionContextId: Protocol.Runtime.ExecutionContextId;\n }>(\"Page.createIsolatedWorld\", {\n frameId: this.frame.frameId,\n worldName: \"v3-world\",\n });\n\n const primaryExpr = this.buildLocatorInvocation(\"countCssMatchesPrimary\", [\n JSON.stringify(selector),\n ]);\n const primary = await this.evaluateCount(primaryExpr, executionContextId);\n\n const ctxId = await executionContexts.waitForMainWorld(\n session,\n this.frame.frameId,\n 1000,\n );\n\n const fallbackExpr = this.buildLocatorInvocation(\"countCssMatchesPierce\", [\n JSON.stringify(selector),\n ]);\n const fallback = await this.evaluateCount(fallbackExpr, ctxId);\n\n return Math.max(primary, fallback);\n }\n\n private async countText(value: string): Promise<number> {\n const session = this.frame.session;\n const ctxId = await executionContexts.waitForMainWorld(\n session,\n this.frame.frameId,\n 1000,\n );\n\n const expr = this.buildLocatorInvocation(\"countTextMatches\", [\n JSON.stringify(value),\n ]);\n\n try {\n const evalRes = await session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression: expr,\n contextId: ctxId,\n returnByValue: true,\n awaitPromise: true,\n },\n );\n\n if (evalRes.exceptionDetails) {\n const details = evalRes.exceptionDetails;\n v3Logger({\n category: \"locator\",\n message: \"count text evaluate exception\",\n level: 0,\n auxiliary: {\n frameId: { value: String(this.frame.frameId), type: \"string\" },\n selector: { value: value, type: \"string\" },\n exception: {\n value:\n details.text ??\n String(\n details.exception?.description ??\n details.exception?.value ??\n \"\",\n ),\n type: \"string\",\n },\n },\n });\n return 0;\n }\n\n const data = (evalRes.result.value ?? {}) as {\n count?: unknown;\n };\n\n const num =\n typeof data.count === \"number\" ? data.count : Number(data.count);\n if (!Number.isFinite(num)) return 0;\n return Math.max(0, Math.floor(num));\n } catch {\n return 0;\n }\n }\n\n private async countXPath(value: string): Promise<number> {\n const session = this.frame.session;\n\n const ctxId = await executionContexts.waitForMainWorld(\n session,\n this.frame.frameId,\n 1000,\n );\n\n const expr = this.buildLocatorInvocation(\"countXPathMatchesMainWorld\", [\n JSON.stringify(value),\n ]);\n\n try {\n const evalRes = await session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression: expr,\n contextId: ctxId,\n returnByValue: true,\n awaitPromise: true,\n },\n );\n\n if (evalRes.exceptionDetails) {\n return 0;\n }\n\n const num =\n typeof evalRes.result.value === \"number\"\n ? evalRes.result.value\n : Number(evalRes.result.value);\n if (!Number.isFinite(num)) return 0;\n return Math.max(0, Math.floor(num));\n } catch {\n return 0;\n }\n }\n\n private async resolveFromObjectId(\n objectId: Protocol.Runtime.RemoteObjectId,\n ): Promise<ResolvedNode | null> {\n const session = this.frame.session;\n let nodeId: Protocol.DOM.NodeId | null = null;\n try {\n const rn = await session.send<{ nodeId: Protocol.DOM.NodeId }>(\n \"DOM.requestNode\",\n { objectId },\n );\n nodeId = rn.nodeId ?? null;\n } catch {\n nodeId = null;\n }\n\n return { objectId, nodeId };\n }\n\n private async evaluateCount(\n expression: string,\n contextId: Protocol.Runtime.ExecutionContextId,\n ): Promise<number> {\n const session = this.frame.session;\n\n try {\n const evalRes = await session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId,\n returnByValue: true,\n awaitPromise: true,\n },\n );\n\n if (evalRes.exceptionDetails) {\n return 0;\n }\n\n const value = evalRes.result.value;\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num)) return 0;\n return Math.max(0, Math.floor(num));\n } catch {\n return 0;\n }\n }\n\n private async evaluateElement(\n expression: string,\n contextId: Protocol.Runtime.ExecutionContextId,\n ): Promise<ResolvedNode | null> {\n const session = this.frame.session;\n\n try {\n const evalRes = await session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId,\n returnByValue: false,\n awaitPromise: true,\n },\n );\n\n if (evalRes.exceptionDetails || !evalRes.result.objectId) {\n return null;\n }\n\n return this.resolveFromObjectId(evalRes.result.objectId);\n } catch {\n return null;\n }\n }\n}\n", "import { promises as fs, type Stats } from \"fs\";\nimport path from \"path\";\nimport { Buffer } from \"buffer\";\nimport { StagehandInvalidArgumentError } from \"../types/public/sdkErrors.js\";\nimport {\n SetInputFilesArgument,\n SetInputFilePayload,\n} from \"../types/public/locator.js\";\nimport { NormalizedFilePayload } from \"../types/private/locator.js\";\n\nconst DEFAULT_MIME_TYPE = \"application/octet-stream\";\n\n/**\n * Normalize user-provided setInputFiles arguments into in-memory payloads.\n * - Resolves string paths relative to the provided base directory.\n * - Validates that each path exists and is a regular file.\n * - Converts all buffers into Node Buffers for downstream processing.\n */\nexport async function normalizeInputFiles(\n files: SetInputFilesArgument,\n opts: { baseDir?: string } = {},\n): Promise<NormalizedFilePayload[]> {\n if (files === null || files === undefined) return [];\n\n const flattened = Array.isArray(files)\n ? (files as Array<string | SetInputFilePayload>)\n : [files];\n if (!flattened.length) return [];\n\n const baseDir = opts.baseDir ?? process.cwd();\n const normalized: NormalizedFilePayload[] = [];\n\n for (const entry of flattened) {\n if (typeof entry === \"string\") {\n const absolutePath = path.isAbsolute(entry)\n ? entry\n : path.resolve(baseDir, entry);\n const stat = await statFile(absolutePath);\n if (!stat.isFile()) {\n throw new StagehandInvalidArgumentError(\n `setInputFiles(): expected a file but received directory or special entry at ${absolutePath}`,\n );\n }\n const buffer = await fs.readFile(absolutePath);\n normalized.push({\n name: path.basename(absolutePath) || \"upload.bin\",\n mimeType: DEFAULT_MIME_TYPE,\n buffer,\n lastModified: stat.mtimeMs || Date.now(),\n absolutePath,\n });\n continue;\n }\n\n if (entry && typeof entry === \"object\" && \"buffer\" in entry) {\n const payload = entry as SetInputFilePayload;\n const buffer = toBuffer(payload.buffer);\n normalized.push({\n name: payload.name || \"upload.bin\",\n mimeType: payload.mimeType || DEFAULT_MIME_TYPE,\n buffer,\n lastModified:\n typeof payload.lastModified === \"number\"\n ? payload.lastModified\n : Date.now(),\n });\n continue;\n }\n\n throw new StagehandInvalidArgumentError(\n \"setInputFiles(): expected file path(s) or payload object(s)\",\n );\n }\n\n return normalized;\n}\n\nasync function statFile(absolutePath: string): Promise<Stats> {\n try {\n return await fs.stat(absolutePath);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException)?.code;\n if (code === \"ENOENT\") {\n throw new StagehandInvalidArgumentError(\n `setInputFiles(): file not found at ${absolutePath}`,\n );\n }\n throw error;\n }\n}\n\nexport function toBuffer(\n data: ArrayBuffer | Uint8Array | Buffer | string,\n): Buffer {\n if (Buffer.isBuffer(data)) return data;\n if (data instanceof Uint8Array) return Buffer.from(data);\n if (typeof data === \"string\") return Buffer.from(data);\n if (data instanceof ArrayBuffer) return Buffer.from(new Uint8Array(data));\n throw new StagehandInvalidArgumentError(\n \"Unsupported file payload buffer type\",\n );\n}\n", "// lib/v3/understudy/locator.ts\nimport { Protocol } from \"devtools-protocol\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport {\n locatorScriptBootstrap,\n locatorScriptGlobalRefs,\n locatorScriptSources,\n} from \"../dom/build/locatorScripts.generated.js\";\nimport type { Frame } from \"./frame.js\";\nimport {\n FrameSelectorResolver,\n type SelectorQuery,\n} from \"./selectorResolver.js\";\nimport {\n StagehandElementNotFoundError,\n StagehandInvalidArgumentError,\n StagehandLocatorError,\n ElementNotVisibleError,\n} from \"../types/public/sdkErrors.js\";\nimport { normalizeInputFiles } from \"./fileUploadUtils.js\";\nimport { SetInputFilesArgument, MouseButton } from \"../types/public/locator.js\";\nimport { NormalizedFilePayload } from \"../types/private/locator.js\";\n\nconst MAX_REMOTE_UPLOAD_BYTES = 50 * 1024 * 1024; // 50MB guard copied from Playwright\n\n/**\n * Locator\n *\n * Purpose:\n * A small, CDP-based element interaction helper scoped to a specific `Frame`.\n * It resolves a CSS/XPath selector inside the frame\u2019s **isolated world**, and then\n * performs low-level actions (click, type, select) using DOM/Runtime/Input\n * protocol domains with minimal abstraction.\n *\n * Key change:\n * - Prefer **objectId**-based CDP calls (scroll, geometry) to avoid brittle\n * frontend nodeId mappings. nodeId is resolved on a best-effort basis and\n * returned for compatibility, but actions do not depend on it.\n *\n * Notes:\n * - Resolution is lazy: every action resolves the selector again.\n * - Uses `Page.createIsolatedWorld` so evaluation is isolated from page scripts.\n * - Releases remote objects (`Runtime.releaseObject`) where appropriate.\n */\nexport class Locator {\n private readonly selectorResolver: FrameSelectorResolver;\n\n private readonly selectorQuery: SelectorQuery;\n\n // -1 means \"no explicit nth()\"; default locator resolves to first match for actions.\n private readonly nthIndex: number;\n\n constructor(\n private readonly frame: Frame,\n private readonly selector: string,\n private readonly options?: { deep?: boolean; depth?: number },\n nthIndex: number = -1,\n ) {\n this.selectorResolver = new FrameSelectorResolver(this.frame);\n this.selectorQuery = FrameSelectorResolver.parseSelector(selector);\n const normalized = Number.isFinite(nthIndex) ? Math.floor(nthIndex) : -1;\n this.nthIndex = normalized < 0 ? -1 : normalized;\n }\n\n /** Return the owning Frame for this locator (typed accessor, no private access). */\n public getFrame(): Frame {\n return this.frame;\n }\n\n /**\n * Set files on an <input type=\"file\"> element.\n *\n * Mirrors Playwright's Locator.setInputFiles basics:\n * - Accepts file path(s) or payload object(s) { name, mimeType, buffer }.\n * - Uses CDP DOM.setFileInputFiles under the hood.\n * - Best\u2011effort dispatches change/input via CDP (Chrome does by default).\n * - Passing an empty array clears the selection.\n */\n public async setInputFiles(files: SetInputFilesArgument): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const tempFiles: string[] = [];\n\n try {\n // Validate element is an <input type=\"file\">\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.ensureFileInputElement,\n returnByValue: true,\n },\n );\n const ok = Boolean(res.result.value);\n if (!ok)\n throw new StagehandInvalidArgumentError(\n 'Target is not an <input type=\"file\"> element',\n );\n } catch (e) {\n throw new StagehandInvalidArgumentError(\n e instanceof Error\n ? e.message\n : \"Unable to verify file input element\",\n );\n }\n\n const normalized = await normalizeInputFiles(files);\n\n if (!normalized.length) {\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: [],\n });\n return;\n }\n\n if (this.frame.isBrowserRemote()) {\n await this.assignFilesViaPayloadInjection(objectId, normalized);\n return;\n }\n\n const filePaths: string[] = [];\n for (const payload of normalized) {\n if (payload.absolutePath) {\n filePaths.push(payload.absolutePath);\n continue;\n }\n const ext = path.extname(payload.name);\n const tmp = path.join(\n os.tmpdir(),\n `stagehand-upload-${Date.now()}-${Math.random().toString(36).slice(2)}${ext}`,\n );\n await fs.promises.writeFile(tmp, payload.buffer);\n tempFiles.push(tmp);\n filePaths.push(tmp);\n }\n\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: filePaths,\n });\n } finally {\n // Cleanup: release element and remove any temporary files we created\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n for (const p of tempFiles) {\n try {\n await fs.promises.unlink(p);\n } catch {\n // ignore\n }\n }\n }\n }\n\n /**\n * Remote browser fallback: build File objects inside the page and attach them via JS.\n *\n * When Stagehand is driving a browser that cannot see the local filesystem (Browserbase,\n * remote CDP, etc.), CDP's DOM.setFileInputFiles would fail because Chrome can't reach\n * our temp files. Instead we base64-encode the payloads, send them into the page, and\n * let a DOM helper create File objects + dispatch change/input events.\n */\n private async assignFilesViaPayloadInjection(\n objectId: Protocol.Runtime.RemoteObjectId,\n files: NormalizedFilePayload[],\n ): Promise<void> {\n const session = this.frame.session;\n\n for (const payload of files) {\n if (payload.buffer.length > MAX_REMOTE_UPLOAD_BYTES) {\n throw new StagehandInvalidArgumentError(\n `setInputFiles(): file \"${payload.name}\" is larger than the 50MB limit for remote uploads`,\n );\n }\n }\n\n const serialized = files.map((payload) => ({\n name: payload.name,\n mimeType: payload.mimeType,\n lastModified: payload.lastModified,\n base64: payload.buffer.toString(\"base64\"),\n }));\n\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration:\n locatorScriptSources.assignFilePayloadsToInputElement,\n arguments: [\n {\n value: serialized,\n },\n ],\n returnByValue: true,\n },\n );\n\n const ok = Boolean(res.result?.value);\n if (!ok) {\n throw new StagehandInvalidArgumentError(\n \"Unable to assign file payloads to remote input element\",\n );\n }\n }\n\n /**\n * Return the DOM backendNodeId for this locator's target element.\n * Useful for identity comparisons without needing element handles.\n */\n async backendNodeId(): Promise<Protocol.DOM.BackendNodeId> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send(\"DOM.enable\").catch(() => {});\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n return node.backendNodeId as Protocol.DOM.BackendNodeId;\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /** Return how many nodes the current selector resolves to. */\n public async count(): Promise<number> {\n const session = this.frame.session;\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n return this.selectorResolver.count(this.selectorQuery);\n }\n\n /**\n * Return the center of the element's bounding box in the owning frame's viewport\n * (CSS pixels), rounded to integers. Scrolls into view best-effort.\n */\n public async centroid(): Promise<{ x: number; y: number }> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n return { x: Math.round(cx), y: Math.round(cy) };\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Highlight the element's bounding box using the CDP Overlay domain.\n * - Scrolls element into view best-effort.\n * - Shows a semi-transparent overlay briefly, then hides it.\n */\n public async highlight(options?: {\n durationMs?: number;\n borderColor?: { r: number; g: number; b: number; a?: number };\n contentColor?: { r: number; g: number; b: number; a?: number };\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const duration = Math.max(0, options?.durationMs ?? 800);\n\n const borderColor = options?.borderColor ?? { r: 255, g: 0, b: 0, a: 0.9 };\n const contentColor =\n options?.contentColor ?? ({ r: 255, g: 200, b: 0, a: 0.2 } as const);\n\n try {\n await session.send(\"Overlay.enable\").catch(() => {});\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n // Prefer backendNodeId to keep highlight stable even if objectId is released.\n await session.send(\"DOM.enable\").catch(() => {});\n let backendNodeId: Protocol.DOM.BackendNodeId | undefined;\n try {\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n backendNodeId = node.backendNodeId as Protocol.DOM.BackendNodeId;\n } catch {\n backendNodeId = undefined;\n }\n\n const highlightConfig: Protocol.Overlay.HighlightConfig = {\n showInfo: false,\n showStyles: false,\n showRulers: false,\n showExtensionLines: false,\n borderColor,\n contentColor,\n } as Protocol.Overlay.HighlightConfig;\n\n const highlightOnce = async () => {\n await session.send<never>(\"Overlay.highlightNode\", {\n ...(backendNodeId ? { backendNodeId } : { objectId }),\n highlightConfig,\n });\n };\n\n // Initial draw\n await highlightOnce();\n\n // Keep alive until duration elapses to resist overlay clears on mouse move/repaints\n if (duration > 0) {\n const start = Date.now();\n const tick = Math.min(300, Math.max(100, Math.floor(duration / 50)));\n while (Date.now() - start < duration) {\n await new Promise((r) => setTimeout(r, tick));\n try {\n await highlightOnce();\n } catch {\n // ignore transient errors\n }\n }\n await session.send<never>(\"Overlay.hideHighlight\").catch(() => {});\n }\n } finally {\n // Releasing objectId should not affect highlight when using backendNodeId.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Move the mouse cursor to the element's visual center without clicking.\n * - Scrolls into view best-effort, resolves geometry, then dispatches a mouse move.\n */\n async hover(): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n await session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Click the element at its visual center.\n * Steps:\n * 1) Resolve selector to { objectId } in the frame world.\n * 2) Scroll into view via `DOM.scrollIntoViewIfNeeded({ objectId })`.\n * 3) Read geometry via `DOM.getBoxModel({ objectId })` \u2192 compute a center point.\n * 4) Synthesize mouse press + release via `Input.dispatchMouseEvent`.\n */\n async click(options?: {\n button?: MouseButton;\n clickCount?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const button = options?.button ?? \"left\";\n const clickCount = options?.clickCount ?? 1;\n\n try {\n // Scroll into view using objectId (avoids frontend nodeId dependence)\n await session.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n\n // Get geometry using objectId\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n // Dispatch click events in a pipelined burst to reduce inter-click delay\n // from network/CPU jitter between round trips.\n const dispatches: Array<Promise<unknown>> = [];\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n\n for (let i = 1; i <= clickCount; i++) {\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n }\n await Promise.all(dispatches);\n } finally {\n // release the element handle\n try {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n } catch {\n // If the context navigated or was destroyed (e.g., link opens new tab),\n // releaseObject may fail with -32000. Ignore as best-effort cleanup.\n }\n }\n }\n\n /**\n * Dispatch a DOM 'click' MouseEvent on the element itself.\n * - Does not synthesize real pointer input; directly dispatches an event.\n * - Useful for elements that rely on click handlers without needing hit-testing.\n */\n async sendClickEvent(options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n detail?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const bubbles = options?.bubbles ?? true;\n const cancelable = options?.cancelable ?? true;\n const composed = options?.composed ?? true;\n const detail = options?.detail ?? 1;\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.dispatchDomClick,\n arguments: [\n {\n value: { bubbles, cancelable, composed, detail },\n },\n ],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Scroll the element vertically to a given percentage (0\u2013100).\n * - If the element is <html> or <body>, scrolls the window/document.\n * - Otherwise, scrolls the element itself via element.scrollTo.\n */\n async scrollTo(percent: number | string): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.scrollElementToPercent,\n arguments: [{ value: percent as unknown as number }],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Fill an input/textarea/contenteditable element.\n * Mirrors Playwright semantics: the DOM helper either applies the native\n * value setter (for special input types) or asks us to type text via the CDP\n * Input domain after focusing/selecting.\n */\n async fill(value: string): Promise<void> {\n const session = this.frame.session;\n // Use the bundled locator globals; the raw fill snippet depends on helper symbols.\n const fillDeclaration = `function(value) { ${locatorScriptBootstrap}; return ${locatorScriptGlobalRefs.fillElementValue}.call(this, value); }`;\n const { objectId } = await this.resolveNode();\n\n let releaseNeeded = true;\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: fillDeclaration,\n arguments: [{ value }],\n returnByValue: true,\n },\n );\n if (res.exceptionDetails) {\n // prefer exception.description over text (eg \"Uncaught\")\n const message =\n res.exceptionDetails.exception?.description ??\n res.exceptionDetails.text ??\n \"Unknown exception during locator().fill()\";\n throw new StagehandLocatorError(\"Filling\", this.selector, message);\n }\n\n const result = res.result.value as\n | { status?: string; reason?: string; value?: string }\n | null\n | undefined;\n const status =\n typeof result === \"object\" && result ? result.status : undefined;\n\n if (status === \"done\") {\n return;\n }\n\n if (status === \"needsinput\") {\n // Release the current handle before synthesizing keyboard input to avoid leaking it.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n releaseNeeded = false;\n\n const valueToType =\n typeof result?.value === \"string\" ? result.value : value;\n\n let prepared = false;\n try {\n const { objectId: prepObjectId } = await this.resolveNode();\n try {\n const prepRes =\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId: prepObjectId,\n functionDeclaration:\n locatorScriptSources.prepareElementForTyping,\n returnByValue: true,\n },\n );\n prepared = Boolean(prepRes.result.value);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId: prepObjectId })\n .catch(() => {});\n }\n } catch {\n // Ignore preparation failures; we'll fall back to typing best-effort.\n }\n\n if (!prepared && valueToType.length > 0) {\n await this.type(valueToType);\n return;\n }\n\n if (valueToType.length === 0) {\n // Simulate deleting the currently selected text to clear the field.\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n } else {\n await session.send<never>(\"Input.insertText\", { text: valueToType });\n }\n\n return;\n }\n\n if (status === \"error\") {\n const reason =\n typeof result?.reason === \"string\" && result.reason.length > 0\n ? result.reason\n : \"Failed to fill element\";\n throw new StagehandInvalidArgumentError(\n `Failed to fill element (${reason})`,\n );\n }\n\n // Backward compatibility: if no status is returned (older bundle), fall back to setter logic.\n if (!status) {\n await this.type(value);\n }\n } finally {\n if (releaseNeeded) {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n }\n\n /**\n * Type text into the element (focuses first).\n * - Focus via element.focus() in page JS (no DOM.focus(nodeId)).\n * - If no delay, uses `Input.insertText` for efficiency.\n * - With delay, synthesizes `keyDown`/`keyUp` per character.\n */\n async type(text: string, options?: { delay?: number }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n try {\n // Focus using JS (avoids DOM.focus(nodeId))\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.focusElement,\n returnByValue: true,\n },\n );\n\n if (!options?.delay) {\n await session.send<never>(\"Input.insertText\", { text });\n return;\n }\n\n for (const ch of text) {\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await new Promise((r) => setTimeout(r, options.delay));\n }\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Select one or more options on a `<select>` element.\n * Returns the values actually selected after the operation.\n */\n async selectOption(values: string | string[]): Promise<string[]> {\n const session = this.frame.session;\n const desired = Array.isArray(values) ? values : [values];\n const { objectId } = await this.resolveNode();\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.selectElementOptions,\n arguments: [{ value: desired }],\n returnByValue: true,\n },\n );\n\n return (res.result.value as string[]) ?? [];\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is attached and visible (rough heuristic).\n */\n async isVisible(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementVisible,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is an input[type=checkbox|radio] and is checked.\n * Also considers aria-checked for ARIA widgets.\n */\n async isChecked(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementChecked,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's input value (for input/textarea/select/contenteditable).\n */\n async inputValue(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInputValue,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's textContent (raw, not innerText).\n */\n async textContent(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementTextContent,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerHTML string.\n */\n async innerHtml(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerHTML,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerText (layout-aware, visible text).\n */\n async innerText(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerText,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return a locator narrowed to the first match.\n */\n first(): Locator {\n return this.nth(0);\n }\n\n /** Return a locator narrowed to the element at the given zero-based index. */\n nth(index: number): Locator {\n const value = Number(index);\n if (!Number.isFinite(value) || value < 0) {\n throw new StagehandInvalidArgumentError(\n \"locator().nth() expects a non-negative index\",\n );\n }\n\n const nextIndex = Math.floor(value);\n if (nextIndex === this.nthIndex) {\n return this;\n }\n\n return new Locator(this.frame, this.selector, this.options, nextIndex);\n }\n\n // ---------- helpers ----------\n\n /**\n * Resolve `this.selector` within the frame to `{ objectId, nodeId? }`:\n * Delegates to a shared selector resolver so all selector logic stays in sync.\n */\n public async resolveNode(): Promise<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }> {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n const index = this.nthIndex < 0 ? 0 : this.nthIndex;\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n index,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n\n return resolved;\n }\n\n /**\n * Resolve all matching nodes for this locator.\n * If the locator is narrowed via nth(), only that index is returned.\n */\n public async resolveNodesForMask(): Promise<\n Array<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }>\n > {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n if (this.nthIndex >= 0) {\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n this.nthIndex,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return [resolved];\n }\n\n const resolved = await this.selectorResolver.resolveAll(this.selectorQuery);\n if (!resolved.length) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return resolved;\n }\n\n /** Compute a center point from a BoxModel content quad */\n private centerFromBoxContent(content: number[]): { cx: number; cy: number } {\n // content is [x1,y1, x2,y2, x3,y3, x4,y4]\n if (!content || content.length < 8) {\n throw new StagehandInvalidArgumentError(\"Invalid box model content quad\");\n }\n const xs = [content[0], content[2], content[4], content[6]];\n const ys = [content[1], content[3], content[5], content[7]];\n const cx = (xs[0] + xs[1] + xs[2] + xs[3]) / 4;\n const cy = (ys[0] + ys[1] + ys[2] + ys[3]) / 4;\n return { cx, cy };\n }\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport { Locator } from \"./locator.js\";\nimport type { Page } from \"./page.js\";\nimport { Frame } from \"./frame.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\nimport {\n ContentFrameNotFoundError,\n StagehandInvalidArgumentError,\n} from \"../types/public/sdkErrors.js\";\n\n/**\n * FrameLocator: resolves iframe elements to their child Frames and allows\n * creating locators scoped to that frame. Supports chaining.\n */\nexport class FrameLocator {\n private readonly parent?: FrameLocator;\n private readonly selector: string;\n private readonly page: Page;\n private readonly root?: Frame;\n\n constructor(\n page: Page,\n selector: string,\n parent?: FrameLocator,\n root?: Frame,\n ) {\n this.page = page;\n this.selector = selector;\n this.parent = parent;\n this.root = root;\n }\n\n /** Create a nested FrameLocator under this one. */\n frameLocator(selector: string): FrameLocator {\n return new FrameLocator(this.page, selector, this);\n }\n\n /** Resolve to the concrete Frame for this FrameLocator chain. */\n async resolveFrame(): Promise<Frame> {\n const parentFrame: Frame = this.parent\n ? await this.parent.resolveFrame()\n : (this.root ?? this.page.mainFrame());\n\n // Resolve the iframe element inside the parent frame\n const tmp = parentFrame.locator(this.selector);\n const parentSession = parentFrame.session;\n const { objectId } = await tmp.resolveNode();\n\n try {\n await parentSession.send(\"DOM.enable\").catch(() => {});\n const desc = await parentSession.send<Protocol.DOM.DescribeNodeResponse>(\n \"DOM.describeNode\",\n { objectId },\n );\n const iframeBackendNodeId = desc.node.backendNodeId;\n\n // Find direct child frames under the parent by consulting the Page's registry\n const childIds = await listDirectChildFrameIdsFromRegistry(\n this.page,\n parentFrame.frameId,\n 1000,\n );\n\n for (const fid of childIds) {\n try {\n const owner = await parentSession.send<{\n backendNodeId: Protocol.DOM.BackendNodeId;\n nodeId?: Protocol.DOM.NodeId;\n }>(\"DOM.getFrameOwner\", { frameId: fid as Protocol.Page.FrameId });\n if (owner.backendNodeId === iframeBackendNodeId) {\n // Ensure child frame is ready (handles OOPIF adoption or same-process)\n await ensureChildFrameReady(this.page, parentFrame, fid, 1200);\n return this.page.frameForId(fid);\n }\n } catch {\n // ignore and try next\n }\n }\n throw new ContentFrameNotFoundError(this.selector);\n } finally {\n await parentSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /** Return a Locator scoped to this frame. Methods delegate to the frame lazily. */\n locator(selector: string): LocatorDelegate {\n return new LocatorDelegate(this, selector);\n }\n}\n\n/** A small delegating wrapper that resolves the frame lazily per call. */\nclass LocatorDelegate {\n constructor(\n private readonly fl: FrameLocator,\n private readonly sel: string,\n private readonly nthIndex: number = -1,\n ) {}\n\n private async real(): Promise<Locator> {\n const frame = await this.fl.resolveFrame();\n const locator = frame.locator(this.sel);\n if (this.nthIndex < 0) return locator;\n return locator.nth(this.nthIndex);\n }\n\n // Locator API delegates\n async click(options?: {\n button?: \"left\" | \"right\" | \"middle\";\n clickCount?: number;\n }) {\n return (await this.real()).click(options);\n }\n async hover() {\n return (await this.real()).hover();\n }\n async fill(value: string) {\n return (await this.real()).fill(value);\n }\n async type(text: string, options?: { delay?: number }) {\n return (await this.real()).type(text, options);\n }\n async selectOption(values: string | string[]) {\n return (await this.real()).selectOption(values);\n }\n async scrollTo(percent: number | string) {\n return (await this.real()).scrollTo(percent);\n }\n async isVisible() {\n return (await this.real()).isVisible();\n }\n async isChecked() {\n return (await this.real()).isChecked();\n }\n async inputValue() {\n return (await this.real()).inputValue();\n }\n async textContent() {\n return (await this.real()).textContent();\n }\n async innerHtml() {\n return (await this.real()).innerHtml();\n }\n async innerText() {\n return (await this.real()).innerText();\n }\n async count() {\n return (await this.real()).count();\n }\n first(): LocatorDelegate {\n return this.nth(0);\n }\n nth(index: number): LocatorDelegate {\n const value = Number(index);\n if (!Number.isFinite(value) || value < 0) {\n throw new StagehandInvalidArgumentError(\n \"locator().nth() expects a non-negative index\",\n );\n }\n\n const nextIndex = Math.floor(value);\n if (nextIndex === this.nthIndex) return this;\n\n return new LocatorDelegate(this.fl, this.sel, nextIndex);\n }\n}\n\n/** Factory to start a FrameLocator chain from an arbitrary root Frame. */\nexport function frameLocatorFromFrame(\n page: Page,\n root: Frame,\n selector: string,\n): FrameLocator {\n return new FrameLocator(page, selector, undefined, root);\n}\n\nasync function listDirectChildFrameIdsFromRegistry(\n page: Page,\n parentFrameId: string,\n timeoutMs: number,\n): Promise<string[]> {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n try {\n const tree = page.getFullFrameTree();\n const node = findFrameNode(tree, parentFrameId);\n const ids = node?.childFrames?.map((c) => c.frame.id as string) ?? [];\n if (ids.length > 0 || Date.now() >= deadline) return ids;\n } catch {\n // ignore\n }\n await new Promise((r) => setTimeout(r, 50));\n }\n}\n\nfunction findFrameNode(\n tree: Protocol.Page.FrameTree,\n targetId: string,\n): Protocol.Page.FrameTree | undefined {\n if (tree.frame.id === targetId) return tree;\n for (const c of tree.childFrames ?? []) {\n const hit = findFrameNode(c, targetId);\n if (hit) return hit;\n }\n return undefined;\n}\n\n/**\n * Ensure we can evaluate in the child frame with minimal delay.\n * - If the child is same-process: parent session owns it and main world appears quickly.\n * - If OOPIF and adoption not finished: wait briefly for ownership change, then main world.\n */\nasync function ensureChildFrameReady(\n page: Page,\n parentFrame: Frame,\n childFrameId: string,\n budgetMs: number,\n): Promise<void> {\n const parentSession = parentFrame.session;\n const deadline = Date.now() + Math.max(0, budgetMs);\n\n // If already owned by a different session (OOPIF adopted), wait briefly there.\n const owner = page.getSessionForFrame(childFrameId);\n if (owner && owner !== parentSession) {\n try {\n await executionContexts.waitForMainWorld(owner, childFrameId, 600);\n } catch {\n // best effort\n }\n return;\n }\n\n const hasMainWorldOnParent = (): boolean => {\n try {\n return (\n executionContexts.getMainWorld(parentSession, childFrameId) !== null\n );\n } catch {\n return false;\n }\n };\n\n if (hasMainWorldOnParent()) return;\n\n await parentSession\n .send(\"Page.setLifecycleEventsEnabled\", { enabled: true })\n .catch(() => {});\n await parentSession.send(\"Runtime.enable\").catch(() => {});\n\n await new Promise<void>((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n parentSession.off(\"Page.lifecycleEvent\", onLifecycle);\n resolve();\n };\n const onLifecycle = (evt: Protocol.Page.LifecycleEventEvent) => {\n if (\n evt.frameId !== childFrameId ||\n (evt.name !== \"DOMContentLoaded\" &&\n evt.name !== \"load\" &&\n evt.name !== \"networkIdle\" &&\n evt.name !== \"networkidle\")\n ) {\n return;\n }\n if (hasMainWorldOnParent()) return finish();\n try {\n const nowOwner = page.getSessionForFrame(childFrameId);\n if (nowOwner && nowOwner !== parentSession) {\n const left = Math.max(150, deadline - Date.now());\n executionContexts\n .waitForMainWorld(nowOwner, childFrameId, left)\n .finally(finish);\n }\n } catch {\n // ignore\n }\n };\n parentSession.on(\"Page.lifecycleEvent\", onLifecycle);\n\n const tick = () => {\n if (done) return;\n if (hasMainWorldOnParent()) return finish();\n try {\n const nowOwner = page.getSessionForFrame(childFrameId);\n if (nowOwner && nowOwner !== parentSession) {\n const left = Math.max(150, deadline - Date.now());\n executionContexts\n .waitForMainWorld(nowOwner, childFrameId, left)\n .finally(finish);\n return;\n }\n } catch {\n // ignore\n }\n if (Date.now() >= deadline) return finish();\n setTimeout(tick, 50);\n };\n tick();\n });\n}\n", "import { Locator } from \"./locator.js\";\nimport type { Frame } from \"./frame.js\";\nimport type { Page } from \"./page.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { FrameLocator, frameLocatorFromFrame } from \"./frameLocator.js\";\nimport { StagehandInvalidArgumentError } from \"../types/public/sdkErrors.js\";\n\n/**\n * Recognize iframe steps like \"iframe\" or \"iframe[2]\" in an XPath.\n */\nconst IFRAME_STEP_RE = /^iframe(?:\\[\\d+])?$/i;\n\ntype Axis = \"child\" | \"desc\";\ntype Step = { axis: Axis; raw: string; name: string };\n\nexport type ResolvedLocatorTarget = {\n frame: Frame;\n selector: string;\n};\n\n/** Parse XPath into steps preserving '/' vs '//' and the raw token (with [n]) */\nfunction parseXPath(path: string): Step[] {\n const s = path.trim();\n let i = 0;\n const steps: Step[] = [];\n while (i < s.length) {\n let axis: Axis = \"child\";\n if (s.startsWith(\"//\", i)) {\n axis = \"desc\";\n i += 2;\n } else if (s[i] === \"/\") {\n axis = \"child\";\n i += 1;\n }\n\n const start = i;\n while (i < s.length && s[i] !== \"/\") i++;\n const raw = s.slice(start, i).trim();\n if (!raw) continue;\n\n const name = raw.replace(/\\[\\d+\\]\\s*$/u, \"\").toLowerCase();\n steps.push({ axis, raw, name });\n }\n return steps;\n}\n\nfunction buildXPathFromSteps(steps: ReadonlyArray<Step>): string {\n let out = \"\";\n for (const st of steps) {\n out += st.axis === \"desc\" ? \"//\" : \"/\";\n out += st.raw; // keep predicates intact\n }\n return out || \"/\";\n}\n\n/** Build a Locator scoped to the correct frame for a deep XPath crossing iframes. */\nexport async function deepLocatorThroughIframes(\n page: Page,\n root: Frame,\n xpathOrSelector: string,\n): Promise<Locator> {\n const target = await resolveDeepXPathTarget(page, root, xpathOrSelector);\n return new Locator(target.frame, target.selector);\n}\n\n/**\n * Unified resolver that supports '>>' hop notation, deep XPath across iframes,\n * and plain single-frame selectors. Keeps hop logic in one shared place.\n */\nexport async function resolveLocatorTarget(\n page: Page,\n root: Frame,\n selectorRaw: string,\n): Promise<ResolvedLocatorTarget> {\n const sel = selectorRaw.trim();\n const parts = sel\n .split(\">>\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (parts.length > 1) {\n // Build a FrameLocator chain for all but the last segment\n let fl = frameLocatorFromFrame(page, root, parts[0]!);\n for (let i = 1; i < parts.length - 1; i++) {\n fl = fl.frameLocator(parts[i]!);\n }\n const targetFrame = await fl.resolveFrame();\n return { frame: targetFrame, selector: parts[parts.length - 1]! };\n }\n\n // No hops \u2014 delegate to XPath-aware deep resolver when needed\n const isXPath = sel.startsWith(\"xpath=\") || sel.startsWith(\"/\");\n if (isXPath) {\n return resolveDeepXPathTarget(page, root, sel);\n }\n return { frame: root, selector: sel };\n}\n\nexport async function resolveLocatorWithHops(\n page: Page,\n root: Frame,\n selectorRaw: string,\n): Promise<Locator> {\n const target = await resolveLocatorTarget(page, root, selectorRaw);\n return new Locator(target.frame, target.selector);\n}\n\n/**\n * DeepLocatorDelegate: a lightweight wrapper that looks like a Locator and\n * resolves to the correct frame/element on each call using hop/deep-XPath logic.\n *\n * Returned by `page.deepLocator()` for ergonomic, await-free chaining:\n * page.deepLocator('iframe#ifrA >> #btn').click()\n */\nexport class DeepLocatorDelegate {\n constructor(\n private readonly page: Page,\n private readonly root: Frame,\n private readonly selector: string,\n private readonly nthIndex: number = 0,\n ) {}\n\n private async real(): Promise<Locator> {\n const base = await resolveLocatorWithHops(\n this.page,\n this.root,\n this.selector,\n );\n return base.nth(this.nthIndex);\n }\n\n // Locator API delegates\n async click(options?: {\n button?: \"left\" | \"right\" | \"middle\";\n clickCount?: number;\n }) {\n return (await this.real()).click(options);\n }\n async count() {\n return (await this.real()).count();\n }\n async hover() {\n return (await this.real()).hover();\n }\n async fill(value: string) {\n return (await this.real()).fill(value);\n }\n async type(text: string, options?: { delay?: number }) {\n return (await this.real()).type(text, options);\n }\n async selectOption(values: string | string[]) {\n return (await this.real()).selectOption(values);\n }\n async scrollTo(percent: number | string) {\n return (await this.real()).scrollTo(percent);\n }\n async isVisible() {\n return (await this.real()).isVisible();\n }\n async isChecked() {\n return (await this.real()).isChecked();\n }\n async inputValue() {\n return (await this.real()).inputValue();\n }\n async textContent() {\n return (await this.real()).textContent();\n }\n async innerHtml() {\n return (await this.real()).innerHtml();\n }\n async innerText() {\n return (await this.real()).innerText();\n }\n async centroid() {\n return (await this.real()).centroid();\n }\n async backendNodeId() {\n return (await this.real()).backendNodeId();\n }\n async highlight(options?: {\n durationMs?: number;\n borderColor?: { r: number; g: number; b: number; a?: number };\n contentColor?: { r: number; g: number; b: number; a?: number };\n }) {\n return (await this.real()).highlight(options);\n }\n async sendClickEvent(options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n detail?: number;\n }) {\n return (await this.real()).sendClickEvent(options);\n }\n async setInputFiles(\n files:\n | string\n | string[]\n | {\n name: string;\n mimeType: string;\n buffer: ArrayBuffer | Uint8Array | Buffer | string;\n }\n | Array<{\n name: string;\n mimeType: string;\n buffer: ArrayBuffer | Uint8Array | Buffer | string;\n }>,\n ) {\n return (await this.real()).setInputFiles(files);\n }\n first() {\n return this.nth(0);\n }\n nth(index: number): DeepLocatorDelegate {\n const value = Number(index);\n if (!Number.isFinite(value) || value < 0) {\n throw new StagehandInvalidArgumentError(\n \"deepLocator().nth() expects a non-negative index\",\n );\n }\n\n const nextIndex = Math.floor(value);\n if (nextIndex === this.nthIndex) return this;\n\n return new DeepLocatorDelegate(\n this.page,\n this.root,\n this.selector,\n nextIndex,\n );\n }\n}\n\n/** Factory to create a deep locator delegate from a Page + root frame. */\nexport function deepLocatorFromPage(\n page: Page,\n root: Frame,\n selector: string,\n): DeepLocatorDelegate {\n return new DeepLocatorDelegate(page, root, selector);\n}\n\nasync function resolveDeepXPathTarget(\n page: Page,\n root: Frame,\n xpathOrSelector: string,\n): Promise<ResolvedLocatorTarget> {\n let path = xpathOrSelector.trim();\n if (path.startsWith(\"xpath=\")) path = path.slice(\"xpath=\".length).trim();\n if (!path.startsWith(\"/\")) path = \"/\" + path;\n\n const steps = parseXPath(path);\n let fl: FrameLocator | undefined;\n let buf: Step[] = [];\n\n const flushIntoFrameLocator = () => {\n if (!buf.length) return;\n const selectorForIframe = \"xpath=\" + buildXPathFromSteps(buf);\n v3Logger({\n category: \"deep-hop\",\n message: \"resolving iframe via FrameLocator\",\n level: 2,\n auxiliary: {\n selectorForIframe: { value: selectorForIframe, type: \"string\" },\n rootFrameId: { value: String(root.frameId), type: \"string\" },\n },\n });\n fl = fl\n ? fl.frameLocator(selectorForIframe)\n : frameLocatorFromFrame(page, root, selectorForIframe);\n buf = [];\n };\n\n for (const st of steps) {\n buf.push(st);\n if (IFRAME_STEP_RE.test(st.name)) flushIntoFrameLocator();\n }\n\n const finalSelector = \"xpath=\" + buildXPathFromSteps(buf);\n const targetFrame = fl ? await fl.resolveFrame() : root;\n v3Logger({\n category: \"deep-hop\",\n message: \"final tail\",\n level: 2,\n auxiliary: {\n frameId: { value: String(targetFrame.frameId), type: \"string\" },\n finalSelector: { value: finalSelector, type: \"string\" },\n },\n });\n return { frame: targetFrame, selector: finalSelector };\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport fs from \"node:fs\";\nimport { Writable } from \"node:stream\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport path from \"node:path\";\nimport pino from \"pino\";\nimport type { LanguageModelMiddleware } from \"ai\";\nimport type { V3Options } from \"./types/public/index.js\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst MAX_LINE_LENGTH = 160;\n\n// Flow logging config dir - empty string disables logging entirely\nconst CONFIG_DIR = process.env.BROWSERBASE_CONFIG_DIR || \"\";\n\nconst NOISY_CDP_EVENTS = new Set([\n \"Target.targetInfoChanged\",\n \"Runtime.executionContextCreated\",\n \"Runtime.executionContextDestroyed\",\n \"Runtime.executionContextsCleared\",\n \"Page.lifecycleEvent\",\n \"Network.dataReceived\",\n \"Network.loadingFinished\",\n \"Network.requestWillBeSentExtraInfo\",\n \"Network.responseReceivedExtraInfo\",\n \"Network.requestWillBeSent\",\n \"Network.responseReceived\",\n]);\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype EventCategory =\n | \"AgentTask\"\n | \"StagehandStep\"\n | \"UnderstudyAction\"\n | \"CDP\"\n | \"LLM\";\n\ninterface FlowEvent {\n // Core identifiers (set via mixin from child logger bindings)\n eventId: string;\n sessionId: string;\n taskId?: string | null;\n stepId?: string | null;\n stepLabel?: string | null;\n actionId?: string | null;\n actionLabel?: string | null;\n\n // Event classification\n category: EventCategory;\n event: \"started\" | \"completed\" | \"call\" | \"message\" | \"request\" | \"response\";\n method?: string;\n msg?: string;\n\n // Event-specific payload (not truncated)\n params?: unknown;\n targetId?: string | null;\n\n // LLM event fields (for individual LLM request/response events only)\n requestId?: string; // Correlation ID linking LLM request to response\n model?: string;\n prompt?: unknown;\n output?: unknown;\n inputTokens?: number; // Tokens for THIS specific LLM call\n outputTokens?: number; // Tokens for THIS specific LLM call\n\n // Aggregate metrics (for completion events only - task/step/action)\n metrics?: {\n durationMs?: number;\n llmRequests?: number; // Total LLM calls in this span\n inputTokens?: number; // Total input tokens across all LLM calls\n outputTokens?: number; // Total output tokens across all LLM calls\n cdpEvents?: number; // Total CDP events in this span\n };\n}\n\ninterface FlowLoggerMetrics {\n taskStartTime?: number;\n stepStartTime?: number;\n actionStartTime?: number;\n llmRequests: number;\n llmInputTokens: number;\n llmOutputTokens: number;\n cdpEvents: number;\n}\n\nexport interface FlowLoggerContext {\n logger: pino.Logger;\n metrics: FlowLoggerMetrics;\n sessionId: string;\n sessionDir: string;\n configDir: string;\n initPromise: Promise<void>;\n initialized: boolean;\n // Current span context (mutable, injected via mixin)\n taskId: string | null;\n stepId: string | null;\n stepLabel: string | null;\n actionId: string | null;\n actionLabel: string | null;\n // File handles for pretty streams\n fileStreams: {\n agent: fs.WriteStream | null;\n stagehand: fs.WriteStream | null;\n understudy: fs.WriteStream | null;\n cdp: fs.WriteStream | null;\n llm: fs.WriteStream | null;\n jsonl: fs.WriteStream | null;\n };\n}\n\nconst loggerContext = new AsyncLocalStorage<FlowLoggerContext>();\n\n// =============================================================================\n// Formatting Utilities (used by pretty streams)\n// =============================================================================\n\n/** Calculate base64 data size in KB */\nconst dataToKb = (data: string): string =>\n ((data.length * 0.75) / 1024).toFixed(1);\n\n/** Truncate CDP IDs: frameId:363F03EB...EF8 \u2192 frameId:363F\u20265EF8 */\nfunction truncateCdpIds(value: string): string {\n return value.replace(\n /([iI]d:?\"?)([0-9A-F]{32})(?=\"?[,})\\s]|$)/g,\n (_, pre: string, id: string) => `${pre}${id.slice(0, 4)}\u2026${id.slice(-4)}`,\n );\n}\n\n/** Truncate line showing start...end */\nfunction truncateLine(value: string, maxLen: number): string {\n const collapsed = value.replace(/\\s+/g, \" \");\n if (collapsed.length <= maxLen) return collapsed;\n const endLen = Math.floor(maxLen * 0.3);\n const startLen = maxLen - endLen - 1;\n return `${collapsed.slice(0, startLen)}\u2026${collapsed.slice(-endLen)}`;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `'${value}'`;\n if (value == null || typeof value !== \"object\") return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return \"[unserializable]\";\n }\n}\n\nfunction formatArgs(args?: unknown | unknown[]): string {\n if (args === undefined) return \"\";\n return (Array.isArray(args) ? args : [args])\n .filter((e) => e !== undefined)\n .map(formatValue)\n .filter((e) => e.length > 0)\n .join(\", \");\n}\n\nconst shortId = (id: string | null | undefined): string =>\n id ? id.slice(-4) : \"-\";\n\nfunction formatTag(\n label: string | null | undefined,\n id: string | null | undefined,\n icon: string,\n): string {\n return id ? `[${icon} #${shortId(id)}${label ? \" \" + label : \"\"}]` : \"\u2911\";\n}\n\nlet nonce = 0;\nfunction formatTimestamp(): string {\n const d = new Date();\n const pad = (n: number, w = 2) => String(n).padStart(w, \"0\");\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}${pad(nonce++ % 100)}`;\n}\n\nconst SENSITIVE_KEYS =\n /apikey|api_key|key|secret|token|password|passwd|pwd|credential|auth/i;\n\nfunction sanitizeOptions(options: V3Options): Record<string, unknown> {\n const sanitize = (obj: unknown): unknown => {\n if (typeof obj !== \"object\" || obj === null) return obj;\n if (Array.isArray(obj)) return obj.map(sanitize);\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = SENSITIVE_KEYS.test(key) ? \"******\" : sanitize(value);\n }\n return result;\n };\n return sanitize({ ...options }) as Record<string, unknown>;\n}\n\n/** Remove unescaped quotes for cleaner log output */\nfunction removeQuotes(str: string): string {\n return str\n .replace(/([^\\\\])[\"']/g, \"$1\")\n .replace(/^[\"']|[\"']$/g, \"\")\n .trim();\n}\n\n// =============================================================================\n// Pretty Formatting (converts FlowEvent to human-readable log line)\n// =============================================================================\n\nfunction prettifyEvent(event: FlowEvent): string | null {\n const parts: string[] = [];\n\n // Build context tags - always add parent span tags (formatTag returns \u2911 for null IDs)\n if (event.category === \"AgentTask\") {\n parts.push(formatTag(\"\", event.taskId, \"\uD83C\uDD70\"));\n } else if (event.category === \"StagehandStep\") {\n parts.push(formatTag(\"\", event.taskId, \"\uD83C\uDD70\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"\uD83C\uDD82\"));\n } else if (event.category === \"UnderstudyAction\") {\n parts.push(formatTag(\"\", event.taskId, \"\uD83C\uDD70\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"\uD83C\uDD82\"));\n parts.push(formatTag(event.actionLabel, event.actionId, \"\uD83C\uDD84\"));\n } else if (event.category === \"CDP\") {\n parts.push(formatTag(\"\", event.taskId, \"\uD83C\uDD70\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"\uD83C\uDD82\"));\n parts.push(formatTag(event.actionLabel, event.actionId, \"\uD83C\uDD84\"));\n parts.push(formatTag(\"CDP\", event.targetId, \"\uD83C\uDD72\"));\n } else if (event.category === \"LLM\") {\n parts.push(formatTag(\"\", event.taskId, \"\uD83C\uDD70\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"\uD83C\uDD82\"));\n parts.push(formatTag(\"LLM\", event.requestId, \"\uD83E\uDDE0\"));\n }\n\n // Build details based on event type\n let details = \"\";\n const argsStr = event.params ? formatArgs(event.params) : \"\";\n\n if (event.category === \"AgentTask\") {\n if (event.event === \"started\") {\n details = `\u25B7 ${event.method}(${argsStr})`;\n } else if (event.event === \"completed\") {\n const m = event.metrics;\n const durationSec = m?.durationMs\n ? (m.durationMs / 1000).toFixed(1)\n : \"?\";\n const llmStats = `${m?.llmRequests ?? 0} LLM calls \uA71B${m?.inputTokens ?? 0} \uA71C${m?.outputTokens ?? 0} tokens`;\n const cdpStats = `${m?.cdpEvents ?? 0} CDP msgs`;\n details = `\u2713 Agent.execute() DONE in ${durationSec}s | ${llmStats} | ${cdpStats}`;\n }\n } else if (event.category === \"StagehandStep\") {\n if (event.event === \"started\") {\n details = `\u25B7 ${event.method}(${argsStr})`;\n } else if (event.event === \"completed\") {\n const durationSec = event.metrics?.durationMs\n ? (event.metrics.durationMs / 1000).toFixed(2)\n : \"?\";\n details = `\u2713 ${event.stepLabel || \"STEP\"} completed in ${durationSec}s`;\n }\n } else if (event.category === \"UnderstudyAction\") {\n if (event.event === \"started\") {\n details = `\u25B7 ${event.method}(${argsStr})`;\n } else if (event.event === \"completed\") {\n const durationSec = event.metrics?.durationMs\n ? (event.metrics.durationMs / 1000).toFixed(2)\n : \"?\";\n details = `\u2713 ${event.actionLabel || \"ACTION\"} completed in ${durationSec}s`;\n }\n } else if (event.category === \"CDP\") {\n const icon = event.event === \"call\" ? \"\u23F5\" : \"\u23F4\";\n details = `${icon} ${event.method}(${argsStr})`;\n } else if (event.category === \"LLM\") {\n if (event.event === \"request\") {\n const promptStr = event.prompt ? \" \" + String(event.prompt) : \"\";\n details = `${event.model} \u23F4${promptStr}`;\n } else if (event.event === \"response\") {\n const hasTokens =\n event.inputTokens !== undefined || event.outputTokens !== undefined;\n const tokenStr = hasTokens\n ? ` \uA71B${event.inputTokens ?? 0} \uA71C${event.outputTokens ?? 0} |`\n : \"\";\n const outputStr = event.output ? \" \" + String(event.output) : \"\";\n details = `${event.model} \u21B3${tokenStr}${outputStr}`;\n }\n }\n\n if (!details) return null;\n\n // Assemble line and apply final truncation\n const fullLine = `${formatTimestamp()} ${parts.join(\" \")} ${details}`;\n const cleaned = removeQuotes(fullLine);\n const processed =\n event.category === \"CDP\" ? truncateCdpIds(cleaned) : cleaned;\n return truncateLine(processed, MAX_LINE_LENGTH);\n}\n\n/** Check if a CDP event should be filtered from pretty output */\nfunction shouldFilterCdpEvent(event: FlowEvent): boolean {\n if (event.category !== \"CDP\") return false;\n if (event.method?.endsWith(\".enable\") || event.method === \"enable\")\n return true;\n return event.event === \"message\" && NOISY_CDP_EVENTS.has(event.method!);\n}\n\n// =============================================================================\n// Stream Creation\n// =============================================================================\n\nconst isWritable = (s: fs.WriteStream | null): s is fs.WriteStream =>\n !!(s && !s.destroyed && s.writable);\n\nfunction createJsonlStream(ctx: FlowLoggerContext): Writable {\n return new Writable({\n objectMode: true,\n write(chunk: string, _, cb) {\n if (ctx.initialized && isWritable(ctx.fileStreams.jsonl)) {\n ctx.fileStreams.jsonl.write(chunk, cb);\n } else cb();\n },\n });\n}\n\nfunction createPrettyStream(\n ctx: FlowLoggerContext,\n category: EventCategory,\n streamKey: keyof FlowLoggerContext[\"fileStreams\"],\n): Writable {\n return new Writable({\n objectMode: true,\n write(chunk: string, _, cb) {\n const stream = ctx.fileStreams[streamKey];\n if (!ctx.initialized || !isWritable(stream)) return cb();\n try {\n const event = JSON.parse(chunk) as FlowEvent;\n if (event.category !== category || shouldFilterCdpEvent(event))\n return cb();\n const line = prettifyEvent(event);\n if (line) stream.write(line + \"\\n\", cb);\n else cb();\n } catch {\n cb();\n }\n },\n });\n}\n\n// =============================================================================\n// Public Helpers (used by external callers)\n// =============================================================================\n\n/**\n * Get the config directory. Returns empty string if logging is disabled.\n */\nexport function getConfigDir(): string {\n return CONFIG_DIR ? path.resolve(CONFIG_DIR) : \"\";\n}\n\n// =============================================================================\n// Prompt Preview Helpers\n// =============================================================================\n\ntype ContentPart = {\n type?: string;\n text?: string;\n content?: unknown[];\n source?: { data?: string };\n image_url?: { url?: string };\n inlineData?: { data?: string };\n};\n\n/** Extract text and image info from a content array (handles nested tool_result) */\nfunction extractFromContent(\n content: unknown[],\n result: { text?: string; extras: string[] },\n): void {\n for (const part of content) {\n const p = part as ContentPart;\n // Text\n if (!result.text && p.text) {\n result.text = p.type === \"text\" || !p.type ? p.text : undefined;\n }\n // Images - various formats\n if (p.type === \"image\" || p.type === \"image_url\") {\n const url = p.image_url?.url;\n if (url?.startsWith(\"data:\"))\n result.extras.push(`${dataToKb(url)}kb image`);\n else if (p.source?.data)\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n else result.extras.push(\"image\");\n } else if (p.source?.data) {\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n } else if (p.inlineData?.data) {\n result.extras.push(`${dataToKb(p.inlineData.data)}kb image`);\n }\n // Recurse into tool_result content\n if (p.type === \"tool_result\" && Array.isArray(p.content)) {\n extractFromContent(p.content, result);\n }\n }\n}\n\n/** Build final preview string with extras */\nfunction buildPreview(\n text: string | undefined,\n extras: string[],\n maxLen?: number,\n): string | undefined {\n if (!text && extras.length === 0) return undefined;\n let result = text || \"\";\n if (maxLen && result.length > maxLen)\n result = result.slice(0, maxLen) + \"...\";\n if (extras.length > 0) {\n const extrasStr = extras.map((e) => `+{${e}}`).join(\" \");\n result = result ? `${result} ${extrasStr}` : extrasStr;\n }\n return result || undefined;\n}\n\n/**\n * Format a prompt preview from LLM messages for logging.\n * Returns format like: \"some text... +{5.8kb image} +{schema} +{12 tools}\"\n */\nexport function formatLlmPromptPreview(\n messages: Array<{ role: string; content: unknown }>,\n options?: { toolCount?: number; hasSchema?: boolean },\n): string | undefined {\n try {\n const lastUserMsg = messages.filter((m) => m.role === \"user\").pop();\n if (!lastUserMsg) return undefined;\n\n const result = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n if (typeof lastUserMsg.content === \"string\") {\n result.text = lastUserMsg.content;\n } else if (Array.isArray(lastUserMsg.content)) {\n extractFromContent(lastUserMsg.content, result);\n } else {\n return undefined;\n }\n\n // Clean instruction prefix\n if (result.text) {\n result.text = result.text.replace(/^[Ii]nstruction: /, \"\");\n }\n\n if (options?.hasSchema) result.extras.push(\"schema\");\n if (options?.toolCount) result.extras.push(`${options.toolCount} tools`);\n\n return buildPreview(result.text, result.extras);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extract a text preview from CUA-style messages.\n * Accepts various message formats (Anthropic, OpenAI, Google).\n */\nexport function formatCuaPromptPreview(\n messages: unknown[],\n maxLen = 100,\n): string | undefined {\n try {\n const lastMsg = messages\n .filter((m) => {\n const msg = m as { role?: string; type?: string };\n return msg.role === \"user\" || msg.type === \"tool_result\";\n })\n .pop() as\n | { content?: unknown; parts?: unknown[]; text?: string }\n | undefined;\n\n if (!lastMsg) return undefined;\n\n const result = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n if (typeof lastMsg.content === \"string\") {\n result.text = lastMsg.content;\n } else if (typeof lastMsg.text === \"string\") {\n result.text = lastMsg.text;\n } else if (Array.isArray(lastMsg.parts)) {\n extractFromContent(lastMsg.parts, result);\n } else if (Array.isArray(lastMsg.content)) {\n extractFromContent(lastMsg.content, result);\n }\n\n return buildPreview(result.text, result.extras, maxLen);\n } catch {\n return undefined;\n }\n}\n\n/** Format CUA response output for logging */\nexport function formatCuaResponsePreview(\n output: unknown,\n maxLen = 100,\n): string {\n try {\n // Handle Google format or array\n const items: unknown[] =\n (output as { candidates?: [{ content?: { parts?: unknown[] } }] })\n ?.candidates?.[0]?.content?.parts ??\n (Array.isArray(output) ? output : []);\n\n const preview = items\n .map((item) => {\n const i = item as {\n type?: string;\n text?: string;\n name?: string;\n functionCall?: { name?: string };\n };\n if (i.text) return i.text.slice(0, 50);\n if (i.functionCall?.name) return `fn:${i.functionCall.name}`;\n if (i.type === \"tool_use\" && i.name) return `tool_use:${i.name}`;\n return i.type ? `[${i.type}]` : \"[item]\";\n })\n .join(\" \");\n\n return preview.slice(0, maxLen);\n } catch {\n return \"[error]\";\n }\n}\n\n// =============================================================================\n// SessionFileLogger - Main API\n// =============================================================================\n\nexport class SessionFileLogger {\n /**\n * Initialize a new logging context. Call this at the start of a session.\n * If BROWSERBASE_CONFIG_DIR is not set, logging is disabled.\n */\n static init(sessionId: string, v3Options?: V3Options): void {\n const configDir = getConfigDir();\n if (!configDir) return; // Logging disabled\n\n const sessionDir = path.join(configDir, \"sessions\", sessionId);\n\n // Create context with placeholder logger (will be replaced after streams init)\n const ctx: FlowLoggerContext = {\n logger: pino({ level: \"silent\" }), // Placeholder, replaced below\n metrics: {\n llmRequests: 0,\n llmInputTokens: 0,\n llmOutputTokens: 0,\n cdpEvents: 0,\n },\n sessionId,\n sessionDir,\n configDir,\n initPromise: Promise.resolve(),\n initialized: false,\n // Span context - mutable, injected into every log via mixin\n taskId: null,\n stepId: null,\n stepLabel: null,\n actionId: null,\n actionLabel: null,\n fileStreams: {\n agent: null,\n stagehand: null,\n understudy: null,\n cdp: null,\n llm: null,\n jsonl: null,\n },\n };\n\n // Store init promise for awaiting in log methods\n ctx.initPromise = SessionFileLogger.initAsync(ctx, v3Options);\n\n loggerContext.enterWith(ctx);\n }\n\n private static async initAsync(\n ctx: FlowLoggerContext,\n v3Options?: V3Options,\n ): Promise<void> {\n try {\n await fs.promises.mkdir(ctx.sessionDir, { recursive: true });\n\n if (v3Options) {\n const sanitizedOptions = sanitizeOptions(v3Options);\n const sessionJsonPath = path.join(ctx.sessionDir, \"session.json\");\n await fs.promises.writeFile(\n sessionJsonPath,\n JSON.stringify(sanitizedOptions, null, 2),\n \"utf-8\",\n );\n }\n\n // Create symlink to latest session\n const latestLink = path.join(ctx.configDir, \"sessions\", \"latest\");\n try {\n try {\n await fs.promises.unlink(latestLink);\n } catch {\n // Ignore if doesn't exist\n }\n await fs.promises.symlink(ctx.sessionId, latestLink, \"dir\");\n } catch {\n // Symlink creation can fail on Windows or due to permissions\n }\n\n // Create file streams\n const dir = ctx.sessionDir;\n ctx.fileStreams.agent = fs.createWriteStream(\n path.join(dir, \"agent_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.stagehand = fs.createWriteStream(\n path.join(dir, \"stagehand_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.understudy = fs.createWriteStream(\n path.join(dir, \"understudy_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.cdp = fs.createWriteStream(\n path.join(dir, \"cdp_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.llm = fs.createWriteStream(\n path.join(dir, \"llm_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.jsonl = fs.createWriteStream(\n path.join(dir, \"session_events.jsonl\"),\n { flags: \"a\" },\n );\n\n ctx.initialized = true;\n\n // Create pino multistream: JSONL + pretty streams per category\n const streams: pino.StreamEntry[] = [\n { stream: createJsonlStream(ctx) },\n { stream: createPrettyStream(ctx, \"AgentTask\", \"agent\") },\n { stream: createPrettyStream(ctx, \"StagehandStep\", \"stagehand\") },\n { stream: createPrettyStream(ctx, \"UnderstudyAction\", \"understudy\") },\n { stream: createPrettyStream(ctx, \"CDP\", \"cdp\") },\n { stream: createPrettyStream(ctx, \"LLM\", \"llm\") },\n ];\n\n // Create logger with mixin that injects span context from AsyncLocalStorage\n ctx.logger = pino(\n {\n level: \"info\",\n // Mixin adds eventId and current span context to every log\n mixin() {\n const store = loggerContext.getStore();\n return {\n eventId: uuidv7(),\n sessionId: store?.sessionId,\n taskId: store?.taskId,\n stepId: store?.stepId,\n stepLabel: store?.stepLabel,\n actionId: store?.actionId,\n actionLabel: store?.actionLabel,\n };\n },\n },\n pino.multistream(streams),\n );\n } catch {\n // Fail silently\n }\n }\n\n static async close(): Promise<void> {\n const ctx = loggerContext.getStore();\n if (!ctx) return;\n await ctx.initPromise;\n SessionFileLogger.logAgentTaskCompleted();\n await Promise.all(\n Object.values(ctx.fileStreams)\n .filter(Boolean)\n .map((s) => new Promise<void>((r) => s!.end(r))),\n ).catch(() => {});\n }\n\n static get sessionId(): string | null {\n return loggerContext.getStore()?.sessionId ?? null;\n }\n\n static get sessionDir(): string | null {\n return loggerContext.getStore()?.sessionDir ?? null;\n }\n\n /**\n * Get the current logger context object.\n */\n static getContext(): FlowLoggerContext | null {\n return loggerContext.getStore() ?? null;\n }\n\n // ===========================================================================\n // Agent Task Events\n // ===========================================================================\n\n /**\n * Start a new task and log it.\n */\n static logAgentTaskStarted({\n invocation,\n args,\n }: {\n invocation: string;\n args?: unknown | unknown[];\n }): void {\n const ctx = loggerContext.getStore();\n if (!ctx) return;\n\n // Set up task context\n ctx.taskId = uuidv7();\n ctx.stepId = null;\n ctx.stepLabel = null;\n ctx.actionId = null;\n ctx.actionLabel = null;\n\n // Reset metrics for new task\n ctx.metrics = {\n taskStartTime: Date.now(),\n llmRequests: 0,\n llmInputTokens: 0,\n llmOutputTokens: 0,\n cdpEvents: 0,\n };\n\n ctx.logger.info({\n category: \"AgentTask\",\n event: \"started\",\n method: invocation,\n params: args,\n } as FlowEvent);\n }\n\n /**\n * Log task completion with metrics summary.\n */\n static logAgentTaskCompleted(options?: { cacheHit?: boolean }): void {\n const ctx = loggerContext.getStore();\n if (!ctx || !ctx.metrics.taskStartTime) return;\n\n const durationMs = Date.now() - ctx.metrics.taskStartTime;\n\n const event: Partial<FlowEvent> = {\n category: \"AgentTask\",\n event: \"completed\",\n method: \"Agent.execute\",\n metrics: {\n durationMs,\n llmRequests: ctx.metrics.llmRequests,\n inputTokens: ctx.metrics.llmInputTokens,\n outputTokens: ctx.metrics.llmOutputTokens,\n cdpEvents: ctx.metrics.cdpEvents,\n },\n };\n\n if (options?.cacheHit) {\n event.msg = \"CACHE HIT, NO LLM NEEDED\";\n }\n\n ctx.logger.info(event);\n\n // Clear task context\n ctx.taskId = null;\n ctx.stepId = null;\n ctx.stepLabel = null;\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.taskStartTime = undefined;\n }\n\n // ===========================================================================\n // Stagehand Step Events\n // ===========================================================================\n\n static logStagehandStepEvent({\n invocation,\n args,\n label,\n }: {\n invocation: string;\n args?: unknown | unknown[];\n label: string;\n }): string {\n const ctx = loggerContext.getStore();\n if (!ctx) return uuidv7();\n\n // Set up step context\n ctx.stepId = uuidv7();\n ctx.stepLabel = label.toUpperCase();\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.stepStartTime = Date.now();\n\n ctx.logger.info({\n category: \"StagehandStep\",\n event: \"started\",\n method: invocation,\n params: args,\n } as FlowEvent);\n\n return ctx.stepId;\n }\n\n static logStagehandStepCompleted(): void {\n const ctx = loggerContext.getStore();\n if (!ctx || !ctx.stepId) return;\n\n const durationMs = ctx.metrics.stepStartTime\n ? Date.now() - ctx.metrics.stepStartTime\n : 0;\n\n ctx.logger.info({\n category: \"StagehandStep\",\n event: \"completed\",\n metrics: { durationMs },\n } as FlowEvent);\n\n // Clear step context\n ctx.stepId = null;\n ctx.stepLabel = null;\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.stepStartTime = undefined;\n }\n\n // ===========================================================================\n // Understudy Action Events\n // ===========================================================================\n\n static logUnderstudyActionEvent({\n actionType,\n target,\n args,\n }: {\n actionType: string;\n target?: string;\n args?: unknown | unknown[];\n }): string {\n const ctx = loggerContext.getStore();\n if (!ctx) return uuidv7();\n\n // Set up action context\n ctx.actionId = uuidv7();\n ctx.actionLabel = actionType\n .toUpperCase()\n .replace(\"UNDERSTUDY.\", \"\")\n .replace(\"PAGE.\", \"\");\n ctx.metrics.actionStartTime = Date.now();\n\n const params: Record<string, unknown> = {};\n if (target) params.target = target;\n if (args) params.args = args;\n\n ctx.logger.info({\n category: \"UnderstudyAction\",\n event: \"started\",\n method: actionType,\n params: Object.keys(params).length > 0 ? params : undefined,\n } as FlowEvent);\n\n return ctx.actionId;\n }\n\n static logUnderstudyActionCompleted(): void {\n const ctx = loggerContext.getStore();\n if (!ctx || !ctx.actionId) return;\n\n const durationMs = ctx.metrics.actionStartTime\n ? Date.now() - ctx.metrics.actionStartTime\n : 0;\n\n ctx.logger.info({\n category: \"UnderstudyAction\",\n event: \"completed\",\n metrics: { durationMs },\n } as FlowEvent);\n\n // Clear action context\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.actionStartTime = undefined;\n }\n\n // ===========================================================================\n // CDP Events\n // ===========================================================================\n\n private static logCdpEvent(\n eventType: \"call\" | \"message\",\n {\n method,\n params,\n targetId,\n }: { method: string; params?: unknown; targetId?: string | null },\n explicitCtx?: FlowLoggerContext | null,\n ): void {\n const ctx = explicitCtx ?? loggerContext.getStore();\n if (!ctx) return;\n if (eventType === \"call\") ctx.metrics.cdpEvents++;\n ctx.logger.info({\n category: \"CDP\",\n event: eventType,\n method,\n params,\n targetId,\n } as FlowEvent);\n }\n\n static logCdpCallEvent(\n data: { method: string; params?: object; targetId?: string | null },\n ctx?: FlowLoggerContext | null,\n ): void {\n SessionFileLogger.logCdpEvent(\"call\", data, ctx);\n }\n\n static logCdpMessageEvent(\n data: { method: string; params?: unknown; targetId?: string | null },\n ctx?: FlowLoggerContext | null,\n ): void {\n SessionFileLogger.logCdpEvent(\"message\", data, ctx);\n }\n\n // ===========================================================================\n // LLM Events\n // ===========================================================================\n\n static logLlmRequest(\n {\n requestId,\n model,\n prompt,\n }: {\n requestId: string;\n model: string;\n operation: string;\n prompt?: string;\n },\n explicitCtx?: FlowLoggerContext | null,\n ): void {\n const ctx = explicitCtx ?? loggerContext.getStore();\n if (!ctx) return;\n\n // Track LLM requests for task metrics\n ctx.metrics.llmRequests++;\n\n ctx.logger.info({\n category: \"LLM\",\n event: \"request\",\n requestId,\n method: \"LLM.request\",\n model,\n prompt,\n });\n }\n\n static logLlmResponse(\n {\n requestId,\n model,\n output,\n inputTokens,\n outputTokens,\n }: {\n requestId: string;\n model: string;\n operation: string;\n output?: string;\n inputTokens?: number;\n outputTokens?: number;\n },\n explicitCtx?: FlowLoggerContext | null,\n ): void {\n const ctx = explicitCtx ?? loggerContext.getStore();\n if (!ctx) return;\n\n // Track tokens for task metrics\n ctx.metrics.llmInputTokens += inputTokens ?? 0;\n ctx.metrics.llmOutputTokens += outputTokens ?? 0;\n\n ctx.logger.info({\n category: \"LLM\",\n event: \"response\",\n requestId,\n method: \"LLM.response\",\n model,\n output,\n inputTokens,\n outputTokens,\n });\n }\n\n // ===========================================================================\n // LLM Logging Middleware\n // ===========================================================================\n\n /**\n * Create middleware for wrapping language models with LLM call logging.\n * Returns a no-op middleware when logging is disabled.\n */\n static createLlmLoggingMiddleware(\n modelId: string,\n ): Pick<LanguageModelMiddleware, \"wrapGenerate\"> {\n // No-op middleware when logging is disabled\n if (!CONFIG_DIR) {\n return {\n wrapGenerate: async ({ doGenerate }) => doGenerate(),\n };\n }\n\n return {\n wrapGenerate: async ({ doGenerate, params }) => {\n const ctx = SessionFileLogger.getContext();\n // Skip logging overhead if no context (shouldn't happen but be safe)\n if (!ctx) {\n return doGenerate();\n }\n const llmRequestId = uuidv7();\n const toolCount = Array.isArray(params.tools) ? params.tools.length : 0;\n\n // Extract prompt preview from last non-system message\n const messages = (params.prompt ?? []) as Array<{\n role?: string;\n content?: unknown;\n }>;\n const lastMsg = messages.filter((m) => m.role !== \"system\").pop();\n const extracted = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n let rolePrefix = lastMsg?.role ?? \"?\";\n if (lastMsg) {\n if (typeof lastMsg.content === \"string\") {\n extracted.text = lastMsg.content;\n } else if (Array.isArray(lastMsg.content)) {\n // Check for tool-result first\n const toolResult = (\n lastMsg.content as Array<{\n type?: string;\n toolName?: string;\n output?: { type?: string; value?: unknown };\n }>\n ).find((p) => p.type === \"tool-result\");\n if (toolResult) {\n rolePrefix = `tool result: ${toolResult.toolName}()`;\n const out = toolResult.output;\n if (out?.type === \"json\" && out.value) {\n extracted.text = JSON.stringify(out.value).slice(0, 150);\n } else if (Array.isArray(out?.value)) {\n extractFromContent(out.value as unknown[], extracted);\n }\n } else {\n extractFromContent(lastMsg.content as unknown[], extracted);\n }\n }\n }\n\n const promptText = extracted.text || \"(no text)\";\n const promptPreview = `${rolePrefix}: ${promptText} +{${toolCount} tools}`;\n\n SessionFileLogger.logLlmRequest(\n {\n requestId: llmRequestId,\n model: modelId,\n operation: \"generateText\",\n prompt: promptPreview,\n },\n ctx,\n );\n\n const result = await doGenerate();\n\n // Extract output preview\n const res = result as {\n text?: string;\n content?: unknown;\n toolCalls?: unknown[];\n };\n let outputPreview = res.text || \"\";\n if (!outputPreview && res.content) {\n if (typeof res.content === \"string\") {\n outputPreview = res.content;\n } else if (Array.isArray(res.content)) {\n outputPreview = (\n res.content as Array<{\n type?: string;\n text?: string;\n toolName?: string;\n }>\n )\n .map(\n (c) =>\n c.text ||\n (c.type === \"tool-call\"\n ? `tool call: ${c.toolName}()`\n : `[${c.type}]`),\n )\n .join(\" \");\n }\n }\n if (!outputPreview && res.toolCalls?.length) {\n outputPreview = `[${res.toolCalls.length} tool calls]`;\n }\n\n SessionFileLogger.logLlmResponse(\n {\n requestId: llmRequestId,\n model: modelId,\n operation: \"generateText\",\n output: outputPreview || \"[empty]\",\n inputTokens: result.usage?.inputTokens,\n outputTokens: result.usage?.outputTokens,\n },\n ctx,\n );\n\n return result;\n },\n };\n }\n}\n\n/**\n * Method decorator for logging understudy actions with automatic start/complete.\n * Logs all arguments automatically. No-op when CONFIG_DIR is empty.\n */\nexport function logAction(actionType: string) {\n return function <T extends (...args: never[]) => Promise<unknown>>(\n originalMethod: T,\n ): T {\n // No-op when logging is disabled\n if (!CONFIG_DIR) {\n return originalMethod;\n }\n\n return async function (this: unknown, ...args: unknown[]) {\n SessionFileLogger.logUnderstudyActionEvent({\n actionType,\n args: args.length > 0 ? args : undefined,\n });\n\n try {\n return await originalMethod.apply(this, args as never[]);\n } finally {\n SessionFileLogger.logUnderstudyActionCompleted();\n }\n } as T;\n };\n}\n\n/**\n * Method decorator for logging Stagehand step events (act, extract, observe).\n * Only adds logging - does NOT wrap with withInstanceLogContext (caller handles that).\n * No-op when CONFIG_DIR is empty.\n */\nexport function logStagehandStep(invocation: string, label: string) {\n return function <T extends (...args: never[]) => Promise<unknown>>(\n originalMethod: T,\n ): T {\n // No-op when logging is disabled\n if (!CONFIG_DIR) {\n return originalMethod;\n }\n\n return async function (\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n SessionFileLogger.logStagehandStepEvent({\n invocation,\n args: args.length > 0 ? args : undefined,\n label,\n });\n\n try {\n return await originalMethod.apply(this, args as never[]);\n } finally {\n SessionFileLogger.logStagehandStepCompleted();\n }\n } as T;\n };\n}\n", "import { LLMTool } from \"../types/public/model.js\";\nimport {\n embed,\n embedMany,\n experimental_generateImage,\n experimental_generateSpeech,\n experimental_transcribe,\n generateObject,\n generateText,\n streamObject,\n streamText,\n} from \"ai\";\nimport type { LanguageModelV2 } from \"@ai-sdk/provider\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { AvailableModel, ClientOptions } from \"../types/public/model.js\";\nimport type { StagehandZodSchema } from \"../zodCompat.js\";\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: ChatMessageContent;\n}\n\nexport type ChatMessageContent =\n | string\n | (ChatMessageImageContent | ChatMessageTextContent)[];\n\nexport interface ChatMessageImageContent {\n type: string;\n image_url?: { url: string };\n text?: string;\n source?: {\n type: string;\n media_type: string;\n data: string;\n };\n}\n\nexport interface ChatMessageTextContent {\n type: string;\n text: string;\n}\n\nexport const AnnotatedScreenshotText =\n \"This is a screenshot of the current page state with the elements annotated on it. Each element id is annotated with a number to the top left of it. Duplicate annotations at the same location are under each other vertically.\";\n\nexport interface ChatCompletionOptions {\n messages: ChatMessage[];\n temperature?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n image?: {\n buffer: Buffer;\n description?: string;\n };\n response_model?: {\n name: string;\n schema: StagehandZodSchema;\n };\n tools?: LLMTool[];\n tool_choice?: \"auto\" | \"none\" | \"required\";\n maxOutputTokens?: number;\n requestId?: string;\n}\n\nexport type LLMResponse = {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: {\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls: {\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }[];\n };\n finish_reason: string;\n }[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n};\n\nexport interface CreateChatCompletionOptions {\n options: ChatCompletionOptions;\n logger: (message: LogLine) => void;\n retries?: number;\n}\n\n/** Simple usage shape if your LLM returns usage tokens. */\nexport interface LLMUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n}\n\n/**\n * For calls that use a schema: the LLMClient may return { data: T; usage?: LLMUsage }\n */\nexport interface LLMParsedResponse<T> {\n data: T;\n usage?: LLMUsage;\n}\n\nexport abstract class LLMClient {\n public type: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {});\n public modelName: AvailableModel | (string & {});\n public hasVision: boolean;\n public clientOptions: ClientOptions;\n public userProvidedInstructions?: string;\n\n constructor(modelName: AvailableModel, userProvidedInstructions?: string) {\n this.modelName = modelName;\n this.userProvidedInstructions = userProvidedInstructions;\n }\n\n // Overload 1: When response_model is provided, returns LLMParsedResponse<T>\n abstract createChatCompletion<T>(\n options: CreateChatCompletionOptions & {\n options: {\n response_model: { name: string; schema: StagehandZodSchema };\n };\n },\n ): Promise<LLMParsedResponse<T>>;\n\n // Overload 2: When response_model is not provided, returns T (defaults to LLMResponse)\n abstract createChatCompletion<T = LLMResponse>(\n options: CreateChatCompletionOptions,\n ): Promise<T>;\n\n public generateObject = generateObject;\n public generateText = generateText;\n public streamText = streamText;\n public streamObject = streamObject;\n public generateImage = experimental_generateImage;\n public embed = embed;\n public embedMany = embedMany;\n public transcribe = experimental_transcribe;\n public generateSpeech = experimental_generateSpeech;\n\n getLanguageModel?(): LanguageModelV2;\n}\n", "import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n ToolSet,\n ModelMessage,\n wrapLanguageModel,\n StreamTextResult,\n StepResult,\n PrepareStepFunction,\n GenerateTextOnStepFinishCallback,\n StreamTextOnStepFinishCallback,\n StreamTextOnErrorCallback,\n StreamTextOnChunkCallback,\n StreamTextOnFinishCallback,\n} from \"ai\";\nimport { LogLine } from \"./logs.js\";\nimport { ClientOptions } from \"./model.js\";\nimport { StagehandZodObject } from \"../../zodCompat.js\";\n\n// Re-export ModelMessage for consumers who want to use it for conversation continuation\nexport type { ModelMessage } from \"ai\";\n\n// Re-export Tool type for consumers who want to define custom tools\nexport type { Tool } from \"ai\";\nimport { Page as PlaywrightPage } from \"playwright-core\";\nimport { Page as PuppeteerPage } from \"puppeteer-core\";\nimport { Page as PatchrightPage } from \"patchright-core\";\nimport { Page } from \"../../understudy/page.js\";\n\nexport interface AgentContext {\n options: AgentExecuteOptionsBase;\n maxSteps: number;\n systemPrompt: string;\n allTools: ToolSet;\n messages: ModelMessage[];\n wrappedModel: ReturnType<typeof wrapLanguageModel>;\n initialPageUrl: string;\n}\n\nexport interface AgentState {\n collectedReasoning: string[];\n actions: AgentAction[];\n finalMessage: string;\n completed: boolean;\n currentPageUrl: string;\n}\n\nexport interface AgentAction {\n type: string;\n reasoning?: string;\n taskCompleted?: boolean;\n action?: string;\n // Tool-specific fields\n timeMs?: number; // wait tool\n pageText?: string; // ariaTree tool\n pageUrl?: string; // ariaTree tool\n instruction?: string; // various tools\n [key: string]: unknown;\n}\n\nexport interface AgentResult {\n success: boolean;\n message: string;\n actions: AgentAction[];\n completed: boolean;\n metadata?: Record<string, unknown>;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n };\n /**\n * The conversation messages from this execution.\n * Pass these to a subsequent execute() call via the `messages` option to continue the conversation.\n * @experimental\n */\n messages?: ModelMessage[];\n /**\n * Custom output data extracted based on the `output` schema provided in execute options.\n * Only populated if an `output` schema was provided.\n * @experimental\n */\n output?: Record<string, unknown>;\n}\n\nexport type AgentStreamResult = StreamTextResult<ToolSet, never> & {\n result: Promise<AgentResult>;\n};\n\n/**\n * Base callbacks shared between execute (non-streaming) and streaming modes.\n */\nexport interface AgentCallbacks {\n /**\n * Optional function called before each step to modify settings.\n * You can change the model, tool choices, active tools, system prompt,\n * and input messages for each step.\n */\n prepareStep?: PrepareStepFunction<ToolSet>;\n /**\n * Callback called when each step (LLM call) is finished.\n * This is called for intermediate steps as well as the final step.\n */\n onStepFinish?:\n | GenerateTextOnStepFinishCallback<ToolSet>\n | StreamTextOnStepFinishCallback<ToolSet>;\n}\n\n/**\n * Error message type for streaming-only callbacks used in non-streaming mode.\n * This provides a clear error message when users try to use streaming callbacks without stream: true.\n */\ntype StreamingCallbackNotAvailable =\n \"This callback requires 'stream: true' in AgentConfig. Set stream: true to use streaming callbacks like onChunk, onFinish, onError, and onAbort.\";\n\n/**\n * Error message for safety confirmation callback misuse.\n * Safety confirmations are only available for non-streaming CUA agent executions.\n */\ntype SafetyConfirmationCallbackNotAvailable =\n \"Safety confirmation callbacks are only available via non-streaming AgentExecuteOptions.callbacks when using mode: 'cua'.\";\n\n/**\n * Callbacks specific to the non-streaming execute method.\n */\nexport interface AgentExecuteCallbacks extends AgentCallbacks {\n /**\n * Callback called when each step (LLM call) is finished.\n */\n onStepFinish?: GenerateTextOnStepFinishCallback<ToolSet>;\n /**\n * Callback for handling safety confirmation requests from CUA providers.\n * Only available when running an agent configured with mode: \"cua\".\n */\n onSafetyConfirmation?: SafetyConfirmationHandler;\n\n /**\n * NOT AVAILABLE in non-streaming mode.\n * This callback requires `stream: true` in AgentConfig.\n *\n * @example\n * ```typescript\n * // Enable streaming to use onChunk:\n * const agent = stagehand.agent({ stream: true });\n * await agent.execute({\n * instruction: \"...\",\n * callbacks: { onChunk: async (chunk) => console.log(chunk) }\n * });\n * ```\n */\n onChunk?: StreamingCallbackNotAvailable;\n\n /**\n * NOT AVAILABLE in non-streaming mode.\n * This callback requires `stream: true` in AgentConfig.\n *\n * @example\n * ```typescript\n * // Enable streaming to use onFinish:\n * const agent = stagehand.agent({ stream: true });\n * await agent.execute({\n * instruction: \"...\",\n * callbacks: { onFinish: (event) => console.log(\"Done!\", event) }\n * });\n * ```\n */\n onFinish?: StreamingCallbackNotAvailable;\n\n /**\n * NOT AVAILABLE in non-streaming mode.\n * This callback requires `stream: true` in AgentConfig.\n *\n * @example\n * ```typescript\n * // Enable streaming to use onError:\n * const agent = stagehand.agent({ stream: true });\n * await agent.execute({\n * instruction: \"...\",\n * callbacks: { onError: ({ error }) => console.error(error) }\n * });\n * ```\n */\n onError?: StreamingCallbackNotAvailable;\n\n /**\n * NOT AVAILABLE in non-streaming mode.\n * This callback requires `stream: true` in AgentConfig.\n *\n * @example\n * ```typescript\n * // Enable streaming to use onAbort:\n * const agent = stagehand.agent({ stream: true });\n * await agent.execute({\n * instruction: \"...\",\n * callbacks: { onAbort: (event) => console.log(\"Aborted\", event.steps) }\n * });\n * ```\n */\n onAbort?: StreamingCallbackNotAvailable;\n}\n\n/**\n * Callbacks specific to the streaming mode.\n */\nexport interface AgentStreamCallbacks extends AgentCallbacks {\n /**\n * Callback called when each step (LLM call) is finished during streaming.\n */\n onStepFinish?: StreamTextOnStepFinishCallback<ToolSet>;\n /**\n * Callback called when an error occurs during streaming.\n * Use this to log errors or handle error states.\n */\n onError?: StreamTextOnErrorCallback;\n /**\n * Callback called for each chunk of the stream.\n * Stream processing will pause until the callback promise resolves.\n */\n onChunk?: StreamTextOnChunkCallback<ToolSet>;\n /**\n * Callback called when the stream finishes.\n */\n onFinish?: StreamTextOnFinishCallback<ToolSet>;\n /**\n * Callback called when the stream is aborted.\n */\n onAbort?: (event: {\n steps: Array<StepResult<ToolSet>>;\n }) => PromiseLike<void> | void;\n /**\n * NOT AVAILABLE in streaming mode.\n * Safety confirmations currently require non-streaming execute() on CUA agents.\n */\n onSafetyConfirmation?: SafetyConfirmationCallbackNotAvailable;\n}\n\n/**\n * Base options for agent execution (without callbacks).\n */\nexport interface AgentExecuteOptionsBase {\n instruction: string;\n maxSteps?: number;\n page?: PlaywrightPage | PuppeteerPage | PatchrightPage | Page;\n highlightCursor?: boolean;\n /**\n * Previous conversation messages to continue from.\n * Pass the `messages` from a previous AgentResult to continue that conversation.\n * @experimental\n */\n messages?: ModelMessage[];\n /**\n * An AbortSignal that can be used to cancel the agent execution.\n * When aborted, the agent will stop and return a partial result.\n * @experimental\n *\n * @example\n * ```typescript\n * const controller = new AbortController();\n * setTimeout(() => controller.abort(), 30000); // 30 second timeout\n *\n * const result = await agent.execute({\n * instruction: \"...\",\n * signal: controller.signal\n * });\n * ```\n */\n signal?: AbortSignal;\n /**\n * Tools to exclude from this execution.\n * Pass an array of tool names to prevent the agent from using those tools.\n *\n * **Note:** Not supported in CUA mode (`mode: \"cua\"`).\n *\n * **Available tools by mode:**\n *\n * **DOM mode (default):**\n * - `act` - Perform semantic actions (click, type, etc.)\n * - `fillForm` - Fill form fields using DOM selectors\n * - `ariaTree` - Get accessibility tree of the page\n * - `extract` - Extract structured data from page\n * - `goto` - Navigate to a URL\n * - `scroll` - Scroll using semantic directions (up/down/left/right)\n * - `keys` - Press keyboard keys\n * - `navback` - Navigate back in history\n * - `screenshot` - Take a screenshot\n * - `think` - Agent reasoning/planning step\n * - `wait` - Wait for time or condition\n * - `done` - Mark task as complete\n * - `search` - Web search (requires BRAVE_API_KEY)\n *\n * **Hybrid mode:**\n * - `click` - Click at specific coordinates\n * - `type` - Type text at coordinates\n * - `dragAndDrop` - Drag from one point to another\n * - `clickAndHold` - Click and hold at coordinates\n * - `fillFormVision` - Fill forms using vision/coordinates\n * - `act` - Perform semantic actions\n * - `ariaTree` - Get accessibility tree\n * - `extract` - Extract data from page\n * - `goto` - Navigate to URL\n * - `scroll` - Scroll using coordinates\n * - `keys` - Press keyboard keys\n * - `navback` - Navigate back\n * - `screenshot` - Take screenshot\n * - `think` - Agent reasoning step\n * - `wait` - Wait for time/condition\n * - `done` - Mark task complete\n * - `search` - Web search (requires BRAVE_API_KEY)\n *\n * @experimental\n * @example\n * ```typescript\n * // Exclude screenshot and extract tools\n * const result = await agent.execute({\n * instruction: \"Click the submit button\",\n * excludeTools: [\"screenshot\", \"extract\"]\n * });\n * ```\n */\n excludeTools?: string[];\n /**\n * A Zod schema defining custom output data to return when the task completes.\n * The agent will populate this data in the final done tool call.\n *\n * @experimental\n * @example\n * ```typescript\n * const result = await agent.execute({\n * instruction: \"Find the cheapest flight from NYC to LA\",\n * output: z.object({\n * price: z.string().describe(\"The price of the flight\"),\n * airline: z.string().describe(\"The airline name\"),\n * departureTime: z.string().describe(\"Departure time\"),\n * }),\n * });\n *\n * console.log(result.output); // { price: \"$199\", airline: \"Delta\", departureTime: \"8:00 AM\" }\n * ```\n */\n output?: StagehandZodObject;\n}\n\n/**\n * Options for non-streaming agent execution.\n * Only accepts AgentExecuteCallbacks (no streaming-specific callbacks like onChunk, onFinish).\n */\nexport interface AgentExecuteOptions extends AgentExecuteOptionsBase {\n /**\n * Callbacks for non-streaming agent execution.\n * For streaming callbacks (onChunk, onFinish, onError, onAbort), use stream: true in AgentConfig.\n */\n callbacks?: AgentExecuteCallbacks;\n}\n\n/**\n * Options for streaming agent execution.\n * Accepts AgentStreamCallbacks including onChunk, onFinish, onError, and onAbort.\n */\nexport interface AgentStreamExecuteOptions extends AgentExecuteOptionsBase {\n /**\n * Callbacks for streaming agent execution.\n * Includes streaming-specific callbacks: onChunk, onFinish, onError, onAbort.\n */\n callbacks?: AgentStreamCallbacks;\n}\nexport type AgentType = \"openai\" | \"anthropic\" | \"google\" | \"microsoft\";\n\nexport const AVAILABLE_CUA_MODELS = [\n \"openai/computer-use-preview\",\n \"openai/computer-use-preview-2025-03-11\",\n \"anthropic/claude-3-7-sonnet-latest\",\n \"anthropic/claude-opus-4-5-20251101\",\n \"anthropic/claude-opus-4-6\",\n \"anthropic/claude-haiku-4-5-20251001\",\n \"anthropic/claude-sonnet-4-20250514\",\n \"anthropic/claude-sonnet-4-5-20250929\",\n \"google/gemini-2.5-computer-use-preview-10-2025\",\n \"google/gemini-3-flash-preview\",\n \"google/gemini-3-pro-preview\",\n \"microsoft/fara-7b\",\n] as const;\nexport type AvailableCuaModel = (typeof AVAILABLE_CUA_MODELS)[number];\n\nexport interface AgentExecutionOptions<\n TOptions extends AgentExecuteOptions = AgentExecuteOptions,\n> {\n options: TOptions;\n logger: (message: LogLine) => void;\n retries?: number;\n}\n\nexport interface AgentHandlerOptions {\n modelName: string;\n clientOptions?: ClientOptions;\n userProvidedInstructions?: string;\n experimental?: boolean;\n}\n\nexport interface ActionExecutionResult {\n success: boolean;\n error?: string;\n data?: unknown;\n}\n\n/**\n * Represents a safety check that requires user confirmation before proceeding.\n * These are issued by CUA providers (OpenAI, Google) when the agent attempts\n * potentially risky actions.\n */\nexport interface SafetyCheck {\n /** Unique identifier for this safety check */\n id: string;\n /** Code identifying the type of safety concern */\n code: string;\n /** Human-readable description of the safety concern */\n message: string;\n}\n\n/**\n * Response from the user for a safety confirmation request.\n */\nexport interface SafetyConfirmationResponse {\n /** Whether the user acknowledged/approved the safety checks */\n acknowledged: boolean;\n}\n\n/**\n * Callback for handling safety confirmation requests.\n * Called when the CUA provider issues safety checks that require user confirmation.\n * The callback should return a promise that resolves when the user has made a decision.\n *\n * @param safetyChecks - Array of safety checks requiring confirmation\n * @returns Promise resolving to the user's response\n *\n * @example\n * ```typescript\n * const agent = stagehand.agent({\n * mode: \"cua\",\n * });\n * await agent.execute({\n * instruction: \"...\",\n * callbacks: {\n * onSafetyConfirmation: async (checks) => {\n * console.log(\"Safety checks:\", checks);\n * const userApproved = await showConfirmationDialog(checks);\n * return { acknowledged: userApproved };\n * },\n * },\n * });\n * ```\n */\nexport type SafetyConfirmationHandler = (\n safetyChecks: SafetyCheck[],\n) => Promise<SafetyConfirmationResponse>;\n\n// Anthropic types:\n\nexport interface ToolUseItem extends ResponseItem {\n type: \"tool_use\";\n id: string; // This is the correct property name from Anthropic's API\n name: string; // Name of the tool being used\n input: Record<string, unknown>;\n}\n\nexport interface AnthropicMessage {\n role: string;\n content: string | Array<AnthropicContentBlock>;\n}\n\nexport interface AnthropicContentBlock {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface AnthropicTextBlock extends AnthropicContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicToolResult {\n type: \"tool_result\";\n tool_use_id: string;\n content: string | Array<AnthropicContentBlock>;\n}\n\n// OpenAI types:\n\nexport interface ResponseItem {\n type: string;\n id: string;\n [key: string]: unknown;\n}\n\nexport interface ComputerCallItem extends ResponseItem {\n type: \"computer_call\";\n call_id: string;\n action: {\n type: string;\n [key: string]: unknown;\n };\n pending_safety_checks?: Array<{\n id: string;\n code: string;\n message: string;\n }>;\n}\n\nexport interface FunctionCallItem extends ResponseItem {\n type: \"function_call\";\n call_id: string;\n name: string;\n arguments: string;\n}\n\nexport type ResponseInputItem =\n | { role: string; content: string }\n | {\n type: \"computer_call_output\";\n call_id: string;\n output:\n | {\n type: \"input_image\";\n image_url: string;\n current_url?: string;\n error?: string;\n [key: string]: unknown;\n }\n | string;\n acknowledged_safety_checks?: Array<{\n id: string;\n code: string;\n message: string;\n }>;\n }\n | {\n type: \"function_call_output\";\n call_id: string;\n output: string;\n };\n\nexport interface AgentInstance {\n execute: (\n instructionOrOptions: string | AgentExecuteOptions,\n ) => Promise<AgentResult>;\n}\n\nexport type AgentProviderType = AgentType;\n\nexport type AgentModelConfig<TModelName extends string = string> = {\n modelName: TModelName;\n} & Record<string, unknown>;\n\n/**\n * Agent tool mode determines which set of tools are available to the agent.\n * - 'dom': Uses DOM-based tools (act, fillForm) - better for structured page interactions\n * - 'hybrid': Uses coordinate-based tools (click, type, dragAndDrop, etc.) - better for visual/screenshot-based interactions\n * - 'cua': Uses Computer Use Agent (CUA) providers like Anthropic Claude or Google Gemini for screenshot-based automation\n */\nexport type AgentToolMode = \"dom\" | \"hybrid\" | \"cua\";\n\nexport type AgentConfig = {\n /**\n * Custom system prompt to provide to the agent. Overrides the default system prompt.\n */\n systemPrompt?: string;\n /**\n * MCP integrations - Array of Client objects\n */\n integrations?: (Client | string)[];\n /**\n * Tools passed to the agent client\n */\n tools?: ToolSet;\n /**\n * @deprecated Use `mode: \"cua\"` instead. This option will be removed in a future version.\n * Enables Computer Use Agent (CUA) mode.\n */\n cua?: boolean;\n /**\n * The model to use for agent functionality\n */\n model?: string | AgentModelConfig<string>;\n /**\n * The model to use for tool execution (observe/act calls within agent tools).\n * If not specified, inherits from the main model configuration.\n * Format: \"provider/model\" (e.g., \"openai/gpt-4o-mini\", \"google/gemini-2.0-flash-exp\")\n */\n executionModel?: string | AgentModelConfig<string>;\n /**\n * Enable streaming mode for the agent.\n * When true, execute() returns AgentStreamResult with textStream for incremental output.\n * When false (default), execute() returns AgentResult after completion.\n */\n stream?: boolean;\n /**\n * Tool mode for the agent. Determines which set of tools are available.\n * - 'dom' (default): Uses DOM-based tools (act, fillForm) for structured interactions\n * - 'hybrid': Uses coordinate-based tools (click, type, dragAndDrop, clickAndHold, fillFormVision)\n * for visual/screenshot-based interactions\n * - 'cua': Uses Computer Use Agent (CUA) providers for screenshot-based automation\n */\n mode?: AgentToolMode;\n};\n\n/**\n * Agent instance returned when stream: true is set in AgentConfig.\n * execute() returns a streaming result that can be consumed incrementally.\n * Accepts AgentStreamExecuteOptions with streaming-specific callbacks.\n */\nexport interface StreamingAgentInstance {\n execute: (\n instructionOrOptions: string | AgentStreamExecuteOptions,\n ) => Promise<AgentStreamResult>;\n}\n\n/**\n * Agent instance returned when stream is false or not set in AgentConfig.\n * execute() returns a result after the agent completes.\n * Accepts AgentExecuteOptions with non-streaming callbacks only.\n */\nexport interface NonStreamingAgentInstance {\n execute: (\n instructionOrOptions: string | AgentExecuteOptions,\n ) => Promise<AgentResult>;\n}\n\n// =============================================================================\n// Vision Action Tool Result Types\n// =============================================================================\n\n/**\n * Content item type for toModelOutput return values.\n * Used in tool definitions to return text and/or media to the model.\n */\nexport type ModelOutputContentItem =\n | { type: \"text\"; text: string }\n | { type: \"media\"; mediaType: string; data: string };\n\nexport interface ClickToolResult {\n success: boolean;\n describe?: string;\n coordinates?: number[];\n error?: string;\n screenshotBase64?: string;\n}\n\nexport interface TypeToolResult {\n success: boolean;\n describe?: string;\n text?: string;\n error?: string;\n screenshotBase64?: string;\n}\n\nexport interface DragAndDropToolResult {\n success: boolean;\n describe?: string;\n error?: string;\n screenshotBase64?: string;\n}\n\nexport interface FillFormField {\n action: string;\n value: string;\n coordinates: { x: number; y: number };\n}\n\nexport interface FillFormVisionToolResult {\n success: boolean;\n playwrightArguments?: FillFormField[];\n error?: string;\n screenshotBase64?: string;\n}\n\nexport interface ScrollToolResult {\n success: boolean;\n message: string;\n scrolledPixels: number;\n}\n\nexport interface ScrollVisionToolResult extends ScrollToolResult {\n screenshotBase64?: string;\n}\n\nexport interface WaitToolResult {\n success: boolean;\n waited: number;\n screenshotBase64?: string;\n}\n", "/**\n * Centralized Zod schemas for Stagehand Server API\n *\n * Naming conventions:\n * - `*RequestSchema` - Request body schemas (zod4), `*Request` is the inferred type\n * - `*ResultSchema` - Inner response data (unwrapped), `*Result` is the inferred type\n * - `*ResponseSchema` - Full response with success wrapper: { success: true, data: *Result }, `*Response` is the inferred type\n *\n * All TypeScript types are inferred from the Zod4 *Schemas using z.infer<>\n */\nimport { z } from \"zod/v4\";\nimport type Browserbase from \"@browserbasehq/sdk\";\n\n// =============================================================================\n// Shared Components\n// =============================================================================\n\n/** Browser launch options for local browsers */\nexport const LocalBrowserLaunchOptionsSchema = z\n .object({\n args: z.array(z.string()).optional(),\n executablePath: z.string().optional(),\n port: z.number().optional(),\n userDataDir: z.string().optional(),\n preserveUserDataDir: z.boolean().optional(),\n headless: z.boolean().optional(),\n devtools: z.boolean().optional(),\n chromiumSandbox: z.boolean().optional(),\n ignoreDefaultArgs: z.union([z.boolean(), z.array(z.string())]).optional(),\n proxy: z\n .object({\n server: z.string(),\n bypass: z.string().optional(),\n username: z.string().optional(),\n password: z.string().optional(),\n })\n .optional(),\n locale: z.string().optional(),\n viewport: z.object({ width: z.number(), height: z.number() }).optional(),\n deviceScaleFactor: z.number().optional(),\n hasTouch: z.boolean().optional(),\n ignoreHTTPSErrors: z.boolean().optional(),\n cdpUrl: z.string().optional(),\n connectTimeoutMs: z.number().optional(),\n downloadsPath: z.string().optional(),\n acceptDownloads: z.boolean().optional(),\n })\n .strict()\n .meta({ id: \"LocalBrowserLaunchOptions\" });\n\n/** Detailed model configuration object */\nexport const ModelConfigObjectSchema = z\n .object({\n provider: z\n .enum([\"openai\", \"anthropic\", \"google\", \"microsoft\"])\n .optional()\n .meta({\n description:\n \"AI provider for the model (or provide a baseURL endpoint instead)\",\n example: \"openai\",\n }),\n modelName: z.string().meta({\n description:\n \"Model name string with provider prefix (e.g., 'openai/gpt-5-nano')\",\n example: \"openai/gpt-5-nano\",\n }),\n apiKey: z.string().optional().meta({\n description: \"API key for the model provider\",\n example: \"sk-some-openai-api-key\",\n }),\n baseURL: z.string().url().optional().meta({\n description: \"Base URL for the model provider\",\n example: \"https://api.openai.com/v1\",\n }),\n })\n .meta({ id: \"ModelConfigObject\" });\n\n/** Model configuration */\nexport const ModelConfigSchema = ModelConfigObjectSchema.meta({\n id: \"ModelConfig\",\n});\n\n/** Action object returned by observe and used by act */\nexport const ActionSchema = z\n .object({\n selector: z.string().meta({\n description: \"CSS selector or XPath for the element\",\n example: \"[data-testid='submit-button']\",\n }),\n description: z.string().meta({\n description: \"Human-readable description of the action\",\n example: \"Click the submit button\",\n }),\n backendNodeId: z.number().optional().meta({\n description: \"Backend node ID for the element\",\n }),\n method: z.string().optional().meta({\n description: \"The method to execute (click, fill, etc.)\",\n example: \"click\",\n }),\n arguments: z\n .array(z.string())\n .optional()\n .meta({\n description: \"Arguments to pass to the method\",\n example: [\"Hello World\"],\n }),\n })\n .meta({\n id: \"Action\",\n description: \"Action object returned by observe and used by act\",\n });\n\n/** Session ID path parameter */\nexport const SessionIdParamsSchema = z\n .object({\n id: z.string().meta({\n description: \"Unique session identifier\",\n example: \"c4dbf3a9-9a58-4b22-8a1c-9f20f9f9e123\",\n }),\n })\n .strict()\n .meta({ id: \"SessionIdParams\" });\n\n/** Browser configuration for session start */\nexport const BrowserConfigSchema = z\n .object({\n type: z.enum([\"local\", \"browserbase\"]).optional().meta({\n description: \"Browser type to use\",\n example: \"local\",\n }),\n cdpUrl: z.string().optional().meta({\n description:\n \"Chrome DevTools Protocol URL for connecting to existing browser\",\n example: \"ws://localhost:9222\",\n }),\n launchOptions: LocalBrowserLaunchOptionsSchema.optional(),\n })\n .meta({ id: \"BrowserConfig\" });\n\n// =============================================================================\n// Request Headers (operational only - auth headers are in security schemes)\n// =============================================================================\n\n/** Operational headers for all session requests (auth handled via security schemes) */\nexport const SessionHeadersSchema = z\n .object({\n \"x-stream-response\": z.enum([\"true\", \"false\"]).optional().meta({\n description: \"Whether to stream the response via SSE\",\n example: \"true\",\n }),\n })\n .meta({ id: \"SessionHeaders\" });\n\n// =============================================================================\n// Response Wrapper Helper\n// =============================================================================\n\n/** Wraps a result schema in standard success response format */\nconst wrapResponse = <T extends z.ZodTypeAny>(resultSchema: T, name: string) =>\n z\n .object({\n success: z.boolean().meta({\n description: \"Indicates whether the request was successful\",\n }),\n data: resultSchema,\n })\n .meta({ id: name });\n\n/** Standard error response */\nexport const ErrorResponseSchema = z\n .object({\n success: z.literal(false),\n error: z.string(),\n code: z.string().optional(),\n })\n .strict()\n .meta({ id: \"ErrorResponse\" });\n\n// =============================================================================\n// Browserbase Session Create Params (zod+hints duplicated version of Browserbase.Sessions.SessionCreateParams)\n// =============================================================================\n\n/** Browserbase viewport configuration */\nexport const BrowserbaseViewportSchema = z\n .object({\n width: z.number().optional(),\n height: z.number().optional(),\n })\n .meta({ id: \"BrowserbaseViewport\" });\n\n/** Browserbase fingerprint screen configuration */\nexport const BrowserbaseFingerprintScreenSchema = z\n .object({\n maxHeight: z.number().optional(),\n maxWidth: z.number().optional(),\n minHeight: z.number().optional(),\n minWidth: z.number().optional(),\n })\n .meta({ id: \"BrowserbaseFingerprintScreen\" });\n\n/** Browserbase fingerprint configuration for stealth mode */\nexport const BrowserbaseFingerprintSchema = z\n .object({\n browsers: z\n .array(z.enum([\"chrome\", \"edge\", \"firefox\", \"safari\"]))\n .optional(),\n devices: z.array(z.enum([\"desktop\", \"mobile\"])).optional(),\n httpVersion: z.enum([\"1\", \"2\"]).optional(),\n locales: z.array(z.string()).optional(),\n operatingSystems: z\n .array(z.enum([\"android\", \"ios\", \"linux\", \"macos\", \"windows\"]))\n .optional(),\n screen: BrowserbaseFingerprintScreenSchema.optional(),\n })\n .meta({ id: \"BrowserbaseFingerprint\" });\n\n/** Browserbase context configuration for session persistence */\nexport const BrowserbaseContextSchema = z\n .object({\n id: z.string(),\n persist: z.boolean().optional(),\n })\n .meta({ id: \"BrowserbaseContext\" });\n\n/** Browserbase browser settings for session creation */\nexport const BrowserbaseBrowserSettingsSchema = z\n .object({\n advancedStealth: z.boolean().optional(),\n blockAds: z.boolean().optional(),\n context: BrowserbaseContextSchema.optional(),\n extensionId: z.string().optional(),\n fingerprint: BrowserbaseFingerprintSchema.optional(),\n logSession: z.boolean().optional(),\n recordSession: z.boolean().optional(),\n solveCaptchas: z.boolean().optional(),\n viewport: BrowserbaseViewportSchema.optional(),\n })\n .meta({ id: \"BrowserbaseBrowserSettings\" });\n\n/** Browserbase managed proxy geolocation configuration */\nexport const BrowserbaseProxyGeolocationSchema = z\n .object({\n country: z.string(),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .meta({ id: \"BrowserbaseProxyGeolocation\" });\n\n/** Browserbase managed proxy configuration */\nexport const BrowserbaseProxyConfigSchema = z\n .object({\n type: z.literal(\"browserbase\"),\n domainPattern: z.string().optional(),\n geolocation: BrowserbaseProxyGeolocationSchema.optional(),\n })\n .meta({ id: \"BrowserbaseProxyConfig\" });\n\n/** External proxy configuration */\nexport const ExternalProxyConfigSchema = z\n .object({\n type: z.literal(\"external\"),\n server: z.string(),\n domainPattern: z.string().optional(),\n username: z.string().optional(),\n password: z.string().optional(),\n })\n .meta({ id: \"ExternalProxyConfig\" });\n\n/** Union of proxy configuration types */\nexport const ProxyConfigSchema = z\n .discriminatedUnion(\"type\", [\n BrowserbaseProxyConfigSchema,\n ExternalProxyConfigSchema,\n ])\n .meta({ id: \"ProxyConfig\" });\n\n/** Browserbase session creation parameters */\nexport const BrowserbaseSessionCreateParamsSchema = z\n .object({\n projectId: z.string().optional(),\n browserSettings: BrowserbaseBrowserSettingsSchema.optional(),\n extensionId: z.string().optional(),\n keepAlive: z.boolean().optional(),\n proxies: z.union([z.boolean(), z.array(ProxyConfigSchema)]).optional(),\n region: z\n .enum([\"us-west-2\", \"us-east-1\", \"eu-central-1\", \"ap-southeast-1\"])\n .optional(),\n timeout: z.number().optional(),\n userMetadata: z.record(z.string(), z.unknown()).optional(),\n })\n .meta({ id: \"BrowserbaseSessionCreateParams\" });\n\n// =============================================================================\n// Session Start\n// =============================================================================\n\nexport const SessionStartRequestSchema = z\n .object({\n modelName: z.string().meta({\n description: \"Model name to use for AI operations\",\n example: \"openai/gpt-4o\",\n }),\n domSettleTimeoutMs: z.number().optional().meta({\n description: \"Timeout in ms to wait for DOM to settle\",\n example: 5000,\n }),\n verbose: z\n .union([z.literal(0), z.literal(1), z.literal(2)])\n .optional()\n .meta({\n description: \"Logging verbosity level (0=quiet, 1=normal, 2=debug)\",\n example: 1,\n override: ({ jsonSchema }: { jsonSchema: Record<string, unknown> }) => {\n delete jsonSchema.anyOf;\n delete jsonSchema.allOf;\n delete jsonSchema.oneOf;\n jsonSchema.type = \"number\";\n jsonSchema.enum = [0, 1, 2];\n },\n }),\n systemPrompt: z.string().optional().meta({\n description: \"Custom system prompt for AI operations\",\n }),\n browserbaseSessionCreateParams:\n BrowserbaseSessionCreateParamsSchema.optional(),\n browser: BrowserConfigSchema.optional(),\n selfHeal: z.boolean().optional().meta({\n description: \"Enable self-healing for failed actions\",\n example: true,\n }),\n browserbaseSessionID: z.string().optional().meta({\n description: \"Existing Browserbase session ID to resume\",\n }),\n // experimental is a V3 field but doesn't need to go over the wire - included because wire type imports options type\n experimental: z.boolean().optional(),\n // V2 compatibility fields - only included because the server imports this type and supports V2\n // should never be used in v3 clients or v3-only server implementations\n waitForCaptchaSolves: z.boolean().optional().meta({\n description: \"Wait for captcha solves (deprecated, v2 only)\",\n }),\n actTimeoutMs: z.number().optional().meta({\n description: \"Timeout in ms for act operations (deprecated, v2 only)\",\n }),\n })\n .meta({ id: \"SessionStartRequest\" });\n\nexport const SessionStartResultSchema = z\n .object({\n sessionId: z.string().meta({\n description: \"Unique Browserbase session identifier\",\n example: \"c4dbf3a9-9a58-4b22-8a1c-9f20f9f9e123\",\n }),\n cdpUrl: z.string().nullish().meta({\n description:\n \"CDP WebSocket URL for connecting to the Browserbase cloud browser (present when available)\",\n example: \"wss://connect.browserbase.com/?signingKey=abc123\",\n }),\n available: z.boolean(),\n })\n .meta({ id: \"SessionStartResult\" });\n\nexport const SessionStartResponseSchema = wrapResponse(\n SessionStartResultSchema,\n \"SessionStartResponse\",\n);\n\n// =============================================================================\n// Session End\n// =============================================================================\n\n/** Session end request - no request body. */\nexport const SessionEndRequestSchema = z\n .object({})\n .strict()\n .optional()\n .meta({ id: \"SessionEndRequest\" });\n\nexport const SessionEndResultSchema = z\n .object({})\n .strict()\n .meta({ id: \"SessionEndResult\" });\n\n/** Session end response - just success flag, no data wrapper */\nexport const SessionEndResponseSchema = z\n .object({\n success: z.boolean().meta({\n description: \"Indicates whether the request was successful\",\n }),\n })\n .strict()\n .meta({ id: \"SessionEndResponse\" });\n\n// =============================================================================\n// Act\n// =============================================================================\n\nexport const ActOptionsSchema = z\n .object({\n model: z.union([ModelConfigSchema, z.string()]).optional().meta({\n description:\n \"Model configuration object or model name string (e.g., 'openai/gpt-5-nano')\",\n }),\n variables: z\n .record(z.string(), z.string())\n .optional()\n .meta({\n description: \"Variables to substitute in the action instruction\",\n example: { username: \"john_doe\" },\n }),\n timeout: z.number().optional().meta({\n description: \"Timeout in ms for the action\",\n example: 30000,\n }),\n })\n .optional()\n .meta({ id: \"ActOptions\" });\n\nexport const ActRequestSchema = z\n .object({\n input: z.string().or(ActionSchema).meta({\n description: \"Natural language instruction or Action object\",\n example: \"Click the login button\",\n }),\n options: ActOptionsSchema,\n frameId: z.string().nullish().meta({\n description: \"Target frame ID for the action\",\n }),\n streamResponse: z.boolean().optional().meta({\n description: \"Whether to stream the response via SSE\",\n example: true,\n }),\n })\n .meta({ id: \"ActRequest\" });\n\n/** Inner act result data */\nexport const ActResultDataSchema = z\n .object({\n success: z.boolean().meta({\n description: \"Whether the action completed successfully\",\n example: true,\n }),\n message: z.string().meta({\n description: \"Human-readable result message\",\n example: \"Successfully clicked the login button\",\n }),\n actionDescription: z.string().meta({\n description: \"Description of the action that was performed\",\n example: \"Clicked button with text 'Login'\",\n }),\n actions: z.array(ActionSchema).meta({\n description: \"List of actions that were executed\",\n }),\n })\n .meta({ id: \"ActResultData\" });\n\nexport const ActResultSchema = z\n .object({\n result: ActResultDataSchema,\n actionId: z.string().optional().meta({\n description: \"Action ID for tracking\",\n }),\n })\n .meta({ id: \"ActResult\" });\n\nexport const ActResponseSchema = wrapResponse(ActResultSchema, \"ActResponse\");\n\n// =============================================================================\n// Extract\n// =============================================================================\n\nexport const ExtractOptionsSchema = z\n .object({\n model: z.union([ModelConfigSchema, z.string()]).optional().meta({\n description:\n \"Model configuration object or model name string (e.g., 'openai/gpt-5-nano')\",\n }),\n timeout: z.number().optional().meta({\n description: \"Timeout in ms for the extraction\",\n example: 30000,\n }),\n selector: z.string().optional().meta({\n description: \"CSS selector to scope extraction to a specific element\",\n example: \"#main-content\",\n }),\n })\n .optional()\n .meta({ id: \"ExtractOptions\" });\n\nexport const ExtractRequestSchema = z\n .object({\n instruction: z.string().optional().meta({\n description: \"Natural language instruction for what to extract\",\n example: \"Extract all product names and prices from the page\",\n }),\n schema: z.record(z.string(), z.unknown()).optional().meta({\n description: \"JSON Schema defining the structure of data to extract\",\n }),\n options: ExtractOptionsSchema,\n frameId: z.string().nullish().meta({\n description: \"Target frame ID for the extraction\",\n }),\n streamResponse: z.boolean().optional().meta({\n description: \"Whether to stream the response via SSE\",\n example: true,\n }),\n })\n .meta({ id: \"ExtractRequest\" });\n\nexport const ExtractResultSchema = z\n .object({\n result: z.unknown().meta({\n description: \"Extracted data matching the requested schema\",\n override: ({ jsonSchema }: { jsonSchema: Record<string, unknown> }) => {\n jsonSchema[\"x-stainless-any\"] = true;\n },\n }),\n actionId: z.string().optional().meta({\n description: \"Action ID for tracking\",\n }),\n })\n .meta({ id: \"ExtractResult\" });\n\nexport const ExtractResponseSchema = wrapResponse(\n ExtractResultSchema,\n \"ExtractResponse\",\n);\n\n// =============================================================================\n// Observe\n// =============================================================================\n\nexport const ObserveOptionsSchema = z\n .object({\n model: z.union([ModelConfigSchema, z.string()]).optional().meta({\n description:\n \"Model configuration object or model name string (e.g., 'openai/gpt-5-nano')\",\n }),\n timeout: z.number().optional().meta({\n description: \"Timeout in ms for the observation\",\n example: 30000,\n }),\n selector: z.string().optional().meta({\n description: \"CSS selector to scope observation to a specific element\",\n example: \"nav\",\n }),\n })\n .optional()\n .meta({ id: \"ObserveOptions\" });\n\nexport const ObserveRequestSchema = z\n .object({\n instruction: z.string().optional().meta({\n description: \"Natural language instruction for what actions to find\",\n example: \"Find all clickable navigation links\",\n }),\n options: ObserveOptionsSchema,\n frameId: z.string().nullish().meta({\n description: \"Target frame ID for the observation\",\n }),\n streamResponse: z.boolean().optional().meta({\n description: \"Whether to stream the response via SSE\",\n example: true,\n }),\n })\n .meta({ id: \"ObserveRequest\" });\n\nexport const ObserveResultSchema = z\n .object({\n result: z.array(ActionSchema),\n actionId: z.string().optional().meta({\n description: \"Action ID for tracking\",\n }),\n })\n .meta({ id: \"ObserveResult\" });\n\nexport const ObserveResponseSchema = wrapResponse(\n ObserveResultSchema,\n \"ObserveResponse\",\n);\n\n// =============================================================================\n// Agent Execute\n// =============================================================================\n\nexport const AgentConfigSchema = z\n .object({\n provider: z // cloud accepts provider: at the top level for legacy reasons, in the future we should remove it\n .enum([\"openai\", \"anthropic\", \"google\", \"microsoft\"])\n .optional()\n .meta({\n description:\n \"AI provider for the agent (legacy, use model: openai/gpt-5-nano instead)\",\n example: \"openai\",\n }),\n model: z.union([ModelConfigSchema, z.string()]).optional().meta({\n description:\n \"Model configuration object or model name string (e.g., 'openai/gpt-5-nano')\",\n }),\n systemPrompt: z.string().optional().meta({\n description: \"Custom system prompt for the agent\",\n }),\n cua: z.boolean().optional().meta({\n description:\n \"Deprecated. Use mode: 'cua' instead. If both are provided, mode takes precedence.\",\n example: true,\n }),\n mode: z.enum([\"dom\", \"hybrid\", \"cua\"]).optional().meta({\n description:\n \"Tool mode for the agent (dom, hybrid, cua). If set, overrides cua.\",\n example: \"cua\",\n }),\n executionModel: z.union([ModelConfigSchema, z.string()]).optional().meta({\n description:\n \"Model configuration object or model name string (e.g., 'openai/gpt-5-nano') for tool execution (observe/act calls within agent tools). If not specified, inherits from the main model configuration.\",\n }),\n })\n .meta({ id: \"AgentConfig\" });\n\n/** Action taken by the agent during execution */\nexport const AgentActionSchema = z\n .object({\n type: z.string().meta({\n description: \"Type of action taken\",\n example: \"click\",\n }),\n reasoning: z.string().optional().meta({\n description: \"Agent's reasoning for taking this action\",\n }),\n taskCompleted: z.boolean().optional(),\n action: z.string().optional(),\n timeMs: z.number().optional().meta({\n description: \"Time taken for this action in ms\",\n }),\n pageText: z.string().optional(),\n pageUrl: z.string().optional(),\n instruction: z.string().optional(),\n })\n .passthrough()\n .meta({ id: \"AgentAction\" });\n\n/** Token usage statistics for agent execution */\nexport const AgentUsageSchema = z\n .object({\n input_tokens: z.number().meta({ example: 1500 }),\n output_tokens: z.number().meta({ example: 250 }),\n reasoning_tokens: z.number().optional(),\n cached_input_tokens: z.number().optional(),\n inference_time_ms: z.number().meta({ example: 2500 }),\n })\n .meta({ id: \"AgentUsage\" });\n\n/** Result data from agent execution */\nexport const AgentResultDataSchema = z\n .object({\n success: z.boolean().meta({\n description: \"Whether the agent completed successfully\",\n example: true,\n }),\n message: z.string().meta({\n description: \"Summary of what the agent accomplished\",\n example: \"Successfully logged in and navigated to dashboard\",\n }),\n actions: z.array(AgentActionSchema),\n completed: z.boolean().meta({\n description: \"Whether the agent finished its task\",\n example: true,\n }),\n metadata: z.record(z.string(), z.unknown()).optional(),\n usage: AgentUsageSchema.optional(),\n })\n .meta({ id: \"AgentResultData\" });\n\nexport const AgentCacheEntrySchema = z\n .object({\n cacheKey: z.string().meta({\n description:\n \"Opaque cache identifier computed from instruction, URL, options, and config\",\n }),\n entry: z.unknown().meta({\n description: \"Serialized cache entry that can be written to disk\",\n }),\n })\n .meta({ id: \"AgentCacheEntry\" });\n\nexport const AgentExecuteOptionsSchema = z\n .object({\n instruction: z.string().meta({\n description: \"Natural language instruction for the agent\",\n example:\n \"Log in with username 'demo' and password 'test123', then navigate to settings\",\n }),\n maxSteps: z.number().optional().meta({\n description: \"Maximum number of steps the agent can take\",\n example: 20,\n }),\n highlightCursor: z.boolean().optional().meta({\n description: \"Whether to visually highlight the cursor during execution\",\n example: true,\n }),\n })\n .meta({ id: \"AgentExecuteOptions\" });\n\nexport const AgentExecuteRequestSchema = z\n .object({\n agentConfig: AgentConfigSchema,\n executeOptions: AgentExecuteOptionsSchema,\n frameId: z.string().nullish().meta({\n description: \"Target frame ID for the agent\",\n }),\n streamResponse: z.boolean().optional().meta({\n description: \"Whether to stream the response via SSE\",\n example: true,\n }),\n shouldCache: z.boolean().optional().meta({\n description:\n \"If true, the server captures a cache entry and returns it to the client\",\n }),\n })\n .meta({ id: \"AgentExecuteRequest\" });\n\nexport const AgentExecuteResultSchema = z\n .object({\n result: AgentResultDataSchema,\n cacheEntry: AgentCacheEntrySchema.optional(),\n })\n .meta({ id: \"AgentExecuteResult\" });\n\nexport const AgentExecuteResponseSchema = wrapResponse(\n AgentExecuteResultSchema,\n \"AgentExecuteResponse\",\n);\n\n// =============================================================================\n// Navigate\n// =============================================================================\n\nexport const NavigateOptionsSchema = z\n .object({\n referer: z.string().optional().meta({\n description: \"Referer header to send with the request\",\n }),\n timeout: z.number().optional().meta({\n description: \"Timeout in ms for the navigation\",\n example: 30000,\n }),\n waitUntil: z\n .enum([\"load\", \"domcontentloaded\", \"networkidle\"])\n .optional()\n .meta({\n description: \"When to consider navigation complete\",\n example: \"networkidle\",\n }),\n })\n .optional()\n .meta({ id: \"NavigateOptions\" });\n\nexport const NavigateRequestSchema = z\n .object({\n url: z.string().meta({\n description: \"URL to navigate to\",\n example: \"https://example.com\",\n }),\n options: NavigateOptionsSchema,\n frameId: z.string().nullish().meta({\n description: \"Target frame ID for the navigation\",\n }),\n streamResponse: z.boolean().optional().meta({\n description: \"Whether to stream the response via SSE\",\n example: true,\n }),\n })\n .meta({ id: \"NavigateRequest\" });\n\nexport const NavigateResultSchema = z\n .object({\n // SerializableResponse from types/private/api.ts - no Zod schema available\n // as it wraps complex devtools-protocol types (Protocol.Network.Response)\n result: z\n .unknown()\n .nullable()\n .meta({\n description: \"Navigation response (Playwright Response object or null)\",\n override: ({ jsonSchema }: { jsonSchema: Record<string, unknown> }) => {\n jsonSchema[\"x-stainless-any\"] = true;\n },\n }),\n actionId: z.string().optional().meta({\n description: \"Action ID for tracking\",\n }),\n })\n .meta({ id: \"NavigateResult\" });\n\nexport const NavigateResponseSchema = wrapResponse(\n NavigateResultSchema,\n \"NavigateResponse\",\n);\n\n// =============================================================================\n// Replay Metrics\n// =============================================================================\n\n/** Token usage for a single action */\nexport const TokenUsageSchema = z\n .object({\n inputTokens: z.number().optional(),\n outputTokens: z.number().optional(),\n timeMs: z.number().optional(),\n cost: z.number().optional(),\n })\n .meta({ id: \"TokenUsage\" });\n\n/** Action entry in replay metrics */\nexport const ReplayActionSchema = z\n .object({\n method: z.string(),\n parameters: z.record(z.string(), z.unknown()),\n result: z.record(z.string(), z.unknown()),\n timestamp: z.number(),\n endTime: z.number().optional(),\n tokenUsage: TokenUsageSchema.optional(),\n })\n .meta({ id: \"ReplayAction\" });\n\n/** Page entry in replay metrics */\nexport const ReplayPageSchema = z\n .object({\n url: z.string(),\n timestamp: z.number(),\n duration: z.number(),\n actions: z.array(ReplayActionSchema),\n })\n .meta({ id: \"ReplayPage\" });\n\n/** Inner result data for replay */\nexport const ReplayResultSchema = z\n .object({\n pages: z.array(ReplayPageSchema),\n clientLanguage: z.string().optional(),\n })\n .meta({ id: \"ReplayResult\" });\n\nexport const ReplayResponseSchema = wrapResponse(\n ReplayResultSchema,\n \"ReplayResponse\",\n);\n\n// =============================================================================\n// SSE Stream Events\n// =============================================================================\n// These schemas define the Server-Sent Events format for streaming responses.\n// Streaming is enabled by setting the `x-stream-response: true` header.\n\n/** Status values for SSE stream events */\nexport const StreamEventStatusSchema = z\n .enum([\"starting\", \"connected\", \"running\", \"finished\", \"error\"])\n .meta({\n id: \"StreamEventStatus\",\n description: \"Current status of the streaming operation\",\n });\n\n/** Type discriminator for SSE stream events */\nexport const StreamEventTypeSchema = z.enum([\"system\", \"log\"]).meta({\n id: \"StreamEventType\",\n description: \"Type of stream event - system events or log messages\",\n});\n\n/** Data payload for system stream events */\nexport const StreamEventSystemDataSchema = z\n .object({\n status: StreamEventStatusSchema,\n result: z\n .unknown()\n .optional()\n .meta({\n description: \"Operation result (present when status is 'finished')\",\n override: ({ jsonSchema }: { jsonSchema: Record<string, unknown> }) => {\n jsonSchema[\"x-stainless-any\"] = true;\n },\n }),\n error: z.string().optional().meta({\n description: \"Error message (present when status is 'error')\",\n }),\n })\n .meta({ id: \"StreamEventSystemData\" });\n\n/** Data payload for log stream events */\nexport const StreamEventLogDataSchema = z\n .object({\n status: z.literal(\"running\"),\n message: z.string().meta({\n description: \"Log message from the operation\",\n }),\n })\n .meta({ id: \"StreamEventLogData\" });\n\n/**\n * SSE stream event sent during streaming responses.\n *\n * IMPORTANT: Key ordering matters for Stainless SDK generation.\n * The `data` field MUST be serialized first, with `status` as the first key within it.\n * This allows Stainless to use `data_starts_with: '{\"data\":{\"status\":\"finished\"'` for event handling.\n *\n * Expected serialization order: {\"data\":{\"status\":...},\"type\":...,\"id\":...}\n */\nexport const StreamEventSchema = z\n .object({\n data: z.union([StreamEventSystemDataSchema, StreamEventLogDataSchema]),\n type: StreamEventTypeSchema,\n id: z.string().uuid().meta({\n description: \"Unique identifier for this event\",\n example: \"c4dbf3a9-9a58-4b22-8a1c-9f20f9f9e123\",\n }),\n })\n .meta({\n id: \"StreamEvent\",\n description:\n \"Server-Sent Event emitted during streaming responses. Events are sent as `data: <JSON>\\\\n\\\\n`. Key order: data (with status first), type, id.\",\n });\n\n// =============================================================================\n// OpenAPI Components\n// =============================================================================\n// These objects are exported for use in gen-openapi.ts to configure the spec.\n\n/** OpenAPI security schemes for authentication */\nexport const openApiSecuritySchemes = {\n BrowserbaseApiKey: {\n type: \"apiKey\",\n in: \"header\",\n name: \"x-bb-api-key\",\n description: \"Browserbase API key for authentication\",\n },\n BrowserbaseProjectId: {\n type: \"apiKey\",\n in: \"header\",\n name: \"x-bb-project-id\",\n description: \"Browserbase project ID\",\n },\n ModelApiKey: {\n type: \"apiKey\",\n in: \"header\",\n name: \"x-model-api-key\",\n description: \"API key for the AI model provider (OpenAI, Anthropic, etc.)\",\n },\n} as const;\n\n/** OpenAPI links for session operations (used in SessionStart response) */\nexport const openApiLinks = {\n SessionAct: {\n operationId: \"SessionAct\",\n parameters: { id: \"$response.body#/data/sessionId\" },\n description: \"Perform an action on the session\",\n },\n SessionExtract: {\n operationId: \"SessionExtract\",\n parameters: { id: \"$response.body#/data/sessionId\" },\n description: \"Extract data from the session\",\n },\n SessionObserve: {\n operationId: \"SessionObserve\",\n parameters: { id: \"$response.body#/data/sessionId\" },\n description: \"Observe available actions on the session\",\n },\n SessionNavigate: {\n operationId: \"SessionNavigate\",\n parameters: { id: \"$response.body#/data/sessionId\" },\n description: \"Navigate to a URL in the session\",\n },\n SessionAgentExecute: {\n operationId: \"SessionAgentExecute\",\n parameters: { id: \"$response.body#/data/sessionId\" },\n description: \"Execute an agent on the session\",\n },\n SessionReplay: {\n operationId: \"SessionReplay\",\n parameters: { id: \"$response.body#/data/sessionId\" },\n description: \"Replay session metrics\",\n },\n SessionEnd: {\n operationId: \"SessionEnd\",\n parameters: { id: \"$response.body#/data/sessionId\" },\n description: \"End the session and release resources\",\n },\n} as const;\n\n/** OpenAPI operation metadata for each endpoint */\nexport const Operations = {\n SessionStart: {\n operationId: \"SessionStart\",\n summary: \"Start a new browser session\",\n description:\n \"Creates a new browser session with the specified configuration. Returns a session ID used for all subsequent operations.\",\n },\n SessionEnd: {\n operationId: \"SessionEnd\",\n summary: \"End a browser session\",\n description:\n \"Terminates the browser session and releases all associated resources.\",\n },\n SessionAct: {\n operationId: \"SessionAct\",\n summary: \"Perform an action\",\n description:\n \"Executes a browser action using natural language instructions or a predefined Action object.\",\n },\n SessionExtract: {\n operationId: \"SessionExtract\",\n summary: \"Extract data from the page\",\n description:\n \"Extracts structured data from the current page using AI-powered analysis.\",\n },\n SessionObserve: {\n operationId: \"SessionObserve\",\n summary: \"Observe available actions\",\n description:\n \"Identifies and returns available actions on the current page that match the given instruction.\",\n },\n SessionNavigate: {\n operationId: \"SessionNavigate\",\n summary: \"Navigate to a URL\",\n description: \"Navigates the browser to the specified URL.\",\n },\n SessionAgentExecute: {\n operationId: \"SessionAgentExecute\",\n summary: \"Execute an AI agent\",\n description:\n \"Runs an autonomous AI agent that can perform complex multi-step browser tasks.\",\n },\n SessionReplay: {\n operationId: \"SessionReplay\",\n summary: \"Replay session metrics\",\n description: \"Retrieves replay metrics for a session.\",\n },\n} as const;\n\n// =============================================================================\n// Type Exports (inferred from schemas)\n// =============================================================================\n\n// Shared types\nexport type Action = z.infer<typeof ActionSchema>;\nexport type ModelConfig = z.infer<typeof ModelConfigSchema>;\nexport type BrowserConfig = z.infer<typeof BrowserConfigSchema>;\nexport type SessionIdParams = z.infer<typeof SessionIdParamsSchema>;\n\n// Header types\nexport type SessionHeaders = z.infer<typeof SessionHeadersSchema>;\n\n// Browserbase types\nexport type BrowserbaseViewport = z.infer<typeof BrowserbaseViewportSchema>;\nexport type BrowserbaseFingerprintScreen = z.infer<\n typeof BrowserbaseFingerprintScreenSchema\n>;\nexport type BrowserbaseFingerprint = z.infer<\n typeof BrowserbaseFingerprintSchema\n>;\nexport type BrowserbaseContext = z.infer<typeof BrowserbaseContextSchema>;\nexport type BrowserbaseBrowserSettings = z.infer<\n typeof BrowserbaseBrowserSettingsSchema\n>;\nexport type BrowserbaseProxyGeolocation = z.infer<\n typeof BrowserbaseProxyGeolocationSchema\n>;\nexport type BrowserbaseProxyConfig = z.infer<\n typeof BrowserbaseProxyConfigSchema\n>;\nexport type ExternalProxyConfig = z.infer<typeof ExternalProxyConfigSchema>;\nexport type BrowserbaseSessionCreateParams = z.infer<\n typeof BrowserbaseSessionCreateParamsSchema\n>;\n\n// Type check: ensure our schema-derived type is assignable to the SDK type\n// This will cause a compile error if our schema drifts from the SDK\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype _BrowserbaseSessionCreateParamsCheck =\n BrowserbaseSessionCreateParams extends Browserbase.Sessions.SessionCreateParams\n ? true\n : never;\n\n// /sessions/start\nexport type SessionStartRequest = z.infer<typeof SessionStartRequestSchema>;\nexport type SessionStartResult = z.infer<typeof SessionStartResultSchema>;\nexport type SessionStartResponse = z.infer<typeof SessionStartResponseSchema>;\n\n// /sessions/{id}/end\nexport type SessionEndResult = z.infer<typeof SessionEndResultSchema>;\nexport type SessionEndResponse = z.infer<typeof SessionEndResponseSchema>;\n\n// /sessions/{id}/act\nexport type ActRequest = z.infer<typeof ActRequestSchema>;\nexport type ActResultData = z.infer<typeof ActResultDataSchema>;\nexport type ActResult = z.infer<typeof ActResultSchema>;\nexport type ActResponse = z.infer<typeof ActResponseSchema>;\n\n// /sessions/{id}/extract\nexport type ExtractRequest = z.infer<typeof ExtractRequestSchema>;\nexport type ExtractResult = z.infer<typeof ExtractResultSchema>;\nexport type ExtractResponse = z.infer<typeof ExtractResponseSchema>;\n\n// /sessions/{id}/observe\nexport type ObserveRequest = z.infer<typeof ObserveRequestSchema>;\nexport type ObserveResult = z.infer<typeof ObserveResultSchema>;\nexport type ObserveResponse = z.infer<typeof ObserveResponseSchema>;\n\n// /sessions/{id}/agentExecute\nexport type AgentAction = z.infer<typeof AgentActionSchema>;\nexport type AgentUsage = z.infer<typeof AgentUsageSchema>;\nexport type AgentResultData = z.infer<typeof AgentResultDataSchema>;\nexport type AgentExecuteRequest = z.infer<typeof AgentExecuteRequestSchema>;\nexport type AgentExecuteResult = z.infer<typeof AgentExecuteResultSchema>;\nexport type AgentExecuteResponse = z.infer<typeof AgentExecuteResponseSchema>;\n\n// /sessions/{id}/navigate\nexport type NavigateRequest = z.infer<typeof NavigateRequestSchema>;\nexport type NavigateResult = z.infer<typeof NavigateResultSchema>;\nexport type NavigateResponse = z.infer<typeof NavigateResponseSchema>;\n\n// /sessions/{id}/replay\nexport type TokenUsage = z.infer<typeof TokenUsageSchema>;\nexport type ReplayAction = z.infer<typeof ReplayActionSchema>;\nexport type ReplayPage = z.infer<typeof ReplayPageSchema>;\nexport type ReplayResult = z.infer<typeof ReplayResultSchema>;\nexport type ReplayResponse = z.infer<typeof ReplayResponseSchema>;\n\n// SSE Stream Events\nexport type StreamEventStatus = z.infer<typeof StreamEventStatusSchema>;\nexport type StreamEventType = z.infer<typeof StreamEventTypeSchema>;\nexport type StreamEventSystemData = z.infer<typeof StreamEventSystemDataSchema>;\nexport type StreamEventLogData = z.infer<typeof StreamEventLogDataSchema>;\nexport type StreamEvent = z.infer<typeof StreamEventSchema>;\n", "export class StagehandAPIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n }\n}\n\nexport class StagehandAPIUnauthorizedError extends StagehandAPIError {\n constructor(message?: string) {\n super(message || \"Unauthorized request\");\n }\n}\n\nexport class StagehandHttpError extends StagehandAPIError {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class StagehandServerError extends StagehandAPIError {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class StagehandResponseBodyError extends StagehandAPIError {\n constructor() {\n super(\"Response body is null\");\n }\n}\n\nexport class StagehandResponseParseError extends StagehandAPIError {\n constructor(message: string) {\n super(message);\n }\n}\n", "export type LogLevel = 0 | 1 | 2;\n\n/**\n * Mapping between numeric log levels and their names\n *\n * 0 - error/warn - Critical issues or important warnings\n * 1 - info - Standard information messages\n * 2 - debug - Detailed information for debugging\n */\nexport const LOG_LEVEL_NAMES: Record<LogLevel, string> = {\n 0: \"error\",\n 1: \"info\",\n 2: \"debug\",\n};\n\nexport type LogLine = {\n id?: string;\n category?: string;\n message: string;\n level?: LogLevel;\n timestamp?: string;\n auxiliary?: {\n [key: string]: {\n value: string;\n type: \"object\" | \"string\" | \"html\" | \"integer\" | \"float\" | \"boolean\";\n };\n };\n};\n\nexport type Logger = (logLine: LogLine) => void;\n", "export interface StagehandMetrics {\n actPromptTokens: number;\n actCompletionTokens: number;\n actReasoningTokens: number;\n actCachedInputTokens: number;\n actInferenceTimeMs: number;\n extractPromptTokens: number;\n extractCompletionTokens: number;\n extractReasoningTokens: number;\n extractCachedInputTokens: number;\n extractInferenceTimeMs: number;\n observePromptTokens: number;\n observeCompletionTokens: number;\n observeReasoningTokens: number;\n observeCachedInputTokens: number;\n observeInferenceTimeMs: number;\n agentPromptTokens: number;\n agentCompletionTokens: number;\n agentReasoningTokens: number;\n agentCachedInputTokens: number;\n agentInferenceTimeMs: number;\n totalPromptTokens: number;\n totalCompletionTokens: number;\n totalReasoningTokens: number;\n totalCachedInputTokens: number;\n totalInferenceTimeMs: number;\n}\n", "import type { ClientOptions as AnthropicClientOptionsBase } from \"@anthropic-ai/sdk\";\nimport type { GoogleVertexProviderSettings as GoogleVertexProviderSettingsBase } from \"@ai-sdk/google-vertex\";\nimport type { LanguageModelV2 } from \"@ai-sdk/provider\";\nimport type { ClientOptions as OpenAIClientOptionsBase } from \"openai\";\nimport type { AgentProviderType } from \"./agent.js\";\n\nexport type OpenAIClientOptions = Pick<\n OpenAIClientOptionsBase,\n \"baseURL\" | \"apiKey\"\n>;\n\nexport type AnthropicClientOptions = Pick<\n AnthropicClientOptionsBase,\n \"baseURL\" | \"apiKey\"\n>;\n\nexport interface GoogleServiceAccountCredentials {\n type?: string;\n project_id?: string;\n private_key_id?: string;\n private_key?: string;\n client_email?: string;\n client_id?: string;\n auth_uri?: string;\n token_uri?: string;\n auth_provider_x509_cert_url?: string;\n client_x509_cert_url?: string;\n universe_domain?: string;\n}\n\nexport type GoogleVertexProviderSettings = Pick<\n GoogleVertexProviderSettingsBase,\n \"project\" | \"location\"\n> & {\n googleAuthOptions?: {\n credentials?: GoogleServiceAccountCredentials;\n };\n};\n\nexport type AnthropicJsonSchemaObject = {\n definitions?: {\n MySchema?: {\n properties?: Record<string, unknown>;\n required?: string[];\n };\n };\n properties?: Record<string, unknown>;\n required?: string[];\n} & Record<string, unknown>;\n\nexport interface LLMTool {\n type: \"function\";\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n}\n\nexport type AISDKProvider = (modelName: string) => LanguageModelV2;\n// Represents a function that takes options (like apiKey) and returns an AISDKProvider\nexport type AISDKCustomProvider = (options: ClientOptions) => AISDKProvider;\n\nexport type AvailableModel =\n | \"gpt-4.1\"\n | \"gpt-4.1-mini\"\n | \"gpt-4.1-nano\"\n | \"o4-mini\"\n | \"o3\"\n | \"o3-mini\"\n | \"o1\"\n | \"o1-mini\"\n | \"gpt-4o\"\n | \"gpt-4o-mini\"\n | \"gpt-4o-2024-08-06\"\n | \"gpt-4.5-preview\"\n | \"o1-preview\"\n | \"claude-3-5-sonnet-latest\"\n | \"claude-3-5-sonnet-20241022\"\n | \"claude-3-5-sonnet-20240620\"\n | \"claude-3-7-sonnet-latest\"\n | \"claude-3-7-sonnet-20250219\"\n | \"cerebras-llama-3.3-70b\"\n | \"cerebras-llama-3.1-8b\"\n | \"groq-llama-3.3-70b-versatile\"\n | \"groq-llama-3.3-70b-specdec\"\n | \"gemini-1.5-flash\"\n | \"gemini-1.5-pro\"\n | \"gemini-1.5-flash-8b\"\n | \"gemini-2.0-flash-lite\"\n | \"gemini-2.0-flash\"\n | \"gemini-2.5-flash-preview-04-17\"\n | \"gemini-2.5-pro-preview-03-25\"\n | string;\n\nexport type ModelProvider =\n | \"openai\"\n | \"anthropic\"\n | \"cerebras\"\n | \"groq\"\n | \"google\"\n | \"aisdk\";\n\nexport type ClientOptions = (\n | OpenAIClientOptions\n | AnthropicClientOptions\n | GoogleVertexProviderSettings\n) & {\n apiKey?: string;\n provider?: AgentProviderType;\n baseURL?: string;\n /** OpenAI organization ID */\n organization?: string;\n /** Delay between agent actions in ms */\n waitBetweenActions?: number;\n /** Anthropic thinking budget for extended thinking */\n thinkingBudget?: number;\n /** Environment type for CUA agents (browser, mac, windows, ubuntu) */\n environment?: string;\n /** Max images for Microsoft FARA agent */\n maxImages?: number;\n /** Temperature for model inference */\n temperature?: number;\n};\n\nexport type ModelConfiguration =\n | AvailableModel\n | (ClientOptions & { modelName: AvailableModel });\n", "import { z } from \"zod\";\nimport { LLMClient } from \"../../llm/LLMClient.js\";\nimport { ModelConfiguration } from \"./model.js\";\nimport { LogLine } from \"./logs.js\";\nimport {\n type BrowserbaseSessionCreateParams,\n LocalBrowserLaunchOptionsSchema,\n} from \"./api.js\";\n\nexport type V3Env = \"LOCAL\" | \"BROWSERBASE\";\n\n// Re-export for backwards compatibility (camelCase alias)\nexport const localBrowserLaunchOptionsSchema = LocalBrowserLaunchOptionsSchema;\n\nexport type LocalBrowserLaunchOptions = z.infer<\n typeof LocalBrowserLaunchOptionsSchema\n>;\n\n/** Constructor options for V3 */\nexport interface V3Options {\n env: V3Env;\n // Browserbase (required when env = \"BROWSERBASE\")\n apiKey?: string;\n projectId?: string;\n /**\n * Optional: fine-tune Browserbase session creation or resume an existing session.\n */\n browserbaseSessionCreateParams?: BrowserbaseSessionCreateParams;\n browserbaseSessionID?: string;\n /**\n * Controls browser keepalive behavior. When set, it overrides any value in\n * browserbaseSessionCreateParams.keepAlive.\n */\n keepAlive?: boolean;\n\n // Local Chromium (optional)\n localBrowserLaunchOptions?: LocalBrowserLaunchOptions;\n\n model?: ModelConfiguration;\n llmClient?: LLMClient; // allow user to pass their own\n systemPrompt?: string;\n logInferenceToFile?: boolean;\n experimental?: boolean;\n verbose?: 0 | 1 | 2;\n selfHeal?: boolean;\n // V2 compatibility fields - only included because the server imports this type and supports V2\n waitForCaptchaSolves?: boolean;\n actTimeoutMs?: number;\n /** Disable pino logging backend (useful for tests or minimal environments). */\n disablePino?: boolean;\n /** Optional external logger hook for integrating with host apps. */\n logger?: (line: LogLine) => void;\n /** Directory used to persist cached actions for act(). */\n cacheDir?: string;\n domSettleTimeout?: number;\n disableAPI?: boolean;\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { Page } from \"./page.js\";\n\ntype RemoteObject = Protocol.Runtime.RemoteObject;\n\nexport type ConsoleListener = (message: ConsoleMessage) => void;\n\nfunction formatRemoteObject(obj: RemoteObject | undefined): string {\n if (!obj) return \"\";\n\n if (\"value\" in obj) {\n const value = obj.value;\n if (value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n\n if (obj.unserializableValue) return obj.unserializableValue;\n if (obj.description) return obj.description;\n\n return obj.type ?? \"\";\n}\n\nexport class ConsoleMessage {\n constructor(\n private readonly event: Protocol.Runtime.ConsoleAPICalledEvent,\n private readonly pageRef?: Page,\n ) {}\n\n type(): Protocol.Runtime.ConsoleAPICalledEvent[\"type\"] {\n return this.event.type;\n }\n\n text(): string {\n const args = this.args();\n if (!args.length) return \"\";\n return args\n .map((arg) => formatRemoteObject(arg))\n .filter((chunk) => chunk.length > 0)\n .join(\" \");\n }\n\n args(): RemoteObject[] {\n return this.event.args ? [...this.event.args] : [];\n }\n\n location(): { url?: string; lineNumber?: number; columnNumber?: number } {\n const frame = this.event.stackTrace?.callFrames?.[0];\n return {\n url: frame?.url,\n lineNumber: frame?.lineNumber,\n columnNumber: frame?.columnNumber,\n };\n }\n\n page(): Page | undefined {\n return this.pageRef;\n }\n\n timestamp(): number | undefined {\n return this.event.timestamp;\n }\n\n raw(): Protocol.Runtime.ConsoleAPICalledEvent {\n return this.event;\n }\n\n toString(): string {\n return this.text();\n }\n}\n", "/**\n * Response\n * -----------------\n *\n * This module implements a Playwright-inspired response wrapper that exposes\n * navigation metadata and helpers for retrieving HTTP response bodies. The\n * abstraction is consumed by navigation routines (e.g. `Page.goto`) so callers\n * can synchronously inspect status codes, lazily fetch body text, or await the\n * network layer finishing the request. The implementation is built directly on\n * Chrome DevTools Protocol primitives \u2013 it holds the originating `requestId`\n * so it can request payloads via `Network.getResponseBody`, and it listens for\n * `responseReceivedExtraInfo`, `loadingFinished`, and `loadingFailed` events to\n * hydrate the richer header view and resolve callers waiting on completion.\n */\n\nimport type { Protocol } from \"devtools-protocol\";\nimport type { SerializableResponse } from \"../types/private/index.js\";\nimport {\n ResponseBodyError,\n ResponseParseError,\n} from \"../types/public/sdkErrors.js\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport type { Frame } from \"./frame.js\";\nimport type { Page } from \"./page.js\";\n\ntype ServerAddr = { ipAddress: string; port: number };\n\nexport function isSerializableResponse(\n value: unknown,\n): value is SerializableResponse {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Partial<SerializableResponse>;\n if (typeof candidate.requestId !== \"string\") return false;\n if (!candidate.response || typeof candidate.response !== \"object\") {\n return false;\n }\n return true;\n}\n\n/**\n * Minimal deferred helper that lets navigation tracking hand out a promise and\n * later control the resolution from event callbacks. Each response owns a\n * single deferred covering the \"finished\" promise so consumers can mirror\n * Playwright's `response.finished()` behaviour.\n */\ntype Deferred<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n};\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (error: Error) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\n/** Normalise header names to lowercase for case-insensitive lookups. */\nfunction normaliseHeaderName(name: string): string {\n return name.toLowerCase();\n}\n\n/** Split multi-value header strings into discrete values while trimming. */\nfunction splitHeaderValues(value: string): string[] {\n return value\n .split(/\\r?\\n/)\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\n/**\n * Parse an HTTP header text block (as emitted by CDP) into an ordered array of\n * name/value pairs while preserving the wire casing.\n */\nfunction parseHeadersText(\n headersText: string | undefined,\n): Array<{ name: string; value: string }> {\n if (!headersText) return [];\n const lines = headersText.split(/\\r?\\n/);\n const entries: Array<{ name: string; value: string }> = [];\n for (const line of lines) {\n if (!line || line.startsWith(\"HTTP/\")) continue;\n const index = line.indexOf(\":\");\n if (index === -1) continue;\n const name = line.slice(0, index).trim();\n const value = line.slice(index + 1).trim();\n entries.push({ name, value });\n }\n return entries;\n}\n\n/**\n * Thin wrapper around CDP response metadata that mirrors the ergonomics of\n * Playwright's `Response` class. The class intentionally keeps the same method\n * names so upstream integrations can transition with minimal code changes.\n */\nexport class Response {\n private readonly page: Page;\n private readonly session: CDPSessionLike;\n private readonly requestId: string;\n private readonly frameId?: string;\n private readonly loaderId?: string;\n private readonly response: Protocol.Network.Response;\n private readonly fromServiceWorkerFlag: boolean;\n private readonly serverAddress?: ServerAddr | null;\n\n private headersObject: Record<string, string>;\n private headersArrayCache: Array<{ name: string; value: string }> | null =\n null;\n private allHeadersCache: Record<string, string> | null = null;\n private readonly headerValuesMap = new Map<string, string[]>();\n\n private finishedDeferred = createDeferred<null | Error>();\n private finishedSettled = false;\n\n private extraInfoHeaders: Protocol.Network.Headers | null = null;\n private extraInfoHeadersText: string | undefined;\n\n /**\n * Build a response wrapper from the CDP notification associated with a\n * navigation. The constructor captures the owning page/session so follow-up\n * methods (body/text/json) can query CDP on-demand. The `response` payload is\n * the raw `Protocol.Network.Response` object emitted by Chrome.\n */\n constructor(params: {\n page: Page;\n session: CDPSessionLike;\n requestId: string;\n frameId?: string;\n loaderId?: string;\n response: Protocol.Network.Response;\n fromServiceWorker: boolean;\n }) {\n this.page = params.page;\n this.session = params.session;\n this.requestId = params.requestId;\n this.frameId = params.frameId;\n this.loaderId = params.loaderId;\n this.response = params.response;\n this.fromServiceWorkerFlag = params.fromServiceWorker;\n\n if (\n params.response.remoteIPAddress &&\n params.response.remotePort !== undefined\n ) {\n this.serverAddress = {\n ipAddress: params.response.remoteIPAddress,\n port: params.response.remotePort,\n };\n } else {\n this.serverAddress = null;\n }\n\n this.headersObject = {};\n for (const [name, value] of Object.entries(this.response.headers ?? {})) {\n const lower = normaliseHeaderName(name);\n if (value === undefined) continue;\n const values = splitHeaderValues(String(value));\n this.headerValuesMap.set(lower, values);\n this.headersObject[lower] = values.join(\", \");\n }\n }\n\n /** URL associated with the navigation request. */\n url(): string {\n return this.response.url;\n }\n\n /** HTTP status code reported by Chrome. */\n status(): number {\n return this.response.status;\n }\n\n /** Human-readable status text that accompanied the response. */\n statusText(): string {\n return this.response.statusText;\n }\n\n /** Convenience predicate that checks for 2xx statuses. */\n ok(): boolean {\n const status = this.status();\n return status >= 200 && status <= 299;\n }\n\n /** Returns the Stagehand frame object that initiated the navigation. */\n frame(): Frame | null {\n if (!this.frameId) return null;\n try {\n return this.page.frameForId(this.frameId);\n } catch {\n return null;\n }\n }\n\n /** Indicates whether the response was serviced by a Service Worker. */\n fromServiceWorker(): boolean {\n return this.fromServiceWorkerFlag;\n }\n\n /**\n * Returns TLS security metadata when provided by the browser. In practice\n * this includes certificate issuer, protocol, and validity interval.\n */\n async securityDetails(): Promise<Protocol.Network.SecurityDetails | null> {\n return this.response.securityDetails ?? null;\n }\n\n /** Returns the resolved server address for the navigation when available. */\n async serverAddr(): Promise<ServerAddr | null> {\n return this.serverAddress ?? null;\n }\n\n /**\n * Returns the response headers normalised to lowercase keys. Matches the\n * behaviour of Playwright's `headers()` by eliding duplicate header entries.\n */\n headers(): Record<string, string> {\n return { ...this.headersObject };\n }\n\n /**\n * Returns all headers including those only surfaced through\n * `responseReceivedExtraInfo` such as `set-cookie`. Values are reported as the\n * browser sends them (no further splitting or concatenation).\n */\n async allHeaders(): Promise<Record<string, string>> {\n if (this.allHeadersCache) return { ...this.allHeadersCache };\n const source = this.extraInfoHeaders ?? this.response.headers ?? {};\n const map: Record<string, string> = {};\n for (const [name, value] of Object.entries(source)) {\n map[name] = String(value);\n }\n this.allHeadersCache = map;\n return { ...map };\n }\n\n /** Returns a concatenated header string for the supplied header name. */\n async headerValue(name: string): Promise<string | null> {\n const values = await this.headerValues(name);\n if (!values.length) return null;\n return values.join(\", \");\n }\n\n /** Returns all values for a header (case-insensitive lookup). */\n async headerValues(name: string): Promise<string[]> {\n const lower = normaliseHeaderName(name);\n if (this.extraInfoHeaders) {\n const raw = this.extraInfoHeaders[name] ?? this.extraInfoHeaders[lower];\n if (raw !== undefined) {\n return splitHeaderValues(String(raw));\n }\n }\n const values = this.headerValuesMap.get(lower);\n return values ? [...values] : [];\n }\n\n /**\n * Returns header entries preserving their original wire casing and ordering.\n * Falls back to the CDP object when the raw header text is unavailable.\n */\n async headersArray(): Promise<Array<{ name: string; value: string }>> {\n if (this.headersArrayCache) return [...this.headersArrayCache];\n\n const entriesFromText = parseHeadersText(this.extraInfoHeadersText);\n if (entriesFromText.length > 0) {\n this.headersArrayCache = entriesFromText;\n return [...entriesFromText];\n }\n\n const entries: Array<{ name: string; value: string }> = [];\n const source = this.extraInfoHeaders ?? this.response.headers ?? {};\n for (const [name, value] of Object.entries(source)) {\n const values = splitHeaderValues(String(value));\n for (const val of values) {\n entries.push({ name, value: val });\n }\n }\n this.headersArrayCache = entries;\n return [...entries];\n }\n\n /**\n * Requests the raw response body from Chrome DevTools Protocol. The method is\n * intentionally lazy because not every caller needs the payload, and CDP only\n * allows retrieving it once the response completes.\n */\n async body(): Promise<Buffer> {\n const result = await this.session\n .send<Protocol.Network.GetResponseBodyResponse>(\n \"Network.getResponseBody\",\n { requestId: this.requestId },\n )\n .catch((error) => {\n throw new ResponseBodyError(String(error));\n });\n\n if (result.base64Encoded) {\n return Buffer.from(result.body, \"base64\");\n }\n return Buffer.from(result.body, \"utf-8\");\n }\n\n /** Decodes the response body as UTF-8 text. */\n async text(): Promise<string> {\n const buffer = await this.body();\n return buffer.toString(\"utf-8\");\n }\n\n /** Parses the response body as JSON and throws if parsing fails. */\n async json<T = unknown>(): Promise<T> {\n const text = await this.text();\n try {\n return JSON.parse(text) as T;\n } catch (error) {\n throw new ResponseParseError(String(error));\n }\n }\n\n /**\n * Resolves once the underlying network request completes or fails. Mirrors\n * Playwright's behaviour by resolving to `null` on success and to an `Error`\n * instance when Chrome reports `Network.loadingFailed`.\n */\n async finished(): Promise<null | Error> {\n return this.finishedDeferred.promise;\n }\n\n /**\n * Internal helper invoked by the navigation tracker when CDP reports extra\n * header information. This keeps the cached header views in sync with the\n * richer metadata.\n */\n public applyExtraInfo(\n event: Protocol.Network.ResponseReceivedExtraInfoEvent,\n ): void {\n this.extraInfoHeaders = event.headers;\n this.extraInfoHeadersText = event.headersText;\n this.allHeadersCache = null;\n this.headersArrayCache = null;\n this.headersObject = {};\n this.headerValuesMap.clear();\n\n const source = event.headers ?? {};\n for (const [name, value] of Object.entries(source)) {\n const lower = normaliseHeaderName(name);\n const segments = splitHeaderValues(String(value));\n this.headerValuesMap.set(lower, segments);\n this.headersObject[lower] = segments.join(\", \");\n }\n }\n\n /**\n * Internal helper for creating a Response object from a Serializable\n * goto response from the Stagehand API\n */\n public static fromSerializable(\n serialized: SerializableResponse,\n context: { page: Page; session: CDPSessionLike },\n ): Response {\n const reconstructed = new Response({\n page: context.page,\n session: context.session,\n requestId: serialized.requestId,\n frameId: serialized.frameId,\n loaderId: serialized.loaderId,\n response: serialized.response as Protocol.Network.Response,\n fromServiceWorker: serialized.fromServiceWorkerFlag ?? false,\n });\n\n if (serialized.extraInfoHeaders) {\n reconstructed.applyExtraInfo({\n requestId: serialized.requestId,\n headers: serialized.extraInfoHeaders,\n headersText: serialized.extraInfoHeadersText,\n } as Protocol.Network.ResponseReceivedExtraInfoEvent);\n }\n\n if (serialized.finishedSettled) {\n reconstructed.markFinished(null);\n }\n\n return reconstructed;\n }\n\n /** Marks the response as finished and resolves the `finished()` promise. */\n public markFinished(error: Error | null): void {\n if (this.finishedSettled) return;\n this.finishedSettled = true;\n if (error) {\n this.finishedDeferred.resolve(error);\n } else {\n this.finishedDeferred.resolve(null);\n }\n }\n}\n", "import { Page } from \"../../understudy/page.js\";\nimport { Page as PlaywrightPage } from \"playwright-core\";\nimport { Page as PatchrightPage } from \"patchright-core\";\nimport { Page as PuppeteerPage } from \"puppeteer-core\";\n\nexport type { PlaywrightPage, PatchrightPage, PuppeteerPage, Page };\nexport type AnyPage = PlaywrightPage | PuppeteerPage | PatchrightPage | Page;\n\nexport { ConsoleMessage } from \"../../understudy/consoleMessage.js\";\nexport type { ConsoleListener } from \"../../understudy/consoleMessage.js\";\n\nexport type LoadState = \"load\" | \"domcontentloaded\" | \"networkidle\";\nexport { Response } from \"../../understudy/response.js\";\n\nexport type SnapshotResult = {\n formattedTree: string;\n xpathMap: Record<string, string>;\n urlMap: Record<string, string>;\n};\n\nexport type PageSnapshotOptions = {\n includeIframes?: boolean;\n};\n", "import {\n CoreAssistantMessage,\n ModelMessage,\n CoreSystemMessage,\n Tool,\n CoreUserMessage,\n generateObject,\n generateText,\n ImagePart,\n TextPart,\n} from \"ai\";\nimport type { LanguageModelV2 } from \"@ai-sdk/provider\";\nimport { CreateChatCompletionOptions, LLMClient } from \"../llm/LLMClient.js\";\nimport { AvailableModel } from \"../types/public/index.js\";\nimport { ChatCompletion } from \"openai/resources\";\n\nexport class AISdkClient extends LLMClient {\n public type = \"aisdk\" as const;\n private model: LanguageModelV2;\n\n constructor({ model }: { model: LanguageModelV2 }) {\n super(model.modelId as AvailableModel);\n this.model = model;\n }\n\n async createChatCompletion<T = ChatCompletion>({\n options,\n }: CreateChatCompletionOptions): Promise<T> {\n const formattedMessages: ModelMessage[] = options.messages.map(\n (message) => {\n if (Array.isArray(message.content)) {\n if (message.role === \"system\") {\n const systemMessage: CoreSystemMessage = {\n role: \"system\",\n content: message.content\n .map((c) => (\"text\" in c ? c.text : \"\"))\n .join(\"\\n\"),\n };\n return systemMessage;\n }\n\n const contentParts = message.content.map((content) => {\n if (\"image_url\" in content) {\n const imageContent: ImagePart = {\n type: \"image\",\n image: content.image_url.url,\n };\n return imageContent;\n } else {\n const textContent: TextPart = {\n type: \"text\",\n text: content.text,\n };\n return textContent;\n }\n });\n\n if (message.role === \"user\") {\n const userMessage: CoreUserMessage = {\n role: \"user\",\n content: contentParts,\n };\n return userMessage;\n } else {\n const textOnlyParts = contentParts.map((part) => ({\n type: \"text\" as const,\n text: part.type === \"image\" ? \"[Image]\" : part.text,\n }));\n const assistantMessage: CoreAssistantMessage = {\n role: \"assistant\",\n content: textOnlyParts,\n };\n return assistantMessage;\n }\n }\n\n return {\n role: message.role,\n content: message.content,\n };\n },\n );\n\n if (options.response_model) {\n const response = await generateObject({\n model: this.model,\n messages: formattedMessages,\n schema: options.response_model.schema,\n });\n\n return {\n data: response.object,\n usage: {\n prompt_tokens: response.usage.inputTokens ?? 0,\n completion_tokens: response.usage.outputTokens ?? 0,\n reasoning_tokens: response.usage.reasoningTokens ?? 0,\n cached_input_tokens: response.usage.cachedInputTokens ?? 0,\n total_tokens: response.usage.totalTokens ?? 0,\n },\n } as T;\n }\n\n const tools: Record<string, Tool> = {};\n\n for (const rawTool of options.tools) {\n tools[rawTool.name] = {\n description: rawTool.description,\n inputSchema: rawTool.parameters,\n } as Tool;\n }\n\n const response = await generateText({\n model: this.model,\n messages: formattedMessages,\n tools,\n });\n\n return {\n data: response.text,\n usage: {\n prompt_tokens: response.usage.inputTokens ?? 0,\n completion_tokens: response.usage.outputTokens ?? 0,\n reasoning_tokens: response.usage.reasoningTokens ?? 0,\n cached_input_tokens: response.usage.cachedInputTokens ?? 0,\n total_tokens: response.usage.totalTokens ?? 0,\n },\n } as T;\n }\n}\n", "/**\n * Welcome to the Stagehand custom OpenAI client!\n *\n * This is a client for models that are compatible with the OpenAI API, like Ollama, Gemini, etc.\n * You can just pass in an OpenAI instance to the client and it will work.\n */\n\nimport type { AvailableModel } from \"../types/public/model.js\";\nimport { CreateChatCompletionOptions, LLMClient } from \"../llm/LLMClient.js\";\nimport OpenAI from \"openai\";\nimport type {\n ChatCompletion,\n ChatCompletionAssistantMessageParam,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartText,\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionMessageParam,\n ChatCompletionSystemMessageParam,\n ChatCompletionUserMessageParam,\n} from \"openai/resources/chat/completions\";\nimport { toJsonSchema } from \"../zodCompat.js\";\nimport { validateZodSchema } from \"../../utils.js\";\nimport {\n CreateChatCompletionResponseError,\n ZodSchemaValidationError,\n} from \"../types/public/sdkErrors.js\";\n\nexport class CustomOpenAIClient extends LLMClient {\n public type = \"openai\" as const;\n private client: OpenAI;\n\n constructor({ modelName, client }: { modelName: string; client: OpenAI }) {\n super(modelName as AvailableModel);\n this.client = client;\n this.modelName = modelName as AvailableModel;\n }\n\n async createChatCompletion<T = ChatCompletion>({\n options,\n retries = 3,\n logger,\n }: CreateChatCompletionOptions): Promise<T> {\n const { image, requestId, ...optionsWithoutImageAndRequestId } = options;\n\n // TODO: Implement vision support\n if (image) {\n console.warn(\n \"Image provided. Vision is not currently supported for openai\",\n );\n }\n\n logger({\n category: \"openai\",\n message: \"creating chat completion\",\n level: 1,\n auxiliary: {\n options: {\n value: JSON.stringify({\n ...optionsWithoutImageAndRequestId,\n requestId,\n }),\n type: \"object\",\n },\n modelName: {\n value: this.modelName,\n type: \"string\",\n },\n },\n });\n\n let responseFormat:\n | ChatCompletionCreateParamsNonStreaming[\"response_format\"]\n | undefined;\n if (options.response_model) {\n responseFormat = {\n type: \"json_object\",\n };\n }\n\n /* eslint-disable */\n // Remove unsupported options\n const { response_model, ...openaiOptions } = {\n ...optionsWithoutImageAndRequestId,\n model: this.modelName,\n };\n\n logger({\n category: \"openai\",\n message: \"creating chat completion\",\n level: 1,\n auxiliary: {\n openaiOptions: {\n value: JSON.stringify(openaiOptions),\n type: \"object\",\n },\n },\n });\n\n const formattedMessages: ChatCompletionMessageParam[] =\n options.messages.map((message) => {\n if (Array.isArray(message.content)) {\n const contentParts = message.content.map((content) => {\n if (\"image_url\" in content) {\n const imageContent: ChatCompletionContentPartImage = {\n image_url: {\n url: content.image_url.url,\n },\n type: \"image_url\",\n };\n return imageContent;\n } else {\n const textContent: ChatCompletionContentPartText = {\n text: content.text,\n type: \"text\",\n };\n return textContent;\n }\n });\n\n if (message.role === \"system\") {\n const formattedMessage: ChatCompletionSystemMessageParam = {\n ...message,\n role: \"system\",\n content: contentParts.filter(\n (content): content is ChatCompletionContentPartText =>\n content.type === \"text\",\n ),\n };\n return formattedMessage;\n } else if (message.role === \"user\") {\n const formattedMessage: ChatCompletionUserMessageParam = {\n ...message,\n role: \"user\",\n content: contentParts,\n };\n return formattedMessage;\n } else {\n const formattedMessage: ChatCompletionAssistantMessageParam = {\n ...message,\n role: \"assistant\",\n content: contentParts.filter(\n (content): content is ChatCompletionContentPartText =>\n content.type === \"text\",\n ),\n };\n return formattedMessage;\n }\n }\n\n return {\n ...message,\n content: message.content,\n } as ChatCompletionMessageParam;\n });\n\n if (options.response_model) {\n const schemaJson = JSON.stringify(\n toJsonSchema(options.response_model.schema),\n null,\n 2,\n );\n formattedMessages.push({\n role: \"user\",\n content: `Respond with valid JSON matching this schema:\\n${schemaJson}\\n\\nDo not include any other text, formatting or markdown in your output. Do not include \\`\\`\\` or \\`\\`\\`json in your response. Only the JSON object itself.`,\n });\n }\n\n const body: ChatCompletionCreateParamsNonStreaming = {\n ...openaiOptions,\n model: this.modelName,\n messages: formattedMessages,\n response_format: responseFormat,\n stream: false,\n tools: options.tools?.map((tool) => ({\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n type: \"function\",\n })),\n };\n\n const response = await this.client.chat.completions.create(body);\n\n logger({\n category: \"openai\",\n message: \"response\",\n level: 1,\n auxiliary: {\n response: {\n value: JSON.stringify(response),\n type: \"object\",\n },\n requestId: {\n value: requestId,\n type: \"string\",\n },\n },\n });\n\n if (options.response_model) {\n const extractedData = response.choices[0].message.content;\n if (!extractedData) {\n throw new CreateChatCompletionResponseError(\"No content in response\");\n }\n\n let parsedData: unknown;\n try {\n parsedData = JSON.parse(extractedData);\n validateZodSchema(options.response_model.schema, parsedData);\n } catch (e) {\n const isParseError = e instanceof SyntaxError;\n logger({\n category: \"openai\",\n message: isParseError\n ? \"Response is not valid JSON\"\n : \"Response failed Zod schema validation\",\n level: 0,\n });\n if (retries > 0) {\n return this.createChatCompletion({\n options,\n logger,\n retries: retries - 1,\n });\n }\n\n if (e instanceof ZodSchemaValidationError) {\n logger({\n category: \"openai\",\n message: `Error during chat completion: ${e.message}`,\n level: 0,\n auxiliary: {\n errorDetails: {\n value: `Message: ${e.message}${e.stack ? \"\\nStack: \" + e.stack : \"\"}`,\n type: \"string\",\n },\n requestId: { value: requestId, type: \"string\" },\n },\n });\n throw new CreateChatCompletionResponseError(e.message);\n }\n throw new CreateChatCompletionResponseError(\n isParseError\n ? \"Failed to parse model response as JSON\"\n : e instanceof Error\n ? e.message\n : \"Unknown error during response processing\",\n );\n }\n\n return {\n data: parsedData,\n usage: {\n prompt_tokens: response.usage?.prompt_tokens ?? 0,\n completion_tokens: response.usage?.completion_tokens ?? 0,\n total_tokens: response.usage?.total_tokens ?? 0,\n },\n } as T;\n }\n\n return {\n data: response.choices[0].message.content,\n usage: {\n prompt_tokens: response.usage?.prompt_tokens ?? 0,\n completion_tokens: response.usage?.completion_tokens ?? 0,\n total_tokens: response.usage?.total_tokens ?? 0,\n },\n } as T;\n }\n}\n", "export * from \"./agent.js\";\n// Export api.ts under namespace to avoid conflicts with methods.ts types\nexport * as Api from \"./api.js\";\nexport * from \"./apiErrors.js\";\nexport * from \"./logs.js\";\nexport * from \"./methods.js\";\nexport * from \"./metrics.js\";\nexport * from \"./model.js\";\nexport * from \"./options.js\";\nexport * from \"./page.js\";\nexport * from \"./sdkErrors.js\";\nexport { AISdkClient } from \"../../external_clients/aisdk.js\";\nexport { CustomOpenAIClient } from \"../../external_clients/customOpenAI.js\";\n", "// 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 \u2192 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 \u2192 DOM.querySelector \u2192 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", "// lib/v3/understudy/frameRegistry.ts\nimport type { Protocol } from \"devtools-protocol\";\n\n/**\n * FrameRegistry\n *\n * Purpose:\n * A single, authoritative source of truth for **both**:\n * 1) Frame topology (parent/children, current main/root id, last-seen CDP `Frame`)\n * 2) Frame \u2192 Session ownership (which CDP session owns a given frameId)\n * 3) Optional iframe-owner metadata (backendNodeId of the <iframe> element in the parent doc)\n *\n *\n * Model:\n * - This class is **CDP-agnostic**; it stores **sessionId strings** (not session objects).\n * - Context bridges (wiring Target/Page events) must call the mutators below (onAttached,\n * onNavigated, onDetached, adoptChildSession, seedFromFrameTree, setOwnerBackendNodeId).\n * - Consumers ask read APIs (getOwnerSessionId, getParent, asProtocolFrameTree, listAll, \u2026)\n * and never probe ownership at run time.\n */\n\ntype FrameId = string;\ntype SessionId = string;\n\ntype FrameInfo = {\n /** Parent frame id, or null for root */\n parentId: FrameId | null;\n /** Children frame ids (direct) */\n children: Set<FrameId>;\n /** Last-seen CDP Frame metadata for this id (may be a shell if never seen) */\n lastSeen?: Protocol.Page.Frame;\n\n /** Owning session id (CDP child session for OOPIF, top-level session for same-process) */\n ownerSessionId?: SessionId;\n\n /**\n * The backendNodeId of the <iframe> element **in the parent document** that hosts this frame.\n * Useful for building absolute XPath prefixes or DOM scoping in the parent session.\n */\n ownerBackendNodeId?: number;\n};\n\n/** Minimal \u201Cshell\u201D CDP frame used when we haven\u2019t yet seen a real Frame from events. */\nfunction shellFrame(id: FrameId): Protocol.Page.Frame {\n return {\n id,\n loaderId: \"\",\n url: \"\",\n domainAndRegistry: \"\",\n securityOrigin: \"\",\n mimeType: \"text/html\",\n secureContextType: \"InsecureScheme\",\n crossOriginIsolatedContextType: \"NotIsolated\",\n gatedAPIFeatures: [],\n } as Protocol.Page.Frame;\n}\n\nexport class FrameRegistry {\n /** Owner target id (top-level target); informational only */\n private readonly ownerTargetId: string;\n\n /** Current main/root frame id (changes on root swaps) */\n private rootFrameId: FrameId;\n\n /** frameId \u2192 FrameInfo */\n private frames = new Map<FrameId, FrameInfo>();\n\n /** sessionId \u2192 Set<frameId> (inverse map for diagnostics/fast membership checks) */\n private framesBySession = new Map<SessionId, Set<FrameId>>();\n\n constructor(ownerTargetId: string, mainFrameId: FrameId) {\n this.ownerTargetId = ownerTargetId;\n this.rootFrameId = mainFrameId;\n this.ensureNode(mainFrameId);\n }\n\n // ---------------------- Mutators (called by Context/Page bridges) ----------------------\n\n /**\n * Record that a frame attached. If `parentId` is null and `frameId` differs from the current\n * root, this is a root swap and we rename the root id.\n *\n * IMPORTANT: The emitter's `sessionId` is the **owner** for the new/attached frame.\n */\n onFrameAttached(\n frameId: FrameId,\n parentId: FrameId | null,\n sessionId: SessionId,\n ): void {\n // Root swap (parentId === null for main frames).\n if (!parentId && frameId !== this.rootFrameId) {\n this.renameNodeId(this.rootFrameId, frameId);\n this.rootFrameId = frameId;\n // ownership moves to this session as well\n this.setOwnerSessionIdInternal(frameId, sessionId);\n return;\n }\n\n // Normal attach\n this.ensureNode(frameId);\n if (parentId) this.ensureNode(parentId);\n\n const info = this.frames.get(frameId)!;\n info.parentId = parentId ?? null;\n\n if (parentId) {\n this.frames.get(parentId)!.children.add(frameId);\n }\n\n // Ownership: the session that emitted frameAttached owns this frame.\n this.setOwnerSessionIdInternal(frameId, sessionId);\n }\n\n /**\n * Record a navigation with the full CDP `Frame`. Also updates ownership based on the emitting\n * session id. Handles root swap if the navigated frame is the new main (no parentId).\n */\n onFrameNavigated(frame: Protocol.Page.Frame, sessionId: SessionId): void {\n this.ensureNode(frame.id);\n const info = this.frames.get(frame.id)!;\n info.lastSeen = frame;\n\n // Ownership follows the session that reported the navigation\n this.setOwnerSessionIdInternal(frame.id, sessionId);\n\n // If this frame has no parent, it might be the (new) main/root\n if (!(\"parentId\" in frame) || !frame.parentId) {\n if (frame.id !== this.rootFrameId) {\n // carry ordinal semantics by renaming the root id\n this.renameNodeId(this.rootFrameId, frame.id);\n this.rootFrameId = frame.id;\n }\n }\n }\n\n onNavigatedWithinDocument(\n frameId: FrameId,\n url: string,\n sessionId: SessionId,\n ): void {\n this.ensureNode(frameId);\n const info = this.frames.get(frameId)!;\n const lastSeen = info.lastSeen ?? shellFrame(frameId);\n info.lastSeen = { ...lastSeen, url };\n this.setOwnerSessionIdInternal(frameId, sessionId);\n }\n\n /**\n * Record that a frame detached. If `reason !== \"swap\"`, remove the subtree from the graph,\n * and clean the inverse maps. For \u201Cswap\u201D we keep the node to preserve continuity.\n */\n onFrameDetached(\n frameId: FrameId,\n reason: \"remove\" | \"swap\" | string = \"remove\",\n ): void {\n if (reason === \"swap\") return;\n\n // Collect subtree starting from frameId.\n const toRemove: FrameId[] = [];\n const collect = (fid: FrameId) => {\n toRemove.push(fid);\n const kids = this.frames.get(fid)?.children ?? new Set<FrameId>();\n for (const k of kids) collect(k);\n };\n collect(frameId);\n\n // Remove nodes, fix parents and inverse maps\n for (const fid of toRemove) {\n const info = this.frames.get(fid);\n if (!info) continue;\n\n // unlink from parent\n if (info.parentId) {\n const p = this.frames.get(info.parentId);\n p?.children.delete(fid);\n }\n\n // unlink inverse session map\n if (info.ownerSessionId) {\n const bag = this.framesBySession.get(info.ownerSessionId);\n bag?.delete(fid);\n if (bag && bag.size === 0)\n this.framesBySession.delete(info.ownerSessionId);\n }\n\n this.frames.delete(fid);\n }\n\n // Guard root if we removed it; assign a placeholder root if needed\n if (!this.frames.has(this.rootFrameId)) {\n // Choose an arbitrary remaining node as root\n const iter = this.frames.keys().next();\n if (!iter.done) this.rootFrameId = iter.value;\n }\n }\n\n /**\n * An adopted OOPIF child session was created whose **main** frame id equals the parent iframe\u2019s frameId.\n * We mark the entire child subtree as owned by `childSessionId`.\n * (Topology edges remain aligned by the parent session\u2019s `frameAttached` events.)\n */\n adoptChildSession(\n childSessionId: SessionId,\n childMainFrameId: FrameId,\n ): void {\n // The child session will emit its own navigations/attachments; as a seed,\n // mark the root frame as owned by the child session.\n this.setOwnerSessionIdInternal(childMainFrameId, childSessionId);\n }\n\n /**\n * Seed topology and ownership from an existing `Page.getFrameTree` snapshot, typically right after\n * a session is attached. This is a best-effort: we record frames and set the provided `sessionId`\n * as owner for the subtree **if** an owner isn't already set.\n */\n seedFromFrameTree(\n sessionId: SessionId,\n frameTree: Protocol.Page.FrameTree,\n ): void {\n const walk = (tree: Protocol.Page.FrameTree, parent: FrameId | null) => {\n this.ensureNode(tree.frame.id);\n // topology\n this.frames.get(tree.frame.id)!.parentId = parent;\n if (parent) this.frames.get(parent)!.children.add(tree.frame.id);\n // last-seen frame\n this.frames.get(tree.frame.id)!.lastSeen = tree.frame;\n // ownership (only if unknown)\n if (!this.frames.get(tree.frame.id)!.ownerSessionId) {\n this.setOwnerSessionIdInternal(tree.frame.id, sessionId);\n }\n for (const c of tree.childFrames ?? []) walk(c, tree.frame.id);\n };\n walk(frameTree, null);\n }\n\n /**\n * Set the backendNodeId of the `<iframe>` element for a child frame **as seen from its parent**.\n * This is useful for building absolute XPath prefixes later (from the parent document).\n */\n setOwnerBackendNodeId(childFrameId: FrameId, backendNodeId: number): void {\n this.ensureNode(childFrameId);\n this.frames.get(childFrameId)!.ownerBackendNodeId = backendNodeId;\n }\n\n // ---------------------- Readers (consumed by Page/snapshot/locators) ----------------------\n\n mainFrameId(): FrameId {\n return this.rootFrameId;\n }\n\n /**\n * Return the owner session id for this frame. If unknown, returns `undefined`.\n */\n getOwnerSessionId(frameId: FrameId): SessionId | undefined {\n return this.frames.get(frameId)?.ownerSessionId;\n }\n\n /**\n * Return the owner backendNodeId (iframe element) if recorded.\n * This is in the **parent** document; pair it with `getParent`.\n */\n getOwnerBackendNodeId(frameId: FrameId): number | undefined {\n return this.frames.get(frameId)?.ownerBackendNodeId;\n }\n\n /**\n * Return the parent frame id, or null for root/unknown.\n */\n getParent(frameId: FrameId): FrameId | null {\n return this.frames.get(frameId)?.parentId ?? null;\n }\n\n /**\n * List frame ids in root-first DFS order (same shape as CDP\u2019s FrameTree traversal).\n */\n listAllFrames(): FrameId[] {\n const out: FrameId[] = [];\n const dfs = (fid: FrameId) => {\n out.push(fid);\n const kids = this.frames.get(fid)?.children ?? new Set<FrameId>();\n for (const k of kids) dfs(k);\n };\n if (this.frames.has(this.rootFrameId)) dfs(this.rootFrameId);\n return out;\n }\n\n /**\n * Serialize to `Protocol.Page.FrameTree` starting at the given root id (typically mainFrameId()).\n */\n asProtocolFrameTree(rootId: FrameId): Protocol.Page.FrameTree {\n const build = (fid: FrameId): Protocol.Page.FrameTree => {\n const info = this.frames.get(fid);\n const frame = info?.lastSeen ?? shellFrame(fid);\n\n const kids = info?.children ?? new Set<FrameId>();\n const childFrames = kids.size\n ? [...kids].map((k) => build(k))\n : undefined;\n\n return childFrames ? { frame, childFrames } : { frame };\n };\n\n return build(rootId);\n }\n\n /**\n * For diagnostics: return the current owner sessions for a frame id (0..n),\n * usually 0 or 1, but helpful to see potential inconsistencies during wiring.\n */\n sessionsForFrame(frameId: FrameId): SessionId[] {\n const info = this.frames.get(frameId);\n return info?.ownerSessionId ? [info.ownerSessionId] : [];\n }\n\n /**\n * For diagnostics: return current frame set per session.\n */\n framesForSession(sessionId: SessionId): FrameId[] {\n return [...(this.framesBySession.get(sessionId) ?? new Set())];\n }\n\n // ---------------------- Internal helpers ----------------------\n\n private ensureNode(fid: FrameId): void {\n if (this.frames.has(fid)) return;\n this.frames.set(fid, {\n parentId: null,\n children: new Set<FrameId>(),\n lastSeen: shellFrame(fid),\n ownerSessionId: undefined,\n ownerBackendNodeId: undefined,\n });\n }\n\n private renameNodeId(oldId: FrameId, newId: FrameId): void {\n if (oldId === newId) return;\n this.ensureNode(oldId);\n\n const info = this.frames.get(oldId)!;\n\n // Move info under new id\n this.frames.delete(oldId);\n this.frames.set(newId, { ...info });\n\n // Fix parent\u2019s children set\n if (info.parentId) {\n const p = this.frames.get(info.parentId);\n if (p) {\n p.children.delete(oldId);\n p.children.add(newId);\n }\n }\n\n // Fix children\u2019s parent pointers\n for (const c of info.children) {\n const ci = this.frames.get(c);\n if (ci) ci.parentId = newId;\n }\n\n // Fix inverse map (session -> frames)\n if (info.ownerSessionId) {\n const bag = this.framesBySession.get(info.ownerSessionId);\n if (bag) {\n bag.delete(oldId);\n bag.add(newId);\n }\n }\n\n // If root moved, keep the root id updated is handled by caller\n }\n\n private setOwnerSessionIdInternal(\n frameId: FrameId,\n sessionId: SessionId,\n ): void {\n this.ensureNode(frameId);\n const info = this.frames.get(frameId)!;\n\n // If the owner is unchanged, do nothing\n if (info.ownerSessionId === sessionId) return;\n\n // Remove from previous owner bag\n if (info.ownerSessionId) {\n const prev = this.framesBySession.get(info.ownerSessionId);\n prev?.delete(frameId);\n if (prev && prev.size === 0)\n this.framesBySession.delete(info.ownerSessionId);\n }\n\n // Set new owner and update bag\n info.ownerSessionId = sessionId;\n const bag = this.framesBySession.get(sessionId) ?? new Set<FrameId>();\n bag.add(frameId);\n this.framesBySession.set(sessionId, bag);\n }\n}\n", "import { Protocol } from \"devtools-protocol\";\n\n/** Metadata tracked for each network request currently in-flight. */\nexport type NetworkRequestInfo = {\n sessionId: string;\n requestId: string;\n requestKey: string;\n frameId?: string;\n loaderId?: string;\n url?: string;\n timestamp: number;\n resourceType?: Protocol.Network.ResourceType;\n documentRequest: boolean;\n};\n\n/** Callback hooks consumers can implement to observe network transitions. */\nexport interface NetworkObserver {\n onRequestStarted(info: NetworkRequestInfo): void;\n onRequestFinished(info: NetworkRequestInfo): void;\n onRequestFailed(info: NetworkRequestInfo): void;\n}\n\n/** Options for the idle waiter helper. */\nexport type WaitForIdleOptions = {\n startTime?: number;\n timeoutMs: number;\n idleTimeMs?: number;\n filter?: (info: NetworkRequestInfo) => boolean;\n totalBudgetMs?: number;\n};\n\nexport const DEFAULT_IDLE_WAIT = 500;\nexport const IGNORED_RESOURCE_TYPES = new Set<\n Protocol.Network.ResourceType | undefined\n>([\"EventSource\", \"WebSocket\"]);\n\n/** The handle returned by the network manager idle helper. */\nexport type WaitForIdleHandle = {\n promise: Promise<void>;\n dispose: () => void;\n};\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport {\n DEFAULT_IDLE_WAIT,\n IGNORED_RESOURCE_TYPES,\n NetworkObserver,\n NetworkRequestInfo,\n WaitForIdleHandle,\n WaitForIdleOptions,\n} from \"../types/private/network.js\";\n\n/**\n * Cross-session network tracker.\n *\n * Centralises network bookkeeping for a Page: every CDP session (top-level and OOPIF)\n * funnels `Network.*` events through here so higher-level waiters can reason about\n * in-flight requests across the entire frame tree. The manager exposes a simple\n * observer interface plus a \"wait until idle\" helper that resolves once no filtered\n * requests remain for a quiet window.\n */\n\n/**\n * Aggregates network information for all CDP sessions owned by a Page.\n */\nexport class NetworkManager {\n private readonly sessions = new Map<\n string,\n {\n session: CDPSessionLike;\n detach: () => void;\n }\n >();\n\n private readonly observers = new Set<NetworkObserver>();\n\n private readonly requests = new Map<string, NetworkRequestInfo>();\n\n private readonly documentRequestsByFrame = new Map<string, string>();\n\n /**\n * Begin tracking network traffic for a CDP session (top-level or OOPIF).\n * Safe to call multiple times; duplicate registrations are ignored.\n */\n public trackSession(session: CDPSessionLike): void {\n const sid = this.sessionKey(session);\n if (this.sessions.has(sid)) return;\n\n const onRequest = (evt: Protocol.Network.RequestWillBeSentEvent) => {\n if (!evt || !evt.requestId) return;\n\n const info: NetworkRequestInfo = {\n sessionId: sid,\n requestId: evt.requestId,\n requestKey: this.requestKey(sid, evt.requestId),\n frameId: evt.frameId ?? undefined,\n loaderId: evt.loaderId ?? undefined,\n url: evt.request?.url,\n timestamp: Date.now(),\n resourceType: evt.type,\n documentRequest: evt.type === \"Document\",\n };\n\n this.requests.set(info.requestKey, info);\n if (info.documentRequest && info.frameId) {\n this.documentRequestsByFrame.set(info.frameId, info.requestKey);\n }\n\n this.emitStart(info);\n };\n\n const finish = (reqId: string) => {\n const key = this.requestKey(sid, reqId);\n const stored = this.requests.get(key);\n if (stored?.frameId) {\n this.documentRequestsByFrame.delete(stored.frameId);\n }\n const info: NetworkRequestInfo = stored ?? {\n sessionId: sid,\n requestId: reqId,\n requestKey: key,\n timestamp: Date.now(),\n documentRequest: false,\n };\n this.requests.delete(key);\n this.emitFinish(info);\n };\n\n const fail = (reqId: string) => {\n const key = this.requestKey(sid, reqId);\n const stored = this.requests.get(key);\n if (stored?.frameId) {\n this.documentRequestsByFrame.delete(stored.frameId);\n }\n const info: NetworkRequestInfo = stored ?? {\n sessionId: sid,\n requestId: reqId,\n requestKey: key,\n timestamp: Date.now(),\n documentRequest: false,\n };\n this.requests.delete(key);\n this.emitFailure(info);\n };\n\n const onFinished = (evt: { requestId: string }) => {\n if (!evt?.requestId) return;\n finish(evt.requestId);\n };\n\n const onFailed = (evt: Protocol.Network.LoadingFailedEvent) => {\n if (!evt?.requestId) return;\n fail(evt.requestId);\n };\n\n const onResponse = (evt: Protocol.Network.ResponseReceivedEvent) => {\n if (!evt?.requestId) return;\n const url = evt.response?.url ?? \"\";\n if (url.startsWith(\"data:\")) finish(evt.requestId);\n };\n\n const onFrameStopped = (evt: Protocol.Page.FrameStoppedLoadingEvent) => {\n if (!evt?.frameId) return;\n const key = this.documentRequestsByFrame.get(evt.frameId);\n if (!key) return;\n const stored = this.requests.get(key);\n if (!stored) {\n this.documentRequestsByFrame.delete(evt.frameId);\n return;\n }\n this.requests.delete(key);\n this.documentRequestsByFrame.delete(evt.frameId);\n this.emitFinish({ ...stored, timestamp: Date.now() });\n };\n\n session.on(\"Network.requestWillBeSent\", onRequest);\n session.on(\"Network.loadingFinished\", onFinished);\n session.on(\"Network.loadingFailed\", onFailed);\n session.on(\"Network.requestServedFromCache\", onFinished);\n session.on(\"Network.responseReceived\", onResponse);\n session.on(\"Page.frameStoppedLoading\", onFrameStopped);\n\n void session.send(\"Network.enable\").catch(() => {});\n void session.send(\"Page.enable\").catch(() => {});\n\n this.sessions.set(sid, {\n session,\n detach: () => {\n session.off(\"Network.requestWillBeSent\", onRequest);\n session.off(\"Network.loadingFinished\", onFinished);\n session.off(\"Network.loadingFailed\", onFailed);\n session.off(\"Network.requestServedFromCache\", onFinished);\n session.off(\"Network.responseReceived\", onResponse);\n session.off(\"Page.frameStoppedLoading\", onFrameStopped);\n },\n });\n }\n\n /**\n * Stop tracking a session and discard any inflight bookkeeping owned by it.\n */\n public untrackSession(rawSessionId: string | undefined): void {\n const sid = rawSessionId ?? \"__main__\";\n const entry = this.sessions.get(sid);\n if (!entry) return;\n entry.detach();\n this.sessions.delete(sid);\n\n for (const key of [...this.requests.keys()]) {\n if (key.startsWith(`${sid}:`)) this.requests.delete(key);\n }\n\n for (const [frameId, key] of [...this.documentRequestsByFrame.entries()]) {\n if (key.startsWith(`${sid}:`)) {\n this.documentRequestsByFrame.delete(frameId);\n }\n }\n }\n\n /**\n * Register a passive observer for request lifecycle notifications.\n * Returns a disposer that removes the observer.\n */\n public addObserver(observer: NetworkObserver): () => void {\n this.observers.add(observer);\n return () => {\n this.observers.delete(observer);\n };\n }\n\n /**\n * Resolve once no (filtered) requests are in flight for the given quiet window.\n * The waiter automatically unregisters itself on completion or timeout.\n */\n public waitForIdle(options: WaitForIdleOptions): WaitForIdleHandle {\n const startTime = options.startTime ?? Date.now();\n const idleTimeMs = options.idleTimeMs ?? DEFAULT_IDLE_WAIT;\n const timeoutMs = options.timeoutMs;\n const remainingBudgetMs = Number.isFinite(timeoutMs)\n ? timeoutMs\n : undefined;\n const originalBudgetMs = Number.isFinite(options.totalBudgetMs ?? NaN)\n ? (options.totalBudgetMs as number)\n : remainingBudgetMs;\n\n const filter =\n options.filter ??\n ((info: NetworkRequestInfo) => {\n return !IGNORED_RESOURCE_TYPES.has(info.resourceType);\n });\n\n const tracked = new Set<string>();\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n let settled = false;\n\n let resolveFn: (() => void) | null = null;\n let rejectFn: ((error: Error) => void) | null = null;\n\n const cleanup = (error?: Error) => {\n if (settled) return;\n settled = true;\n if (idleTimer) clearTimeout(idleTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n removeObserver();\n tracked.clear();\n if (error) {\n rejectFn?.(error);\n } else {\n resolveFn?.();\n }\n };\n\n const maybeIdle = () => {\n if (settled) return;\n if (tracked.size === 0) {\n if (!idleTimer) {\n idleTimer = setTimeout(() => {\n cleanup();\n }, idleTimeMs);\n }\n } else if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = null;\n }\n };\n\n const observer: NetworkObserver = {\n onRequestStarted: (info) => {\n if (settled) return;\n if (info.timestamp < startTime) return;\n if (!filter(info)) return;\n tracked.add(info.requestKey);\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = null;\n }\n },\n onRequestFinished: (info) => {\n if (settled) return;\n if (!tracked.delete(info.requestKey)) return;\n maybeIdle();\n },\n onRequestFailed: (info) => {\n if (settled) return;\n if (!tracked.delete(info.requestKey)) return;\n maybeIdle();\n },\n };\n\n const removeObserver = this.addObserver(observer);\n\n const promise = new Promise<void>((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n\n // Trigger initial idle check so that we still respect the quiet window\n maybeIdle();\n\n if (Number.isFinite(timeoutMs)) {\n timeoutTimer = setTimeout(\n () => {\n const elapsed = Date.now() - startTime;\n const message =\n originalBudgetMs !== undefined\n ? `networkidle timed out after ${originalBudgetMs}ms`\n : `networkidle timed out after ${elapsed}ms`;\n cleanup(new Error(message));\n },\n Math.max(0, timeoutMs),\n );\n }\n\n return {\n promise,\n dispose: () => cleanup(new Error(\"waitForIdle disposed\")),\n };\n }\n\n /**\n * Tear down all session listeners and clear observers/bookkeeping.\n */\n public dispose(): void {\n for (const { detach } of this.sessions.values()) {\n detach();\n }\n this.sessions.clear();\n this.observers.clear();\n this.requests.clear();\n this.documentRequestsByFrame.clear();\n }\n\n /** Fan-out helper when a tracked request starts. */\n private emitStart(info: NetworkRequestInfo): void {\n for (const obs of this.observers) {\n obs.onRequestStarted(info);\n }\n }\n\n /** Fan-out helper when a tracked request completes successfully. */\n private emitFinish(info: NetworkRequestInfo): void {\n for (const obs of this.observers) {\n obs.onRequestFinished(info);\n }\n }\n\n /** Fan-out helper when a tracked request fails mid-flight. */\n private emitFailure(info: NetworkRequestInfo): void {\n for (const obs of this.observers) {\n obs.onRequestFailed(info);\n }\n }\n\n /** Compute a stable key for a session (falls back to synthetic root id). */\n private sessionKey(session: CDPSessionLike): string {\n return session.id ?? \"__main__\";\n }\n\n /** Compose the unique key for tracking a request under a session. */\n private requestKey(sessionId: string, requestId: string): string {\n return `${sessionId}:${requestId}`;\n }\n}\n", "import type { Protocol } from \"devtools-protocol\";\nimport type { LoadState } from \"../types/public/page.js\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport type { NetworkManager } from \"./networkManager.js\";\nimport type { Page } from \"./page.js\";\nimport { TimeoutError } from \"../types/public/sdkErrors.js\";\nimport {\n DEFAULT_IDLE_WAIT,\n IGNORED_RESOURCE_TYPES,\n type NetworkRequestInfo,\n WaitForIdleHandle,\n} from \"../types/private/network.js\";\n\n/**\n * Coordinates page lifecycle waits (load/domcontentloaded/networkidle) while\n * following main-frame swaps and navigation aborts. Each navigation spawns a\n * one-off watcher that listens for relevant CDP events and resolves or rejects\n * depending on the requested `waitUntil` state.\n */\n\n/**\n * Small utility that mirrors Playwright's lifecycle watcher semantics. Bridges\n * main-frame lifecycle events with the NetworkManager's idle signal so callers\n * can await `load`, `domcontentloaded`, or `networkidle` with a single promise.\n */\nexport class LifecycleWatcher {\n private readonly page: Page;\n private readonly mainSession: CDPSessionLike;\n private readonly networkManager: NetworkManager;\n private readonly waitUntil: LoadState;\n private readonly timeoutMs: number;\n private readonly startTime: number;\n private readonly navigationCommandId: number;\n private currentLoaderId: string | undefined;\n private idleStartTime: number;\n\n private cleanupCallbacks: Array<() => void> = [];\n private idleHandle: WaitForIdleHandle | null = null;\n\n private abortReject: ((error: Error) => void) | null = null;\n private abortPromise: Promise<never>;\n private abortError: Error | null = null;\n private disposed = false;\n\n private expectedLoaderId: string | undefined;\n private initialLoaderId: string | undefined;\n private pendingFollowupNavigation = false;\n\n /**\n * Create a watcher; callers should subsequently invoke {@link wait}.\n */\n constructor(params: {\n page: Page;\n mainSession: CDPSessionLike;\n networkManager: NetworkManager;\n waitUntil: LoadState;\n timeoutMs: number;\n navigationCommandId: number;\n }) {\n this.page = params.page;\n this.mainSession = params.mainSession;\n this.networkManager = params.networkManager;\n this.waitUntil = params.waitUntil;\n this.timeoutMs = params.timeoutMs;\n this.startTime = Date.now();\n this.navigationCommandId = params.navigationCommandId;\n this.idleStartTime = this.startTime;\n\n this.abortPromise = new Promise<never>((_, reject) => {\n this.abortReject = reject;\n });\n\n this.installSessionListeners();\n }\n\n /** Hint the watcher with the loader id returned by Page.navigate. */\n public setExpectedLoaderId(loaderId: string | undefined): void {\n if (!loaderId) return;\n this.expectedLoaderId = loaderId;\n this.initialLoaderId = loaderId;\n this.currentLoaderId = loaderId;\n this.idleStartTime = Date.now();\n }\n\n /** Wait for the requested lifecycle state or throw on timeout/abort. */\n public async wait(): Promise<void> {\n const deadline = Date.now() + this.timeoutMs;\n\n try {\n if (this.waitUntil === \"domcontentloaded\") {\n await this.awaitWithAbort(\n this.page.waitForMainLoadState(\n \"domcontentloaded\",\n this.timeRemaining(deadline),\n ),\n );\n return;\n }\n\n while (true) {\n await this.awaitWithAbort(\n this.page.waitForMainLoadState(\"load\", this.timeRemaining(deadline)),\n );\n\n if (this.waitUntil !== \"networkidle\") break;\n\n try {\n await this.awaitWithAbort(this.waitForNetworkIdle(deadline));\n break;\n } catch (error) {\n if (this.shouldRestartAfterFollowup(error)) {\n continue;\n }\n throw error;\n }\n }\n } finally {\n this.dispose();\n }\n\n if (this.abortError) throw this.abortError;\n }\n\n /** Cancel any outstanding network-idle waits and remove event listeners. */\n public dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n\n if (this.idleHandle) {\n void this.idleHandle.promise.catch(() => {});\n this.idleHandle.dispose();\n this.idleHandle = null;\n }\n\n for (const fn of this.cleanupCallbacks) {\n try {\n fn();\n } catch {\n // ignore listener cleanup errors\n }\n }\n this.cleanupCallbacks = [];\n this.abortReject = null;\n }\n\n /** Subscribe to main-frame events to detect abort conditions. */\n private installSessionListeners(): void {\n const onFrameNavigated = (evt: Protocol.Page.FrameNavigatedEvent) => {\n if (!evt?.frame?.id) return;\n\n const mainFrameId = this.page.mainFrameId();\n if (evt.frame.id !== mainFrameId) return;\n\n const loaderId = evt.frame.loaderId;\n if (!loaderId) return;\n\n if (!this.initialLoaderId) {\n this.initialLoaderId = loaderId;\n this.currentLoaderId = loaderId;\n this.idleStartTime = Date.now();\n }\n\n if (!this.expectedLoaderId) {\n this.expectedLoaderId = loaderId;\n this.currentLoaderId = loaderId;\n this.idleStartTime = Date.now();\n return;\n }\n\n if (loaderId !== this.expectedLoaderId) {\n if (!this.page.isCurrentNavigationCommand(this.navigationCommandId)) {\n this.triggerAbort(\n new Error(\"Navigation was superseded by a new request\"),\n );\n return;\n }\n\n this.adoptNewMainLoader(loaderId);\n }\n };\n\n const onFrameDetached = (evt: Protocol.Page.FrameDetachedEvent) => {\n if (!evt?.frameId) return;\n const mainFrameId = this.page.mainFrameId();\n if (evt.frameId !== mainFrameId) return;\n if (evt.reason === \"swap\") return;\n this.triggerAbort(new Error(\"Main frame was detached\"));\n };\n\n this.mainSession.on(\"Page.frameNavigated\", onFrameNavigated);\n this.cleanupCallbacks.push(() => {\n this.mainSession.off(\"Page.frameNavigated\", onFrameNavigated);\n });\n\n this.mainSession.on(\"Page.frameDetached\", onFrameDetached);\n this.cleanupCallbacks.push(() => {\n this.mainSession.off(\"Page.frameDetached\", onFrameDetached);\n });\n }\n\n /** Compute remaining time until the shared deadline elapses. */\n private timeRemaining(deadline: number): number {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new TimeoutError(\"Lifecycle wait\", this.timeoutMs);\n }\n return remaining;\n }\n\n /** Await an operation but abort early if navigation replacement fires. */\n private async awaitWithAbort<T>(operation: Promise<T>): Promise<T> {\n try {\n return await Promise.race([operation, this.abortPromise]);\n } catch (error) {\n if (this.abortError) throw this.abortError;\n throw error;\n }\n }\n\n /** Mark the watcher as aborted and reject any pending waiters. */\n private triggerAbort(error: Error): void {\n if (this.abortError) return;\n this.abortError = error;\n if (this.abortReject) {\n this.abortReject(error);\n this.abortReject = null;\n }\n }\n private waitForNetworkIdle(deadline: number): Promise<void> {\n this.pendingFollowupNavigation = false;\n const remaining = this.timeRemaining(deadline);\n const idleWindow = Math.min(DEFAULT_IDLE_WAIT, remaining);\n this.idleHandle = this.networkManager.waitForIdle({\n startTime: this.idleStartTime,\n timeoutMs: remaining,\n totalBudgetMs: this.timeoutMs,\n idleTimeMs: idleWindow,\n filter: this.buildIdleFilter(),\n });\n\n return this.idleHandle.promise.catch((error) => {\n if (this.abortError) throw this.abortError;\n throw error;\n });\n }\n\n private shouldRestartAfterFollowup(error: unknown): boolean {\n if (!this.pendingFollowupNavigation) return false;\n if (!(error instanceof Error)) return false;\n if (error.message !== \"waitForIdle disposed\") return false;\n this.pendingFollowupNavigation = false;\n return true;\n }\n\n private adoptNewMainLoader(loaderId: string): void {\n this.expectedLoaderId = loaderId;\n this.currentLoaderId = loaderId;\n this.idleStartTime = Date.now();\n if (this.waitUntil !== \"networkidle\") return;\n\n this.pendingFollowupNavigation = true;\n\n if (this.idleHandle) {\n const handle = this.idleHandle;\n this.idleHandle = null;\n void handle.promise.catch(() => {});\n handle.dispose();\n }\n }\n\n private buildIdleFilter(): (info: NetworkRequestInfo) => boolean {\n const loaderId = this.currentLoaderId;\n const mainFrameId = this.page.mainFrameId();\n\n return (info: NetworkRequestInfo) => {\n if (IGNORED_RESOURCE_TYPES.has(info.resourceType)) return false;\n\n if (loaderId && info.loaderId) {\n return info.loaderId === loaderId;\n }\n\n if (!info.loaderId && info.frameId) {\n return info.frameId === mainFrameId;\n }\n\n return true;\n };\n }\n}\n", "/**\n * NavigationResponseTracker\n * -------------------------\n *\n * Tracks DevTools Protocol network events for a single navigation command so\n * Stagehand can surface a Playwright-like response object from `Page.goto` and\n * related APIs. The tracker listens for `Network.responseReceived` events that\n * correspond to the targeted document navigation, handles loader-id churn that\n * arises from redirects or preloading, and enriches the resulting\n * `Response` with extra header information. It also observes\n * `Network.loadingFinished` / `Network.loadingFailed` to fulfil the\n * `response.finished()` contract exposed to consumers.\n */\n\nimport type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport type { Page } from \"./page.js\";\nimport { Response } from \"./response.js\";\n\n/**\n * Watches CDP events on a given session and resolves with the navigation's\n * primary document response once identified.\n */\nexport class NavigationResponseTracker {\n private readonly page: Page;\n private readonly session: CDPSessionLike;\n private readonly navigationCommandId: number;\n\n private expectedLoaderId: string | undefined;\n private selectedRequestId: string | null = null;\n private selectedResponse: Response | null = null;\n private acceptNextWithoutLoader = false;\n\n private responseResolved = false;\n private resolveResponse!: (value: Response | null) => void;\n private responsePromise: Promise<Response | null>;\n\n private readonly pendingResponsesByLoader = new Map<\n string,\n Protocol.Network.ResponseReceivedEvent\n >();\n private readonly pendingExtraInfo = new Map<\n string,\n Protocol.Network.ResponseReceivedExtraInfoEvent\n >();\n\n private readonly listeners: Array<{\n event: string;\n handler: (event: unknown) => void;\n }> = [];\n\n /**\n * Create a tracker bound to a specific navigation command. The tracker begins\n * listening for network events immediately so it should be constructed before\n * the navigation request is dispatched.\n */\n constructor(params: {\n page: Page;\n session: CDPSessionLike;\n navigationCommandId: number;\n }) {\n this.page = params.page;\n this.session = params.session;\n this.navigationCommandId = params.navigationCommandId;\n\n this.responsePromise = new Promise<Response | null>((resolve) => {\n this.resolveResponse = (value) => {\n if (this.responseResolved) return;\n this.responseResolved = true;\n resolve(value);\n };\n });\n\n this.installListeners();\n }\n\n /** Stop listening for CDP events and release any pending bookkeeping. */\n public dispose(): void {\n for (const { event, handler } of this.listeners) {\n this.session.off(event, handler as never);\n }\n this.listeners.length = 0;\n this.pendingResponsesByLoader.clear();\n this.pendingExtraInfo.clear();\n }\n\n /**\n * Hint the tracker with the loader id returned by `Page.navigate`. Chrome only\n * emits this once the browser begins navigating, so we store early responses\n * and match them once the loader id is known.\n */\n public setExpectedLoaderId(loaderId: string | undefined): void {\n if (!loaderId) return;\n this.expectedLoaderId = loaderId;\n const pending = this.pendingResponsesByLoader.get(loaderId);\n if (pending) {\n this.pendingResponsesByLoader.delete(loaderId);\n this.selectResponse(pending);\n }\n }\n\n /**\n * Some navigation APIs (reload/history traversal) do not provide a loader id\n * up front. This flag instructs the tracker to accept the next qualifying\n * document response even if no loader id has been announced yet.\n */\n public expectNavigationWithoutKnownLoader(): void {\n this.acceptNextWithoutLoader = true;\n }\n\n /**\n * Returns a promise that resolves with the matched response (or `null` when\n * no document response was observed).\n */\n public async navigationCompleted(): Promise<Response | null> {\n if (!this.responseResolved) {\n queueMicrotask(() => {\n if (!this.responseResolved) this.resolveResponse(null);\n });\n }\n return this.responsePromise;\n }\n\n /** Expose the raw response promise (mainly for tests). */\n public async response(): Promise<Response | null> {\n return this.responsePromise;\n }\n\n /** Register all CDP listeners relevant to navigation tracking. */\n private installListeners(): void {\n this.addListener(\"Network.responseReceived\", (event) => {\n this.onResponseReceived(event as Protocol.Network.ResponseReceivedEvent);\n });\n this.addListener(\"Network.responseReceivedExtraInfo\", (event) => {\n this.onResponseReceivedExtraInfo(\n event as Protocol.Network.ResponseReceivedExtraInfoEvent,\n );\n });\n this.addListener(\"Network.loadingFinished\", (event) => {\n this.onLoadingFinished(event as Protocol.Network.LoadingFinishedEvent);\n });\n this.addListener(\"Network.loadingFailed\", (event) => {\n this.onLoadingFailed(event as Protocol.Network.LoadingFailedEvent);\n });\n }\n\n /** Attach a CDP listener and track it for later disposal. */\n private addListener(event: string, handler: (event: unknown) => void): void {\n this.session.on(event, handler as never);\n this.listeners.push({ event, handler });\n }\n\n /** Handle the initial response payload for document navigations. */\n private onResponseReceived(\n event: Protocol.Network.ResponseReceivedEvent,\n ): void {\n if (!this.page.isCurrentNavigationCommand(this.navigationCommandId)) return;\n if (!event || !event.response) return;\n if (event.type !== \"Document\") return;\n if (event.frameId !== this.page.mainFrameId()) return;\n\n const loaderId = event.loaderId ?? \"\";\n if (this.acceptNextWithoutLoader) {\n this.acceptNextWithoutLoader = false;\n this.selectResponse(event);\n return;\n }\n\n if (this.expectedLoaderId) {\n if (loaderId && loaderId !== this.expectedLoaderId) {\n this.pendingResponsesByLoader.set(loaderId, event);\n return;\n }\n this.selectResponse(event);\n return;\n }\n\n if (loaderId) {\n this.pendingResponsesByLoader.set(loaderId, event);\n return;\n }\n\n this.selectResponse(event);\n }\n\n /** Merge auxiliary header information once Chrome exposes it. */\n private onResponseReceivedExtraInfo(\n event: Protocol.Network.ResponseReceivedExtraInfoEvent,\n ): void {\n if (!event || !event.requestId) return;\n if (this.selectedRequestId && event.requestId === this.selectedRequestId) {\n this.selectedResponse?.applyExtraInfo(event);\n return;\n }\n this.pendingExtraInfo.set(event.requestId, event);\n }\n\n /** Resolve the response's finished promise when the request completes. */\n private onLoadingFinished(\n event: Protocol.Network.LoadingFinishedEvent,\n ): void {\n if (!event || !event.requestId) return;\n if (event.requestId !== this.selectedRequestId) return;\n this.selectedResponse?.markFinished(null);\n }\n\n /** Resolve the response's finished promise with an error on failure. */\n private onLoadingFailed(event: Protocol.Network.LoadingFailedEvent): void {\n // Ignore malformed events or ones without a request id\n if (!event || !event.requestId) return;\n // Only the tracked document request should toggle the response state\n if (event.requestId !== this.selectedRequestId) return;\n // Surface Chrome's failure text through response.finished()\n const errorText = event.errorText || \"Navigation request failed\";\n this.selectedResponse?.markFinished(new Error(errorText));\n }\n\n /**\n * Create the `Response` wrapper for the chosen document response and\n * resolve awaiting consumers. Subsequent events flesh out the header/body\n * helpers and mark the request as finished.\n */\n private selectResponse(event: Protocol.Network.ResponseReceivedEvent): void {\n if (event.loaderId) {\n this.pendingResponsesByLoader.delete(event.loaderId);\n }\n\n if (this.responseResolved) return;\n if (this.selectedResponse) return;\n\n const protocol = event.response?.protocol?.toLowerCase() ?? \"\";\n const url = event.response?.url ?? \"\";\n const isDataUrl = protocol === \"data\" || url.startsWith(\"data:\");\n const isAboutUrl = protocol === \"about\" || url.startsWith(\"about:\");\n\n if (isDataUrl || isAboutUrl) {\n this.pendingExtraInfo.delete(event.requestId);\n this.selectedRequestId = null;\n this.selectedResponse = null;\n this.resolveResponse(null);\n return;\n }\n\n const response = new Response({\n page: this.page,\n session: this.session,\n requestId: event.requestId,\n frameId: event.frameId,\n loaderId: event.loaderId,\n response: event.response,\n fromServiceWorker: Boolean(event.response?.fromServiceWorker),\n });\n\n this.selectedRequestId = event.requestId;\n this.selectedResponse = response;\n\n const extraInfo = this.pendingExtraInfo.get(event.requestId);\n if (extraInfo) {\n response.applyExtraInfo(extraInfo);\n this.pendingExtraInfo.delete(event.requestId);\n }\n\n this.resolveResponse(response);\n }\n}\n", "import { promises as fs } from \"fs\";\nimport { InitScriptSource } from \"../types/private/index.js\";\nimport { StagehandInvalidArgumentError } from \"../types/public/sdkErrors.js\";\n\nconst DEFAULT_CALLER = \"context.addInitScript\";\n\nfunction appendSourceURL(source: string, filePath: string): string {\n const sanitized = filePath.replace(/\\n/g, \"\");\n return `${source}\\n//# sourceURL=${sanitized}`;\n}\n\nexport async function normalizeInitScriptSource<Arg>(\n script: InitScriptSource<Arg>,\n arg?: Arg,\n caller: string = DEFAULT_CALLER,\n): Promise<string> {\n if (typeof script === \"function\") {\n const argString = Object.is(arg, undefined)\n ? \"undefined\"\n : JSON.stringify(arg);\n return `(${script.toString()})(${argString})`;\n }\n\n if (!Object.is(arg, undefined)) {\n throw new StagehandInvalidArgumentError(\n `${caller}: 'arg' is only supported when passing a function.`,\n );\n }\n\n if (typeof script === \"string\") {\n return script;\n }\n\n if (!script || typeof script !== \"object\") {\n throw new StagehandInvalidArgumentError(\n `${caller}: provide a string, function, or an object with path/content.`,\n );\n }\n\n if (typeof script.content === \"string\") {\n return script.content;\n }\n\n if (typeof script.path === \"string\" && script.path.trim()) {\n const raw = await fs.readFile(script.path, \"utf8\");\n return appendSourceURL(raw, script.path);\n }\n\n throw new StagehandInvalidArgumentError(\n `${caller}: provide a string, function, or an object with path/content.`,\n );\n}\n", "/*\n * AUTO-GENERATED FILE. DO NOT EDIT.\n * Update sources in lib/v3/dom/screenshotScripts and run genScreenshotScripts.ts.\n */\nexport const screenshotScriptSources = {\n \"resolveMaskRect\": \"function h(r){function u(t,e){try{return t&&typeof t.closest==\\\"function\\\"?t.closest(e):null}catch{return null}}function s(t,e){try{return!!t&&typeof t.matches==\\\"function\\\"&&t.matches(e)}catch{return!1}}function c(t){let e=u(t,\\\"dialog[open]\\\");if(e)return e;let l=u(t,\\\"[popover]\\\");return l&&s(l,\\\":popover-open\\\")?l:null}if(!this||typeof this.getBoundingClientRect!=\\\"function\\\")return null;let n=this.getBoundingClientRect();if(!n)return null;let i=window.getComputedStyle(this);if(!i||i.visibility===\\\"hidden\\\"||i.display===\\\"none\\\"||n.width<=0||n.height<=0)return null;let o=c(this);if(o){let t=o.getBoundingClientRect();if(!t)return null;let e=null;if(r)try{let l=o.getAttribute(\\\"data-stagehand-mask-root\\\");l&&l.startsWith(r)?e=l:(e=r+\\\"_root_\\\"+Math.random().toString(36).slice(2),o.setAttribute(\\\"data-stagehand-mask-root\\\",e))}catch{e=null}return{x:n.left-t.left-(o.clientLeft||0)+(o.scrollLeft||0),y:n.top-t.top-(o.clientTop||0)+(o.scrollTop||0),width:n.width,height:n.height,rootToken:e}}return{x:n.left+window.scrollX,y:n.top+window.scrollY,width:n.width,height:n.height,rootToken:null}}\"\n} as const;\nexport type ScreenshotScriptName = keyof typeof screenshotScriptSources;\n", "import { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport type { Frame } from \"./frame.js\";\nimport type { Locator } from \"./locator.js\";\nimport type { Page } from \"./page.js\";\nimport type {\n ScreenshotClip,\n ScreenshotScaleOption,\n} from \"../types/public/screenshotTypes.js\";\nimport { StagehandInvalidArgumentError } from \"../types/public/sdkErrors.js\";\nimport { screenshotScriptSources } from \"../dom/build/screenshotScripts.generated.js\";\n\nexport type ScreenshotCleanup = () => Promise<void> | void;\n\nexport function collectFramesForScreenshot(page: Page): Frame[] {\n const seen = new Map<string, Frame>();\n const main = page.mainFrame();\n seen.set(main.frameId, main);\n for (const frame of page.frames()) {\n seen.set(frame.frameId, frame);\n }\n return Array.from(seen.values());\n}\n\nexport function normalizeScreenshotClip(clip: ScreenshotClip): ScreenshotClip {\n const x = Number(clip.x);\n const y = Number(clip.y);\n const width = Number(clip.width);\n const height = Number(clip.height);\n\n for (const [key, value] of Object.entries({ x, y, width, height })) {\n if (!Number.isFinite(value)) {\n throw new StagehandInvalidArgumentError(\n `screenshot: clip.${key} must be a finite number`,\n );\n }\n }\n\n if (width <= 0 || height <= 0) {\n throw new StagehandInvalidArgumentError(\n \"screenshot: clip width/height must be positive\",\n );\n }\n\n return { x, y, width, height };\n}\n\nexport async function computeScreenshotScale(\n page: Page,\n mode: ScreenshotScaleOption,\n): Promise<number | undefined> {\n if (mode !== \"css\") return undefined;\n try {\n const frame = page.mainFrame();\n const dpr = await frame\n .evaluate(() => {\n const ratio = Number(window.devicePixelRatio || 1);\n return Number.isFinite(ratio) && ratio > 0 ? ratio : 1;\n })\n .catch(() => 1);\n const safeRatio = Number.isFinite(dpr) && dpr > 0 ? dpr : 1;\n return Math.min(2, Math.max(0.1, 1 / safeRatio));\n } catch {\n return 1;\n }\n}\n\nexport async function setTransparentBackground(\n session: CDPSessionLike,\n): Promise<ScreenshotCleanup> {\n await session\n .send(\"Emulation.setDefaultBackgroundColorOverride\", {\n color: { r: 0, g: 0, b: 0, a: 0 },\n })\n .catch(() => {});\n\n return async () => {\n await session\n .send(\"Emulation.setDefaultBackgroundColorOverride\", {})\n .catch(() => {});\n };\n}\n\nexport async function applyStyleToFrames(\n frames: Frame[],\n css: string,\n label: string,\n): Promise<ScreenshotCleanup> {\n const trimmed = css.trim();\n if (!trimmed) return async () => {};\n const token = `__v3_style_${label}_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2)}`;\n\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate(\n ({ css, token }) => {\n try {\n const doc = document;\n if (!doc) return;\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-stagehand-style\", token);\n style.textContent = css;\n const parent = doc.head || doc.documentElement || doc.body;\n parent?.appendChild(style);\n } catch {\n // ignore\n }\n },\n { css: trimmed, token },\n )\n .catch(() => {}),\n ),\n );\n\n return async () => {\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate((token) => {\n try {\n const doc = document;\n if (!doc) return;\n const nodes = doc.querySelectorAll(\n `[data-stagehand-style=\"${token}\"]`,\n );\n nodes.forEach((node) => node.remove());\n } catch {\n // ignore\n }\n }, token)\n .catch(() => {}),\n ),\n );\n };\n}\n\nexport async function disableAnimations(\n frames: Frame[],\n): Promise<ScreenshotCleanup> {\n const css = `\n*,\n*::before,\n*::after {\n animation-delay: 0s !important;\n animation-duration: 0s !important;\n animation-iteration-count: 1 !important;\n animation-play-state: paused !important;\n transition-property: none !important;\n transition-duration: 0s !important;\n transition-delay: 0s !important;\n}`;\n\n const cleanup = await applyStyleToFrames(frames, css, \"animations\");\n\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate(() => {\n try {\n const animations =\n typeof document.getAnimations === \"function\"\n ? document.getAnimations()\n : [];\n for (const animation of animations) {\n try {\n const details = animation.effect?.getComputedTiming?.();\n if (details && details.iterations !== Infinity) {\n animation.finish?.();\n } else {\n animation.cancel?.();\n }\n } catch {\n animation.cancel?.();\n }\n }\n } catch {\n // ignore\n }\n })\n .catch(() => {}),\n ),\n );\n\n return cleanup;\n}\n\nexport async function hideCaret(frames: Frame[]): Promise<ScreenshotCleanup> {\n const css = `\ninput,\ntextarea,\n[contenteditable],\n[contenteditable=\"\"],\n[contenteditable=\"true\"],\n[contenteditable=\"plaintext-only\"],\n*:focus {\n caret-color: transparent !important;\n}`;\n\n return applyStyleToFrames(frames, css, \"caret\");\n}\n\nexport async function applyMaskOverlays(\n locators: Locator[],\n color: string,\n): Promise<ScreenshotCleanup> {\n type MaskRectSpec = ScreenshotClip & { rootToken?: string | null };\n const rectsByFrame = new Map<\n Frame,\n { rects: MaskRectSpec[]; rootTokens: Set<string> }\n >();\n\n const token = `__v3_mask_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n for (const locator of locators) {\n try {\n const info = await resolveMaskRects(locator, token);\n if (!info) continue;\n const entry = rectsByFrame.get(info.frame) ?? {\n rects: [],\n rootTokens: new Set<string>(),\n };\n entry.rects.push(...info.rects);\n for (const rect of info.rects) {\n if (rect.rootToken) entry.rootTokens.add(rect.rootToken);\n }\n rectsByFrame.set(info.frame, entry);\n } catch {\n // ignore individual locator failures\n }\n }\n\n if (rectsByFrame.size === 0) {\n return async () => {};\n }\n\n await Promise.all(\n Array.from(rectsByFrame.entries()).map(([frame, { rects }]) =>\n frame\n .evaluate(\n ({ rects, color, token }) => {\n try {\n const doc = document;\n if (!doc) return;\n for (const rect of rects) {\n const defaultRoot = doc.documentElement || doc.body;\n if (!defaultRoot) return;\n const root = rect.rootToken\n ? doc.querySelector(\n `[data-stagehand-mask-root=\"${rect.rootToken}\"]`,\n ) || defaultRoot\n : defaultRoot;\n if (!root) continue;\n if (rect.rootToken) {\n try {\n const style = window.getComputedStyle(root as Element);\n if (style && style.position === \"static\") {\n const rootEl = root as HTMLElement;\n if (\n !rootEl.hasAttribute(\"data-stagehand-mask-root-pos\")\n ) {\n rootEl.setAttribute(\n \"data-stagehand-mask-root-pos\",\n rootEl.style.position || \"\",\n );\n }\n rootEl.style.position = \"relative\";\n }\n } catch {\n // ignore\n }\n }\n const el = doc.createElement(\"div\");\n el.setAttribute(\"data-stagehand-mask\", token);\n el.style.position = \"absolute\";\n el.style.left = `${rect.x}px`;\n el.style.top = `${rect.y}px`;\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n el.style.backgroundColor = color;\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"2147483647\";\n el.style.opacity = \"1\";\n el.style.mixBlendMode = \"normal\";\n (root as Element).appendChild(el);\n }\n } catch {\n // ignore\n }\n },\n { rects, color, token },\n )\n .catch(() => {}),\n ),\n );\n\n return async () => {\n await Promise.all(\n Array.from(rectsByFrame.entries()).map(([frame, { rootTokens }]) =>\n frame\n .evaluate(\n ({ token, rootTokens }) => {\n try {\n const doc = document;\n if (!doc) return;\n const nodes = doc.querySelectorAll(\n `[data-stagehand-mask=\"${token}\"]`,\n );\n nodes.forEach((node) => node.remove());\n for (const rootToken of rootTokens) {\n const root = doc.querySelector(\n `[data-stagehand-mask-root=\"${rootToken}\"]`,\n ) as HTMLElement | null;\n if (!root) continue;\n const prev = root.getAttribute(\n \"data-stagehand-mask-root-pos\",\n );\n if (prev !== null) {\n root.style.position = prev;\n root.removeAttribute(\"data-stagehand-mask-root-pos\");\n }\n root.removeAttribute(\"data-stagehand-mask-root\");\n }\n } catch {\n // ignore\n }\n },\n { token, rootTokens: Array.from(rootTokens) },\n )\n .catch(() => {}),\n ),\n );\n };\n}\n\nasync function resolveMaskRects(\n locator: Locator,\n maskToken: string,\n): Promise<{\n frame: Frame;\n rects: Array<ScreenshotClip & { rootToken?: string | null }>;\n} | null> {\n const frame = locator.getFrame();\n const session = frame.session;\n let resolved: Array<{\n objectId: Protocol.Runtime.RemoteObjectId;\n nodeId: Protocol.DOM.NodeId | null;\n }> = [];\n\n try {\n resolved = await locator.resolveNodesForMask();\n const rects: Array<ScreenshotClip & { rootToken?: string | null }> = [];\n\n for (const { objectId } of resolved) {\n try {\n const rect = await resolveMaskRectForObject(\n session,\n objectId,\n maskToken,\n );\n if (rect) rects.push(rect);\n } catch {\n // ignore individual element failures\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n if (!rects.length) return null;\n\n return { frame, rects };\n } catch {\n return null;\n }\n}\n\nasync function resolveMaskRectForObject(\n session: CDPSessionLike,\n objectId: Protocol.Runtime.RemoteObjectId,\n maskToken: string,\n): Promise<(ScreenshotClip & { rootToken?: string | null }) | null> {\n const result = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: screenshotScriptSources.resolveMaskRect,\n arguments: [{ value: maskToken }],\n returnByValue: true,\n },\n );\n\n if (result.exceptionDetails) {\n return null;\n }\n\n const rect = result.result.value as\n | (ScreenshotClip & { rootToken?: string | null })\n | null;\n if (!rect) return null;\n\n const { x, y, width, height } = rect;\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return null;\n }\n\n return {\n x,\n y,\n width,\n height,\n rootToken:\n rect.rootToken && typeof rect.rootToken === \"string\"\n ? rect.rootToken\n : undefined,\n };\n}\n\nexport async function runScreenshotCleanups(\n cleanups: ScreenshotCleanup[],\n): Promise<void> {\n for (let i = cleanups.length - 1; i >= 0; i -= 1) {\n const fn = cleanups[i];\n if (!fn) continue;\n try {\n const result = fn();\n if (result && typeof (result as Promise<void>).then === \"function\") {\n await result;\n }\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\nexport async function withScreenshotTimeout<T>(\n timeoutMs: number | undefined,\n task: () => Promise<T>,\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) return task();\n\n let timer: NodeJS.Timeout | null = null;\n const timeoutPromise = new Promise<T>((_, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`screenshot: timeout of ${timeoutMs}ms exceeded`));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([task(), timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n", "import { Protocol } from \"devtools-protocol\";\nimport { promises as fs } from \"fs\";\nimport { v3Logger } from \"../logger.js\";\nimport { logAction } from \"../flowLogger.js\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport { CdpConnection } from \"./cdp.js\";\nimport { Frame } from \"./frame.js\";\nimport { FrameLocator } from \"./frameLocator.js\";\nimport { deepLocatorFromPage, resolveLocatorTarget } from \"./deepLocator.js\";\nimport {\n captureHybridSnapshot,\n resolveXpathForLocation,\n} from \"./a11y/snapshot/index.js\";\nimport { FrameRegistry } from \"./frameRegistry.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\nimport {\n LoadState,\n SnapshotResult,\n PageSnapshotOptions,\n} from \"../types/public/page.js\";\nimport { NetworkManager } from \"./networkManager.js\";\nimport { LifecycleWatcher } from \"./lifecycleWatcher.js\";\nimport { NavigationResponseTracker } from \"./navigationResponseTracker.js\";\nimport { Response, isSerializableResponse } from \"./response.js\";\nimport { ConsoleMessage, ConsoleListener } from \"./consoleMessage.js\";\nimport type { StagehandAPIClient } from \"../api.js\";\nimport {\n LocalBrowserLaunchOptions,\n StagehandSnapshotError,\n} from \"../types/public/index.js\";\nimport type { Locator } from \"./locator.js\";\nimport {\n StagehandInvalidArgumentError,\n StagehandEvalError,\n} from \"../types/public/sdkErrors.js\";\nimport { normalizeInitScriptSource } from \"./initScripts.js\";\nimport { buildLocatorInvocation } from \"./locatorInvocation.js\";\nimport type {\n ScreenshotAnimationsOption,\n ScreenshotCaretOption,\n ScreenshotOptions,\n ScreenshotScaleOption,\n} from \"../types/public/screenshotTypes.js\";\nimport {\n applyMaskOverlays,\n applyStyleToFrames,\n collectFramesForScreenshot,\n computeScreenshotScale,\n disableAnimations,\n hideCaret,\n normalizeScreenshotClip,\n runScreenshotCleanups,\n setTransparentBackground,\n withScreenshotTimeout,\n type ScreenshotCleanup,\n} from \"./screenshotUtils.js\";\nimport { InitScriptSource } from \"../types/private/index.js\";\n\n/**\n * Page\n *\n * One instance per **top-level target**. It owns:\n * - the top-level CDP session (for the page target)\n * - all adopted OOPIF child sessions (Target.attachToTarget with flatten: true)\n * - a **FrameRegistry** that is the single source of truth for BOTH:\n * \u2022 frame topology (parent/children, root swaps, last-seen CDP Frame)\n * \u2022 frame \u2192 session ownership (which session owns which frameId)\n *\n * Page exposes convenient APIs (goto/reload/url/screenshot/locator),\n * and simple bridges that Context uses to feed Page/Target events in.\n */\n\nconst LIFECYCLE_NAME: Record<LoadState, string> = {\n load: \"load\",\n domcontentloaded: \"DOMContentLoaded\",\n networkidle: \"networkIdle\",\n};\n\nexport class Page {\n /** Every CDP child session this page owns (top-level + adopted OOPIF sessions). */\n private readonly sessions = new Map<string, CDPSessionLike>(); // sessionId -> session\n\n /** Unified truth for frame topology + ownership. */\n private readonly registry: FrameRegistry;\n\n /** A convenience wrapper bound to the current main frame id (top-level session). */\n private mainFrameWrapper: Frame;\n\n /** Compact ordinal per frameId (used by snapshot encoding). */\n private frameOrdinals = new Map<string, number>();\n private nextOrdinal = 0;\n\n /** cache Frames per frameId so everyone uses the same one */\n private readonly frameCache = new Map<string, Frame>();\n private readonly browserIsRemote: boolean;\n\n /** Stable id for Frames created by this Page (use top-level TargetId). */\n private readonly pageId: string;\n /** Cached current URL for synchronous page.url() */\n private _currentUrl: string = \"about:blank\";\n\n private navigationCommandSeq = 0;\n private latestNavigationCommandId = 0;\n\n private readonly networkManager: NetworkManager;\n /** Optional API client for routing page operations to the API */\n private readonly apiClient: StagehandAPIClient | null = null;\n private readonly consoleListeners = new Set<ConsoleListener>();\n private readonly consoleHandlers = new Map<\n string,\n (evt: Protocol.Runtime.ConsoleAPICalledEvent) => void\n >();\n /** Document-start scripts installed across every session this page owns. */\n private readonly initScripts: string[] = [];\n\n private constructor(\n private readonly conn: CdpConnection,\n private readonly mainSession: CDPSessionLike,\n private readonly _targetId: string,\n mainFrameId: string,\n apiClient?: StagehandAPIClient | null,\n browserIsRemote = false,\n ) {\n this.pageId = _targetId;\n this.apiClient = apiClient ?? null;\n this.browserIsRemote = browserIsRemote;\n\n // own the main session\n if (mainSession.id) this.sessions.set(mainSession.id, mainSession);\n\n // initialize registry with root/main frame id\n this.registry = new FrameRegistry(_targetId, mainFrameId);\n\n // main-frame wrapper is always bound to the **top-level** session\n this.mainFrameWrapper = new Frame(\n this.mainSession,\n mainFrameId,\n this.pageId,\n this.browserIsRemote,\n );\n\n this.networkManager = new NetworkManager();\n this.networkManager.trackSession(this.mainSession);\n }\n\n // Send a single init script to a specific CDP session.\n private async installInitScriptOnSession(\n session: CDPSessionLike,\n source: string,\n ): Promise<void> {\n await session.send(\"Page.addScriptToEvaluateOnNewDocument\", {\n source: source,\n });\n }\n\n // Replay every previously registered init script onto a newly adopted session.\n private async applyInitScriptsToSession(\n session: CDPSessionLike,\n ): Promise<void> {\n for (const source of this.initScripts) {\n await this.installInitScriptOnSession(session, source);\n }\n }\n\n // Register a new init script and fan it out to all active sessions for this page.\n public async registerInitScript(source: string): Promise<void> {\n if (this.initScripts.includes(source)) return;\n this.initScripts.push(source);\n\n const installs: Array<Promise<void>> = [];\n installs.push(this.installInitScriptOnSession(this.mainSession, source));\n for (const session of this.sessions.values()) {\n if (session === this.mainSession) continue;\n installs.push(this.installInitScriptOnSession(session, source));\n }\n await Promise.all(installs);\n }\n\n // Seed an init script without re-installing it on the current sessions.\n public seedInitScript(source: string): void {\n if (this.initScripts.includes(source)) return;\n this.initScripts.push(source);\n }\n\n // --- Optional visual cursor overlay management ---\n private cursorEnabled = false;\n private async ensureCursorScript(): Promise<void> {\n const script = `(() => {\n const ID = '__v3_cursor_overlay__';\n const state = { el: null, last: null };\n // Expose API early so move() calls before install are buffered\n try {\n if (!window.__v3Cursor || !window.__v3Cursor.__installed) {\n const api = {\n __installed: false,\n move(x, y) {\n if (state.el) {\n state.el.style.left = Math.max(0, x) + 'px';\n state.el.style.top = Math.max(0, y) + 'px';\n } else {\n state.last = [x, y];\n }\n },\n show() { if (state.el) state.el.style.display = 'block'; },\n hide() { if (state.el) state.el.style.display = 'none'; },\n };\n window.__v3Cursor = api;\n }\n } catch {}\n\n function install() {\n try {\n if (state.el) return; // already installed\n let el = document.getElementById(ID);\n if (!el) {\n const root = document.documentElement || document.body || document.head;\n if (!root) { setTimeout(install, 50); return; }\n el = document.createElement('div');\n el.id = ID;\n el.style.position = 'fixed';\n el.style.left = '0px';\n el.style.top = '0px';\n el.style.width = '16px';\n el.style.height = '24px';\n el.style.zIndex = '2147483647';\n el.style.pointerEvents = 'none';\n el.style.userSelect = 'none';\n el.style.mixBlendMode = 'normal';\n el.style.contain = 'layout style paint';\n el.style.willChange = 'transform,left,top';\n el.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"24\" viewBox=\"0 0 16 24\"><path d=\"M1 0 L1 22 L6 14 L15 14 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"0.7\"/></svg>';\n root.appendChild(el);\n }\n state.el = el;\n try { window.__v3Cursor.__installed = true; } catch {}\n if (state.last) {\n window.__v3Cursor.move(state.last[0], state.last[1]);\n state.last = null;\n }\n } catch {}\n }\n\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n install();\n } else {\n document.addEventListener('DOMContentLoaded', install, { once: true });\n setTimeout(install, 100);\n }\n })();`;\n\n // Ensure future documents get the cursor at doc-start\n await this.mainSession\n .send(\"Page.addScriptToEvaluateOnNewDocument\", { source: script })\n .catch(() => {});\n // Inject into current document now\n await this.mainSession\n .send(\"Runtime.evaluate\", {\n expression: script,\n includeCommandLineAPI: false,\n })\n .catch(() => {});\n }\n\n public async enableCursorOverlay(): Promise<void> {\n if (this.cursorEnabled) return;\n await this.ensureCursorScript();\n this.cursorEnabled = true;\n }\n\n private async updateCursor(x: number, y: number): Promise<void> {\n if (!this.cursorEnabled) return;\n try {\n await this.mainSession.send(\"Runtime.evaluate\", {\n expression: `typeof window.__v3Cursor!==\"undefined\"&&window.__v3Cursor.move(${Math.round(x)}, ${Math.round(y)})`,\n });\n } catch {\n //\n }\n }\n\n public async addInitScript<Arg>(\n script: InitScriptSource<Arg>,\n arg?: Arg,\n ): Promise<void> {\n const source = await normalizeInitScriptSource(\n script,\n arg,\n \"page.addInitScript\",\n );\n await this.registerInitScript(source);\n }\n\n /**\n * Factory: create Page and seed registry with the shallow tree from Page.getFrameTree.\n * Assumes Page domain is already enabled on the session passed in.\n */\n static async create(\n conn: CdpConnection,\n session: CDPSessionLike,\n targetId: string,\n apiClient?: StagehandAPIClient | null,\n localBrowserLaunchOptions?: LocalBrowserLaunchOptions | null,\n browserIsRemote = false,\n ): Promise<Page> {\n await session.send(\"Page.enable\").catch(() => {});\n await session\n .send(\"Page.setLifecycleEventsEnabled\", { enabled: true })\n .catch(() => {});\n const { frameTree } = await session.send<{\n frameTree: Protocol.Page.FrameTree;\n }>(\"Page.getFrameTree\");\n const mainFrameId = frameTree.frame.id;\n\n const page = new Page(\n conn,\n session,\n targetId,\n mainFrameId,\n apiClient,\n browserIsRemote,\n );\n // Seed current URL from initial frame tree\n try {\n page._currentUrl = String(frameTree?.frame?.url ?? page._currentUrl);\n if (localBrowserLaunchOptions?.viewport) {\n await page.setViewportSize(\n localBrowserLaunchOptions.viewport.width,\n localBrowserLaunchOptions.viewport.height,\n {\n deviceScaleFactor: localBrowserLaunchOptions.deviceScaleFactor ?? 1,\n },\n );\n }\n } catch {\n // ignore\n }\n\n // Seed topology + ownership for nodes known at creation time.\n page.registry.seedFromFrameTree(session.id ?? \"root\", frameTree);\n\n return page;\n }\n\n // ---------------- Event-driven updates from Context ----------------\n\n /**\n * Parent/child session emitted a `frameAttached`.\n * Topology update + ownership stamped to **emitting session**.\n */\n public onFrameAttached(\n frameId: string,\n parentId: string | null,\n session: CDPSessionLike,\n ): void {\n this.ensureOrdinal(frameId);\n this.registry.onFrameAttached(frameId, parentId, session.id ?? \"root\");\n // Cache is keyed by frameId \u2192 invalidate to ensure future frameForId resolves with latest owner\n this.frameCache.delete(frameId);\n }\n\n /**\n * Parent/child session emitted a `frameDetached`.\n */\n public onFrameDetached(\n frameId: string,\n reason: \"remove\" | \"swap\" | string = \"remove\",\n ): void {\n this.registry.onFrameDetached(frameId, reason);\n this.frameCache.delete(frameId);\n }\n\n /**\n * Parent/child session emitted a `frameNavigated`.\n * Topology + ownership update. Handles root swaps.\n */\n public onFrameNavigated(\n frame: Protocol.Page.Frame,\n session: CDPSessionLike,\n ): void {\n const prevRoot = this.mainFrameId();\n this.registry.onFrameNavigated(frame, session.id ?? \"root\");\n\n // If the root changed, keep the convenience wrapper in sync\n const newRoot = this.mainFrameId();\n if (newRoot !== prevRoot) {\n const oldOrd = this.frameOrdinals.get(prevRoot) ?? 0;\n this.frameOrdinals.set(newRoot, oldOrd);\n this.mainFrameWrapper = new Frame(\n this.mainSession,\n newRoot,\n this.pageId,\n this.browserIsRemote,\n );\n }\n\n // Update cached URL if this navigation pertains to the current main frame\n if (frame.id === this.mainFrameId()) {\n try {\n // Prefer frame.url; fallback keeps previous value\n this._currentUrl = String(\n (frame as { url?: string })?.url ?? this._currentUrl,\n );\n } catch {\n // ignore\n }\n }\n\n // Invalidate the cached Frame for this id (session may have changed)\n this.frameCache.delete(frame.id);\n }\n\n public onNavigatedWithinDocument(\n frameId: string,\n url: string,\n session: CDPSessionLike,\n ): void {\n const normalized = String(url ?? \"\").trim();\n if (!normalized) return;\n\n this.registry.onNavigatedWithinDocument(\n frameId,\n normalized,\n session.id ?? \"root\",\n );\n\n if (frameId === this.mainFrameId()) {\n this._currentUrl = normalized;\n }\n }\n\n /**\n * An OOPIF child session whose **main** frame id equals the parent iframe\u2019s frameId\n * has been attached; adopt the session into this Page and seed ownership for its subtree.\n */\n public adoptOopifSession(\n childSession: CDPSessionLike,\n childMainFrameId: string,\n ): void {\n if (childSession.id) this.sessions.set(childSession.id, childSession);\n\n this.networkManager.trackSession(childSession);\n\n void this.applyInitScriptsToSession(childSession).catch(() => {});\n\n if (this.consoleListeners.size > 0) {\n this.installConsoleTap(childSession);\n }\n\n // session will start emitting its own page events; mark ownership seed now\n this.registry.adoptChildSession(\n childSession.id ?? \"child\",\n childMainFrameId,\n );\n this.frameCache.delete(childMainFrameId);\n\n // Bridge events from the child session to keep registry in sync\n childSession.on<Protocol.Page.FrameNavigatedEvent>(\n \"Page.frameNavigated\",\n (evt) => {\n this.onFrameNavigated(evt.frame, childSession);\n },\n );\n childSession.on<Protocol.Page.FrameAttachedEvent>(\n \"Page.frameAttached\",\n (evt) => {\n this.onFrameAttached(\n evt.frameId,\n evt.parentFrameId ?? null,\n childSession,\n );\n },\n );\n childSession.on<Protocol.Page.FrameDetachedEvent>(\n \"Page.frameDetached\",\n (evt) => {\n this.onFrameDetached(evt.frameId, evt.reason ?? \"remove\");\n },\n );\n\n // One-shot seed the child's subtree ownership from its current tree\n void (async () => {\n try {\n await childSession.send(\"Page.enable\").catch(() => {});\n let { frameTree } =\n await childSession.send<Protocol.Page.GetFrameTreeResponse>(\n \"Page.getFrameTree\",\n );\n\n // Normalize: ensure the child\u2019s reported root id matches our known main id\n if (frameTree.frame.id !== childMainFrameId) {\n frameTree = {\n ...frameTree,\n frame: { ...frameTree.frame, id: childMainFrameId },\n };\n }\n\n this.registry.seedFromFrameTree(childSession.id ?? \"child\", frameTree);\n } catch {\n // If snapshot races, live events will still converge the registry.\n }\n })();\n }\n\n /** Detach an adopted child session and prune its subtree */\n public detachOopifSession(sessionId: string): void {\n // Find which frames were owned by this session and prune by tree starting from each root.\n for (const fid of this.registry.framesForSession(sessionId)) {\n this.registry.onFrameDetached(fid, \"remove\");\n this.frameCache.delete(fid);\n }\n this.teardownConsoleTap(sessionId);\n this.sessions.delete(sessionId);\n this.networkManager.untrackSession(sessionId);\n }\n\n // ---------------- Ownership helpers / lookups ----------------\n\n /** Return the owning CDP session for a frameId (falls back to main session) */\n public getSessionForFrame(frameId: string): CDPSessionLike {\n const sid = this.registry.getOwnerSessionId(frameId);\n if (!sid) return this.mainSession;\n return this.sessions.get(sid) ?? this.mainSession;\n }\n\n /** Always returns a Frame bound to the owning session */\n public frameForId(frameId: string): Frame {\n const hit = this.frameCache.get(frameId);\n if (hit) return hit;\n\n const sess = this.getSessionForFrame(frameId);\n const f = new Frame(sess, frameId, this.pageId, this.browserIsRemote);\n this.frameCache.set(frameId, f);\n return f;\n }\n\n /** Expose a session by id (used by snapshot to resolve session id -> session) */\n public getSessionById(id: string): CDPSessionLike | undefined {\n return this.sessions.get(id);\n }\n\n public registerSessionForNetwork(session: CDPSessionLike): void {\n this.networkManager.trackSession(session);\n }\n\n public unregisterSessionForNetwork(sessionId: string | undefined): void {\n this.networkManager.untrackSession(sessionId);\n }\n\n public on(event: \"console\", listener: ConsoleListener): Page {\n if (event !== \"console\") {\n throw new StagehandInvalidArgumentError(`Unsupported event: ${event}`);\n }\n\n const firstListener = this.consoleListeners.size === 0;\n this.consoleListeners.add(listener);\n\n if (firstListener) {\n this.ensureConsoleTaps();\n }\n\n return this;\n }\n\n public once(event: \"console\", listener: ConsoleListener): Page {\n if (event !== \"console\") {\n throw new StagehandInvalidArgumentError(`Unsupported event: ${event}`);\n }\n\n const wrapper: ConsoleListener = (message) => {\n this.off(\"console\", wrapper);\n listener(message);\n };\n\n return this.on(\"console\", wrapper);\n }\n\n public off(event: \"console\", listener: ConsoleListener): Page {\n if (event !== \"console\") {\n throw new StagehandInvalidArgumentError(`Unsupported event: ${event}`);\n }\n\n this.consoleListeners.delete(listener);\n\n if (this.consoleListeners.size === 0) {\n this.removeAllConsoleTaps();\n }\n\n return this;\n }\n\n // ---------------- MAIN APIs ----------------\n\n public targetId(): string {\n return this._targetId;\n }\n\n /**\n * Send a CDP command through the main session.\n * Allows external consumers to execute arbitrary Chrome DevTools Protocol commands.\n *\n * @param method - The CDP method name (e.g., \"Page.enable\", \"Runtime.evaluate\")\n * @param params - Optional parameters for the CDP command\n * @returns Promise resolving to the typed CDP response\n *\n * @example\n * // Enable the Runtime domain\n * await page.sendCDP(\"Runtime.enable\");\n *\n * @example\n * // Evaluate JavaScript with typed response\n * const result = await page.sendCDP<Protocol.Runtime.EvaluateResponse>(\n * \"Runtime.evaluate\",\n * { expression: \"1 + 1\" }\n * );\n */\n public sendCDP<T = unknown>(method: string, params?: object): Promise<T> {\n return this.mainSession.send<T>(method, params);\n }\n\n /** Seed the cached URL before navigation events converge. */\n public seedCurrentUrl(url: string | undefined | null): void {\n if (!url) return;\n try {\n const normalized = String(url).trim();\n if (!normalized) return;\n this._currentUrl = normalized;\n } catch {\n // ignore invalid url seeds\n }\n }\n\n public mainFrameId(): string {\n return this.registry.mainFrameId();\n }\n\n public mainFrame(): Frame {\n return this.mainFrameWrapper;\n }\n\n /**\n * Close this top-level page (tab). Best-effort via Target.closeTarget.\n */\n @logAction(\"Page.close\")\n public async close(): Promise<void> {\n try {\n await this.conn.send(\"Target.closeTarget\", { targetId: this._targetId });\n } catch {\n // ignore\n }\n const deadline = Date.now() + 2000;\n while (Date.now() < deadline) {\n try {\n const targets = await this.conn.getTargets();\n if (!targets.some((t) => t.targetId === this._targetId)) {\n this.networkManager.dispose();\n return;\n }\n } catch {\n // ignore and retry\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n this.networkManager.dispose();\n this.removeAllConsoleTaps();\n this.consoleListeners.clear();\n }\n\n public getFullFrameTree(): Protocol.Page.FrameTree {\n return this.asProtocolFrameTree(this.mainFrameId());\n }\n\n public asProtocolFrameTree(rootMainFrameId: string): Protocol.Page.FrameTree {\n return this.registry.asProtocolFrameTree(rootMainFrameId);\n }\n\n private ensureOrdinal(frameId: string): number {\n const hit = this.frameOrdinals.get(frameId);\n if (hit !== undefined) return hit;\n const ord = this.nextOrdinal++;\n this.frameOrdinals.set(frameId, ord);\n return ord;\n }\n\n /** Public getter for snapshot code / handlers. */\n public getOrdinal(frameId: string): number {\n return this.ensureOrdinal(frameId);\n }\n\n public listAllFrameIds(): string[] {\n return this.registry.listAllFrames();\n }\n\n private ensureConsoleTaps(): void {\n if (this.consoleListeners.size === 0) return;\n\n this.installConsoleTap(this.mainSession);\n for (const session of this.sessions.values()) {\n this.installConsoleTap(session);\n }\n }\n\n private installConsoleTap(session: CDPSessionLike): void {\n const key = this.sessionKey(session);\n if (this.consoleHandlers.has(key)) return;\n\n void session.send(\"Runtime.enable\").catch(() => {});\n\n const handler = (evt: Protocol.Runtime.ConsoleAPICalledEvent) => {\n this.emitConsole(evt);\n };\n\n session.on<Protocol.Runtime.ConsoleAPICalledEvent>(\n \"Runtime.consoleAPICalled\",\n handler,\n );\n\n this.consoleHandlers.set(key, handler);\n }\n\n private sessionKey(session: CDPSessionLike): string {\n return session.id ?? \"__root__\";\n }\n\n private resolveSessionByKey(key: string): CDPSessionLike | undefined {\n if (this.mainSession.id) {\n if (this.mainSession.id === key) return this.mainSession;\n } else if (key === \"__root__\") {\n return this.mainSession;\n }\n\n return this.sessions.get(key);\n }\n\n private teardownConsoleTap(key: string): void {\n const handler = this.consoleHandlers.get(key);\n if (!handler) return;\n\n const session = this.resolveSessionByKey(key);\n session?.off(\"Runtime.consoleAPICalled\", handler);\n this.consoleHandlers.delete(key);\n }\n\n private removeAllConsoleTaps(): void {\n for (const key of [...this.consoleHandlers.keys()]) {\n this.teardownConsoleTap(key);\n }\n }\n\n private emitConsole(evt: Protocol.Runtime.ConsoleAPICalledEvent): void {\n if (this.consoleListeners.size === 0) return;\n\n const message = new ConsoleMessage(evt, this);\n const listeners = [...this.consoleListeners];\n\n for (const listener of listeners) {\n try {\n listener(message);\n } catch (error) {\n v3Logger({\n category: \"page\",\n message: \"Console listener threw\",\n level: 2,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n type: { value: evt.type, type: \"string\" },\n },\n });\n }\n }\n }\n\n // -------- Convenience APIs delegated to the current main frame --------\n\n /**\n * Navigate the page; optionally wait for a lifecycle state.\n * Waits on the **current** main frame and follows root swaps during navigation.\n */\n @logAction(\"Page.goto\")\n async goto(\n url: string,\n options?: { waitUntil?: LoadState; timeoutMs?: number },\n ): Promise<Response | null> {\n const waitUntil: LoadState = options?.waitUntil ?? \"domcontentloaded\";\n const timeout = options?.timeoutMs ?? 15000;\n\n const navigationCommandId = this.beginNavigationCommand();\n const tracker = new NavigationResponseTracker({\n page: this,\n session: this.mainSession,\n navigationCommandId,\n });\n\n const watcher = new LifecycleWatcher({\n page: this,\n mainSession: this.mainSession,\n networkManager: this.networkManager,\n waitUntil,\n timeoutMs: timeout,\n navigationCommandId,\n });\n\n try {\n // Route to API if available\n if (this.apiClient) {\n const result = await this.apiClient.goto(\n url,\n { waitUntil: options?.waitUntil },\n this.mainFrameId(),\n );\n this._currentUrl = url;\n\n if (isSerializableResponse(result)) {\n return Response.fromSerializable(result, {\n page: this,\n session: this.mainSession,\n });\n }\n return result;\n }\n const response =\n await this.mainSession.send<Protocol.Page.NavigateResponse>(\n \"Page.navigate\",\n { url },\n );\n this._currentUrl = url;\n if (response?.loaderId) {\n watcher.setExpectedLoaderId(response.loaderId);\n tracker.setExpectedLoaderId(response.loaderId);\n }\n await watcher.wait();\n return await tracker.navigationCompleted();\n } finally {\n watcher.dispose();\n tracker.dispose();\n }\n }\n\n /**\n * Reload the page; optionally wait for a lifecycle state.\n */\n @logAction(\"Page.reload\")\n async reload(options?: {\n waitUntil?: LoadState;\n timeoutMs?: number;\n ignoreCache?: boolean;\n }): Promise<Response | null> {\n const waitUntil = options?.waitUntil;\n const timeout = options?.timeoutMs ?? 15000;\n\n const navigationCommandId = this.beginNavigationCommand();\n\n const tracker = new NavigationResponseTracker({\n page: this,\n session: this.mainSession,\n navigationCommandId,\n });\n tracker.expectNavigationWithoutKnownLoader();\n\n const watcher = waitUntil\n ? new LifecycleWatcher({\n page: this,\n mainSession: this.mainSession,\n networkManager: this.networkManager,\n waitUntil,\n timeoutMs: timeout,\n navigationCommandId,\n })\n : null;\n\n try {\n await this.mainSession.send(\"Page.reload\", {\n ignoreCache: options?.ignoreCache ?? false,\n });\n\n if (watcher) {\n await watcher.wait();\n }\n return await tracker.navigationCompleted();\n } finally {\n watcher?.dispose();\n tracker.dispose();\n }\n }\n\n /**\n * Navigate back in history if possible; optionally wait for a lifecycle state.\n */\n @logAction(\"Page.goBack\")\n async goBack(options?: {\n waitUntil?: LoadState;\n timeoutMs?: number;\n }): Promise<Response | null> {\n const { entries, currentIndex } =\n await this.mainSession.send<Protocol.Page.GetNavigationHistoryResponse>(\n \"Page.getNavigationHistory\",\n );\n const prev = entries[currentIndex - 1];\n if (!prev) return null; // nothing to do\n const waitUntil = options?.waitUntil;\n const timeout = options?.timeoutMs ?? 15000;\n\n const navigationCommandId = this.beginNavigationCommand();\n\n const tracker = new NavigationResponseTracker({\n page: this,\n session: this.mainSession,\n navigationCommandId,\n });\n tracker.expectNavigationWithoutKnownLoader();\n\n const watcher = waitUntil\n ? new LifecycleWatcher({\n page: this,\n mainSession: this.mainSession,\n networkManager: this.networkManager,\n waitUntil,\n timeoutMs: timeout,\n navigationCommandId,\n })\n : null;\n\n try {\n await this.mainSession.send(\"Page.navigateToHistoryEntry\", {\n entryId: prev.id,\n });\n this._currentUrl = prev.url ?? this._currentUrl;\n\n if (watcher) {\n await watcher.wait();\n }\n return await tracker.navigationCompleted();\n } finally {\n watcher?.dispose();\n tracker.dispose();\n }\n }\n\n /**\n * Navigate forward in history if possible; optionally wait for a lifecycle state.\n */\n @logAction(\"Page.goForward\")\n async goForward(options?: {\n waitUntil?: LoadState;\n timeoutMs?: number;\n }): Promise<Response | null> {\n const { entries, currentIndex } =\n await this.mainSession.send<Protocol.Page.GetNavigationHistoryResponse>(\n \"Page.getNavigationHistory\",\n );\n const next = entries[currentIndex + 1];\n if (!next) return null; // nothing to do\n const waitUntil = options?.waitUntil;\n const timeout = options?.timeoutMs ?? 15000;\n\n const navigationCommandId = this.beginNavigationCommand();\n\n const tracker = new NavigationResponseTracker({\n page: this,\n session: this.mainSession,\n navigationCommandId,\n });\n tracker.expectNavigationWithoutKnownLoader();\n\n const watcher = waitUntil\n ? new LifecycleWatcher({\n page: this,\n mainSession: this.mainSession,\n networkManager: this.networkManager,\n waitUntil,\n timeoutMs: timeout,\n navigationCommandId,\n })\n : null;\n\n try {\n await this.mainSession.send(\"Page.navigateToHistoryEntry\", {\n entryId: next.id,\n });\n this._currentUrl = next.url ?? this._currentUrl;\n\n if (watcher) {\n await watcher.wait();\n }\n return await tracker.navigationCompleted();\n } finally {\n watcher?.dispose();\n tracker.dispose();\n }\n }\n\n /**\n * Return the current page URL (synchronous, cached from navigation events).\n */\n url(): string {\n return this._currentUrl;\n }\n\n private beginNavigationCommand(): number {\n const id = ++this.navigationCommandSeq;\n this.latestNavigationCommandId = id;\n return id;\n }\n\n public isCurrentNavigationCommand(id: number): boolean {\n return this.latestNavigationCommandId === id;\n }\n\n /**\n * Return the current page title.\n * Prefers reading from the active document via Runtime.evaluate to reflect dynamic changes.\n * Falls back to navigation history title if evaluation is unavailable.\n */\n async title(): Promise<string> {\n try {\n await this.mainSession.send(\"Runtime.enable\").catch(() => {});\n const ctxId = await this.mainWorldExecutionContextId();\n const { result } =\n await this.mainSession.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression: \"document.title\",\n contextId: ctxId,\n returnByValue: true,\n },\n );\n return String(result?.value ?? \"\");\n } catch {\n // Fallback: use navigation history entry title\n try {\n const { entries, currentIndex } =\n await this.mainSession.send<Protocol.Page.GetNavigationHistoryResponse>(\n \"Page.getNavigationHistory\",\n );\n return entries[currentIndex]?.title ?? \"\";\n } catch {\n return \"\";\n }\n }\n }\n\n /**\n * Capture a screenshot with Playwright-style options.\n *\n * @param options Optional screenshot configuration.\n * @param options.animations Control CSS/Web animations during capture. Use\n * \"disabled\" to fast-forward finite animations and pause infinite ones.\n * @param options.caret Either hide the text caret (default) or leave it\n * visible via \"initial\".\n * @param options.clip Restrict capture to a specific rectangle (in CSS\n * pixels). Cannot be combined with `fullPage`.\n * @param options.fullPage Capture the full scrollable page instead of the\n * current viewport.\n * @param options.mask Array of locators that should be covered with an\n * overlay while the screenshot is taken.\n * @param options.maskColor CSS color used for the mask overlay (default\n * `#FF00FF`).\n * @param options.omitBackground Make the default page background transparent\n * (PNG only).\n * @param options.path File path to write the screenshot to. The file extension\n * determines the image type when `type` is not explicitly provided.\n * @param options.quality JPEG quality (0\u2013100). Only applies when\n * `type === \"jpeg\"`.\n * @param options.scale Render scale: use \"css\" for one pixel per CSS pixel,\n * otherwise the default \"device\" leverages the current device pixel ratio.\n * @param options.style Additional CSS text injected into every frame before\n * capture (removed afterwards).\n * @param options.timeout Maximum capture duration in milliseconds before a\n * timeout error is thrown.\n * @param options.type Image format (`\"png\"` by default).\n */\n @logAction(\"Page.screenshot\")\n async screenshot(options?: ScreenshotOptions): Promise<Buffer> {\n const opts = options ?? {};\n const type = opts.type ?? \"png\";\n\n if (type !== \"png\" && type !== \"jpeg\") {\n throw new StagehandInvalidArgumentError(\n `screenshot: unsupported image type \"${type}\"`,\n );\n }\n\n if (opts.fullPage && opts.clip) {\n throw new StagehandInvalidArgumentError(\n \"screenshot: clip and fullPage cannot be used together\",\n );\n }\n\n if (type === \"png\" && typeof opts.quality === \"number\") {\n throw new StagehandInvalidArgumentError(\n 'screenshot: quality option is only valid for type=\"jpeg\"',\n );\n }\n\n const caretMode: ScreenshotCaretOption = opts.caret ?? \"hide\";\n const animationsMode: ScreenshotAnimationsOption =\n opts.animations ?? \"allow\";\n const scaleMode: ScreenshotScaleOption = opts.scale ?? \"device\";\n const frames = collectFramesForScreenshot(this);\n const clip = opts.clip ? normalizeScreenshotClip(opts.clip) : undefined;\n const captureScale = await computeScreenshotScale(this, scaleMode);\n const maskLocators = (opts.mask ?? []).filter(\n (locator): locator is Locator => Boolean(locator),\n );\n\n const cleanupTasks: ScreenshotCleanup[] = [];\n\n const exec = async (): Promise<Buffer> => {\n try {\n if (opts.omitBackground) {\n cleanupTasks.push(await setTransparentBackground(this.mainSession));\n }\n\n if (animationsMode === \"disabled\") {\n cleanupTasks.push(await disableAnimations(frames));\n }\n\n if (caretMode === \"hide\") {\n cleanupTasks.push(await hideCaret(frames));\n }\n\n if (opts.style && opts.style.trim()) {\n cleanupTasks.push(\n await applyStyleToFrames(frames, opts.style, \"custom\"),\n );\n }\n\n if (maskLocators.length > 0) {\n cleanupTasks.push(\n await applyMaskOverlays(maskLocators, opts.maskColor ?? \"#FF00FF\"),\n );\n }\n\n const buffer = await this.mainFrameWrapper.screenshot({\n fullPage: opts.fullPage,\n clip,\n type,\n quality: type === \"jpeg\" ? opts.quality : undefined,\n scale: captureScale,\n });\n\n if (opts.path) {\n await fs.writeFile(opts.path, buffer);\n }\n\n return buffer;\n } finally {\n await runScreenshotCleanups(cleanupTasks);\n }\n };\n\n return withScreenshotTimeout(opts.timeout, exec);\n }\n\n /**\n * Create a locator bound to the current main frame.\n */\n locator(selector: string): ReturnType<Frame[\"locator\"]> {\n return this.mainFrameWrapper.locator(selector);\n }\n\n /**\n * Deep locator that supports cross-iframe traversal.\n * - Recognizes '>>' hop notation to enter iframe contexts.\n * - Supports deep XPath that includes iframe steps (e.g., '/html/body/iframe[2]//div').\n * Returns a Locator scoped to the appropriate frame.\n */\n deepLocator(selector: string) {\n return deepLocatorFromPage(this, this.mainFrameWrapper, selector);\n }\n\n /**\n * Frame locator similar to Playwright: targets iframe elements and scopes\n * subsequent locators to that frame. Supports chaining.\n */\n frameLocator(selector: string): FrameLocator {\n return new FrameLocator(this, selector);\n }\n\n /**\n * List all frames belonging to this page as Frame objects bound to their owning sessions.\n * The list is ordered by a stable ordinal assigned during the page lifetime.\n */\n frames(): Frame[] {\n const ids = this.listAllFrameIds();\n const withOrd = ids.map((id) => ({ id, ord: this.getOrdinal(id) }));\n withOrd.sort((a, b) => a.ord - b.ord);\n return withOrd.map(({ id }) => this.frameForId(id));\n }\n\n /**\n * Wait until the page reaches a lifecycle state on the current main frame.\n * Mirrors Playwright's API signatures.\n */\n @logAction(\"Page.waitForLoadState\")\n async waitForLoadState(state: LoadState, timeoutMs?: number): Promise<void> {\n await this.waitForMainLoadState(state, timeoutMs ?? 15000);\n }\n\n /**\n * Wait for a specified amount of time.\n *\n * @param ms The number of milliseconds to wait.\n */\n async waitForTimeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Wait for an element matching the selector to appear in the DOM.\n * Uses MutationObserver for efficiency\n * Pierces shadow DOM by default.\n * Supports iframe hop notation with '>>' (e.g., 'iframe#checkout >> .submit-btn').\n *\n * @param selector CSS selector to wait for (supports '>>' for iframe hops)\n * @param options\n * @param options.state Element state to wait for: 'attached' | 'detached' | 'visible' | 'hidden' (default: 'visible')\n * @param options.timeout Maximum time to wait in milliseconds (default: 30000)\n * @param options.pierceShadow Whether to search inside shadow DOM (default: true)\n * @returns True when the condition is met\n * @throws Error if timeout is reached before the condition is met\n */\n @logAction(\"Page.waitForSelector\")\n async waitForSelector(\n selector: string,\n options?: {\n state?: \"attached\" | \"detached\" | \"visible\" | \"hidden\";\n timeout?: number;\n pierceShadow?: boolean;\n },\n ): Promise<boolean> {\n const timeout = options?.timeout ?? 30000;\n const state = options?.state ?? \"visible\";\n const pierceShadow = options?.pierceShadow ?? true;\n const startTime = Date.now();\n const root = this.mainFrameWrapper;\n const { frame: targetFrame, selector: finalSelector } =\n await resolveLocatorTarget(this, root, selector);\n const elapsed = Date.now() - startTime;\n const remainingTimeout = Math.max(0, timeout - elapsed);\n\n const expression = buildLocatorInvocation(\"waitForSelector\", [\n JSON.stringify(finalSelector),\n JSON.stringify(state),\n String(remainingTimeout),\n String(pierceShadow),\n ]);\n return targetFrame.evaluate(expression);\n }\n\n /**\n * Evaluate a function or expression in the current main frame's main world.\n * - If a string is provided, it is treated as a JS expression.\n * - If a function is provided, it is stringified and invoked with the optional argument.\n * - The return value should be JSON-serializable. Non-serializable objects will\n * best-effort serialize via JSON.stringify inside the page context.\n */\n @logAction(\"Page.evaluate\")\n async evaluate<R = unknown, Arg = unknown>(\n pageFunctionOrExpression: string | ((arg: Arg) => R | Promise<R>),\n arg?: Arg,\n ): Promise<R> {\n await this.mainSession.send(\"Runtime.enable\").catch(() => {});\n const ctxId = await this.mainWorldExecutionContextId();\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 { result, exceptionDetails } =\n await this.mainSession.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId: ctxId,\n returnByValue: true,\n awaitPromise: true,\n },\n );\n\n if (exceptionDetails) {\n const msg =\n exceptionDetails.text ||\n exceptionDetails.exception?.description ||\n \"Evaluation failed\";\n throw new StagehandEvalError(msg);\n }\n\n return result?.value as R;\n }\n\n /**\n * Force the page viewport to an exact CSS size and device scale factor.\n * Ensures screenshots match width x height pixels when deviceScaleFactor = 1.\n */\n // @logAction(\"Page.setViewportSize\") // disabled because it's pretty noisy, can always re-enable if needed for debugging\n async setViewportSize(\n width: number,\n height: number,\n options?: { deviceScaleFactor?: number },\n ): Promise<void> {\n const dsf = Math.max(0.01, options?.deviceScaleFactor ?? 1);\n await this.mainSession\n .send(\"Emulation.setDeviceMetricsOverride\", {\n width,\n height,\n deviceScaleFactor: dsf,\n mobile: false,\n screenWidth: width,\n screenHeight: height,\n positionX: 0,\n positionY: 0,\n scale: 1,\n } as Protocol.Emulation.SetDeviceMetricsOverrideRequest)\n .catch(() => {});\n\n // Best-effort ensure visible size in headless\n await this.mainSession\n .send(\"Emulation.setVisibleSize\", { width, height })\n .catch(() => {});\n }\n\n /**\n * Click at absolute page coordinates (CSS pixels).\n * Dispatches mouseMoved \u2192 mousePressed \u2192 mouseReleased via CDP Input domain\n * on the top-level page target's session. Coordinates are relative to the\n * viewport origin (top-left). Does not scroll.\n */\n @logAction(\"Page.click\")\n async click(\n x: number,\n y: number,\n options?: {\n button?: \"left\" | \"right\" | \"middle\";\n clickCount?: number;\n returnXpath?: boolean;\n },\n ): Promise<string> {\n const button = options?.button ?? \"left\";\n const clickCount = options?.clickCount ?? 1;\n\n let xpathResult: string | undefined;\n if (options?.returnXpath) {\n // Resolve the deepest node at the given coordinates and compute absolute XPath efficiently\n try {\n const hit = await resolveXpathForLocation(this, x, y);\n if (hit) {\n v3Logger({\n category: \"page\",\n message: \"click resolved hit\",\n level: 2,\n auxiliary: {\n frameId: { value: String(hit.frameId), type: \"string\" },\n backendNodeId: {\n value: String(hit.backendNodeId),\n type: \"string\",\n },\n x: { value: String(x), type: \"integer\" },\n y: { value: String(y), type: \"integer\" },\n },\n });\n xpathResult = hit.absoluteXPath;\n v3Logger({\n category: \"page\",\n message: `click resolved xpath`,\n level: 2,\n auxiliary: {\n xpath: { value: String(xpathResult ?? \"\"), type: \"string\" },\n },\n });\n }\n } catch {\n // best-effort; fall through if any step fails\n }\n }\n\n // Synthesize a simple mouse move + press + release sequence.\n await this.updateCursor(x, y);\n // Dispatch click events in a pipelined burst to reduce inter-click delay\n // from network/CPU jitter between round trips.\n const dispatches: Array<Promise<unknown>> = [];\n dispatches.push(\n this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x,\n y,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n\n for (let i = 1; i <= clickCount; i++) {\n dispatches.push(\n this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x,\n y,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n dispatches.push(\n this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x,\n y,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n }\n await Promise.all(dispatches);\n\n return xpathResult ?? \"\";\n }\n\n /**\n * Hover at absolute page coordinates (CSS pixels).\n * Dispatches mouseMoved via CDP Input domain on the top-level page target's\n * session.\n */\n @logAction(\"Page.hover\")\n async hover(\n x: number,\n y: number,\n options?: { returnXpath?: boolean },\n ): Promise<string> {\n let xpathResult: string | undefined;\n if (options?.returnXpath) {\n try {\n const hit = await resolveXpathForLocation(this, x, y);\n if (hit) {\n v3Logger({\n category: \"page\",\n message: \"hover resolved hit\",\n level: 2,\n auxiliary: {\n frameId: { value: String(hit.frameId), type: \"string\" },\n backendNodeId: {\n value: String(hit.backendNodeId),\n type: \"string\",\n },\n x: { value: String(x), type: \"integer\" },\n y: { value: String(y), type: \"integer\" },\n },\n });\n xpathResult = hit.absoluteXPath;\n }\n } catch {\n v3Logger({\n category: \"page\",\n message: \"Failed to resolve xpath for hover\",\n level: 2,\n auxiliary: {\n x: { value: String(x), type: \"integer\" },\n y: { value: String(y), type: \"integer\" },\n },\n });\n }\n }\n\n await this.updateCursor(x, y);\n await this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x,\n y,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n\n return xpathResult ?? \"\";\n }\n\n @logAction(\"Page.scroll\")\n async scroll(\n x: number,\n y: number,\n deltaX: number,\n deltaY: number,\n options?: { returnXpath?: boolean },\n ): Promise<string> {\n let xpathResult: string | undefined;\n if (options?.returnXpath) {\n try {\n const hit = await resolveXpathForLocation(this, x, y);\n if (hit) xpathResult = hit.absoluteXPath;\n } catch {\n // best-effort\n }\n }\n\n await this.updateCursor(x, y);\n await this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x,\n y,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n\n // Synthesize a simple mouse move + press + release sequence\n await this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseWheel\",\n x,\n y,\n button: \"none\",\n deltaX,\n deltaY,\n } as Protocol.Input.DispatchMouseEventRequest);\n\n return xpathResult ?? \"\";\n }\n\n /**\n * Drag from (fromX, fromY) to (toX, toY) using mouse events.\n * Sends mouseMoved \u2192 mousePressed \u2192 mouseMoved (steps) \u2192 mouseReleased.\n */\n @logAction(\"Page.dragAndDrop\")\n async dragAndDrop(\n fromX: number,\n fromY: number,\n toX: number,\n toY: number,\n options?: {\n button?: \"left\" | \"right\" | \"middle\";\n steps?: number;\n delay?: number;\n returnXpath?: boolean;\n },\n ): Promise<[string, string]> {\n const button = options?.button ?? \"left\";\n const steps = Math.max(1, Math.floor(options?.steps ?? 1));\n const delay = Math.max(0, options?.delay ?? 0);\n\n const sleep = (ms: number) =>\n new Promise<void>((r) => (ms > 0 ? setTimeout(r, ms) : r()));\n\n const buttonMask = (b: typeof button): number => {\n switch (b) {\n case \"left\":\n return 1;\n case \"right\":\n return 2;\n case \"middle\":\n return 4;\n default:\n return 1;\n }\n };\n\n let fromXpath: string | undefined;\n let toXpath: string | undefined;\n if (options?.returnXpath) {\n try {\n const start = await resolveXpathForLocation(this, fromX, fromY);\n if (start) fromXpath = start.absoluteXPath;\n } catch {\n //\n }\n try {\n const end = await resolveXpathForLocation(this, toX, toY);\n if (end) toXpath = end.absoluteXPath;\n } catch {\n //\n }\n }\n\n // Move to start\n await this.updateCursor(fromX, fromY);\n await this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: fromX,\n y: fromY,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n\n // Press\n await this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: fromX,\n y: fromY,\n button,\n buttons: buttonMask(button),\n clickCount: 1,\n } as Protocol.Input.DispatchMouseEventRequest);\n\n // Intermediate moves\n for (let i = 1; i <= steps; i++) {\n const t = i / steps;\n const x = fromX + (toX - fromX) * t;\n const y = fromY + (toY - fromY) * t;\n await this.updateCursor(x, y);\n await this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x,\n y,\n button,\n buttons: buttonMask(button),\n } as Protocol.Input.DispatchMouseEventRequest);\n if (delay) await sleep(delay);\n }\n\n // Release at end\n await this.updateCursor(toX, toY);\n await this.mainSession.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: toX,\n y: toY,\n button,\n buttons: buttonMask(button),\n clickCount: 1,\n } as Protocol.Input.DispatchMouseEventRequest);\n\n return [fromXpath ?? \"\", toXpath ?? \"\"];\n }\n\n /**\n * Type a string by dispatching keyDown/keyUp events per character.\n * Focus must already be on the desired element. Uses CDP Input.dispatchKeyEvent\n * and never falls back to Input.insertText. Optional delay applies between\n * successive characters.\n */\n @logAction(\"Page.type\")\n async type(\n text: string,\n options?: { delay?: number; withMistakes?: boolean },\n ): Promise<void> {\n const delay = Math.max(0, options?.delay ?? 0);\n const withMistakes = !!options?.withMistakes;\n\n const sleep = (ms: number) =>\n new Promise<void>((r) => (ms > 0 ? setTimeout(r, ms) : r()));\n\n const keyStroke = async (\n ch: string,\n override?: {\n key?: string;\n code?: string;\n windowsVirtualKeyCode?: number;\n },\n ) => {\n if (override) {\n const base: Protocol.Input.DispatchKeyEventRequest = {\n type: \"keyDown\",\n key: override.key,\n code: override.code,\n windowsVirtualKeyCode: override.windowsVirtualKeyCode,\n } as Protocol.Input.DispatchKeyEventRequest;\n await this.mainSession.send(\"Input.dispatchKeyEvent\", base);\n await this.mainSession.send(\"Input.dispatchKeyEvent\", {\n ...base,\n type: \"keyUp\",\n } as Protocol.Input.DispatchKeyEventRequest);\n return;\n }\n\n // Printable character: include key, code, and text for maximum compatibility\n // Some sites (like Wordle) check event.key rather than relying on text input\n const isLetter = /^[a-zA-Z]$/.test(ch);\n const isDigit = /^[0-9]$/.test(ch);\n\n let key = ch;\n let code = \"\";\n let windowsVirtualKeyCode: number | undefined;\n\n if (isLetter) {\n // For letters, key is the character, code is KeyX where X is uppercase\n key = ch;\n code = `Key${ch.toUpperCase()}`;\n windowsVirtualKeyCode = ch.toUpperCase().charCodeAt(0);\n } else if (isDigit) {\n key = ch;\n code = `Digit${ch}`;\n windowsVirtualKeyCode = ch.charCodeAt(0);\n } else if (ch === \" \") {\n key = \" \";\n code = \"Space\";\n windowsVirtualKeyCode = 32;\n }\n\n const down: Protocol.Input.DispatchKeyEventRequest = {\n type: \"keyDown\",\n key,\n code: code || undefined,\n text: ch,\n unmodifiedText: ch,\n windowsVirtualKeyCode,\n };\n await this.mainSession.send(\"Input.dispatchKeyEvent\", down);\n await this.mainSession.send(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key,\n code: code || undefined,\n windowsVirtualKeyCode,\n } as Protocol.Input.DispatchKeyEventRequest);\n };\n\n const pressBackspace = async () =>\n keyStroke(\"\\b\", {\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n });\n\n const randomPrintable = (avoid: string): string => {\n const pool =\n \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 .,;:'\\\"!?@#$%^&*()-_=+[]{}<>/\\\\|`~\";\n let c = avoid;\n while (c === avoid) {\n c = pool[Math.floor(Math.random() * pool.length)];\n }\n return c;\n };\n\n for (const ch of text) {\n // Control keys that we explicitly map\n if (ch === \"\\n\" || ch === \"\\r\") {\n await keyStroke(ch, {\n key: \"Enter\",\n code: \"Enter\",\n windowsVirtualKeyCode: 13,\n });\n } else if (ch === \"\\t\") {\n await keyStroke(ch, {\n key: \"Tab\",\n code: \"Tab\",\n windowsVirtualKeyCode: 9,\n });\n } else {\n if (withMistakes && Math.random() < 0.12) {\n // Type a wrong character, then backspace to correct\n const wrong = randomPrintable(ch);\n await keyStroke(wrong);\n if (delay) await sleep(delay);\n await pressBackspace();\n if (delay) await sleep(delay);\n }\n await keyStroke(ch);\n }\n\n if (delay) await sleep(delay);\n }\n }\n\n /**\n * Press a single key or key combination (keyDown then keyUp).\n * For printable characters, uses the text path on keyDown; for named keys, sets key/code/VK.\n * Supports key combinations with modifiers like \"Cmd+A\", \"Ctrl+C\", \"Shift+Tab\", etc.\n */\n @logAction(\"Page.keyPress\")\n async keyPress(key: string, options?: { delay?: number }): Promise<void> {\n const delay = Math.max(0, options?.delay ?? 0);\n const sleep = (ms: number) =>\n new Promise<void>((r) => (ms > 0 ? setTimeout(r, ms) : r()));\n\n // Split key combination by + but handle the special case of \"+\" key itself\n function split(keyString: string): string[] {\n // Special case: if the entire string is just \"+\", return it as-is\n if (keyString === \"+\") {\n return [\"+\"];\n }\n\n const keys: string[] = [];\n let building = \"\";\n for (const char of keyString) {\n if (char === \"+\" && building) {\n keys.push(building);\n building = \"\";\n } else {\n building += char;\n }\n }\n if (building) {\n keys.push(building);\n }\n return keys;\n }\n\n const tokens = split(key);\n const mainKey = tokens[tokens.length - 1];\n const modifierKeys = tokens.slice(0, -1);\n\n try {\n for (const modKey of modifierKeys) {\n await this.keyDown(modKey);\n }\n\n await this.keyDown(mainKey);\n if (delay) await sleep(delay);\n await this.keyUp(mainKey);\n\n for (let i = modifierKeys.length - 1; i >= 0; i--) {\n await this.keyUp(modifierKeys[i]);\n }\n } catch (error) {\n // Clear stuck modifiers on error to prevent affecting subsequent keyPress calls\n this._pressedModifiers.clear();\n throw error;\n }\n }\n\n @logAction(\"Page.snapshot\")\n async snapshot(options?: PageSnapshotOptions): Promise<SnapshotResult> {\n try {\n const { combinedTree, combinedXpathMap, combinedUrlMap } =\n await captureHybridSnapshot(this, {\n pierceShadow: true,\n includeIframes: options?.includeIframes,\n });\n\n return {\n formattedTree: combinedTree,\n xpathMap: combinedXpathMap,\n urlMap: combinedUrlMap,\n };\n } catch (err) {\n throw new StagehandSnapshotError(err);\n }\n }\n\n // Track pressed modifier keys\n private _pressedModifiers = new Set<string>();\n\n /** Press a key down without releasing it */\n private async keyDown(key: string): Promise<void> {\n const normalizedKey = this.normalizeModifierKey(key);\n\n const modifierKeys = [\"Alt\", \"Control\", \"Meta\", \"Shift\"];\n if (modifierKeys.includes(normalizedKey)) {\n this._pressedModifiers.add(normalizedKey);\n }\n\n let modifiers = 0;\n if (this._pressedModifiers.has(\"Alt\")) modifiers |= 1;\n if (this._pressedModifiers.has(\"Control\")) modifiers |= 2;\n if (this._pressedModifiers.has(\"Meta\")) modifiers |= 4;\n if (this._pressedModifiers.has(\"Shift\")) modifiers |= 8;\n\n const named = this.getNamedKeys();\n\n if (normalizedKey.length === 1) {\n const hasNonShiftModifier =\n this._pressedModifiers.has(\"Alt\") ||\n this._pressedModifiers.has(\"Control\") ||\n this._pressedModifiers.has(\"Meta\");\n if (hasNonShiftModifier) {\n // For accelerators (e.g., Cmd/Ctrl/Alt + key), do not send text. Use rawKeyDown with key/code/VK.\n const desc = this.describePrintableKey(normalizedKey);\n const macCommands = this.isMacOS()\n ? this.macCommandsFor(desc.code ?? \"\")\n : [];\n const req: Protocol.Input.DispatchKeyEventRequest = {\n type: \"rawKeyDown\",\n modifiers,\n key: desc.key,\n ...(desc.code ? { code: desc.code } : {}),\n ...(typeof desc.vk === \"number\"\n ? { windowsVirtualKeyCode: desc.vk }\n : {}),\n ...(macCommands.length ? { commands: macCommands } : {}),\n } as Protocol.Input.DispatchKeyEventRequest;\n await this.mainSession.send(\"Input.dispatchKeyEvent\", req);\n } else {\n // Typing path (no non-Shift modifiers): send text to generate input\n await this.mainSession.send(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n text: normalizedKey,\n unmodifiedText: normalizedKey,\n modifiers,\n } as Protocol.Input.DispatchKeyEventRequest);\n }\n return;\n }\n\n const entry = named[normalizedKey] ?? null;\n if (entry) {\n const macCommands = this.isMacOS() ? this.macCommandsFor(entry.code) : [];\n const includeText = !!entry.text && modifiers === 0;\n const keyDown: Protocol.Input.DispatchKeyEventRequest = {\n type: includeText ? \"keyDown\" : \"rawKeyDown\",\n key: entry.key,\n code: entry.code,\n windowsVirtualKeyCode: entry.vk,\n modifiers,\n ...(includeText\n ? {\n text: entry.text,\n unmodifiedText: entry.unmodifiedText ?? entry.text,\n }\n : {}),\n ...(macCommands.length ? { commands: macCommands } : {}),\n } as Protocol.Input.DispatchKeyEventRequest;\n await this.mainSession.send(\"Input.dispatchKeyEvent\", keyDown);\n return;\n }\n\n // Fallback: send with key property only\n await this.mainSession.send(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: normalizedKey,\n modifiers,\n } as Protocol.Input.DispatchKeyEventRequest);\n }\n\n /** Release a pressed key */\n private async keyUp(key: string): Promise<void> {\n const normalizedKey = this.normalizeModifierKey(key);\n\n let modifiers = 0;\n if (this._pressedModifiers.has(\"Alt\")) modifiers |= 1;\n if (this._pressedModifiers.has(\"Control\")) modifiers |= 2;\n if (this._pressedModifiers.has(\"Meta\")) modifiers |= 4;\n if (this._pressedModifiers.has(\"Shift\")) modifiers |= 8;\n\n const modifierKeys = [\"Alt\", \"Control\", \"Meta\", \"Shift\"];\n if (modifierKeys.includes(normalizedKey)) {\n this._pressedModifiers.delete(normalizedKey);\n }\n\n const named = this.getNamedKeys();\n\n if (normalizedKey.length === 1) {\n const desc = this.describePrintableKey(normalizedKey);\n await this.mainSession.send(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: desc.key,\n code: desc.code,\n windowsVirtualKeyCode:\n typeof desc.vk === \"number\" ? desc.vk : undefined,\n modifiers,\n } as Protocol.Input.DispatchKeyEventRequest);\n return;\n }\n\n const entry = named[normalizedKey] ?? null;\n if (entry) {\n await this.mainSession.send(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: entry.key,\n code: entry.code,\n windowsVirtualKeyCode: entry.vk,\n modifiers,\n } as Protocol.Input.DispatchKeyEventRequest);\n return;\n }\n\n // Fallback: send with key property only\n await this.mainSession.send(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: normalizedKey,\n modifiers,\n } as Protocol.Input.DispatchKeyEventRequest);\n }\n\n /** Normalize key names to match CDP expectations */\n private normalizeModifierKey(key: string): string {\n const lower = key.toLowerCase();\n switch (lower) {\n // Modifier keys\n case \"cmd\":\n case \"command\":\n case \"controlormeta\":\n // On Mac, Cmd is Meta; elsewhere map to Control for common shortcuts\n return this.isMacOS() ? \"Meta\" : \"Control\";\n case \"win\":\n case \"windows\":\n return \"Meta\";\n case \"ctrl\":\n case \"control\":\n return \"Control\";\n case \"option\":\n case \"alt\":\n return \"Alt\";\n case \"shift\":\n return \"Shift\";\n case \"meta\":\n return \"Meta\";\n // Action keys\n case \"enter\":\n case \"return\":\n return \"Enter\";\n case \"esc\":\n case \"escape\":\n return \"Escape\";\n case \"backspace\":\n return \"Backspace\";\n case \"tab\":\n return \"Tab\";\n case \"space\":\n case \"spacebar\":\n return \" \";\n case \"delete\":\n case \"del\":\n return \"Delete\";\n // Arrow keys\n case \"left\":\n case \"arrowleft\":\n return \"ArrowLeft\";\n case \"right\":\n case \"arrowright\":\n return \"ArrowRight\";\n case \"up\":\n case \"arrowup\":\n return \"ArrowUp\";\n case \"down\":\n case \"arrowdown\":\n return \"ArrowDown\";\n // Navigation keys\n case \"home\":\n return \"Home\";\n case \"end\":\n return \"End\";\n case \"pageup\":\n case \"pgup\":\n return \"PageUp\";\n case \"pagedown\":\n case \"pgdn\":\n return \"PageDown\";\n default:\n return key;\n }\n }\n\n /**\n * Get the map of named keys with their properties\n */\n private getNamedKeys(): Record<\n string,\n {\n key: string;\n code: string;\n vk: number;\n text?: string;\n unmodifiedText?: string;\n }\n > {\n return {\n Enter: {\n key: \"Enter\",\n code: \"Enter\",\n vk: 13,\n text: \"\\r\",\n unmodifiedText: \"\\r\",\n },\n Tab: { key: \"Tab\", code: \"Tab\", vk: 9 },\n Backspace: { key: \"Backspace\", code: \"Backspace\", vk: 8 },\n Escape: { key: \"Escape\", code: \"Escape\", vk: 27 },\n Delete: { key: \"Delete\", code: \"Delete\", vk: 46 },\n ArrowLeft: { key: \"ArrowLeft\", code: \"ArrowLeft\", vk: 37 },\n ArrowUp: { key: \"ArrowUp\", code: \"ArrowUp\", vk: 38 },\n ArrowRight: { key: \"ArrowRight\", code: \"ArrowRight\", vk: 39 },\n ArrowDown: { key: \"ArrowDown\", code: \"ArrowDown\", vk: 40 },\n Home: { key: \"Home\", code: \"Home\", vk: 36 },\n End: { key: \"End\", code: \"End\", vk: 35 },\n PageUp: { key: \"PageUp\", code: \"PageUp\", vk: 33 },\n PageDown: { key: \"PageDown\", code: \"PageDown\", vk: 34 },\n // Modifier keys\n Alt: { key: \"Alt\", code: \"AltLeft\", vk: 18 },\n Control: { key: \"Control\", code: \"ControlLeft\", vk: 17 },\n Meta: { key: \"Meta\", code: \"MetaLeft\", vk: 91 },\n Shift: { key: \"Shift\", code: \"ShiftLeft\", vk: 16 },\n };\n }\n\n /**\n * Minimal description for printable keys (letters/digits/space) to provide code and VK.\n * Used when non-Shift modifiers are pressed to avoid sending text while keeping accelerator info.\n */\n private describePrintableKey(ch: string): {\n key: string;\n code?: string;\n vk?: number;\n } {\n const shiftDown = this._pressedModifiers.has(\"Shift\");\n const isLetter = /^[a-zA-Z]$/.test(ch);\n const isDigit = /^[0-9]$/.test(ch);\n\n if (isLetter) {\n const upper = ch.toUpperCase();\n return {\n key: shiftDown ? upper : upper.toLowerCase(),\n code: `Key${upper}`,\n vk: upper.charCodeAt(0), // 'A'..'Z' => 65..90\n };\n }\n\n if (isDigit) {\n return {\n key: ch,\n code: `Digit${ch}`,\n vk: ch.charCodeAt(0), // '0'..'9' => 48..57\n };\n }\n\n if (ch === \" \") {\n return { key: \" \", code: \"Space\", vk: 32 };\n }\n\n // Fallback: just return the character as-is; VK best-effort from ASCII\n return {\n key: shiftDown ? ch.toUpperCase() : ch,\n vk: ch.toUpperCase().charCodeAt(0),\n };\n }\n\n private isMacOS(): boolean {\n try {\n return process.platform === \"darwin\";\n } catch {\n return false;\n }\n }\n\n /**\n * Return Chromium mac editing commands (without trailing ':') for a given code like 'KeyA'\n * Only used on macOS to trigger system editing shortcuts (e.g., selectAll, copy, paste...).\n */\n private macCommandsFor(code: string): string[] {\n if (!this.isMacOS()) return [];\n const parts: string[] = [];\n if (this._pressedModifiers.has(\"Shift\")) parts.push(\"Shift\");\n if (this._pressedModifiers.has(\"Control\")) parts.push(\"Control\");\n if (this._pressedModifiers.has(\"Alt\")) parts.push(\"Alt\");\n if (this._pressedModifiers.has(\"Meta\")) parts.push(\"Meta\");\n parts.push(code);\n const shortcut = parts.join(\"+\");\n const table: Record<string, string | string[]> = {\n \"Meta+KeyA\": \"selectAll:\",\n \"Meta+KeyC\": \"copy:\",\n \"Meta+KeyX\": \"cut:\",\n \"Meta+KeyV\": \"paste:\",\n \"Meta+KeyZ\": \"undo:\",\n };\n const value = table[shortcut];\n if (!value) return [];\n const list = Array.isArray(value) ? value : [value];\n return list\n .filter((c) => !c.startsWith(\"insert\"))\n .map((c) => c.substring(0, c.length - 1));\n }\n\n // ---- Page-level lifecycle waiter that follows main frame id swaps ----\n\n /** Resolve the main-world execution context for the current main frame. */\n private async mainWorldExecutionContextId(): Promise<number> {\n return executionContexts.waitForMainWorld(\n this.mainSession,\n this.mainFrameId(),\n 1000,\n );\n }\n\n private async isMainLoadStateReady(\n state: \"domcontentloaded\" | \"load\",\n ): Promise<boolean> {\n try {\n const ctxId = await this.mainWorldExecutionContextId();\n const { result } =\n await this.mainSession.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression: \"document.readyState\",\n contextId: ctxId,\n returnByValue: true,\n },\n );\n const readyState = String(result?.value ?? \"\");\n if (state === \"domcontentloaded\") {\n return readyState === \"interactive\" || readyState === \"complete\";\n }\n return readyState === \"complete\";\n } catch {\n return false;\n }\n }\n\n /**\n * Wait until the **current** main frame reaches a lifecycle state.\n * - Fast path via `document.readyState`.\n * - Event path listens at the session level and compares incoming `frameId`\n * to `mainFrameId()` **at event time** to follow root swaps.\n */\n async waitForMainLoadState(\n state: LoadState,\n timeoutMs = 15000,\n ): Promise<void> {\n await this.mainSession\n .send(\"Page.setLifecycleEventsEnabled\", { enabled: true })\n .catch(() => {});\n\n // Fast path: check the *current* main frame's readyState.\n if (\n (state === \"domcontentloaded\" || state === \"load\") &&\n (await this.isMainLoadStateReady(state))\n ) {\n return;\n }\n\n const wanted = LIFECYCLE_NAME[state];\n return new Promise<void>((resolve, reject) => {\n let done = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n let pollInFlight = false;\n\n const off = () => {\n this.mainSession.off(\"Page.lifecycleEvent\", onLifecycle);\n this.mainSession.off(\"Page.domContentEventFired\", onDomContent);\n this.mainSession.off(\"Page.loadEventFired\", onLoad);\n };\n const clearPollTimer = () => {\n if (pollTimer) {\n clearTimeout(pollTimer);\n pollTimer = null;\n }\n };\n\n const finish = () => {\n if (done) return;\n done = true;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n clearPollTimer();\n off();\n resolve();\n };\n\n const onLifecycle = (evt: Protocol.Page.LifecycleEventEvent) => {\n if (evt.name !== wanted) return;\n // Compare against the *current* main frame id when the event arrives.\n if (evt.frameId === this.mainFrameId()) finish();\n };\n\n const onDomContent = () => {\n if (state === \"domcontentloaded\") finish();\n };\n\n const onLoad = () => {\n if (state === \"load\") finish();\n };\n\n this.mainSession.on(\"Page.lifecycleEvent\", onLifecycle);\n // Backups for sites that don't emit lifecycle consistently\n this.mainSession.on(\"Page.domContentEventFired\", onDomContent);\n this.mainSession.on(\"Page.loadEventFired\", onLoad);\n\n // Fallback polling closes lifecycle-event races in remote environments\n // where readyState has advanced but the corresponding event was missed.\n const pollReadyState = async () => {\n if (done || pollInFlight) return;\n pollInFlight = true;\n try {\n if (done) return;\n if (\n (state === \"domcontentloaded\" || state === \"load\") &&\n (await this.isMainLoadStateReady(state))\n ) {\n finish();\n return;\n }\n } finally {\n pollInFlight = false;\n }\n if (!done) {\n clearPollTimer();\n pollTimer = setTimeout(() => {\n void pollReadyState();\n }, 100);\n }\n };\n void pollReadyState();\n\n timer = setTimeout(() => {\n if (done) return;\n done = true;\n clearPollTimer();\n off();\n reject(\n new Error(\n `waitForMainLoadState(${state}) timed out after ${timeoutMs}ms`,\n ),\n );\n }, timeoutMs);\n });\n }\n}\n", "export { V3 } from \"./v3.js\";\nexport { V3 as Stagehand } from \"./v3.js\";\n\nexport * from \"./types/public/index.js\";\nexport { AnnotatedScreenshotText, LLMClient } from \"./llm/LLMClient.js\";\n\nexport {\n AgentProvider,\n modelToAgentProviderMap,\n} from \"./agent/AgentProvider.js\";\nexport type {\n AgentTools,\n AgentToolTypesMap,\n AgentUITools,\n AgentToolCall,\n AgentToolResult,\n} from \"./agent/tools/index.js\";\n\nexport {\n validateZodSchema,\n isRunningInBun,\n toGeminiSchema,\n getZodType,\n transformSchema,\n injectUrls,\n providerEnvVarMap,\n loadApiKeyFromEnv,\n trimTrailingTextNode,\n jsonSchemaToZod,\n} from \"../utils.js\";\nexport { isZod4Schema, isZod3Schema, toJsonSchema } from \"./zodCompat.js\";\n\nexport { connectToMCPServer } from \"./mcp/connection.js\";\nexport { V3Evaluator } from \"../v3Evaluator.js\";\nexport { tool } from \"ai\";\nexport { getAISDKLanguageModel } from \"./llm/LLMProvider.js\";\nexport { __internalCreateInMemoryAgentCacheHandle } from \"./cache/serverAgentCache.js\";\nexport { maybeRunShutdownSupervisorFromArgv as __internalMaybeRunShutdownSupervisorFromArgv } from \"./shutdown/supervisor.js\";\nexport type { ServerAgentCacheHandle } from \"./cache/serverAgentCache.js\";\n\nexport type {\n ChatMessage,\n ChatMessageContent,\n ChatMessageImageContent,\n ChatMessageTextContent,\n ChatCompletionOptions,\n LLMResponse,\n CreateChatCompletionOptions,\n LLMUsage,\n LLMParsedResponse,\n} from \"./llm/LLMClient.js\";\n\nexport type {\n StagehandZodSchema,\n StagehandZodObject,\n InferStagehandSchema,\n JsonSchemaDocument,\n} from \"./zodCompat.js\";\n\nexport type { JsonSchema, JsonSchemaProperty } from \"../utils.js\";\n", "import { EventEmitter } from \"events\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport process from \"process\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { z } from \"zod\";\nimport {\n InferStagehandSchema,\n StagehandZodSchema,\n toJsonSchema,\n} from \"./zodCompat.js\";\nimport { loadApiKeyFromEnv } from \"../utils.js\";\nimport { StagehandLogger, LoggerOptions } from \"../logger.js\";\nimport { ActCache } from \"./cache/ActCache.js\";\nimport { AgentCache } from \"./cache/AgentCache.js\";\nimport { CacheStorage } from \"./cache/CacheStorage.js\";\nimport { ActHandler } from \"./handlers/actHandler.js\";\nimport { ExtractHandler } from \"./handlers/extractHandler.js\";\nimport { ObserveHandler } from \"./handlers/observeHandler.js\";\nimport { V3AgentHandler } from \"./handlers/v3AgentHandler.js\";\nimport { V3CuaAgentHandler } from \"./handlers/v3CuaAgentHandler.js\";\nimport { createBrowserbaseSession } from \"./launch/browserbase.js\";\nimport { launchLocalChrome } from \"./launch/local.js\";\nimport { LLMClient } from \"./llm/LLMClient.js\";\nimport { LLMProvider } from \"./llm/LLMProvider.js\";\nimport {\n bindInstanceLogger,\n unbindInstanceLogger,\n withInstanceLogContext,\n} from \"./logger.js\";\nimport { cleanupLocalBrowser } from \"./shutdown/cleanupLocal.js\";\nimport { startShutdownSupervisor } from \"./shutdown/supervisorClient.js\";\nimport { resolveTools } from \"./mcp/utils.js\";\nimport {\n ActHandlerParams,\n ExtractHandlerParams,\n ObserveHandlerParams,\n AgentReplayStep,\n InitState,\n AgentCacheContext,\n} from \"./types/private/index.js\";\nimport type {\n ShutdownSupervisorConfig,\n ShutdownSupervisorHandle,\n} from \"./types/private/shutdown.js\";\nimport {\n AgentConfig,\n AgentExecuteCallbacks,\n AgentExecuteOptions,\n AgentStreamExecuteOptions,\n AgentResult,\n AVAILABLE_CUA_MODELS,\n LogLine,\n StagehandMetrics,\n Action,\n ActOptions,\n ActResult,\n defaultExtractSchema,\n ExtractOptions,\n HistoryEntry,\n ObserveOptions,\n pageTextSchema,\n V3FunctionName,\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n LocalBrowserLaunchOptions,\n V3Options,\n AnyPage,\n PatchrightPage,\n PlaywrightPage,\n PuppeteerPage,\n CuaModelRequiredError,\n StagehandInvalidArgumentError,\n StagehandNotInitializedError,\n MissingEnvironmentVariableError,\n StagehandInitError,\n AgentStreamResult,\n} from \"./types/public/index.js\";\nimport { V3Context } from \"./understudy/context.js\";\nimport { Page } from \"./understudy/page.js\";\nimport { resolveModel } from \"../modelUtils.js\";\nimport { StagehandAPIClient } from \"./api.js\";\nimport { validateExperimentalFeatures } from \"./agent/utils/validateExperimentalFeatures.js\";\nimport { SessionFileLogger, logStagehandStep } from \"./flowLogger.js\";\nimport { createTimeoutGuard } from \"./handlers/handlerUtils/timeoutGuard.js\";\nimport { ActTimeoutError } from \"./types/public/sdkErrors.js\";\n\nconst DEFAULT_MODEL_NAME = \"openai/gpt-4.1-mini\";\nconst DEFAULT_VIEWPORT = { width: 1288, height: 711 };\n\ntype ResolvedModelConfiguration = {\n modelName: AvailableModel;\n clientOptions?: ClientOptions;\n};\n\nfunction resolveModelConfiguration(\n model?: V3Options[\"model\"],\n): ResolvedModelConfiguration {\n if (!model) {\n return { modelName: DEFAULT_MODEL_NAME };\n }\n\n if (typeof model === \"string\") {\n return { modelName: model as AvailableModel };\n }\n\n if (model && typeof model === \"object\") {\n const { modelName, ...clientOptions } = model;\n if (!modelName) {\n throw new StagehandInvalidArgumentError(\n \"model.modelName is required when providing client options.\",\n );\n }\n return {\n modelName,\n clientOptions: clientOptions as ClientOptions,\n };\n }\n\n return { modelName: DEFAULT_MODEL_NAME };\n}\n\n/**\n * V3\n *\n * Purpose:\n * A high-level orchestrator for Stagehand V3. Abstracts away whether the browser\n * runs **locally via Chrome** or remotely on **Browserbase**, and exposes simple\n * entrypoints (`act`, `extract`, `observe`) that delegate to the corresponding\n * handler classes.\n *\n * Responsibilities:\n * - Bootstraps Chrome or Browserbase, ensures a working CDP WebSocket, and builds a `V3Context`.\n * - Manages lifecycle: init, context access, cleanup.\n * - Bridges external page objects (Playwright/Puppeteer) into internal frameIds for handlers.\n * - Provides a stable API surface for downstream code regardless of runtime environment.\n */\nexport class V3 {\n private readonly opts: V3Options;\n private state: InitState = { kind: \"UNINITIALIZED\" };\n private actHandler: ActHandler | null = null;\n private extractHandler: ExtractHandler | null = null;\n private observeHandler: ObserveHandler | null = null;\n private ctx: V3Context | null = null;\n public llmClient!: LLMClient;\n\n /**\n * Event bus for internal communication.\n * Emits events like 'screenshot' when screenshots are captured during agent execution.\n */\n public readonly bus: EventEmitter = new EventEmitter();\n private modelName: AvailableModel;\n private modelClientOptions: ClientOptions;\n private llmProvider: LLMProvider;\n private overrideLlmClients: Map<string, LLMClient> = new Map();\n private readonly domSettleTimeoutMs?: number;\n private _isClosing = false;\n public browserbaseSessionId?: string;\n private browserbaseSessionUrl?: string;\n private browserbaseDebugUrl?: string;\n public get browserbaseSessionID(): string | undefined {\n return this.browserbaseSessionId;\n }\n public get browserbaseSessionURL(): string | undefined {\n return this.browserbaseSessionUrl;\n }\n public get browserbaseDebugURL(): string | undefined {\n return this.browserbaseDebugUrl;\n }\n /**\n * Returns true if the browser is running on Browserbase.\n */\n public get isBrowserbase(): boolean {\n return this.state.kind === \"BROWSERBASE\";\n }\n\n /**\n * Returns true if advancedStealth is enabled in Browserbase settings.\n */\n public get isAdvancedStealth(): boolean {\n return (\n this.opts.browserbaseSessionCreateParams?.browserSettings\n ?.advancedStealth === true\n );\n }\n\n /**\n * Returns the configured viewport dimensions from launch options.\n * Falls back to default 1288x711 if not configured.\n */\n public get configuredViewport(): { width: number; height: number } {\n const defaultWidth = 1288;\n const defaultHeight = 711;\n\n if (this.opts.env === \"BROWSERBASE\") {\n const vp =\n this.opts.browserbaseSessionCreateParams?.browserSettings?.viewport;\n return {\n width: vp?.width ?? defaultWidth,\n height: vp?.height ?? defaultHeight,\n };\n }\n\n // LOCAL env\n const vp = this.opts.localBrowserLaunchOptions?.viewport;\n return {\n width: vp?.width ?? defaultWidth,\n height: vp?.height ?? defaultHeight,\n };\n }\n\n private _onCdpClosed = (why: string) => {\n if (this.state.kind === \"BROWSERBASE\") {\n void this._logBrowserbaseSessionStatus();\n }\n\n // Single place to react to the transport closing\n this._immediateShutdown(`CDP transport closed: ${why}`).catch(() => {});\n };\n public readonly experimental: boolean = false;\n public readonly logInferenceToFile: boolean = false;\n public readonly disableAPI: boolean = false;\n private externalLogger?: (logLine: LogLine) => void;\n public verbose: 0 | 1 | 2 = 1;\n private stagehandLogger: StagehandLogger;\n private _history: Array<HistoryEntry> = [];\n private readonly instanceId: string;\n private static _processGuardsInstalled = false;\n private static _instances: Set<V3> = new Set();\n private cacheStorage: CacheStorage;\n private actCache: ActCache;\n private agentCache: AgentCache;\n private apiClient: StagehandAPIClient | null = null;\n private keepAlive?: boolean;\n private shutdownSupervisor: ShutdownSupervisorHandle | null = null;\n\n public stagehandMetrics: StagehandMetrics = {\n actPromptTokens: 0,\n actCompletionTokens: 0,\n actReasoningTokens: 0,\n actCachedInputTokens: 0,\n actInferenceTimeMs: 0,\n extractPromptTokens: 0,\n extractCompletionTokens: 0,\n extractReasoningTokens: 0,\n extractCachedInputTokens: 0,\n extractInferenceTimeMs: 0,\n observePromptTokens: 0,\n observeCompletionTokens: 0,\n observeReasoningTokens: 0,\n observeCachedInputTokens: 0,\n observeInferenceTimeMs: 0,\n agentPromptTokens: 0,\n agentCompletionTokens: 0,\n agentReasoningTokens: 0,\n agentCachedInputTokens: 0,\n agentInferenceTimeMs: 0,\n totalPromptTokens: 0,\n totalCompletionTokens: 0,\n totalReasoningTokens: 0,\n totalCachedInputTokens: 0,\n totalInferenceTimeMs: 0,\n };\n\n constructor(opts: V3Options) {\n this.externalLogger = opts.logger;\n this.verbose = opts.verbose ?? 1;\n this.instanceId = uuidv7();\n this.keepAlive =\n opts.keepAlive ?? opts.browserbaseSessionCreateParams?.keepAlive;\n\n // Create per-instance StagehandLogger (handles usePino, verbose, externalLogger)\n // This gives each V3 instance independent logger configuration\n // while still sharing the underlying Pino worker thread via StagehandLogger.sharedPinoLogger\n const loggerOptions: LoggerOptions = {\n pretty: true,\n level: \"info\", // Most permissive - filtering happens at instance level\n };\n\n if (opts.disablePino !== undefined) {\n loggerOptions.usePino = !opts.disablePino;\n }\n\n this.stagehandLogger = new StagehandLogger(loggerOptions, opts.logger);\n this.stagehandLogger.setVerbosity(this.verbose);\n\n // Also bind to AsyncLocalStorage for v3Logger() calls from handlers\n // This maintains backward compatibility with code that uses v3Logger() directly\n try {\n if (this.externalLogger) {\n // Use external logger directly when provided\n bindInstanceLogger(this.instanceId, this.externalLogger);\n } else {\n // Fall back to stagehandLogger when no external logger\n bindInstanceLogger(this.instanceId, (line) => {\n this.stagehandLogger.log(line);\n });\n }\n } catch {\n // ignore\n }\n const { modelName, clientOptions } = resolveModelConfiguration(opts.model);\n this.modelName = modelName;\n this.experimental = opts.experimental ?? false;\n this.logInferenceToFile = opts.logInferenceToFile ?? false;\n this.llmProvider = new LLMProvider(this.logger);\n this.domSettleTimeoutMs = opts.domSettleTimeout;\n this.disableAPI = opts.disableAPI ?? false;\n\n const baseClientOptions: ClientOptions = clientOptions\n ? ({ ...clientOptions } as ClientOptions)\n : ({} as ClientOptions);\n if (opts.llmClient) {\n this.llmClient = opts.llmClient;\n this.modelClientOptions = baseClientOptions;\n this.disableAPI = true;\n } else {\n // Ensure API key is set\n let apiKey = (baseClientOptions as { apiKey?: string }).apiKey;\n if (!apiKey) {\n try {\n apiKey = loadApiKeyFromEnv(\n this.modelName.split(\"/\")[0], // \"openai\", \"anthropic\", etc\n this.logger,\n );\n } catch (error) {\n this.logger({\n category: \"init\",\n message: `Error loading API key for model ${this.modelName}: ${error}. Continuing without LLM client.`,\n level: 0,\n });\n throw error;\n }\n }\n this.modelClientOptions = {\n ...baseClientOptions,\n apiKey,\n } as ClientOptions;\n\n // Get the default client for this model\n this.llmClient = this.llmProvider.getClient(\n this.modelName,\n this.modelClientOptions,\n { experimental: this.experimental, disableAPI: this.disableAPI },\n );\n }\n\n this.cacheStorage = CacheStorage.create(opts.cacheDir, this.logger, {\n label: \"cache directory\",\n });\n this.actCache = new ActCache({\n storage: this.cacheStorage,\n logger: this.logger,\n getActHandler: () => this.actHandler,\n getDefaultLlmClient: () => this.resolveLlmClient(),\n domSettleTimeoutMs: this.domSettleTimeoutMs,\n });\n this.agentCache = new AgentCache({\n storage: this.cacheStorage,\n logger: this.logger,\n getActHandler: () => this.actHandler,\n getContext: () => this.ctx,\n getDefaultLlmClient: () => this.resolveLlmClient(),\n getBaseModelName: () => this.modelName,\n getSystemPrompt: () => opts.systemPrompt,\n domSettleTimeoutMs: this.domSettleTimeoutMs,\n act: this.act.bind(this),\n });\n\n this.opts = opts;\n\n // Initialize session file logger\n SessionFileLogger.init(this.instanceId, opts);\n\n // Track instance for global process guard handling\n V3._instances.add(this);\n }\n\n /**\n * Async property for metrics so callers can `await v3.metrics`.\n * When using API mode, fetches metrics from the API. Otherwise returns local metrics.\n */\n public get metrics(): Promise<StagehandMetrics> {\n if (this.apiClient) {\n // Fetch metrics from the API\n return this.apiClient.getReplayMetrics().catch((error) => {\n this.logger({\n category: \"metrics\",\n message: `Failed to fetch metrics from API: ${error}`,\n level: 0,\n });\n // Fall back to local metrics on error\n return this.stagehandMetrics;\n });\n }\n // Return local metrics wrapped in a Promise for consistency\n return Promise.resolve(this.stagehandMetrics);\n }\n\n private resolveLlmClient(model?: ModelConfiguration): LLMClient {\n if (!model) {\n return this.llmClient;\n }\n\n let modelName: AvailableModel | string;\n let clientOptions: ClientOptions | undefined;\n\n if (typeof model === \"string\") {\n modelName = model;\n } else {\n const { modelName: overrideModelName, ...rest } = model;\n modelName = overrideModelName;\n clientOptions = rest as ClientOptions;\n }\n\n if (\n modelName === this.modelName &&\n (!clientOptions || Object.keys(clientOptions).length === 0)\n ) {\n return this.llmClient;\n }\n\n const overrideProvider = String(modelName).split(\"/\")[0];\n const baseProvider = String(this.modelName).split(\"/\")[0];\n\n const mergedOptions = {\n ...(overrideProvider === baseProvider ? this.modelClientOptions : {}),\n ...(clientOptions ?? {}),\n } as ClientOptions;\n\n const providerKey = overrideProvider;\n if (!(mergedOptions as { apiKey?: string }).apiKey) {\n const apiKey = loadApiKeyFromEnv(providerKey, this.logger);\n if (apiKey) {\n (mergedOptions as { apiKey?: string }).apiKey = apiKey;\n }\n }\n\n const cacheKey = JSON.stringify({\n modelName,\n clientOptions: mergedOptions,\n });\n\n const cached = this.overrideLlmClients.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const client = this.llmProvider.getClient(\n modelName as AvailableModel,\n mergedOptions,\n { experimental: this.experimental, disableAPI: this.disableAPI },\n );\n\n this.overrideLlmClients.set(cacheKey, client);\n return client;\n }\n\n private beginAgentReplayRecording(): void {\n this.agentCache.beginRecording();\n }\n\n private endAgentReplayRecording(): AgentReplayStep[] {\n return this.agentCache.endRecording();\n }\n\n private discardAgentReplayRecording(): void {\n this.agentCache.discardRecording();\n }\n\n private isAgentReplayRecording(): boolean {\n return this.agentCache.isRecording();\n }\n\n public isAgentReplayActive(): boolean {\n return this.agentCache.isReplayActive();\n }\n\n public recordAgentReplayStep(step: AgentReplayStep): void {\n this.agentCache.recordStep(step);\n }\n\n /**\n * Async property for history so callers can `await v3.history`.\n * Returns a frozen copy to avoid external mutation.\n */\n public get history(): Promise<ReadonlyArray<HistoryEntry>> {\n return Promise.resolve(Object.freeze([...this._history]));\n }\n\n public addToHistory(\n method: HistoryEntry[\"method\"],\n parameters: unknown,\n result?: unknown,\n ): void {\n this._history.push({\n method,\n parameters,\n result: result ?? null,\n timestamp: new Date().toISOString(),\n });\n }\n\n public updateMetrics(\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ): void {\n switch (functionName) {\n case V3FunctionName.ACT:\n this.stagehandMetrics.actPromptTokens += promptTokens;\n this.stagehandMetrics.actCompletionTokens += completionTokens;\n this.stagehandMetrics.actReasoningTokens += reasoningTokens;\n this.stagehandMetrics.actCachedInputTokens += cachedInputTokens;\n this.stagehandMetrics.actInferenceTimeMs += inferenceTimeMs;\n break;\n\n case V3FunctionName.EXTRACT:\n this.stagehandMetrics.extractPromptTokens += promptTokens;\n this.stagehandMetrics.extractCompletionTokens += completionTokens;\n this.stagehandMetrics.extractReasoningTokens += reasoningTokens;\n this.stagehandMetrics.extractCachedInputTokens += cachedInputTokens;\n this.stagehandMetrics.extractInferenceTimeMs += inferenceTimeMs;\n break;\n\n case V3FunctionName.OBSERVE:\n this.stagehandMetrics.observePromptTokens += promptTokens;\n this.stagehandMetrics.observeCompletionTokens += completionTokens;\n this.stagehandMetrics.observeReasoningTokens += reasoningTokens;\n this.stagehandMetrics.observeCachedInputTokens += cachedInputTokens;\n this.stagehandMetrics.observeInferenceTimeMs += inferenceTimeMs;\n break;\n\n case V3FunctionName.AGENT:\n this.stagehandMetrics.agentPromptTokens += promptTokens;\n this.stagehandMetrics.agentCompletionTokens += completionTokens;\n this.stagehandMetrics.agentReasoningTokens += reasoningTokens;\n this.stagehandMetrics.agentCachedInputTokens += cachedInputTokens;\n this.stagehandMetrics.agentInferenceTimeMs += inferenceTimeMs;\n break;\n }\n this.updateTotalMetrics(\n promptTokens,\n completionTokens,\n reasoningTokens,\n cachedInputTokens,\n inferenceTimeMs,\n );\n }\n\n private updateTotalMetrics(\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ): void {\n this.stagehandMetrics.totalPromptTokens += promptTokens;\n this.stagehandMetrics.totalCompletionTokens += completionTokens;\n this.stagehandMetrics.totalReasoningTokens += reasoningTokens;\n this.stagehandMetrics.totalCachedInputTokens += cachedInputTokens;\n this.stagehandMetrics.totalInferenceTimeMs += inferenceTimeMs;\n }\n\n private async _immediateShutdown(reason: string): Promise<void> {\n try {\n this.logger({\n category: \"v3\",\n message: `initiating shutdown \u2192 ${reason}`,\n level: 0,\n });\n } catch {\n //\n }\n\n try {\n this.logger({\n category: \"v3\",\n message: `closing resources \u2192 ${reason}`,\n level: 0,\n });\n await this.close({ force: true });\n } catch {\n // swallow \u2014 already shutting down\n }\n }\n\n /** Spawn a crash-only supervisor that cleans up when this process dies. */\n private startShutdownSupervisor(\n config: ShutdownSupervisorConfig,\n ): ShutdownSupervisorHandle | null {\n if (this.shutdownSupervisor) return this.shutdownSupervisor;\n this.shutdownSupervisor = startShutdownSupervisor(config, {\n onError: (error, context) => {\n try {\n this.logger({\n category: \"v3\",\n message:\n \"Shutdown supervisor unavailable; crash cleanup disabled. \" +\n \"If this process exits unexpectedly, local Chrome or Browserbase \" +\n \"sessions may remain running even with keepAlive=false.\",\n level: 0,\n auxiliary: {\n context: { value: context, type: \"string\" },\n error: { value: error.message, type: \"string\" },\n },\n });\n } catch {\n // ignore logging failures\n }\n },\n });\n return this.shutdownSupervisor;\n }\n\n /** Stop the supervisor during a normal shutdown. */\n private stopShutdownSupervisor(): void {\n if (!this.shutdownSupervisor) return;\n try {\n this.shutdownSupervisor.stop();\n } catch {\n // best-effort\n }\n this.shutdownSupervisor = null;\n }\n\n /**\n * Entrypoint: initializes handlers, launches Chrome or Browserbase,\n * and sets up a CDP context.\n */\n async init(): Promise<void> {\n try {\n return await withInstanceLogContext(this.instanceId, async () => {\n this.actHandler = new ActHandler(\n this.llmClient,\n this.modelName,\n this.modelClientOptions,\n (model) => this.resolveLlmClient(model),\n this.opts.systemPrompt ?? \"\",\n this.logInferenceToFile,\n this.opts.selfHeal ?? true,\n (\n functionName,\n promptTokens,\n completionTokens,\n reasoningTokens,\n cachedInputTokens,\n inferenceTimeMs,\n ) =>\n this.updateMetrics(\n functionName,\n promptTokens,\n completionTokens,\n reasoningTokens,\n cachedInputTokens,\n inferenceTimeMs,\n ),\n this.domSettleTimeoutMs,\n );\n this.extractHandler = new ExtractHandler(\n this.llmClient,\n this.modelName,\n this.modelClientOptions,\n (model) => this.resolveLlmClient(model),\n this.opts.systemPrompt ?? \"\",\n this.logInferenceToFile,\n this.experimental,\n (\n functionName,\n promptTokens,\n completionTokens,\n reasoningTokens,\n cachedInputTokens,\n inferenceTimeMs,\n ) =>\n this.updateMetrics(\n functionName,\n promptTokens,\n completionTokens,\n reasoningTokens,\n cachedInputTokens,\n inferenceTimeMs,\n ),\n );\n this.observeHandler = new ObserveHandler(\n this.llmClient,\n this.modelName,\n this.modelClientOptions,\n (model) => this.resolveLlmClient(model),\n this.opts.systemPrompt ?? \"\",\n this.logInferenceToFile,\n this.experimental,\n (\n functionName,\n promptTokens,\n completionTokens,\n reasoningTokens,\n cachedInputTokens,\n inferenceTimeMs,\n ) =>\n this.updateMetrics(\n functionName,\n promptTokens,\n completionTokens,\n reasoningTokens,\n cachedInputTokens,\n inferenceTimeMs,\n ),\n );\n if (this.opts.env === \"LOCAL\") {\n // chrome-launcher conditionally adds --headless when the environment variable\n // HEADLESS is set, without parsing its value.\n // if it is not equal to true, then we delete it from the process\n const envHeadless = process.env.HEADLESS;\n if (envHeadless !== undefined) {\n const normalized = envHeadless.trim().toLowerCase();\n if (normalized !== \"true\") {\n delete process.env.HEADLESS;\n }\n }\n const lbo: LocalBrowserLaunchOptions =\n this.opts.localBrowserLaunchOptions ?? {};\n\n // If a CDP URL is provided, attach instead of launching.\n if (lbo.cdpUrl) {\n this.logger({\n category: \"init\",\n message: \"Connecting to local browser\",\n level: 1,\n });\n this.ctx = await V3Context.create(lbo.cdpUrl, {\n env: \"LOCAL\",\n });\n const logCtx = SessionFileLogger.getContext();\n this.ctx.conn.cdpLogger = (info) =>\n SessionFileLogger.logCdpCallEvent(info, logCtx);\n this.ctx.conn.cdpEventLogger = (info) =>\n SessionFileLogger.logCdpMessageEvent(info, logCtx);\n this.ctx.conn.onTransportClosed(this._onCdpClosed);\n this.state = {\n kind: \"LOCAL\",\n // no LaunchedChrome when attaching externally; create a stub kill\n chrome: {\n kill: async () => {},\n } as unknown as import(\"chrome-launcher\").LaunchedChrome,\n ws: lbo.cdpUrl,\n };\n this.resetBrowserbaseSessionMetadata();\n // Post-connect settings (downloads and viewport) if provided\n await this._applyPostConnectLocalOptions(lbo);\n return;\n }\n this.logger({\n category: \"init\",\n message: \"Launching local browser\",\n level: 1,\n });\n\n // Determine or create user data dir\n let userDataDir = lbo.userDataDir;\n let createdTemp = false;\n if (!userDataDir) {\n const base = path.join(os.tmpdir(), \"stagehand-v3\");\n fs.mkdirSync(base, { recursive: true });\n userDataDir = fs.mkdtempSync(path.join(base, \"profile-\"));\n createdTemp = true;\n }\n\n // Build chrome flags\n const defaults = [\n \"--remote-allow-origins=*\",\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-dev-shm-usage\",\n \"--site-per-process\",\n ];\n let chromeFlags: string[] = [];\n const ignore = lbo.ignoreDefaultArgs;\n if (ignore === true) {\n // drop defaults\n chromeFlags = [];\n } else if (Array.isArray(ignore)) {\n chromeFlags = defaults.filter(\n (f) => !ignore.some((ex) => f.includes(ex)),\n );\n } else {\n chromeFlags = [...defaults];\n }\n\n // headless handled by launchLocalChrome\n if (lbo.devtools) chromeFlags.push(\"--auto-open-devtools-for-tabs\");\n if (lbo.locale) chromeFlags.push(`--lang=${lbo.locale}`);\n if (!lbo.viewport) {\n lbo.viewport = DEFAULT_VIEWPORT;\n }\n if (lbo.viewport?.width && lbo.viewport?.height) {\n chromeFlags.push(\n `--window-size=${lbo.viewport.width},${lbo.viewport.height + 87}`, // Added pixels to the window to account for the address bar\n );\n }\n if (typeof lbo.deviceScaleFactor === \"number\") {\n chromeFlags.push(\n `--force-device-scale-factor=${Math.max(0.1, lbo.deviceScaleFactor)}`,\n );\n }\n if (lbo.hasTouch) chromeFlags.push(\"--touch-events=enabled\");\n if (lbo.ignoreHTTPSErrors)\n chromeFlags.push(\"--ignore-certificate-errors\");\n if (lbo.proxy?.server)\n chromeFlags.push(`--proxy-server=${lbo.proxy.server}`);\n if (lbo.proxy?.bypass)\n chromeFlags.push(`--proxy-bypass-list=${lbo.proxy.bypass}`);\n\n // add user-supplied args last\n if (Array.isArray(lbo.args)) chromeFlags.push(...lbo.args);\n\n const keepAlive = this.keepAlive === true;\n const { ws, chrome } = await launchLocalChrome({\n chromePath: lbo.executablePath,\n chromeFlags,\n port: lbo.port,\n headless: lbo.headless,\n userDataDir,\n connectTimeoutMs: lbo.connectTimeoutMs,\n handleSIGINT: !keepAlive,\n });\n if (keepAlive) {\n try {\n chrome.process?.unref?.();\n } catch {\n // best-effort: avoid keeping the event loop alive\n }\n }\n this.ctx = await V3Context.create(ws, {\n env: \"LOCAL\",\n localBrowserLaunchOptions: lbo,\n });\n const logCtx = SessionFileLogger.getContext();\n this.ctx.conn.cdpLogger = (info) =>\n SessionFileLogger.logCdpCallEvent(info, logCtx);\n this.ctx.conn.cdpEventLogger = (info) =>\n SessionFileLogger.logCdpMessageEvent(info, logCtx);\n this.ctx.conn.onTransportClosed(this._onCdpClosed);\n this.state = {\n kind: \"LOCAL\",\n chrome,\n ws,\n userDataDir,\n createdTempProfile: createdTemp,\n preserveUserDataDir: !!lbo.preserveUserDataDir,\n };\n this.resetBrowserbaseSessionMetadata();\n const chromePid = chrome.process?.pid ?? chrome.pid;\n if (!keepAlive && chromePid) {\n this.startShutdownSupervisor({\n kind: \"LOCAL\",\n pid: chromePid,\n userDataDir,\n createdTempProfile: createdTemp,\n preserveUserDataDir: !!lbo.preserveUserDataDir,\n });\n }\n\n // Post-connect settings (downloads and viewport) if provided\n await this._applyPostConnectLocalOptions(lbo);\n return;\n }\n\n if (this.opts.env === \"BROWSERBASE\") {\n const { apiKey, projectId } = this.requireBrowserbaseCreds();\n if (!apiKey || !projectId) {\n throw new MissingEnvironmentVariableError(\n \"BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID\",\n \"Browserbase environment\",\n );\n }\n this.logger({\n category: \"init\",\n message: \"Starting browserbase session\",\n level: 1,\n });\n const baseSessionParams =\n this.opts.browserbaseSessionCreateParams ?? {};\n const resolvedKeepAlive = this.keepAlive;\n const keepAlive = this.keepAlive === true;\n const effectiveSessionParams =\n resolvedKeepAlive !== undefined\n ? { ...baseSessionParams, keepAlive: resolvedKeepAlive }\n : baseSessionParams;\n if (!this.disableAPI && !this.experimental) {\n this.apiClient = new StagehandAPIClient({\n apiKey,\n projectId,\n logger: this.logger,\n });\n const createSessionPayload = {\n projectId: effectiveSessionParams.projectId ?? projectId,\n ...effectiveSessionParams,\n browserSettings: {\n ...(effectiveSessionParams.browserSettings ?? {}),\n viewport: effectiveSessionParams.browserSettings?.viewport ?? {\n width: 1288,\n height: 711,\n },\n },\n userMetadata: {\n ...(effectiveSessionParams.userMetadata ?? {}),\n stagehand: \"true\",\n },\n };\n const { sessionId, available } = await this.apiClient.init({\n modelName: this.modelName,\n modelApiKey: this.modelClientOptions.apiKey,\n domSettleTimeoutMs: this.domSettleTimeoutMs,\n verbose: this.verbose,\n systemPrompt: this.opts.systemPrompt,\n selfHeal: this.opts.selfHeal,\n browserbaseSessionCreateParams: createSessionPayload,\n browserbaseSessionID: this.opts.browserbaseSessionID,\n });\n if (!available) {\n this.apiClient = null;\n }\n this.opts.browserbaseSessionID = sessionId;\n }\n const { ws, sessionId, bb } = await createBrowserbaseSession(\n apiKey,\n projectId,\n effectiveSessionParams,\n this.opts.browserbaseSessionID,\n );\n this.ctx = await V3Context.create(ws, {\n env: \"BROWSERBASE\",\n apiClient: this.apiClient,\n });\n const logCtx = SessionFileLogger.getContext();\n this.ctx.conn.cdpLogger = (info) =>\n SessionFileLogger.logCdpCallEvent(info, logCtx);\n this.ctx.conn.cdpEventLogger = (info) =>\n SessionFileLogger.logCdpMessageEvent(info, logCtx);\n this.ctx.conn.onTransportClosed(this._onCdpClosed);\n this.state = { kind: \"BROWSERBASE\", sessionId, ws, bb };\n this.browserbaseSessionId = sessionId;\n if (!keepAlive && !this.disableAPI) {\n this.startShutdownSupervisor({\n kind: \"STAGEHAND_API\",\n sessionId,\n apiKey,\n projectId,\n });\n }\n\n await this._ensureBrowserbaseDownloadsEnabled();\n\n const resumed = !!this.opts.browserbaseSessionID;\n let debugUrl: string | undefined;\n try {\n const dbg = (await bb.sessions.debug(sessionId)) as unknown as {\n debuggerUrl?: string;\n };\n debugUrl = dbg?.debuggerUrl;\n } catch {\n // Ignore debug fetch failures; continue with sessionUrl only\n }\n const sessionUrl = `https://www.browserbase.com/sessions/${sessionId}`;\n this.browserbaseSessionUrl = sessionUrl;\n this.browserbaseDebugUrl = debugUrl;\n\n try {\n this.logger({\n category: \"init\",\n message: resumed\n ? this.apiClient\n ? \"Browserbase session started\"\n : \"Browserbase session resumed\"\n : \"Browserbase session started\",\n level: 1,\n auxiliary: {\n sessionUrl: { value: sessionUrl, type: \"string\" },\n ...(debugUrl && {\n debugUrl: { value: debugUrl, type: \"string\" },\n }),\n sessionId: { value: sessionId, type: \"string\" },\n },\n });\n } catch {\n // best-effort logging \u2014 ignore failures\n }\n return;\n }\n\n const neverEnv: never = this.opts.env;\n throw new StagehandInitError(`Unsupported env: ${neverEnv}`);\n });\n } catch (error) {\n // Cleanup instanceLoggers map on init failure to prevent memory leak\n if (this.externalLogger) {\n try {\n unbindInstanceLogger(this.instanceId);\n } catch {\n // ignore cleanup errors\n }\n }\n throw error;\n }\n }\n\n /** Apply post-connect local browser options that require CDP. */\n private async _applyPostConnectLocalOptions(\n lbo: LocalBrowserLaunchOptions,\n ): Promise<void> {\n try {\n // Downloads behavior\n if (lbo.downloadsPath || lbo.acceptDownloads !== undefined) {\n const behavior = lbo.acceptDownloads === false ? \"deny\" : \"allow\";\n await this.ctx?.conn\n .send(\"Browser.setDownloadBehavior\", {\n behavior,\n downloadPath: lbo.downloadsPath,\n eventsEnabled: true,\n })\n .catch(() => {});\n }\n } catch {\n // best-effort only\n }\n }\n\n private async _ensureBrowserbaseDownloadsEnabled(): Promise<void> {\n const conn = this.ctx?.conn;\n if (!conn) return;\n try {\n await conn.send(\"Browser.setDownloadBehavior\", {\n behavior: \"allow\",\n downloadPath: \"downloads\",\n eventsEnabled: true,\n });\n } catch {\n // best-effort only\n }\n }\n\n private resetBrowserbaseSessionMetadata(): void {\n this.browserbaseSessionId = undefined;\n this.browserbaseSessionUrl = undefined;\n this.browserbaseDebugUrl = undefined;\n }\n\n /**\n * Run an \"act\" instruction through the ActHandler.\n *\n * New API:\n * - act(instruction: string, options?: ActOptions)\n * - act(action: Action, options?: ActOptions)\n */\n async act(instruction: string, options?: ActOptions): Promise<ActResult>;\n async act(action: Action, options?: ActOptions): Promise<ActResult>;\n\n @logStagehandStep(\"Stagehand.act\", \"ACT\")\n async act(input: string | Action, options?: ActOptions): Promise<ActResult> {\n return await withInstanceLogContext(this.instanceId, async () => {\n if (!this.actHandler) throw new StagehandNotInitializedError(\"act()\");\n\n let actResult: ActResult;\n\n if (isObserveResult(input)) {\n // Resolve page: use provided page if any, otherwise default active page\n const v3Page = await this.resolvePage(options?.page);\n\n // Use selector as provided to support XPath, CSS, and other engines\n const selector = input.selector;\n if (this.apiClient) {\n actResult = await this.apiClient.act({\n input,\n options,\n frameId: v3Page.mainFrameId(),\n });\n } else {\n const effectiveTimeoutMs =\n typeof options?.timeout === \"number\" && options.timeout > 0\n ? options.timeout\n : undefined;\n const ensureTimeRemaining = createTimeoutGuard(\n effectiveTimeoutMs,\n (ms) => new ActTimeoutError(ms),\n );\n actResult = await this.actHandler.takeDeterministicAction(\n { ...input, selector },\n v3Page,\n this.domSettleTimeoutMs,\n this.resolveLlmClient(options?.model),\n ensureTimeRemaining,\n options?.variables,\n );\n }\n\n // history: record ObserveResult-based act call\n this.addToHistory(\n \"act\",\n {\n observeResult: input,\n },\n actResult,\n );\n return actResult;\n }\n // instruction path\n if (typeof input !== \"string\" || !input.trim()) {\n throw new StagehandInvalidArgumentError(\n \"act(): instruction string is required unless passing an Action\",\n );\n }\n\n // Resolve page from options or default\n const page = await this.resolvePage(options?.page);\n const actCacheLlmClient = options?.model\n ? this.resolveLlmClient(options.model)\n : undefined;\n\n let actCacheContext: Awaited<\n ReturnType<typeof this.actCache.prepareContext>\n > | null = null;\n const canUseCache =\n typeof input === \"string\" &&\n !this.isAgentReplayRecording() &&\n this.actCache.enabled;\n if (canUseCache) {\n actCacheContext = await this.actCache.prepareContext(\n input,\n page,\n options?.variables,\n );\n if (actCacheContext) {\n const cachedResult = await this.actCache.tryReplay(\n actCacheContext,\n page,\n options?.timeout,\n actCacheLlmClient,\n );\n if (cachedResult) {\n this.addToHistory(\n \"act\",\n {\n instruction: input,\n variables: options?.variables,\n timeout: options?.timeout,\n cacheHit: true,\n },\n cachedResult,\n );\n return cachedResult;\n }\n }\n }\n\n const handlerParams: ActHandlerParams = {\n instruction: input,\n page,\n variables: options?.variables,\n timeout: options?.timeout,\n model: options?.model,\n };\n if (this.apiClient) {\n const frameId = page.mainFrameId();\n actResult = await this.apiClient.act({ input, options, frameId });\n } else {\n actResult = await this.actHandler.act(handlerParams);\n }\n // history: record instruction-based act call (omit page object)\n this.addToHistory(\n \"act\",\n {\n instruction: input,\n variables: options?.variables,\n timeout: options?.timeout,\n },\n actResult,\n );\n\n if (\n actCacheContext &&\n actResult.success &&\n Array.isArray(actResult.actions) &&\n actResult.actions.length > 0\n ) {\n await this.actCache.store(actCacheContext, actResult);\n }\n return actResult;\n });\n }\n\n /**\n * Run an \"extract\" instruction through the ExtractHandler.\n *\n * Accepted forms:\n * - extract() \u2192 pageText\n * - extract(options) \u2192 pageText\n * - extract(instruction) \u2192 defaultExtractSchema\n * - extract(instruction, schema) \u2192 schema-inferred\n * - extract(instruction, schema, options)\n */\n\n async extract(): Promise<z.infer<typeof pageTextSchema>>;\n async extract(\n options: ExtractOptions,\n ): Promise<z.infer<typeof pageTextSchema>>;\n async extract(\n instruction: string,\n options?: ExtractOptions,\n ): Promise<z.infer<typeof defaultExtractSchema>>;\n async extract<T extends StagehandZodSchema>(\n instruction: string,\n schema: T,\n options?: ExtractOptions,\n ): Promise<InferStagehandSchema<T>>;\n\n @logStagehandStep(\"Stagehand.extract\", \"EXTRACT\")\n async extract(\n a?: string | ExtractOptions,\n b?: StagehandZodSchema | ExtractOptions,\n c?: ExtractOptions,\n ): Promise<unknown> {\n return await withInstanceLogContext(this.instanceId, async () => {\n if (!this.extractHandler) {\n throw new StagehandNotInitializedError(\"extract()\");\n }\n\n // Normalize args\n let instruction: string | undefined;\n let schema: StagehandZodSchema | undefined;\n let options: ExtractOptions | undefined;\n\n if (typeof a === \"string\") {\n instruction = a;\n const isZodSchema = (val: unknown): val is StagehandZodSchema =>\n !!val &&\n typeof val === \"object\" &&\n \"parse\" in val &&\n \"safeParse\" in val;\n if (isZodSchema(b)) {\n schema = b as StagehandZodSchema;\n options = c as ExtractOptions | undefined;\n } else {\n options = b as ExtractOptions | undefined;\n }\n } else {\n // a is options or undefined\n options = (a as ExtractOptions) || undefined;\n }\n\n if (!instruction && schema) {\n throw new StagehandInvalidArgumentError(\n \"extract(): schema provided without instruction\",\n );\n }\n\n // If instruction without schema \u2192 defaultExtractSchema\n const effectiveSchema =\n instruction && !schema ? defaultExtractSchema : schema;\n\n // Resolve page from options or use active page\n const page = await this.resolvePage(options?.page);\n\n const handlerParams: ExtractHandlerParams<StagehandZodSchema> = {\n instruction,\n schema: effectiveSchema as StagehandZodSchema | undefined,\n model: options?.model,\n timeout: options?.timeout,\n selector: options?.selector,\n page,\n };\n let result: z.infer<typeof effectiveSchema> | { pageText: string };\n if (this.apiClient) {\n const frameId = page.mainFrameId();\n result = await this.apiClient.extract({\n instruction: handlerParams.instruction,\n schema: handlerParams.schema,\n options,\n frameId,\n });\n } else {\n result =\n await this.extractHandler.extract<StagehandZodSchema>(handlerParams);\n }\n const historySchemaDescriptor = effectiveSchema\n ? toJsonSchema(effectiveSchema)\n : undefined;\n this.addToHistory(\n \"extract\",\n {\n instruction,\n selector: options?.selector,\n timeout: options?.timeout,\n schema: historySchemaDescriptor,\n },\n result,\n );\n return result;\n });\n }\n\n /**\n * Run an \"observe\" instruction through the ObserveHandler.\n */\n async observe(): Promise<Action[]>;\n async observe(options: ObserveOptions): Promise<Action[]>;\n async observe(\n instruction: string,\n options?: ObserveOptions,\n ): Promise<Action[]>;\n @logStagehandStep(\"Stagehand.observe\", \"OBSERVE\")\n async observe(\n a?: string | ObserveOptions,\n b?: ObserveOptions,\n ): Promise<Action[]> {\n return await withInstanceLogContext(this.instanceId, async () => {\n if (!this.observeHandler) {\n throw new StagehandNotInitializedError(\"observe()\");\n }\n\n // Normalize args\n let instruction: string | undefined;\n let options: ObserveOptions | undefined;\n if (typeof a === \"string\") {\n instruction = a;\n options = b;\n } else {\n options = a as ObserveOptions | undefined;\n }\n\n // Resolve to our internal Page type\n const page = await this.resolvePage(options?.page);\n\n const handlerParams: ObserveHandlerParams = {\n instruction,\n model: options?.model,\n timeout: options?.timeout,\n selector: options?.selector,\n page: page!,\n };\n\n let results: Action[];\n if (this.apiClient) {\n const frameId = page.mainFrameId();\n results = await this.apiClient.observe({\n instruction,\n options,\n frameId,\n });\n } else {\n results = await this.observeHandler.observe(handlerParams);\n }\n\n // history: record observe call (omit page object)\n this.addToHistory(\n \"observe\",\n {\n instruction,\n timeout: options?.timeout,\n },\n results,\n );\n return results;\n });\n }\n\n /** Return the browser-level CDP WebSocket endpoint. */\n connectURL(): string {\n if (this.state.kind === \"UNINITIALIZED\") {\n throw new StagehandNotInitializedError(\"connectURL()\");\n }\n return this.state.ws;\n }\n\n /** Expose the current CDP-backed context. */\n public get context(): V3Context {\n return this.ctx;\n }\n\n /** Best-effort cleanup of context and launched resources. */\n async close(opts?: { force?: boolean }): Promise<void> {\n // If we're already closing and this isn't a forced close, no-op.\n if (this._isClosing && !opts?.force) return;\n this._isClosing = true;\n\n const keepAlive = this.keepAlive === true;\n\n // End Browserbase session via API when keepAlive is not enabled\n if (!keepAlive && this.apiClient) {\n try {\n await this.apiClient.end();\n } catch {\n // best-effort cleanup\n }\n }\n\n try {\n // Close session file logger\n try {\n await SessionFileLogger.close();\n } catch {\n // ignore\n }\n\n // Unhook CDP transport close handler\n try {\n if (this.ctx?.conn && this._onCdpClosed) {\n this.ctx.conn.offTransportClosed?.(this._onCdpClosed);\n }\n } catch {\n // ignore\n }\n\n // Close CDP context\n try {\n await this.ctx?.close();\n } catch {\n // ignore\n }\n\n // Kill local Chrome and clean up temp profile when keepAlive is not enabled\n if (!keepAlive && this.state.kind === \"LOCAL\") {\n const localState = this.state;\n await cleanupLocalBrowser({\n killChrome: () => localState.chrome.kill(),\n userDataDir: localState.userDataDir,\n createdTempProfile: localState.createdTempProfile,\n preserveUserDataDir: localState.preserveUserDataDir,\n });\n }\n } finally {\n this.stopShutdownSupervisor();\n\n // Reset internal state\n this.state = { kind: \"UNINITIALIZED\" };\n this.ctx = null;\n this._isClosing = false;\n this.resetBrowserbaseSessionMetadata();\n try {\n unbindInstanceLogger(this.instanceId);\n } catch {\n // ignore\n }\n try {\n this.bus.removeAllListeners();\n } catch {\n // ignore\n }\n this._history = [];\n this.actHandler = null;\n this.extractHandler = null;\n this.observeHandler = null;\n V3._instances.delete(this);\n }\n }\n\n /** Guard: ensure Browserbase credentials exist in options. */\n private requireBrowserbaseCreds(): { apiKey: string; projectId: string } {\n let { apiKey, projectId } = this.opts;\n\n // Fall back to environment variables if not explicitly provided\n if (!apiKey)\n apiKey = process.env.BROWSERBASE_API_KEY ?? process.env.BB_API_KEY;\n if (!projectId)\n projectId =\n process.env.BROWSERBASE_PROJECT_ID ?? process.env.BB_PROJECT_ID;\n\n if (!apiKey || !projectId) {\n const missing: string[] = [];\n if (!apiKey) missing.push(\"BROWSERBASE_API_KEY\");\n if (!projectId) missing.push(\"BROWSERBASE_PROJECT_ID\");\n throw new MissingEnvironmentVariableError(\n missing.join(\", \"),\n \"Browserbase\",\n );\n }\n\n // Cache resolved values back into opts for consistency\n this.opts.apiKey = apiKey;\n this.opts.projectId = projectId;\n\n // Informational log\n this.logger({\n category: \"init\",\n message: \"Using Browserbase credentials\",\n level: 1,\n });\n\n return { apiKey, projectId };\n }\n\n public get logger(): (logLine: LogLine) => void {\n // Delegate to per-instance StagehandLogger\n // StagehandLogger handles: verbosity filtering, usePino selection, external logger routing\n // This provides per-instance configuration while maintaining shared Pino optimization\n return (logLine: LogLine) => {\n const line = { ...logLine, level: logLine.level ?? 1 };\n this.stagehandLogger.log(line);\n };\n }\n\n /**\n * Normalize a Playwright/Puppeteer page object into its top frame id,\n * so handlers can resolve it to a `Page` within our V3Context.\n */\n private async resolveTopFrameId(\n page: PlaywrightPage | PuppeteerPage | PatchrightPage,\n ): Promise<string> {\n if (this.isPlaywrightPage(page)) {\n const cdp = await page.context().newCDPSession(page);\n const { frameTree } = await cdp.send(\"Page.getFrameTree\");\n return frameTree.frame.id;\n }\n\n if (this.isPatchrightPage(page)) {\n const cdp = await page.context().newCDPSession(page);\n const { frameTree } = await cdp.send(\"Page.getFrameTree\");\n return frameTree.frame.id;\n }\n\n if (this.isPuppeteerPage(page)) {\n const cdp = await page.createCDPSession();\n const { frameTree } = await cdp.send(\"Page.getFrameTree\");\n this.logger({\n category: \"v3\",\n message: \"Puppeteer frame id\",\n level: 2,\n auxiliary: { frameId: { value: frameTree.frame.id, type: \"string\" } },\n });\n return frameTree.frame.id;\n }\n\n throw new StagehandInvalidArgumentError(\n \"Unsupported page object passed to V3.act()\",\n );\n }\n\n private isPlaywrightPage(p: unknown): p is PlaywrightPage {\n return (\n typeof p === \"object\" &&\n p !== null &&\n typeof (p as PlaywrightPage).context === \"function\"\n );\n }\n\n private isPatchrightPage(p: unknown): p is PatchrightPage {\n return (\n typeof p === \"object\" &&\n p !== null &&\n typeof (p as PatchrightPage).context === \"function\"\n );\n }\n\n private isPuppeteerPage(p: unknown): p is PuppeteerPage {\n return (\n typeof p === \"object\" &&\n p !== null &&\n typeof (p as PuppeteerPage).target === \"function\"\n );\n }\n\n /** Resolve an external page reference or fall back to the active V3 page. */\n private async resolvePage(page?: AnyPage): Promise<Page> {\n if (page) {\n return await this.normalizeToV3Page(page);\n }\n const ctx = this.ctx;\n if (!ctx) {\n throw new StagehandNotInitializedError(\"resolvePage()\");\n }\n return await ctx.awaitActivePage();\n }\n\n private async normalizeToV3Page(input: AnyPage): Promise<Page> {\n if (input instanceof (await import(\"./understudy/page.js\")).Page) {\n return input as Page;\n }\n if (this.isPlaywrightPage(input)) {\n const frameId = await this.resolveTopFrameId(input);\n const page = this.ctx!.resolvePageByMainFrameId(frameId);\n if (!page)\n throw new StagehandInitError(\n \"Failed to resolve V3 Page from Playwright page.\",\n );\n return page;\n }\n if (this.isPatchrightPage(input)) {\n const frameId = await this.resolveTopFrameId(input);\n const page = this.ctx!.resolvePageByMainFrameId(frameId);\n if (!page)\n throw new StagehandInitError(\n \"Failed to resolve V3 Page from Patchright page.\",\n );\n return page;\n }\n if (this.isPuppeteerPage(input)) {\n const frameId = await this.resolveTopFrameId(input);\n const page = this.ctx!.resolvePageByMainFrameId(frameId);\n if (!page)\n throw new StagehandInitError(\n \"Failed to resolve V3 Page from Puppeteer page.\",\n );\n return page;\n }\n throw new StagehandInvalidArgumentError(\"Unsupported page object.\");\n }\n\n private async _logBrowserbaseSessionStatus(): Promise<void> {\n if (this.state.kind !== \"BROWSERBASE\") {\n return;\n }\n\n try {\n const snapshot = (await this.state.bb.sessions.retrieve(\n this.state.sessionId,\n )) as { id?: string; status?: string };\n if (!snapshot?.status) return;\n\n const sessionId = snapshot.id ?? this.state.sessionId;\n const message =\n snapshot.status === \"TIMED_OUT\"\n ? `Browserbase session timed out (sessionId: ${sessionId})`\n : `Browserbase session status: ${snapshot.status}`;\n\n this.logger({\n category: \"v3\",\n message,\n level: 0,\n });\n } catch {\n // Ignore failures; nothing to log\n }\n }\n\n /**\n * Prepares shared context for agent execution (both execute and stream).\n * Extracts duplicated setup logic into a single helper.\n */\n private async prepareAgentExecution(\n options: AgentConfig | undefined,\n instructionOrOptions:\n | string\n | AgentExecuteOptions\n | AgentStreamExecuteOptions,\n agentConfigSignature: string,\n ): Promise<{\n handler: V3AgentHandler;\n resolvedOptions: AgentExecuteOptions | AgentStreamExecuteOptions;\n instruction: string;\n cacheContext: AgentCacheContext | null;\n llmClient: LLMClient;\n }> {\n // Note: experimental validation is done at the call site before this method\n // Warn if mode is not explicitly set (defaults to \"dom\")\n if (options?.mode === undefined) {\n this.logger({\n category: \"agent\",\n message:\n \"Using agent in default DOM mode (legacy). Agent will default to 'hybrid' on an upcoming release for improved performance.\\n \u2192 https://docs.stagehand.dev/v3/basics/agent\\n\",\n level: 0,\n });\n }\n\n const tools = options?.integrations\n ? await resolveTools(options.integrations, options.tools)\n : (options?.tools ?? {});\n\n const agentLlmClient = options?.model\n ? this.resolveLlmClient(options.model)\n : this.llmClient;\n\n const handler = new V3AgentHandler(\n this,\n this.logger,\n agentLlmClient,\n typeof options?.executionModel === \"string\"\n ? options.executionModel\n : options?.executionModel?.modelName,\n options?.systemPrompt,\n tools,\n options?.mode,\n );\n\n const resolvedOptions: AgentExecuteOptions | AgentStreamExecuteOptions =\n typeof instructionOrOptions === \"string\"\n ? { instruction: instructionOrOptions }\n : instructionOrOptions;\n\n const callbacksWithSafety = resolvedOptions.callbacks as\n | AgentExecuteCallbacks\n | undefined;\n if (callbacksWithSafety?.onSafetyConfirmation) {\n throw new StagehandInvalidArgumentError(\n 'onSafetyConfirmation callback is only supported when using mode: \"cua\" agents.',\n );\n }\n\n if (resolvedOptions.page) {\n const normalizedPage = await this.normalizeToV3Page(resolvedOptions.page);\n this.ctx!.setActivePage(normalizedPage);\n }\n\n const instruction = resolvedOptions.instruction.trim();\n const sanitizedOptions =\n this.agentCache.sanitizeExecuteOptions(resolvedOptions);\n\n const cacheContext = this.agentCache.shouldAttemptCache(instruction)\n ? await this.agentCache.prepareContext({\n instruction,\n options: sanitizedOptions,\n configSignature: agentConfigSignature,\n page: await this.ctx!.awaitActivePage(),\n })\n : null;\n\n return {\n handler,\n resolvedOptions,\n instruction,\n cacheContext,\n llmClient: agentLlmClient,\n };\n }\n\n /**\n * Create a v3 agent instance (AISDK tool-based) with execute().\n * Mirrors the v2 Stagehand.agent() tool mode (no CUA provider here).\n *\n * @overload When stream: true, returns a streaming agent where execute() returns AgentStreamResult\n * @overload When stream is false/undefined, returns a non-streaming agent where execute() returns AgentResult\n */\n agent(options: AgentConfig & { stream: true }): {\n execute: (\n instructionOrOptions: string | AgentStreamExecuteOptions,\n ) => Promise<AgentStreamResult>;\n };\n agent(options?: AgentConfig & { stream?: false }): {\n execute: (\n instructionOrOptions: string | AgentExecuteOptions,\n ) => Promise<AgentResult>;\n };\n agent(options?: AgentConfig): {\n execute: (\n instructionOrOptions:\n | string\n | AgentExecuteOptions\n | AgentStreamExecuteOptions,\n ) => Promise<AgentResult | AgentStreamResult>;\n } {\n // Determine if CUA mode is enabled (via mode: \"cua\" or deprecated cua: true)\n const isCuaMode =\n options?.mode !== undefined\n ? options.mode === \"cua\"\n : options?.cua === true;\n\n // Emit deprecation warning for cua: true\n if (options?.cua === true) {\n this.logger({\n category: \"agent\",\n message:\n '[DEPRECATED] The \"cua: true\" option is deprecated. Use \"mode: \\'cua\\'\" instead. This option will be removed in a future version.',\n level: 0,\n });\n console.warn(\n '[Stagehand] DEPRECATED: The \"cua: true\" option is deprecated. Use \"mode: \\'cua\\'\" instead.',\n );\n }\n\n this.logger({\n category: \"agent\",\n message: \"Creating v3 agent instance\",\n level: 1,\n auxiliary: {\n cua: { value: isCuaMode ? \"true\" : \"false\", type: \"boolean\" },\n mode: { value: options?.mode ?? \"dom\", type: \"string\" },\n model: options?.model\n ? typeof options?.model === \"string\"\n ? { value: options.model, type: \"string\" }\n : { value: options.model.modelName, type: \"string\" }\n : { value: this.llmClient.modelName, type: \"string\" },\n systemPrompt: { value: options?.systemPrompt ?? \"\", type: \"string\" },\n tools: { value: JSON.stringify(options?.tools ?? {}), type: \"object\" },\n ...(options?.integrations && {\n integrations: {\n value: JSON.stringify(options.integrations),\n type: \"object\",\n },\n }),\n },\n });\n\n // If CUA mode is enabled (via mode: \"cua\" or deprecated cua: true), use the computer-use agent path\n if (isCuaMode) {\n // Validate agent config at creation time (includes CUA+streaming conflict check)\n validateExperimentalFeatures({\n isExperimental: this.experimental,\n agentConfig: options,\n });\n\n const modelToUse = options?.model || {\n modelName: this.modelName,\n ...this.modelClientOptions,\n };\n\n const { modelName, isCua, clientOptions } = resolveModel(modelToUse);\n\n if (!isCua) {\n throw new CuaModelRequiredError(AVAILABLE_CUA_MODELS);\n }\n\n const agentConfigSignature =\n this.agentCache.buildConfigSignature(options);\n return {\n execute: async (instructionOrOptions: string | AgentExecuteOptions) =>\n withInstanceLogContext(this.instanceId, async () => {\n validateExperimentalFeatures({\n isExperimental: this.experimental,\n agentConfig: options,\n executeOptions:\n typeof instructionOrOptions === \"object\"\n ? instructionOrOptions\n : null,\n });\n\n SessionFileLogger.logAgentTaskStarted({\n invocation: \"Agent.execute\",\n args: [instructionOrOptions],\n });\n const tools = options?.integrations\n ? await resolveTools(options.integrations, options.tools)\n : (options?.tools ?? {});\n\n const handler = new V3CuaAgentHandler(\n this,\n this.logger,\n {\n modelName,\n clientOptions,\n userProvidedInstructions:\n options.systemPrompt ??\n `You are a helpful assistant that can use a web browser.\\nDo not ask follow up questions, the user will trust your judgement.`,\n },\n tools,\n );\n\n const resolvedOptions: AgentExecuteOptions =\n typeof instructionOrOptions === \"string\"\n ? { instruction: instructionOrOptions }\n : instructionOrOptions;\n if (resolvedOptions.page) {\n const normalizedPage = await this.normalizeToV3Page(\n resolvedOptions.page,\n );\n this.ctx!.setActivePage(normalizedPage);\n }\n const instruction = resolvedOptions.instruction.trim();\n const sanitizedOptions =\n this.agentCache.sanitizeExecuteOptions(resolvedOptions);\n\n let cacheContext: AgentCacheContext | null = null;\n if (this.agentCache.shouldAttemptCache(instruction)) {\n const startPage = await this.ctx!.awaitActivePage();\n cacheContext = await this.agentCache.prepareContext({\n instruction,\n options: sanitizedOptions,\n configSignature: agentConfigSignature,\n page: startPage,\n });\n if (cacheContext) {\n const replayed = await this.agentCache.tryReplay(cacheContext);\n if (replayed) {\n SessionFileLogger.logAgentTaskCompleted({ cacheHit: true });\n return replayed;\n }\n }\n }\n\n let agentSteps: AgentReplayStep[] = [];\n const shouldRecordLocally =\n !!cacheContext && (!this.apiClient || this.experimental);\n if (shouldRecordLocally) {\n this.beginAgentReplayRecording();\n }\n\n let result: AgentResult;\n try {\n if (this.apiClient && !this.experimental) {\n const page = await this.ctx!.awaitActivePage();\n result = await this.apiClient.agentExecute(\n options,\n resolvedOptions,\n page.mainFrameId(),\n !!cacheContext,\n );\n if (cacheContext) {\n const transferredEntry =\n this.apiClient.consumeLatestAgentCacheEntry();\n await this.agentCache.storeTransferredEntry(transferredEntry);\n }\n } else {\n result = await handler.execute(instructionOrOptions);\n }\n if (shouldRecordLocally) {\n agentSteps = this.endAgentReplayRecording();\n }\n\n if (\n shouldRecordLocally &&\n cacheContext &&\n result.success &&\n agentSteps.length > 0\n ) {\n await this.agentCache.store(cacheContext, agentSteps, result);\n }\n\n return result;\n } catch (err) {\n if (shouldRecordLocally) this.discardAgentReplayRecording();\n throw err;\n } finally {\n if (shouldRecordLocally) {\n this.discardAgentReplayRecording();\n }\n SessionFileLogger.logAgentTaskCompleted();\n }\n }),\n };\n }\n\n // Default: AISDK tools-based agent\n const agentConfigSignature = this.agentCache.buildConfigSignature(options);\n const isStreaming = options?.stream ?? false;\n\n return {\n execute: async (\n instructionOrOptions:\n | string\n | AgentExecuteOptions\n | AgentStreamExecuteOptions,\n ): Promise<AgentResult | AgentStreamResult> =>\n withInstanceLogContext(this.instanceId, async () => {\n validateExperimentalFeatures({\n isExperimental: this.experimental,\n agentConfig: options,\n executeOptions:\n typeof instructionOrOptions === \"object\"\n ? instructionOrOptions\n : null,\n isStreaming,\n });\n SessionFileLogger.logAgentTaskStarted({\n invocation: \"Agent.execute\",\n args: [instructionOrOptions],\n });\n\n // Streaming mode\n if (isStreaming) {\n const { handler, resolvedOptions, cacheContext, llmClient } =\n await this.prepareAgentExecution(\n options,\n instructionOrOptions,\n agentConfigSignature,\n );\n\n if (cacheContext) {\n const replayed = await this.agentCache.tryReplayAsStream(\n cacheContext,\n llmClient,\n );\n if (replayed) {\n SessionFileLogger.logAgentTaskCompleted({ cacheHit: true });\n return replayed;\n }\n }\n\n const streamResult = await handler.stream(\n resolvedOptions as AgentStreamExecuteOptions,\n );\n\n if (cacheContext) {\n const wrappedStream = this.agentCache.wrapStreamForCaching(\n cacheContext,\n streamResult,\n () => this.beginAgentReplayRecording(),\n () => this.endAgentReplayRecording(),\n () => this.discardAgentReplayRecording(),\n );\n // Log completion when stream is returned (stream completes asynchronously)\n SessionFileLogger.logAgentTaskCompleted();\n return wrappedStream;\n }\n\n // Log completion when stream is returned (stream completes asynchronously)\n SessionFileLogger.logAgentTaskCompleted();\n return streamResult;\n }\n\n // Non-streaming mode (default)\n const { handler, resolvedOptions, cacheContext, llmClient } =\n await this.prepareAgentExecution(\n options,\n instructionOrOptions,\n agentConfigSignature,\n );\n\n if (cacheContext) {\n const replayed = await this.agentCache.tryReplay(\n cacheContext,\n llmClient,\n );\n if (replayed) {\n SessionFileLogger.logAgentTaskCompleted({ cacheHit: true });\n return replayed;\n }\n }\n\n let agentSteps: AgentReplayStep[] = [];\n const shouldRecordLocally =\n !!cacheContext && (!this.apiClient || this.experimental);\n if (shouldRecordLocally) {\n this.beginAgentReplayRecording();\n }\n let result: AgentResult;\n\n try {\n if (this.apiClient && !this.experimental) {\n const page = await this.ctx!.awaitActivePage();\n result = await this.apiClient.agentExecute(\n options ?? {},\n resolvedOptions as AgentExecuteOptions,\n page.mainFrameId(),\n !!cacheContext,\n );\n if (cacheContext) {\n const transferredEntry =\n this.apiClient.consumeLatestAgentCacheEntry();\n await this.agentCache.storeTransferredEntry(transferredEntry);\n }\n } else {\n result = await handler.execute(\n resolvedOptions as AgentExecuteOptions,\n );\n }\n if (shouldRecordLocally) {\n agentSteps = this.endAgentReplayRecording();\n }\n\n if (\n shouldRecordLocally &&\n cacheContext &&\n result.success &&\n agentSteps.length > 0\n ) {\n await this.agentCache.store(cacheContext, agentSteps, result);\n }\n\n return result;\n } catch (err) {\n if (shouldRecordLocally) this.discardAgentReplayRecording();\n throw err;\n } finally {\n if (shouldRecordLocally) {\n this.discardAgentReplayRecording();\n }\n SessionFileLogger.logAgentTaskCompleted();\n }\n }),\n };\n }\n}\n\nfunction isObserveResult(v: unknown): v is Action {\n return (\n !!v && typeof v === \"object\" && \"selector\" in (v as Record<string, unknown>)\n );\n}\n", "import pino from \"pino\";\nimport { LogLine } from \"./v3/types/public/logs.js\";\n\n// Map our existing levels to Pino's standard levels\nconst levelMapping: Record<number, pino.Level> = {\n 0: \"error\", // Critical/important messages\n 1: \"info\", // Standard information\n 2: \"debug\", // Detailed debugging information\n};\n\n// Define configuration options\nexport interface LoggerOptions {\n pretty?: boolean;\n level?: pino.Level;\n destination?: pino.DestinationStream;\n usePino?: boolean; // Whether to use pino (default: true)\n}\n\n/**\n * Creates a configured Pino logger instance\n */\nexport function createLogger(options: LoggerOptions = {}) {\n const loggerConfig: pino.LoggerOptions = {\n level: options.level || \"info\",\n base: undefined, // Don't include pid and hostname\n browser: {\n asObject: true,\n },\n // Disable worker threads to avoid issues in tests\n transport: undefined,\n };\n\n // Add pretty printing for dev environments only if explicitly requested\n // and not in a test environment\n if (options.pretty && !isTestEnvironment()) {\n try {\n // Use require for dynamic import\n const transport = {\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"SYS:standard\",\n ignore: \"pid,hostname\",\n },\n },\n };\n Object.assign(loggerConfig, transport);\n } catch {\n console.warn(\n \"pino-pretty not available, falling back to standard logging\",\n );\n }\n }\n\n return pino(loggerConfig, options.destination);\n}\n\n/**\n * Check if we're running in a test environment\n */\nfunction isTestEnvironment(): boolean {\n return (\n process.env.NODE_ENV === \"test\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.PLAYWRIGHT_TEST_BASE_DIR !== undefined ||\n // Check if we're in a CI environment\n process.env.CI === \"true\"\n );\n}\n\n/**\n * StagehandLogger class that wraps Pino for our specific needs\n *\n * LOGGING PRECEDENCE:\n *\n * Test environments:\n * - External logger provided -> external logger only.\n * - No external logger -> console fallback only (Pino disabled).\n *\n * Non-test environments:\n * - usePino === true -> emit via Pino and also call the external logger when present.\n * - usePino === false -> disable Pino; use the external logger when present, otherwise console fallback.\n * - usePino === undefined -> prefer the external logger when present; otherwise use Pino.\n *\n * SHARED PINO OPTIMIZATION:\n * We maintain a single shared Pino instance when `usePino` is enabled.\n * This prevents spawning a new worker thread for every Stagehand instance\n * (which happens when `pino-pretty` transport is used), eliminating the\n * memory/RSS growth observed when many Stagehand objects are created and\n * disposed within the same process (e.g. a request-per-instance API).\n */\nexport class StagehandLogger {\n /**\n * Shared Pino logger instance across all StagehandLogger instances.\n * First instance to enable Pino creates it, subsequent instances reuse it.\n */\n private static sharedPinoLogger: pino.Logger | null = null;\n\n private logger?: pino.Logger;\n private verbose: 0 | 1 | 2;\n private externalLogger?: (logLine: LogLine) => void;\n private usePino: boolean;\n private isTest: boolean;\n\n constructor(\n options: LoggerOptions = {},\n externalLogger?: (logLine: LogLine) => void,\n ) {\n this.isTest = isTestEnvironment();\n this.externalLogger = externalLogger;\n\n const externalProvided = typeof externalLogger === \"function\";\n const explicitUsePino = options.usePino;\n\n if (this.isTest) {\n this.usePino = false;\n } else if (explicitUsePino === true) {\n this.usePino = true;\n } else if (explicitUsePino === false) {\n this.usePino = false;\n } else {\n this.usePino = !externalProvided;\n }\n\n if (this.usePino) {\n // Re-use (or create) a single shared Pino logger instance\n if (!StagehandLogger.sharedPinoLogger) {\n StagehandLogger.sharedPinoLogger = createLogger(options);\n }\n this.logger = StagehandLogger.sharedPinoLogger;\n }\n\n this.verbose = 1; // Default verbosity level\n }\n\n /**\n * Set the verbosity level\n */\n setVerbosity(level: 0 | 1 | 2) {\n this.verbose = level;\n\n if (this.usePino && this.logger) {\n // Map our verbosity levels to Pino log levels\n switch (level) {\n case 0:\n this.logger.level = \"error\";\n break;\n case 1:\n this.logger.level = \"info\";\n break;\n case 2:\n this.logger.level = \"debug\";\n break;\n }\n }\n }\n\n /**\n * Log a message using our LogLine format\n */\n log(logLine: LogLine): void {\n // Skip logs above verbosity level\n if ((logLine.level ?? 1) > this.verbose) {\n return;\n }\n\n // For test environments WITHOUT an external logger OR for cases where Pino\n // is disabled and no external logger is provided, fall back to console.* so\n // users still see logs (non-colourised).\n const shouldFallbackToConsole =\n (!this.usePino && !this.externalLogger) ||\n (this.isTest && !this.externalLogger);\n\n if (shouldFallbackToConsole) {\n const level = logLine.level ?? 1;\n const ts = logLine.timestamp ?? new Date().toISOString();\n const levelStr = level === 0 ? \"ERROR\" : level === 2 ? \"DEBUG\" : \"INFO\";\n\n // Format like Pino: [timestamp] LEVEL: message\n let output = `[${ts}] ${levelStr}: ${logLine.message}`;\n\n // Add auxiliary data on separate indented lines (like Pino pretty format)\n if (logLine.auxiliary) {\n const formattedData = this.formatAuxiliaryData(logLine.auxiliary);\n for (const [key, value] of Object.entries(formattedData)) {\n let formattedValue: string;\n if (typeof value === \"object\" && value !== null) {\n // Pretty print objects with indentation\n formattedValue = JSON.stringify(value, null, 2)\n .split(\"\\n\")\n .map((line, i) => (i === 0 ? line : ` ${line}`))\n .join(\"\\n\");\n } else {\n formattedValue = String(value);\n }\n output += `\\n ${key}: ${formattedValue}`;\n }\n }\n\n switch (level) {\n case 0:\n console.error(output);\n break;\n case 1:\n console.log(output);\n break;\n case 2:\n console.debug(output);\n break;\n }\n\n return; // already handled via console output, avoid duplicate logging\n }\n\n if (this.usePino && this.logger) {\n // Determine the Pino log level\n const pinoLevel = levelMapping[logLine.level ?? 1] || \"info\";\n\n // Structure the log data\n const logData = {\n category: logLine.category,\n timestamp: logLine.timestamp || new Date().toISOString(),\n ...this.formatAuxiliaryData(logLine.auxiliary),\n };\n\n // Log through Pino with the appropriate level\n if (pinoLevel === \"error\") {\n this.logger.error(logData, logLine.message);\n } else if (pinoLevel === \"info\") {\n this.logger.info(logData, logLine.message);\n } else if (pinoLevel === \"debug\") {\n this.logger.debug(logData, logLine.message);\n } else if (pinoLevel === \"warn\") {\n this.logger.warn(logData, logLine.message);\n } else if (pinoLevel === \"trace\") {\n this.logger.trace(logData, logLine.message);\n } else {\n this.logger.info(logData, logLine.message);\n }\n }\n\n // IMPORTANT: External logger receives logs ALWAYS when provided (takes precedence)\n // This ensures user-provided loggers (e.g., EvalLogger, custom loggers) capture all logs\n // regardless of Pino configuration. Pino is used for console output, external logger\n // is used for programmatic log capture.\n if (this.externalLogger) {\n this.externalLogger(logLine);\n }\n }\n\n /**\n * Helper to format auxiliary data for structured logging\n */\n private formatAuxiliaryData(auxiliary?: LogLine[\"auxiliary\"]) {\n if (!auxiliary) return {};\n\n const formattedData: Record<string, unknown> = {};\n\n for (const [key, { value, type }] of Object.entries(auxiliary)) {\n let formattedValue: unknown;\n\n // Convert values based on their type\n switch (type) {\n case \"integer\":\n formattedValue = parseInt(value, 10);\n break;\n case \"float\":\n formattedValue = parseFloat(value);\n break;\n case \"boolean\":\n formattedValue = value === \"true\";\n break;\n case \"object\":\n try {\n formattedValue = JSON.parse(value);\n } catch {\n formattedValue = value;\n }\n break;\n default:\n formattedValue = value;\n }\n\n // Skip undefined values and empty objects/arrays\n if (formattedValue === undefined) continue;\n if (typeof formattedValue === \"object\" && formattedValue !== null) {\n const isEmpty = Array.isArray(formattedValue)\n ? formattedValue.length === 0\n : Object.keys(formattedValue).length === 0;\n if (isEmpty) continue;\n }\n\n formattedData[key] = formattedValue;\n }\n\n return formattedData;\n }\n\n /**\n * Convenience methods for different log levels\n */\n error(message: string, data?: Record<string, unknown>): void {\n this.log({\n message,\n level: 0,\n auxiliary: this.convertToAuxiliary(data),\n });\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n this.log({\n message,\n level: 1,\n category: \"warning\",\n auxiliary: this.convertToAuxiliary(data),\n });\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n this.log({\n message,\n level: 1,\n auxiliary: this.convertToAuxiliary(data),\n });\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n this.log({\n message,\n level: 2,\n auxiliary: this.convertToAuxiliary(data),\n });\n }\n\n /**\n * Convert a plain object to our auxiliary format\n */\n private convertToAuxiliary(\n data?: Record<string, unknown>,\n ): LogLine[\"auxiliary\"] {\n if (!data) return undefined;\n\n const auxiliary: LogLine[\"auxiliary\"] = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n\n const type = typeof value;\n\n auxiliary[key] = {\n value: type === \"object\" ? JSON.stringify(value) : String(value),\n type:\n type === \"number\"\n ? Number.isInteger(value)\n ? \"integer\"\n : \"float\"\n : type === \"boolean\"\n ? \"boolean\"\n : type === \"object\"\n ? \"object\"\n : \"string\",\n };\n }\n\n return auxiliary;\n }\n}\n", "import { createHash } from \"crypto\";\nimport type { ActHandler } from \"../handlers/actHandler.js\";\nimport type { LLMClient } from \"../llm/LLMClient.js\";\nimport type { Action, ActResult, Logger } from \"../types/public/index.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport { CacheStorage } from \"./CacheStorage.js\";\nimport { safeGetPageUrl, waitForCachedSelector } from \"./utils.js\";\nimport {\n ActCacheContext,\n ActCacheDeps,\n CachedActEntry,\n} from \"../types/private/index.js\";\nimport { StagehandNotInitializedError } from \"../types/public/sdkErrors.js\";\n\nexport class ActCache {\n private readonly storage: CacheStorage;\n private readonly logger: Logger;\n private readonly getActHandler: () => ActHandler | null;\n private readonly getDefaultLlmClient: () => LLMClient;\n private readonly domSettleTimeoutMs?: number;\n\n constructor({\n storage,\n logger,\n getActHandler,\n getDefaultLlmClient,\n domSettleTimeoutMs,\n }: ActCacheDeps) {\n this.storage = storage;\n this.logger = logger;\n this.getActHandler = getActHandler;\n this.getDefaultLlmClient = getDefaultLlmClient;\n this.domSettleTimeoutMs = domSettleTimeoutMs;\n }\n\n get enabled(): boolean {\n return this.storage.enabled;\n }\n\n async prepareContext(\n instruction: string,\n page: Page,\n variables?: Record<string, string>,\n ): Promise<ActCacheContext | null> {\n if (!this.enabled) return null;\n const sanitizedInstruction = instruction.trim();\n const sanitizedVariables = variables ? { ...variables } : undefined;\n const variableKeys = sanitizedVariables\n ? Object.keys(sanitizedVariables).sort()\n : [];\n const pageUrl = await safeGetPageUrl(page);\n const cacheKey = this.buildActCacheKey(\n sanitizedInstruction,\n pageUrl,\n variableKeys,\n );\n return {\n instruction: sanitizedInstruction,\n cacheKey,\n pageUrl,\n variableKeys,\n variables: sanitizedVariables,\n };\n }\n\n async tryReplay(\n context: ActCacheContext,\n page: Page,\n timeout?: number,\n llmClientOverride?: LLMClient,\n ): Promise<ActResult | null> {\n if (!this.enabled) return null;\n\n const {\n value: entry,\n error,\n path,\n } = await this.storage.readJson<CachedActEntry>(`${context.cacheKey}.json`);\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: `failed to read act cache entry: ${path}`,\n level: 2,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return null;\n }\n if (!entry) return null;\n if (entry.version !== 1) return null;\n if (!Array.isArray(entry.actions) || entry.actions.length === 0) {\n return null;\n }\n\n const entryVariableKeys = Array.isArray(entry.variableKeys)\n ? [...entry.variableKeys].sort()\n : [];\n const contextVariableKeys = [...context.variableKeys];\n\n if (!this.doVariableKeysMatch(entryVariableKeys, contextVariableKeys)) {\n return null;\n }\n\n if (\n contextVariableKeys.length > 0 &&\n (!context.variables ||\n !this.hasAllVariableValues(contextVariableKeys, context.variables))\n ) {\n this.logger({\n category: \"cache\",\n message: \"act cache miss: missing variables for replay\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n },\n });\n return null;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache hit\",\n level: 1,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: {\n value: entry.url ?? context.pageUrl,\n type: \"string\",\n },\n },\n });\n\n return await this.replayCachedActions(\n context,\n entry,\n page,\n timeout,\n llmClientOverride,\n );\n }\n\n async store(context: ActCacheContext, result: ActResult): Promise<void> {\n if (!this.enabled) return;\n\n const entry: CachedActEntry = {\n version: 1,\n instruction: context.instruction,\n url: context.pageUrl,\n variableKeys: context.variableKeys,\n actions: result.actions ?? [],\n actionDescription: result.actionDescription,\n message: result.message,\n };\n\n const { error, path } = await this.storage.writeJson(\n `${context.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to write act cache entry\",\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache stored\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.pageUrl, type: \"string\" },\n },\n });\n }\n\n private buildActCacheKey(\n instruction: string,\n url: string,\n variableKeys: string[],\n ): string {\n const payload = JSON.stringify({\n instruction,\n url,\n variableKeys,\n });\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n }\n\n private async replayCachedActions(\n context: ActCacheContext,\n entry: CachedActEntry,\n page: Page,\n timeout?: number,\n llmClientOverride?: LLMClient,\n ): Promise<ActResult> {\n const handler = this.getActHandler();\n if (!handler) {\n throw new StagehandNotInitializedError(\"act()\");\n }\n const effectiveClient = llmClientOverride ?? this.getDefaultLlmClient();\n\n const execute = async (): Promise<ActResult> => {\n const actionResults: ActResult[] = [];\n for (const action of entry.actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"act\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n effectiveClient,\n undefined,\n context.variables,\n );\n actionResults.push(result);\n if (!result.success) {\n break;\n }\n }\n\n if (actionResults.length === 0) {\n return {\n success: false,\n message: \"Failed to perform act: cached entry has no actions\",\n actionDescription: entry.actionDescription ?? entry.instruction,\n actions: [],\n };\n }\n\n const success = actionResults.every((r) => r.success);\n const actions = actionResults.flatMap((r) => r.actions ?? []);\n const message =\n actionResults\n .map((r) => r.message)\n .filter((m) => m && m.trim().length > 0)\n .join(\" \u2192 \") ||\n entry.message ||\n `Replayed ${entry.actions.length} cached action${\n entry.actions.length === 1 ? \"\" : \"s\"\n }.`;\n const actionDescription =\n entry.actionDescription ||\n actionResults[actionResults.length - 1]?.actionDescription ||\n entry.actions[entry.actions.length - 1]?.description ||\n entry.instruction;\n\n if (\n success &&\n actions.length > 0 &&\n this.haveActionsChanged(entry.actions, actions)\n ) {\n await this.refreshCacheEntry(context, {\n ...entry,\n actions,\n message,\n actionDescription,\n });\n }\n return {\n success,\n message,\n actionDescription,\n actions,\n };\n };\n\n return await this.runWithTimeout(execute, timeout);\n }\n\n private haveActionsChanged(original: Action[], updated: Action[]): boolean {\n if (original.length !== updated.length) {\n return true;\n }\n\n for (let i = 0; i < original.length; i += 1) {\n const orig = original[i];\n const next = updated[i];\n if (!next) {\n return true;\n }\n\n if (orig.selector !== next.selector) {\n return true;\n }\n\n if (orig.description !== next.description) {\n return true;\n }\n\n if ((orig.method ?? \"\") !== (next.method ?? \"\")) {\n return true;\n }\n\n const origArgs = orig.arguments ?? [];\n const nextArgs = next.arguments ?? [];\n if (origArgs.length !== nextArgs.length) {\n return true;\n }\n\n for (let j = 0; j < origArgs.length; j += 1) {\n if (origArgs[j] !== nextArgs[j]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private async refreshCacheEntry(\n context: ActCacheContext,\n entry: CachedActEntry,\n ): Promise<void> {\n const { error, path } = await this.storage.writeJson(\n `${context.cacheKey}.json`,\n {\n ...entry,\n variableKeys: context.variableKeys,\n },\n );\n\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to update act cache entry after self-heal\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache entry updated after self-heal\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.pageUrl, type: \"string\" },\n },\n });\n }\n\n private doVariableKeysMatch(\n entryKeys: string[],\n contextKeys: string[],\n ): boolean {\n if (entryKeys.length !== contextKeys.length) {\n return false;\n }\n\n for (let i = 0; i < entryKeys.length; i += 1) {\n if (entryKeys[i] !== contextKeys[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n private hasAllVariableValues(\n variableKeys: string[],\n variables: Record<string, string>,\n ): boolean {\n for (const key of variableKeys) {\n if (!(key in variables)) {\n return false;\n }\n }\n return true;\n }\n\n private async runWithTimeout<T>(\n run: () => Promise<T>,\n timeout?: number,\n ): Promise<T> {\n if (!timeout) {\n return await run();\n }\n\n return await new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`act() timed out after ${timeout}ms`));\n }, timeout);\n\n void run().then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n }\n}\n", "import type { Logger } from \"../types/public/index.js\";\nimport { Page } from \"../understudy/page.js\";\n\nconst DEFAULT_WAIT_TIMEOUT_MS = 15000;\n\nexport function cloneForCache<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nexport async function safeGetPageUrl(page: Page): Promise<string> {\n try {\n return page.url();\n } catch {\n return \"\";\n }\n}\n\n/**\n * Waits for a cached action's selector to be attached to the DOM before executing.\n * Logs a warning and proceeds if the wait times out (non-blocking).\n */\nexport async function waitForCachedSelector(params: {\n page: Page;\n selector: string | undefined;\n timeout: number | undefined;\n logger: Logger;\n context?: string;\n}): Promise<void> {\n const { page, selector, timeout, logger, context } = params;\n if (!selector) return;\n\n try {\n await page.waitForSelector(selector, {\n state: \"attached\",\n timeout: timeout ?? DEFAULT_WAIT_TIMEOUT_MS,\n });\n } catch (err) {\n logger({\n category: \"cache\",\n message: `waitForSelector failed for ${context ?? \"cached\"} action selector, proceeding anyway`,\n level: 2,\n auxiliary: {\n selector: { value: selector, type: \"string\" },\n error: { value: String(err), type: \"string\" },\n },\n });\n }\n}\n", "import { createHash } from \"crypto\";\nimport type { ActHandler } from \"../handlers/actHandler.js\";\nimport type { LLMClient } from \"../llm/LLMClient.js\";\nimport type {\n AgentReplayActStep,\n AgentReplayFillFormStep,\n AgentReplayGotoStep,\n AgentReplayKeysStep,\n AgentReplayNavBackStep,\n AgentReplayScrollStep,\n AgentReplayStep,\n AgentReplayWaitStep,\n CachedAgentEntry,\n SanitizedAgentExecuteOptions,\n ActFn,\n AgentCacheContext,\n AgentCacheDeps,\n AgentCacheTransferPayload,\n} from \"../types/private/index.js\";\nimport type {\n Action,\n AgentResult,\n AgentStreamResult,\n AgentConfig,\n AgentExecuteOptionsBase,\n AvailableModel,\n Logger,\n} from \"../types/public/index.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport type { V3Context } from \"../understudy/context.js\";\nimport { CacheStorage } from \"./CacheStorage.js\";\nimport {\n cloneForCache,\n safeGetPageUrl,\n waitForCachedSelector,\n} from \"./utils.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"apikey\", \"api_key\", \"api-key\"]);\n\nexport class AgentCache {\n private readonly storage: CacheStorage;\n private readonly logger: Logger;\n private readonly getActHandler: () => ActHandler | null;\n private readonly getContext: () => V3Context | null;\n private readonly getDefaultLlmClient: () => LLMClient;\n private readonly getBaseModelName: () => AvailableModel;\n private readonly getSystemPrompt: () => string | undefined;\n private readonly domSettleTimeoutMs?: number;\n private readonly act: ActFn;\n private readonly bufferLatestEntry: boolean;\n\n private recording: AgentReplayStep[] | null = null;\n private latestEntry: AgentCacheTransferPayload | null = null;\n\n constructor({\n storage,\n logger,\n getActHandler,\n getContext,\n getDefaultLlmClient,\n getBaseModelName,\n getSystemPrompt,\n domSettleTimeoutMs,\n act,\n bufferLatestEntry,\n }: AgentCacheDeps) {\n this.storage = storage;\n this.logger = logger;\n this.getActHandler = getActHandler;\n this.getContext = getContext;\n this.getDefaultLlmClient = getDefaultLlmClient;\n this.getBaseModelName = getBaseModelName;\n this.getSystemPrompt = getSystemPrompt;\n this.domSettleTimeoutMs = domSettleTimeoutMs;\n this.act = act;\n this.bufferLatestEntry = bufferLatestEntry ?? false;\n }\n\n get enabled(): boolean {\n return this.storage.enabled;\n }\n\n shouldAttemptCache(instruction: string): boolean {\n return this.enabled && instruction.trim().length > 0;\n }\n\n sanitizeExecuteOptions(\n options?: AgentExecuteOptionsBase,\n ): SanitizedAgentExecuteOptions {\n if (!options) return {};\n const sanitized: SanitizedAgentExecuteOptions = {};\n if (typeof options.maxSteps === \"number\") {\n sanitized.maxSteps = options.maxSteps;\n }\n if (\n \"highlightCursor\" in options &&\n typeof (options as { highlightCursor?: unknown }).highlightCursor ===\n \"boolean\"\n ) {\n sanitized.highlightCursor = (\n options as { highlightCursor?: boolean }\n ).highlightCursor;\n }\n return sanitized;\n }\n\n buildConfigSignature(agentOptions?: AgentConfig): string {\n const toolKeys = agentOptions?.tools\n ? Object.keys(agentOptions.tools).sort()\n : undefined;\n const integrationSignatures = agentOptions?.integrations\n ? agentOptions.integrations.map((integration) =>\n typeof integration === \"string\" ? integration : \"client\",\n )\n : undefined;\n const serializedModel = this.serializeAgentModelForCache(\n agentOptions?.model,\n );\n const serializedExecutionModel = this.serializeAgentModelForCache(\n agentOptions?.executionModel,\n );\n\n const isCuaMode =\n agentOptions?.mode !== undefined\n ? agentOptions.mode === \"cua\"\n : agentOptions?.cua === true;\n\n return JSON.stringify({\n v3Model: this.getBaseModelName(),\n systemPrompt: this.getSystemPrompt() ?? \"\",\n agent: {\n cua: isCuaMode,\n model: serializedModel ?? null,\n executionModel: isCuaMode ? null : serializedExecutionModel,\n systemPrompt: agentOptions?.systemPrompt ?? null,\n toolKeys,\n integrations: integrationSignatures,\n },\n });\n }\n\n async prepareContext(params: {\n instruction: string;\n options: SanitizedAgentExecuteOptions;\n configSignature: string;\n page: Page;\n }): Promise<AgentCacheContext | null> {\n if (!this.shouldAttemptCache(params.instruction)) {\n return null;\n }\n const instruction = params.instruction.trim();\n const startUrl = await safeGetPageUrl(params.page);\n const cacheKey = this.buildAgentCacheKey(\n instruction,\n startUrl,\n params.options,\n params.configSignature,\n );\n return {\n instruction,\n startUrl,\n options: params.options,\n configSignature: params.configSignature,\n cacheKey,\n };\n }\n\n async tryReplay(\n context: AgentCacheContext,\n llmClientOverride?: LLMClient,\n ): Promise<AgentResult | null> {\n if (!this.enabled) return null;\n\n const {\n value: entry,\n error,\n path,\n } = await this.storage.readJson<CachedAgentEntry>(\n `agent-${context.cacheKey}.json`,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: `failed to read agent cache entry: ${path}`,\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return null;\n }\n if (!entry || entry.version !== 1) {\n return null;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache hit\",\n level: 1,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.startUrl, type: \"string\" },\n },\n });\n\n return await this.replayAgentCacheEntry(context, entry, llmClientOverride);\n }\n\n /**\n * Attempts to replay a cached agent execution and returns it as a stream result.\n *\n * This method exists because the agent API exposes two execution modes:\n * - `execute()` - Returns a Promise<AgentResult> directly\n * - `stream()` - Returns an AgentStreamResult with async iterables for real-time output\n *\n * When a cache hit occurs, we need to return the appropriate type for each mode:\n * - For `execute()`, we use `tryReplay()` which returns AgentResult\n * - For `stream()`, we use `tryReplayAsStream()` which wraps the result in a\n * stream-compatible interface\n *\n * This ensures consumers using `stream()` can still iterate over `textStream`\n * and await `result` even when the response comes from cache, maintaining\n * API consistency regardless of whether the result was cached or live.\n */\n async tryReplayAsStream(\n context: AgentCacheContext,\n llmClientOverride?: LLMClient,\n ): Promise<AgentStreamResult | null> {\n const result = await this.tryReplay(context, llmClientOverride);\n if (!result) return null;\n return this.createCachedStreamResult(result);\n }\n\n /**\n * Creates a mock AgentStreamResult that wraps a cached AgentResult.\n *\n * AgentStreamResult (from the AI SDK) is a complex type with multiple async\n * iterables and promises. When serving from cache, we don't have an actual\n * LLM stream to consume - we just have the final result. This method creates\n * a \"fake\" stream\n\n * This approach lets cached responses be transparent to the consumer -\n * they can use the same iteration patterns whether the result is live or cached.\n */\n private createCachedStreamResult(\n cachedResult: AgentResult,\n ): AgentStreamResult {\n const message = cachedResult.message ?? \"\";\n\n async function* textStreamGenerator(): AsyncGenerator<string> {\n yield message;\n }\n\n async function* fullStreamGenerator(): AsyncGenerator<{\n type: string;\n textDelta?: string;\n }> {\n yield { type: \"text-delta\", textDelta: message };\n yield { type: \"finish\" };\n }\n\n const mockStreamResult = {\n textStream: textStreamGenerator(),\n fullStream: fullStreamGenerator(),\n result: Promise.resolve(cachedResult),\n text: Promise.resolve(message),\n usage: Promise.resolve({\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n }),\n finishReason: Promise.resolve(\"stop\" as const),\n experimental_providerMetadata: Promise.resolve(undefined),\n response: Promise.resolve({\n id: \"cached\",\n timestamp: new Date(),\n modelId: \"cached\",\n }),\n rawResponse: Promise.resolve({ headers: {} }),\n warnings: Promise.resolve([]),\n steps: Promise.resolve([]),\n toolCalls: Promise.resolve([]),\n toolResults: Promise.resolve([]),\n [Symbol.asyncIterator]: () => textStreamGenerator(),\n } as unknown as AgentStreamResult;\n\n return mockStreamResult;\n }\n\n /**\n * Wraps an AgentStreamResult with caching logic.\n *\n * This method handles the complexity of caching for streaming responses:\n * 1. Begins recording agent replay steps\n * 2. Wraps the stream's result promise to capture completion\n * 3. On success: ends recording and stores the cache entry\n * 4. On error: discards the recording\n *\n * This keeps the caching orchestration in AgentCache rather than\n * spreading it across the V3 class.\n *\n * @param context - The cache context for this execution\n * @param streamResult - The stream result from the agent handler\n * @param beginRecording - Callback to start recording (from V3)\n * @param endRecording - Callback to end recording and get steps (from V3)\n * @param discardRecording - Callback to discard recording on error (from V3)\n * @returns The wrapped stream result with caching enabled\n */\n wrapStreamForCaching(\n context: AgentCacheContext,\n streamResult: AgentStreamResult,\n beginRecording: () => void,\n endRecording: () => AgentReplayStep[],\n discardRecording: () => void,\n ): AgentStreamResult {\n beginRecording();\n\n const originalResultPromise = streamResult.result;\n const wrappedResultPromise = originalResultPromise.then(\n async (result) => {\n const agentSteps = endRecording();\n\n if (result.success && agentSteps.length > 0) {\n await this.store(context, agentSteps, result);\n }\n\n return result;\n },\n (error) => {\n discardRecording();\n throw error;\n },\n );\n\n streamResult.result = wrappedResultPromise;\n return streamResult;\n }\n\n async store(\n context: AgentCacheContext,\n steps: AgentReplayStep[],\n result: AgentResult,\n ): Promise<void> {\n if (!this.enabled) return;\n\n const entry: CachedAgentEntry = {\n version: 1,\n instruction: context.instruction,\n startUrl: context.startUrl,\n options: context.options,\n configSignature: context.configSignature,\n steps: cloneForCache(steps),\n result: this.pruneAgentResult(result),\n timestamp: new Date().toISOString(),\n };\n\n const { error, path } = await this.storage.writeJson(\n `agent-${context.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to write agent cache entry\",\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache stored\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n steps: { value: String(steps.length), type: \"string\" },\n },\n });\n\n if (this.bufferLatestEntry) {\n this.latestEntry = {\n cacheKey: context.cacheKey,\n entry: cloneForCache(entry),\n };\n }\n }\n\n consumeBufferedEntry(): AgentCacheTransferPayload | null {\n if (!this.bufferLatestEntry || !this.latestEntry) {\n return null;\n }\n\n const payload = this.latestEntry;\n this.latestEntry = null;\n return payload;\n }\n\n async storeTransferredEntry(\n payload: AgentCacheTransferPayload | null,\n ): Promise<void> {\n if (!this.enabled || !payload) return;\n\n const entry = cloneForCache(payload.entry);\n const { error, path } = await this.storage.writeJson(\n `agent-${payload.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to import remote agent cache entry\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache imported from server\",\n level: 2,\n auxiliary: {\n instruction: { value: entry.instruction, type: \"string\" },\n steps: { value: String(entry.steps?.length ?? 0), type: \"string\" },\n },\n });\n }\n\n /**\n * Clone the agent result and prune bulky fields (e.g. screenshot base64 blobs)\n * before persisting it to disk. This keeps cache entries compact without\n * mutating the live AgentResult returned to callers.\n */\n private pruneAgentResult(result: AgentResult): AgentResult {\n const cloned = cloneForCache(result);\n if (!Array.isArray(cloned.actions)) {\n return cloned;\n }\n\n for (const action of cloned.actions) {\n if (action?.type === \"screenshot\") {\n delete action.base64;\n }\n }\n\n return cloned;\n }\n\n beginRecording(): void {\n this.recording = [];\n }\n\n endRecording(): AgentReplayStep[] {\n if (!this.recording) return [];\n const steps = cloneForCache(this.recording);\n this.recording = null;\n return steps;\n }\n\n discardRecording(): void {\n this.recording = null;\n }\n\n isRecording(): boolean {\n return Array.isArray(this.recording);\n }\n\n recordStep(step: AgentReplayStep): void {\n if (!this.isRecording()) return;\n try {\n this.recording!.push(cloneForCache(step));\n } catch (err) {\n this.logger({\n category: \"cache\",\n message: \"failed to record agent replay step\",\n level: 2,\n auxiliary: {\n error: { value: String(err), type: \"string\" },\n },\n });\n }\n }\n\n isReplayActive(): boolean {\n return this.isRecording();\n }\n\n private serializeAgentModelForCache(\n model?: AgentConfig[\"model\"],\n ): null | string | { modelName: string; options?: Record<string, unknown> } {\n if (!model) return null;\n if (typeof model === \"string\") return model;\n\n const { modelName, ...modelOptions } = model;\n const sanitizedOptions =\n Object.keys(modelOptions).length > 0\n ? this.sanitizeModelOptionsForCache(\n modelOptions as Record<string, unknown>,\n )\n : undefined;\n return sanitizedOptions\n ? { modelName, options: sanitizedOptions }\n : modelName;\n }\n\n private buildAgentCacheKey(\n instruction: string,\n startUrl: string,\n options: SanitizedAgentExecuteOptions,\n configSignature: string,\n ): string {\n const payload = {\n instruction,\n startUrl,\n options,\n configSignature,\n };\n return createHash(\"sha256\").update(JSON.stringify(payload)).digest(\"hex\");\n }\n\n private sanitizeModelOptionsForCache(\n value: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n const sanitizedEntries: Record<string, unknown> = {};\n for (const [key, rawValue] of Object.entries(value)) {\n if (SENSITIVE_CONFIG_KEYS.has(key.toLowerCase())) {\n continue;\n }\n\n const sanitizedValue = this.sanitizeModelValueForCache(rawValue);\n if (sanitizedValue !== undefined) {\n sanitizedEntries[key] = sanitizedValue;\n }\n }\n\n return Object.keys(sanitizedEntries).length > 0\n ? sanitizedEntries\n : undefined;\n }\n\n private sanitizeModelValueForCache(value: unknown): unknown {\n if (Array.isArray(value)) {\n const sanitizedArray = value\n .map((item) => this.sanitizeModelValueForCache(item))\n .filter((item) => item !== undefined);\n return sanitizedArray;\n }\n\n if (value && typeof value === \"object\") {\n return this.sanitizeModelOptionsForCache(\n value as Record<string, unknown>,\n );\n }\n\n return value;\n }\n\n private async replayAgentCacheEntry(\n context: AgentCacheContext,\n entry: CachedAgentEntry,\n llmClientOverride?: LLMClient,\n ): Promise<AgentResult | null> {\n const ctx = this.getContext();\n const handler = this.getActHandler();\n if (!ctx || !handler) return null;\n const effectiveClient = llmClientOverride ?? this.getDefaultLlmClient();\n try {\n const updatedSteps: AgentReplayStep[] = [];\n let stepsChanged = false;\n for (const step of entry.steps ?? []) {\n const replayedStep =\n (await this.executeAgentReplayStep(\n step,\n ctx,\n handler,\n effectiveClient,\n )) ?? step;\n stepsChanged ||= replayedStep !== step;\n updatedSteps.push(replayedStep);\n }\n const result = cloneForCache(entry.result);\n result.usage = {\n input_tokens: 0,\n output_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n inference_time_ms: 0,\n };\n result.metadata = {\n ...(result.metadata ?? {}),\n cacheHit: true,\n cacheTimestamp: entry.timestamp,\n };\n if (stepsChanged) {\n await this.refreshAgentCacheEntry(context, entry, updatedSteps);\n }\n return result;\n } catch (err) {\n this.logger({\n category: \"cache\",\n message: \"agent cache replay failed\",\n level: 1,\n auxiliary: {\n error: { value: String(err), type: \"string\" },\n },\n });\n return null;\n }\n }\n\n private async executeAgentReplayStep(\n step: AgentReplayStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n ): Promise<AgentReplayStep> {\n switch (step.type) {\n case \"act\":\n return await this.replayAgentActStep(\n step as AgentReplayActStep,\n ctx,\n handler,\n llmClient,\n );\n case \"fillForm\":\n return await this.replayAgentFillFormStep(\n step as AgentReplayFillFormStep,\n ctx,\n handler,\n llmClient,\n );\n case \"goto\":\n await this.replayAgentGotoStep(step as AgentReplayGotoStep, ctx);\n return step;\n case \"scroll\":\n await this.replayAgentScrollStep(step as AgentReplayScrollStep, ctx);\n return step;\n case \"wait\":\n await this.replayAgentWaitStep(step as AgentReplayWaitStep);\n return step;\n case \"navback\":\n await this.replayAgentNavBackStep(step as AgentReplayNavBackStep, ctx);\n return step;\n case \"keys\":\n await this.replayAgentKeysStep(step as AgentReplayKeysStep, ctx);\n return step;\n case \"done\":\n case \"extract\":\n case \"screenshot\":\n case \"ariaTree\":\n return step;\n default:\n this.logger({\n category: \"cache\",\n message: `agent cache skipping step type: ${step.type}`,\n level: 2,\n });\n return step;\n }\n }\n\n private async replayAgentActStep(\n step: AgentReplayActStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n ): Promise<AgentReplayActStep> {\n const actions = Array.isArray(step.actions) ? step.actions : [];\n if (actions.length > 0) {\n const page = await ctx.awaitActivePage();\n const updatedActions: Action[] = [];\n for (const action of actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"agent act\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n llmClient,\n );\n if (result.success && Array.isArray(result.actions)) {\n updatedActions.push(...cloneForCache(result.actions));\n } else {\n updatedActions.push(cloneForCache(action));\n }\n }\n if (this.haveActionsChanged(actions, updatedActions)) {\n return { ...step, actions: updatedActions };\n }\n return step;\n }\n await this.act(step.instruction, { timeout: step.timeout });\n return step;\n }\n\n private async replayAgentFillFormStep(\n step: AgentReplayFillFormStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n ): Promise<AgentReplayFillFormStep> {\n const actions =\n Array.isArray(step.actions) && step.actions.length > 0\n ? step.actions\n : (step.observeResults ?? []);\n if (!Array.isArray(actions) || actions.length === 0) {\n return step;\n }\n const page = await ctx.awaitActivePage();\n const updatedActions: Action[] = [];\n for (const action of actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"fillForm\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n llmClient,\n );\n if (result.success && Array.isArray(result.actions)) {\n updatedActions.push(...cloneForCache(result.actions));\n } else {\n updatedActions.push(cloneForCache(action));\n }\n }\n if (this.haveActionsChanged(actions, updatedActions)) {\n return { ...step, actions: updatedActions };\n }\n return step;\n }\n\n private async replayAgentGotoStep(\n step: AgentReplayGotoStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n await page.goto(step.url, { waitUntil: step.waitUntil ?? \"load\" });\n }\n\n private async replayAgentScrollStep(\n step: AgentReplayScrollStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n let anchor = step.anchor;\n if (!anchor) {\n anchor = await page\n .mainFrame()\n .evaluate<{ x: number; y: number }>(() => ({\n x: Math.max(0, Math.floor(window.innerWidth / 2)),\n y: Math.max(0, Math.floor(window.innerHeight / 2)),\n }));\n }\n const deltaX = step.deltaX ?? 0;\n const deltaY = step.deltaY ?? 0;\n await page.scroll(\n Math.round(anchor.x ?? 0),\n Math.round(anchor.y ?? 0),\n deltaX,\n deltaY,\n );\n }\n\n private async replayAgentWaitStep(step: AgentReplayWaitStep): Promise<void> {\n if (!step.timeMs || step.timeMs <= 0) return;\n await new Promise((resolve) => setTimeout(resolve, step.timeMs));\n }\n\n private async replayAgentNavBackStep(\n step: AgentReplayNavBackStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n await page.goBack({ waitUntil: step.waitUntil ?? \"domcontentloaded\" });\n }\n\n private async replayAgentKeysStep(\n step: AgentReplayKeysStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n const { method, text, keys, times } = step.playwrightArguments;\n const repeatCount = Math.max(1, times ?? 1);\n\n if (method === \"type\" && text) {\n for (let i = 0; i < repeatCount; i++) {\n await page.type(text, { delay: 100 });\n }\n } else if (method === \"press\" && keys) {\n for (let i = 0; i < repeatCount; i++) {\n await page.keyPress(keys, { delay: 100 });\n }\n }\n }\n\n private haveActionsChanged(original: Action[], updated: Action[]): boolean {\n if (original.length !== updated.length) {\n return true;\n }\n for (let i = 0; i < original.length; i += 1) {\n const orig = original[i];\n const next = updated[i];\n if (!orig || !next) {\n return true;\n }\n if (orig.selector !== next.selector) {\n return true;\n }\n if ((orig.description ?? \"\") !== (next.description ?? \"\")) {\n return true;\n }\n if ((orig.method ?? \"\") !== (next.method ?? \"\")) {\n return true;\n }\n const origArgs = Array.isArray(orig.arguments) ? orig.arguments : [];\n const nextArgs = Array.isArray(next.arguments) ? next.arguments : [];\n if (origArgs.length !== nextArgs.length) {\n return true;\n }\n for (let j = 0; j < origArgs.length; j += 1) {\n if (origArgs[j] !== nextArgs[j]) {\n return true;\n }\n }\n }\n return false;\n }\n\n private async refreshAgentCacheEntry(\n context: AgentCacheContext,\n entry: CachedAgentEntry,\n updatedSteps: AgentReplayStep[],\n ): Promise<void> {\n const updatedEntry: CachedAgentEntry = {\n ...entry,\n steps: cloneForCache(updatedSteps),\n timestamp: new Date().toISOString(),\n };\n const { error, path } = await this.storage.writeJson(\n `agent-${context.cacheKey}.json`,\n updatedEntry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to update agent cache entry after self-heal\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n this.logger({\n category: \"cache\",\n message: \"agent cache entry updated after self-heal\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n steps: { value: String(updatedSteps.length), type: \"string\" },\n },\n });\n }\n}\n", "import fs from \"fs\";\nimport path from \"path\";\nimport type { Logger } from \"../types/public/index.js\";\nimport { ReadJsonResult, WriteJsonResult } from \"../types/private/index.js\";\n\nconst jsonClone = <T>(value: T): T => {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) {\n return value;\n }\n return JSON.parse(serialized) as T;\n};\n\nexport class CacheStorage {\n private constructor(\n private readonly logger: Logger,\n private readonly dir?: string,\n private readonly memoryStore?: Map<string, unknown>,\n ) {}\n\n static create(\n cacheDir: string | undefined,\n logger: Logger,\n options?: { label?: string },\n ): CacheStorage {\n if (!cacheDir) {\n return new CacheStorage(logger);\n }\n\n const resolved = path.resolve(cacheDir);\n try {\n fs.mkdirSync(resolved, { recursive: true });\n return new CacheStorage(logger, resolved);\n } catch (err) {\n const label = options?.label ?? \"cache directory\";\n logger({\n category: \"cache\",\n message: `unable to initialize ${label}: ${resolved}`,\n level: 1,\n auxiliary: {\n error: { value: String(err), type: \"string\" },\n },\n });\n return new CacheStorage(logger);\n }\n }\n\n static createMemory(logger: Logger): CacheStorage {\n return new CacheStorage(logger, undefined, new Map());\n }\n\n get directory(): string | undefined {\n return this.dir;\n }\n\n get enabled(): boolean {\n return !!this.dir || !!this.memoryStore;\n }\n\n private resolvePath(fileName: string): string | null {\n if (!this.dir) return null;\n return path.join(this.dir, fileName);\n }\n\n async readJson<T>(fileName: string): Promise<ReadJsonResult<T>> {\n if (this.memoryStore) {\n if (!this.memoryStore.has(fileName)) {\n return { value: null };\n }\n const existing = this.memoryStore.get(fileName) as T;\n return { value: jsonClone(existing) };\n }\n\n const filePath = this.resolvePath(fileName);\n if (!filePath) {\n return { value: null };\n }\n\n try {\n const raw = await fs.promises.readFile(filePath, \"utf8\");\n return { value: JSON.parse(raw) as T };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === \"ENOENT\") {\n return { value: null };\n }\n return { value: null, error: err, path: filePath };\n }\n }\n\n async writeJson(fileName: string, data: unknown): Promise<WriteJsonResult> {\n if (this.memoryStore) {\n this.memoryStore.set(fileName, jsonClone(data));\n return {};\n }\n\n const filePath = this.resolvePath(fileName);\n if (!filePath) {\n return {};\n }\n\n try {\n await fs.promises.mkdir(path.dirname(filePath), { recursive: true });\n await fs.promises.writeFile(\n filePath,\n JSON.stringify(data, null, 2),\n \"utf8\",\n );\n return {};\n } catch (err) {\n return { error: err, path: filePath };\n }\n }\n}\n", "import { z } from \"zod\";\nimport { LogLine } from \"./v3/types/public/logs.js\";\nimport { ChatMessage, LLMClient } from \"./v3/llm/LLMClient.js\";\nimport { getEnvTimeoutMs, withTimeout } from \"./v3/timeoutConfig.js\";\nimport {\n buildActSystemPrompt,\n buildExtractSystemPrompt,\n buildExtractUserPrompt,\n buildMetadataPrompt,\n buildMetadataSystemPrompt,\n buildObserveSystemPrompt,\n buildObserveUserMessage,\n} from \"./prompt.js\";\nimport { appendSummary, writeTimestampedTxtFile } from \"./inferenceLogUtils.js\";\nimport type {\n InferStagehandSchema,\n StagehandZodObject,\n} from \"./v3/zodCompat.js\";\nimport { SupportedUnderstudyAction } from \"./v3/types/private/handlers.js\";\n\n// Re-export for backward compatibility\nexport type { LLMParsedResponse, LLMUsage } from \"./v3/llm/LLMClient.js\";\n\nfunction withLlmTimeout<T>(promise: Promise<T>, operation: string): Promise<T> {\n const timeoutMs = getEnvTimeoutMs(\"LLM_MAX_MS\");\n if (!timeoutMs) return promise;\n return withTimeout(promise, timeoutMs, `LLM ${operation}`);\n}\n\nexport async function extract<T extends StagehandZodObject>({\n instruction,\n domElements,\n schema,\n llmClient,\n logger,\n userProvidedInstructions,\n logInferenceToFile = false,\n}: {\n instruction: string;\n domElements: string;\n schema: T;\n llmClient: LLMClient;\n userProvidedInstructions?: string;\n logger: (message: LogLine) => void;\n logInferenceToFile?: boolean;\n}) {\n const metadataSchema = z.object({\n progress: z\n .string()\n .describe(\n \"progress of what has been extracted so far, as concise as possible\",\n ),\n completed: z\n .boolean()\n .describe(\n \"true if the goal is now accomplished. Use this conservatively, only when sure that the goal has been completed.\",\n ),\n });\n\n type ExtractionResponse = InferStagehandSchema<T>;\n type MetadataResponse = z.infer<typeof metadataSchema>;\n\n const isUsingAnthropic = llmClient.type === \"anthropic\";\n const isGPT5 = llmClient.modelName.includes(\"gpt-5\"); // TODO: remove this as we update support for gpt-5 configuration options\n\n const extractCallMessages: ChatMessage[] = [\n buildExtractSystemPrompt(isUsingAnthropic, userProvidedInstructions),\n buildExtractUserPrompt(instruction, domElements, isUsingAnthropic),\n ];\n\n let extractCallFile = \"\";\n let extractCallTimestamp = \"\";\n if (logInferenceToFile) {\n const { fileName, timestamp } = writeTimestampedTxtFile(\n \"extract_summary\",\n \"extract_call\",\n {\n modelCall: \"extract\",\n messages: extractCallMessages,\n },\n );\n extractCallFile = fileName;\n extractCallTimestamp = timestamp;\n }\n\n const extractStartTime = Date.now();\n const extractionResponse = await withLlmTimeout(\n llmClient.createChatCompletion<ExtractionResponse>({\n options: {\n messages: extractCallMessages,\n response_model: {\n schema,\n name: \"Extraction\",\n },\n temperature: isGPT5 ? 1 : 0.1,\n top_p: 1,\n frequency_penalty: 0,\n presence_penalty: 0,\n },\n logger,\n }),\n \"extract\",\n );\n const extractEndTime = Date.now();\n\n const { data: extractedData, usage: extractUsage } = extractionResponse;\n\n let extractResponseFile = \"\";\n if (logInferenceToFile) {\n const { fileName } = writeTimestampedTxtFile(\n \"extract_summary\",\n \"extract_response\",\n {\n modelResponse: \"extract\",\n rawResponse: extractedData,\n },\n );\n extractResponseFile = fileName;\n\n appendSummary(\"extract\", {\n extract_inference_type: \"extract\",\n timestamp: extractCallTimestamp,\n LLM_input_file: extractCallFile,\n LLM_output_file: extractResponseFile,\n prompt_tokens: extractUsage?.prompt_tokens ?? 0,\n completion_tokens: extractUsage?.completion_tokens ?? 0,\n reasoning_tokens: extractUsage?.reasoning_tokens ?? 0,\n cached_input_tokens: extractUsage?.cached_input_tokens ?? 0,\n inference_time_ms: extractEndTime - extractStartTime,\n });\n }\n\n const metadataCallMessages: ChatMessage[] = [\n buildMetadataSystemPrompt(),\n buildMetadataPrompt(instruction, extractedData),\n ];\n\n let metadataCallFile = \"\";\n let metadataCallTimestamp = \"\";\n if (logInferenceToFile) {\n const { fileName, timestamp } = writeTimestampedTxtFile(\n \"extract_summary\",\n \"metadata_call\",\n {\n modelCall: \"metadata\",\n messages: metadataCallMessages,\n },\n );\n metadataCallFile = fileName;\n metadataCallTimestamp = timestamp;\n }\n\n const metadataStartTime = Date.now();\n const metadataResponse = await withLlmTimeout(\n llmClient.createChatCompletion<MetadataResponse>({\n options: {\n messages: metadataCallMessages,\n response_model: {\n name: \"Metadata\",\n schema: metadataSchema,\n },\n temperature: isGPT5 ? 1 : 0.1,\n top_p: 1,\n frequency_penalty: 0,\n presence_penalty: 0,\n },\n logger,\n }),\n \"extract metadata\",\n );\n const metadataEndTime = Date.now();\n\n const {\n data: {\n completed: metadataResponseCompleted,\n progress: metadataResponseProgress,\n },\n usage: metadataResponseUsage,\n } = metadataResponse;\n\n let metadataResponseFile = \"\";\n if (logInferenceToFile) {\n const { fileName } = writeTimestampedTxtFile(\n \"extract_summary\",\n \"metadata_response\",\n {\n modelResponse: \"metadata\",\n completed: metadataResponseCompleted,\n progress: metadataResponseProgress,\n },\n );\n metadataResponseFile = fileName;\n\n appendSummary(\"extract\", {\n extract_inference_type: \"metadata\",\n timestamp: metadataCallTimestamp,\n LLM_input_file: metadataCallFile,\n LLM_output_file: metadataResponseFile,\n prompt_tokens: metadataResponseUsage?.prompt_tokens ?? 0,\n completion_tokens: metadataResponseUsage?.completion_tokens ?? 0,\n reasoning_tokens: metadataResponseUsage?.reasoning_tokens ?? 0,\n cached_input_tokens: metadataResponseUsage?.cached_input_tokens ?? 0,\n inference_time_ms: metadataEndTime - metadataStartTime,\n });\n }\n\n const totalPromptTokens =\n (extractUsage?.prompt_tokens ?? 0) +\n (metadataResponseUsage?.prompt_tokens ?? 0);\n\n const totalCompletionTokens =\n (extractUsage?.completion_tokens ?? 0) +\n (metadataResponseUsage?.completion_tokens ?? 0);\n\n const totalInferenceTimeMs =\n extractEndTime - extractStartTime + (metadataEndTime - metadataStartTime);\n const totalReasoningTokens =\n (extractUsage?.reasoning_tokens ?? 0) +\n (metadataResponseUsage?.reasoning_tokens ?? 0);\n const totalCachedInputTokens =\n (extractUsage?.cached_input_tokens ?? 0) +\n (metadataResponseUsage?.cached_input_tokens ?? 0);\n\n return {\n ...extractedData,\n metadata: {\n completed: metadataResponseCompleted,\n progress: metadataResponseProgress,\n },\n prompt_tokens: totalPromptTokens,\n completion_tokens: totalCompletionTokens,\n reasoning_tokens: totalReasoningTokens,\n cached_input_tokens: totalCachedInputTokens,\n inference_time_ms: totalInferenceTimeMs,\n };\n}\n\nexport async function observe({\n instruction,\n domElements,\n llmClient,\n userProvidedInstructions,\n logger,\n logInferenceToFile = false,\n supportedActions,\n}: {\n instruction: string;\n domElements: string;\n llmClient: LLMClient;\n userProvidedInstructions?: string;\n logger: (message: LogLine) => void;\n logInferenceToFile?: boolean;\n supportedActions?: string[];\n}) {\n const isGPT5 = llmClient.modelName.includes(\"gpt-5\"); // TODO: remove this as we update support for gpt-5 configuration options\n\n const observeSchema = z.object({\n elements: z\n .array(\n z.object({\n elementId: z\n .string()\n .regex(/^\\d+-\\d+$/)\n .describe(\n \"the ID string associated with the element. Never include surrounding square brackets. This field must follow the format of 'number-number'.\",\n ),\n description: z\n .string()\n .describe(\n \"a description of the accessible element and its purpose\",\n ),\n method: z\n .enum(\n // Use Object.values() for Zod v3 compatibility - z.enum() in v3 doesn't accept TypeScript enums directly\n Object.values(SupportedUnderstudyAction) as unknown as readonly [\n string,\n ...string[],\n ],\n )\n .describe(\n `the candidate method/action to interact with the element. Select one of the available Understudy interaction methods.`,\n ),\n arguments: z.array(\n z\n .string()\n .describe(\n \"the arguments to pass to the method. For example, for a click, the arguments are empty, but for a fill, the arguments are the value to fill in.\",\n ),\n ),\n }),\n )\n .describe(\"an array of accessible elements that match the instruction\"),\n });\n\n type ObserveResponse = z.infer<typeof observeSchema>;\n\n const messages: ChatMessage[] = [\n buildObserveSystemPrompt(userProvidedInstructions, supportedActions),\n buildObserveUserMessage(instruction, domElements),\n ];\n\n let callTimestamp = \"\";\n let callFile = \"\";\n if (logInferenceToFile) {\n const { fileName, timestamp } = writeTimestampedTxtFile(\n `observe_summary`,\n `observe_call`,\n {\n modelCall: \"observe\",\n messages,\n },\n );\n callFile = fileName;\n callTimestamp = timestamp;\n }\n\n const start = Date.now();\n const rawResponse = await llmClient.createChatCompletion<ObserveResponse>({\n options: {\n messages,\n response_model: {\n schema: observeSchema,\n name: \"Observation\",\n },\n temperature: isGPT5 ? 1 : 0.1,\n top_p: 1,\n frequency_penalty: 0,\n presence_penalty: 0,\n },\n logger,\n });\n const end = Date.now();\n const usageTimeMs = end - start;\n\n const { data: observeData, usage: observeUsage } = rawResponse;\n const promptTokens = observeUsage?.prompt_tokens ?? 0;\n const completionTokens = observeUsage?.completion_tokens ?? 0;\n const reasoningTokens = observeUsage?.reasoning_tokens ?? 0;\n const cachedInputTokens = observeUsage?.cached_input_tokens ?? 0;\n\n let responseFile = \"\";\n if (logInferenceToFile) {\n const { fileName: responseFileName } = writeTimestampedTxtFile(\n `observe_summary`,\n `observe_response`,\n {\n modelResponse: \"observe\",\n rawResponse: observeData,\n },\n );\n responseFile = responseFileName;\n\n appendSummary(\"observe\", {\n [`observe_inference_type`]: \"observe\",\n timestamp: callTimestamp,\n LLM_input_file: callFile,\n LLM_output_file: responseFile,\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n reasoning_tokens: reasoningTokens,\n cached_input_tokens: cachedInputTokens,\n inference_time_ms: usageTimeMs,\n });\n }\n\n const parsedElements =\n observeData.elements?.map((el) => {\n const base = {\n elementId: el.elementId,\n description: String(el.description),\n method: String(el.method),\n arguments: el.arguments,\n };\n return base;\n }) ?? [];\n\n return {\n elements: parsedElements,\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n reasoning_tokens: reasoningTokens,\n cached_input_tokens: cachedInputTokens,\n inference_time_ms: usageTimeMs,\n };\n}\n\nexport async function act({\n instruction,\n domElements,\n llmClient,\n userProvidedInstructions,\n logger,\n logInferenceToFile = false,\n}: {\n instruction: string;\n domElements: string;\n llmClient: LLMClient;\n userProvidedInstructions?: string;\n logger: (message: LogLine) => void;\n logInferenceToFile?: boolean;\n}) {\n const isGPT5 = llmClient.modelName.includes(\"gpt-5\"); // TODO: remove this as we update support for gpt-5 configuration options\n\n const actSchema = z.object({\n elementId: z\n .string()\n .regex(/^\\d+-\\d+$/)\n .describe(\n \"the ID string associated with the element. Never include surrounding square brackets. This field must follow the format of 'number-number'.\",\n ),\n description: z\n .string()\n .describe(\"a description of the accessible element and its purpose\"),\n method: z\n .enum(\n // Use Object.values() for Zod v3 compatibility - z.enum() in v3 doesn't accept TypeScript enums directly\n Object.values(SupportedUnderstudyAction) as unknown as readonly [\n string,\n ...string[],\n ],\n )\n .describe(\n \"the candidate method/action to interact with the element. Select one of the available Understudy interaction methods.\",\n ),\n arguments: z.array(\n z\n .string()\n .describe(\n \"the arguments to pass to the method. For example, for a click, the arguments are empty, but for a fill, the arguments are the value to fill in.\",\n ),\n ),\n twoStep: z.boolean(),\n });\n\n type ActResponse = z.infer<typeof actSchema>;\n\n const messages: ChatMessage[] = [\n buildActSystemPrompt(userProvidedInstructions),\n buildObserveUserMessage(instruction, domElements),\n ];\n\n let callTimestamp = \"\";\n let callFile = \"\";\n if (logInferenceToFile) {\n const { fileName, timestamp } = writeTimestampedTxtFile(\n `act_summary`,\n `act_call`,\n {\n modelCall: \"act\",\n messages,\n },\n );\n callFile = fileName;\n callTimestamp = timestamp;\n }\n\n const start = Date.now();\n const rawResponse = await llmClient.createChatCompletion<ActResponse>({\n options: {\n messages,\n response_model: {\n schema: actSchema,\n name: \"act\",\n },\n temperature: isGPT5 ? 1 : 0.1,\n top_p: 1,\n frequency_penalty: 0,\n presence_penalty: 0,\n },\n logger,\n });\n const end = Date.now();\n const usageTimeMs = end - start;\n\n const { data: actData, usage: actUsage } = rawResponse;\n const promptTokens = actUsage?.prompt_tokens ?? 0;\n const completionTokens = actUsage?.completion_tokens ?? 0;\n const reasoningTokens = actUsage?.reasoning_tokens ?? 0;\n const cachedInputTokens = actUsage?.cached_input_tokens ?? 0;\n\n let responseFile = \"\";\n if (logInferenceToFile) {\n const { fileName: responseFileName } = writeTimestampedTxtFile(\n `act_summary`,\n `act_response`,\n {\n modelResponse: \"act\",\n rawResponse: actData,\n },\n );\n responseFile = responseFileName;\n\n appendSummary(\"act\", {\n [`act_inference_type`]: \"act\",\n timestamp: callTimestamp,\n LLM_input_file: callFile,\n LLM_output_file: responseFile,\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n reasoning_tokens: reasoningTokens,\n cached_input_tokens: cachedInputTokens,\n inference_time_ms: usageTimeMs,\n });\n }\n\n const parsedElement = {\n elementId: actData.elementId,\n description: String(actData.description),\n method: String(actData.method),\n arguments: actData.arguments,\n };\n\n return {\n element: parsedElement,\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n reasoning_tokens: reasoningTokens,\n cached_input_tokens: cachedInputTokens,\n inference_time_ms: usageTimeMs,\n twoStep: actData.twoStep,\n };\n}\n", "import { TimeoutError } from \"./types/public/sdkErrors.js\";\n\nexport function getEnvTimeoutMs(name: string): number | undefined {\n const raw = process.env[name];\n if (!raw) return undefined;\n const normalized = raw.trim().replace(/ms$/i, \"\");\n const value = Number(normalized);\n if (!Number.isFinite(value) || value <= 0) return undefined;\n return value;\n}\n\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation: string,\n): Promise<T> {\n let timeoutId: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutError(operation, timeoutMs));\n }, timeoutMs);\n });\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n}\n", "import { ChatMessage } from \"./v3/llm/LLMClient.js\";\n\nexport function buildUserInstructionsString(\n userProvidedInstructions?: string,\n): string {\n if (!userProvidedInstructions) {\n return \"\";\n }\n\n return `\\n\\n# Custom Instructions Provided by the User\n \nPlease keep the user's instructions in mind when performing actions. If the user's instructions are not relevant to the current task, ignore them.\n\nUser Instructions:\n${userProvidedInstructions}`;\n}\n\n// extract\nexport function buildExtractSystemPrompt(\n isUsingPrintExtractedDataTool: boolean = false,\n userProvidedInstructions?: string,\n): ChatMessage {\n const baseContent = `You are extracting content on behalf of a user.\n If a user asks you to extract a 'list' of information, or 'all' information, \n YOU MUST EXTRACT ALL OF THE INFORMATION THAT THE USER REQUESTS.\n \n You will be given:\n1. An instruction\n2. `;\n\n const contentDetail = `A list of DOM elements to extract from.`;\n\n const instructions = `\nPrint the exact text from the DOM elements with all symbols, characters, and endlines as is.\nPrint null or an empty string if no new information is found.\n `.trim();\n\n const toolInstructions = isUsingPrintExtractedDataTool\n ? `\nONLY print the content using the print_extracted_data tool provided.\nONLY print the content using the print_extracted_data tool provided.\n `.trim()\n : \"\";\n\n const additionalInstructions =\n \"If a user is attempting to extract links or URLs, you MUST respond with ONLY the IDs of the link elements. \\n\" +\n \"Do not attempt to extract links directly from the text unless absolutely necessary. \";\n\n const userInstructions = buildUserInstructionsString(\n userProvidedInstructions,\n );\n\n const content =\n `${baseContent}${contentDetail}\\n\\n${instructions}\\n${toolInstructions}${\n additionalInstructions ? `\\n\\n${additionalInstructions}` : \"\"\n }${userInstructions ? `\\n\\n${userInstructions}` : \"\"}`.replace(/\\s+/g, \" \");\n\n return {\n role: \"system\",\n content,\n };\n}\n\nexport function buildExtractUserPrompt(\n instruction: string,\n domElements: string,\n isUsingPrintExtractedDataTool: boolean = false,\n): ChatMessage {\n let content = `Instruction: ${instruction}\nDOM: ${domElements}`;\n\n if (isUsingPrintExtractedDataTool) {\n content += `\nONLY print the content using the print_extracted_data tool provided.\nONLY print the content using the print_extracted_data tool provided.`;\n }\n\n return {\n role: \"user\",\n content,\n };\n}\n\nconst metadataSystemPrompt = `You are an AI assistant tasked with evaluating the progress and completion status of an extraction task.\nAnalyze the extraction response and determine if the task is completed or if more information is needed.\nStrictly abide by the following criteria:\n1. Once the instruction has been satisfied by the current extraction response, ALWAYS set completion status to true and stop processing, regardless of remaining chunks.\n2. Only set completion status to false if BOTH of these conditions are true:\n - The instruction has not been satisfied yet\n - There are still chunks left to process (chunksTotal > chunksSeen)`;\n\nexport function buildMetadataSystemPrompt(): ChatMessage {\n return {\n role: \"system\",\n content: metadataSystemPrompt,\n };\n}\n\nexport function buildMetadataPrompt(\n instruction: string,\n extractionResponse: object,\n): ChatMessage {\n return {\n role: \"user\",\n content: `Instruction: ${instruction}\nExtracted content: ${JSON.stringify(extractionResponse, null, 2)}`,\n };\n}\n\n// observe\nexport function buildObserveSystemPrompt(\n userProvidedInstructions?: string,\n supportedActions?: string[],\n): ChatMessage {\n const actionsString = supportedActions?.length\n ? `\\n\\nSupported actions: ${supportedActions.join(\", \")}`\n : \"\";\n\n const observeSystemPrompt = `\nYou are helping the user automate the browser by finding elements based on what the user wants to observe in the page.\n\nYou will be given:\n1. a instruction of elements to observe\n2. a hierarchical accessibility tree showing the semantic structure of the page. The tree is a hybrid of the DOM and the accessibility tree.\n\nReturn an array of elements that match the instruction if they exist, otherwise return an empty array.\nWhen returning elements, include the appropriate method from the supported actions list.${actionsString}. When choosing non-left click actions, provide right or middle as the argument.`;\n const content = observeSystemPrompt.replace(/\\s+/g, \" \");\n\n return {\n role: \"system\",\n content: [content, buildUserInstructionsString(userProvidedInstructions)]\n .filter(Boolean)\n .join(\"\\n\\n\"),\n };\n}\n\nexport function buildObserveUserMessage(\n instruction: string,\n domElements: string,\n): ChatMessage {\n return {\n role: \"user\",\n content: `instruction: ${instruction}\nAccessibility Tree: \\n${domElements}\\n`,\n };\n}\n\nexport function buildActSystemPrompt(\n userProvidedInstructions?: string,\n): ChatMessage {\n const actSystemPrompt = `\nYou are helping the user automate the browser by finding elements based on what action the user wants to take on the page\n\nYou will be given:\n1. a user defined instruction about what action to take\n2. a hierarchical accessibility tree showing the semantic structure of the page. The tree is a hybrid of the DOM and the accessibility tree.\n\nReturn the element that matches the instruction if it exists. Otherwise, return an empty object.`;\n const content = actSystemPrompt.replace(/\\s+/g, \" \");\n\n return {\n role: \"system\",\n content: [content, buildUserInstructionsString(userProvidedInstructions)]\n .filter(Boolean)\n .join(\"\\n\\n\"),\n };\n}\n\nexport function buildActPrompt(\n action: string,\n supportedActions: string[],\n variables?: Record<string, string>,\n): string {\n // Base instruction\n let instruction = `Find the most relevant element to perform an action on given the following action: ${action}. \n IF AND ONLY IF the action EXPLICITLY includes the word 'dropdown' and implies choosing/selecting an option from a dropdown, ignore the 'General Instructions' section, and follow the 'Dropdown Specific Instructions' section carefully.\n \n General Instructions: \n Provide an action for this element such as ${supportedActions.join(\", \")}. Remember that to users, buttons and links look the same in most cases.\n When choosing non-left click actions, provide right or middle as the argument\n If the action is completely unrelated to a potential action to be taken on the page, return an empty object. \n ONLY return one action. If multiple actions are relevant, return the most relevant one. \n If the user is asking to scroll to a position on the page, e.g., 'halfway' or 0.75, etc, you must return the argument formatted as the correct percentage, e.g., '50%' or '75%', etc.\n If the user is asking to scroll to the next chunk/previous chunk, choose the nextChunk/prevChunk method. No arguments are required here.\n If the action implies a key press, e.g., 'press enter', 'press a', 'press space', etc., always choose the press method with the appropriate key as argument \u2014 e.g. 'a', 'Enter', 'Space'. Do not choose a click action on an on-screen keyboard. Capitalize the first character like 'Enter', 'Tab', 'Escape' only for special keys. \n \n Dropdown Specific Instructions:\n For interacting with dropdowns, there are two specific cases that you need to handle. \n \n CASE 1: the element is a 'select' element. \n - choose the selectOptionFromDropdown method,\n - set the argument to the exact text of the option that should be selected,\n - set twoStep to false.\n CASE 2: the element is NOT a 'select' element:\n - do not attempt to directly choose the element from the dropdown. You will need to click to expand the dropdown first. You will achieve this by following these instructions:\n - choose the node that most closely corresponds to the given instruction EVEN if it is a 'StaticText' element, or otherwise does not appear to be interactable. \n - choose the 'click' method\n - set twoStep to true.\n `;\n\n // Add variable names (not values) to the instruction if any\n if (variables && Object.keys(variables).length > 0) {\n const variableNames = Object.keys(variables)\n .map((key) => `%${key}%`)\n .join(\", \");\n const variablesPrompt = `The following variables are available to use in the action: ${variableNames}. Fill the argument variables with the variable name.`;\n instruction += ` ${variablesPrompt}`;\n }\n\n return instruction;\n}\n\nexport function buildStepTwoPrompt(\n originalUserAction: string,\n previousAction: string,\n supportedActions: string[],\n variables?: Record<string, string>,\n): string {\n // Base instruction\n let instruction = `\n The original user action was: ${originalUserAction}.\n You have just taken the following action which completed step 1 of 2: ${previousAction}.\n \n Now, you must find the most relevant element to perform an action on in order to complete step 2 of 2. \n \n General Instructions: \n Provide an action for this element such as ${supportedActions.join(\", \")}. Remember that to users, buttons and links look the same in most cases.\n If the action is completely unrelated to a potential action to be taken on the page, return an empty object. \n ONLY return one action. If multiple actions are relevant, return the most relevant one. \n If the user is asking to scroll to a position on the page, e.g., 'halfway' or 0.75, etc, you must return the argument formatted as the correct percentage, e.g., '50%' or '75%', etc.\n If the user is asking to scroll to the next chunk/previous chunk, choose the nextChunk/prevChunk method. No arguments are required here.\n If the action implies a key press, e.g., 'press enter', 'press a', 'press space', etc., always choose the press method with the appropriate key as argument \u2014 e.g. 'a', 'Enter', 'Space'. Do not choose a click action on an on-screen keyboard. Capitalize the first character like 'Enter', 'Tab', 'Escape' only for special keys. \n `;\n\n // Add variable names (not values) to the instruction if any\n if (variables && Object.keys(variables).length > 0) {\n const variableNames = Object.keys(variables)\n .map((key) => `%${key}%`)\n .join(\", \");\n const variablesPrompt = `The following variables are available to use in the action: ${variableNames}. Fill the argument variables with the variable name.`;\n instruction += ` ${variablesPrompt}`;\n }\n\n return instruction;\n}\n\nexport function buildOperatorSystemPrompt(goal: string): ChatMessage {\n return {\n role: \"system\",\n content: `You are a general-purpose agent whose job is to accomplish the user's goal across multiple model calls by running actions on the page.\n\nYou will be given a goal and a list of steps that have been taken so far. Your job is to determine if either the user's goal has been completed or if there are still steps that need to be taken.\n\n# Your current goal\n${goal}\n\n# CRITICAL: You MUST use the provided tools to take actions. Do not just describe what you want to do - actually call the appropriate tools.\n\n# Available tools and when to use them:\n- \\`act\\`: Use this to interact with the page (click, type, navigate, etc.)\n- \\`extract\\`: Use this to get information from the page\n- \\`goto\\`: Use this to navigate to a specific URL\n- \\`wait\\`: Use this to wait for a period of time\n- \\`navback\\`: Use this to go back to the previous page\n- \\`refresh\\`: Use this to refresh the current page\n- \\`close\\`: Use this ONLY when the task is complete or cannot be achieved\n- External tools: Use any additional tools (like search tools) as needed for your goal\n\n# Important guidelines\n1. ALWAYS use tools - never just provide text responses about what you plan to do\n2. Break down complex actions into individual atomic steps\n3. For \\`act\\` commands, use only one action at a time, such as:\n - Single click on a specific element\n - Type into a single input field\n - Select a single option\n4. Avoid combining multiple actions in one instruction\n5. If multiple actions are needed, they should be separate steps\n6. Only use \\`close\\` when the task is genuinely complete or impossible to achieve`,\n };\n}\n\nexport function buildCuaDefaultSystemPrompt(): string {\n return `You are a helpful assistant that can use a web browser.\\nDo not ask follow up questions, the user will trust your judgement. Today's date is ${new Date().toISOString().split(\"T\")[0]}.`;\n}\n\nexport function buildGoogleCUASystemPrompt(): ChatMessage {\n return {\n role: \"system\",\n content: `You are a general-purpose browser agent whose job is to accomplish the user's goal.\nToday's date is ${new Date().toISOString().split(\"T\")[0]}.\nYou have access to a search tool; however, in most cases you should operate within the page/url the user has provided. ONLY use the search tool if you're stuck or the task is impossible to complete within the current page.\nYou will be given a goal and a list of steps that have been taken so far. Avoid requesting the user for input as much as possible. Good luck!\n`,\n };\n}\n", "import fs from \"fs\";\nimport path from \"path\";\n\n/**\n * Create (or ensure) a parent directory named \"inference_summary\".\n */\nfunction ensureInferenceSummaryDir(): string {\n const inferenceDir = path.join(process.cwd(), \"inference_summary\");\n if (!fs.existsSync(inferenceDir)) {\n fs.mkdirSync(inferenceDir, { recursive: true });\n }\n return inferenceDir;\n}\n\n/**\n * Appends a new entry to the act_summary.json file, then writes the file back out.\n */\nexport function appendSummary<T>(inferenceType: string, entry: T) {\n const summaryPath = getSummaryJsonPath(inferenceType);\n const arrayKey = `${inferenceType}_summary`;\n\n const existingData = readSummaryFile<T>(inferenceType);\n existingData[arrayKey].push(entry);\n\n fs.writeFileSync(summaryPath, JSON.stringify(existingData, null, 2));\n}\n\n/** A simple timestamp utility for filenames. */\nfunction getTimestamp(): string {\n return new Date()\n .toISOString()\n .replace(/[^0-9T]/g, \"\")\n .replace(\"T\", \"_\");\n}\n\n/**\n * Writes `data` as JSON into a file in `directory`, using a prefix plus timestamp.\n * Returns both the file name and the timestamp used, so you can log them.\n */\nexport function writeTimestampedTxtFile(\n directory: string,\n prefix: string,\n data: unknown,\n): { fileName: string; timestamp: string } {\n const baseDir = ensureInferenceSummaryDir();\n\n const subDir = path.join(baseDir, directory);\n if (!fs.existsSync(subDir)) {\n fs.mkdirSync(subDir, { recursive: true });\n }\n\n const timestamp = getTimestamp();\n const fileName = `${timestamp}_${prefix}.txt`;\n const filePath = path.join(subDir, fileName);\n\n fs.writeFileSync(\n filePath,\n JSON.stringify(data, null, 2).replace(/\\\\n/g, \"\\n\"),\n );\n\n return { fileName, timestamp };\n}\n\n/**\n * Returns the path to the `<inferenceType>_summary.json` file.\n *\n * For example, if `inferenceType = \"act\"`, this will be:\n * `./inference_summary/act_summary/act_summary.json`\n */\nfunction getSummaryJsonPath(inferenceType: string): string {\n const baseDir = ensureInferenceSummaryDir();\n const subDir = path.join(baseDir, `${inferenceType}_summary`);\n if (!fs.existsSync(subDir)) {\n fs.mkdirSync(subDir, { recursive: true });\n }\n return path.join(subDir, `${inferenceType}_summary.json`);\n}\n\n/**\n * Reads the `<inferenceType>_summary.json` file, returning an object\n * with the top-level array named `<inferenceType>_summary`, if it exists.\n *\n * E.g. if inferenceType is \"act\", we expect a shape like:\n * {\n * \"act_summary\": [ ... ]\n * }\n *\n * If the file or array is missing, returns { \"<inferenceType>_summary\": [] }.\n */\nfunction readSummaryFile<T>(inferenceType: string): Record<string, T[]> {\n const summaryPath = getSummaryJsonPath(inferenceType);\n\n // The top-level array key, e.g. \"act_summary\", \"observe_summary\", \"extract_summary\"\n const arrayKey = `${inferenceType}_summary`;\n\n if (!fs.existsSync(summaryPath)) {\n return { [arrayKey]: [] };\n }\n\n try {\n const raw = fs.readFileSync(summaryPath, \"utf8\");\n const parsed = JSON.parse(raw);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n Array.isArray(parsed[arrayKey])\n ) {\n return parsed;\n }\n } catch {\n // If we fail to parse for any reason, fall back to empty array\n }\n return { [arrayKey]: [] };\n}\n", "import { Page } from \"../../understudy/page.js\";\nimport { ModelConfiguration } from \"../public/model.js\";\nimport type { StagehandZodSchema } from \"../../zodCompat.js\";\n\nexport interface ActHandlerParams {\n instruction: string;\n model?: ModelConfiguration;\n variables?: Record<string, string>;\n timeout?: number;\n page: Page;\n}\n\nexport interface ExtractHandlerParams<T extends StagehandZodSchema> {\n instruction?: string;\n schema?: T;\n model?: ModelConfiguration;\n timeout?: number;\n selector?: string;\n page: Page;\n}\n\nexport interface ObserveHandlerParams {\n instruction?: string;\n model?: ModelConfiguration;\n timeout?: number;\n selector?: string;\n page: Page;\n}\n\n// We can use this enum to list the actions supported in performUnderstudyMethod\nexport enum SupportedUnderstudyAction {\n CLICK = \"click\",\n FILL = \"fill\",\n TYPE = \"type\",\n PRESS = \"press\",\n SCROLL = \"scrollTo\",\n NEXT_CHUNK = \"nextChunk\",\n PREV_CHUNK = \"prevChunk\",\n SELECT_OPTION_FROM_DROPDOWN = \"selectOptionFromDropdown\",\n HOVER = \"hover\",\n DOUBLE_CLICK = \"doubleClick\",\n DRAG_AND_DROP = \"dragAndDrop\",\n}\n", "// lib/v3/handlers/actHandler.ts\nimport { act as actInference } from \"../../inference.js\";\nimport { buildActPrompt, buildStepTwoPrompt } from \"../../prompt.js\";\nimport { trimTrailingTextNode } from \"../../utils.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { ActHandlerParams } from \"../types/private/handlers.js\";\nimport { ActResult, Action, V3FunctionName } from \"../types/public/methods.js\";\nimport { ActTimeoutError } from \"../types/public/sdkErrors.js\";\nimport {\n captureHybridSnapshot,\n diffCombinedTrees,\n} from \"../understudy/a11y/snapshot/index.js\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { SupportedUnderstudyAction } from \"../types/private/index.js\";\nimport { EncodedId } from \"../types/private/internal.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n} from \"../types/public/model.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport {\n performUnderstudyMethod,\n waitForDomNetworkQuiet,\n} from \"./handlerUtils/actHandlerUtils.js\";\nimport { createTimeoutGuard } from \"./handlerUtils/timeoutGuard.js\";\n\ntype ActInferenceElement = {\n elementId?: string;\n description: string;\n method?: string;\n arguments?: string[];\n};\n\ntype ActInferenceResponse = Awaited<ReturnType<typeof actInference>>;\n\nexport class ActHandler {\n private readonly llmClient: LLMClient;\n private readonly defaultModelName: AvailableModel;\n private readonly defaultClientOptions: ClientOptions;\n private readonly resolveLlmClient: (model?: ModelConfiguration) => LLMClient;\n private readonly systemPrompt: string;\n private readonly logInferenceToFile: boolean;\n private readonly selfHeal: boolean;\n private readonly onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n private readonly defaultDomSettleTimeoutMs?: number;\n\n constructor(\n llmClient: LLMClient,\n defaultModelName: AvailableModel,\n defaultClientOptions: ClientOptions,\n resolveLlmClient: (model?: ModelConfiguration) => LLMClient,\n systemPrompt?: string,\n logInferenceToFile?: boolean,\n selfHeal?: boolean,\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void,\n defaultDomSettleTimeoutMs?: number,\n ) {\n this.llmClient = llmClient;\n this.defaultModelName = defaultModelName;\n this.defaultClientOptions = defaultClientOptions;\n this.resolveLlmClient = resolveLlmClient;\n this.systemPrompt = systemPrompt ?? \"\";\n this.logInferenceToFile = logInferenceToFile ?? false;\n this.selfHeal = !!selfHeal;\n this.onMetrics = onMetrics;\n this.defaultDomSettleTimeoutMs = defaultDomSettleTimeoutMs;\n }\n\n private recordActMetrics(response: ActInferenceResponse): void {\n this.onMetrics?.(\n V3FunctionName.ACT,\n response.prompt_tokens ?? 0,\n response.completion_tokens ?? 0,\n response.reasoning_tokens ?? 0,\n response.cached_input_tokens ?? 0,\n response.inference_time_ms ?? 0,\n );\n }\n\n private async getActionFromLLM({\n instruction,\n domElements,\n xpathMap,\n llmClient,\n requireMethodAndArguments = true,\n }: {\n instruction: string;\n domElements: string;\n xpathMap: Record<string, string>;\n llmClient: LLMClient;\n requireMethodAndArguments?: boolean;\n }): Promise<{ action?: Action; response: ActInferenceResponse }> {\n const response = await actInference({\n instruction,\n domElements,\n llmClient,\n userProvidedInstructions: this.systemPrompt,\n logger: v3Logger,\n logInferenceToFile: this.logInferenceToFile,\n });\n\n this.recordActMetrics(response);\n\n const normalized = normalizeActInferenceElement(\n response.element as ActInferenceElement | undefined,\n xpathMap,\n requireMethodAndArguments,\n );\n\n if (!normalized) {\n return { response };\n }\n\n return {\n action: { ...normalized } as Action,\n response,\n };\n }\n\n async act(params: ActHandlerParams): Promise<ActResult> {\n const { instruction, page, variables, timeout, model } = params;\n\n const llmClient = this.resolveLlmClient(model);\n const effectiveTimeoutMs =\n typeof timeout === \"number\" && timeout > 0 ? timeout : undefined;\n\n const ensureTimeRemaining = createTimeoutGuard(\n effectiveTimeoutMs,\n (ms) => new ActTimeoutError(ms),\n );\n\n ensureTimeRemaining();\n await waitForDomNetworkQuiet(\n page.mainFrame(),\n this.defaultDomSettleTimeoutMs,\n );\n ensureTimeRemaining();\n const { combinedTree, combinedXpathMap } = await captureHybridSnapshot(\n page,\n { experimental: true },\n );\n\n const actInstruction = buildActPrompt(\n instruction,\n Object.values(SupportedUnderstudyAction),\n variables,\n );\n\n ensureTimeRemaining();\n const { action: firstAction, response: actInferenceResponse } =\n await this.getActionFromLLM({\n instruction: actInstruction,\n domElements: combinedTree,\n xpathMap: combinedXpathMap,\n llmClient,\n });\n\n if (!firstAction) {\n v3Logger({\n category: \"action\",\n message: \"no actionable element returned by LLM\",\n level: 1,\n });\n return {\n success: false,\n message: \"Failed to perform act: No action found\",\n actionDescription: instruction,\n actions: [],\n };\n }\n\n // First action (self-heal aware path)\n ensureTimeRemaining();\n const firstResult = await this.takeDeterministicAction(\n firstAction,\n page,\n this.defaultDomSettleTimeoutMs,\n llmClient,\n ensureTimeRemaining,\n variables,\n );\n\n // If not two-step, return the first action result\n if (actInferenceResponse?.twoStep !== true) {\n return firstResult;\n }\n\n // Take a new focused snapshot and observe again\n ensureTimeRemaining();\n const { combinedTree: combinedTree2, combinedXpathMap: combinedXpathMap2 } =\n await captureHybridSnapshot(page, {\n experimental: true,\n });\n\n let diffedTree = diffCombinedTrees(combinedTree, combinedTree2);\n if (!diffedTree.trim()) {\n // Fallback: if no diff detected, use the fresh tree to avoid empty context\n diffedTree = combinedTree2;\n }\n\n const previousAction = `method: ${firstAction.method}, description: ${firstAction.description}, arguments: ${firstAction.arguments}`;\n\n const stepTwoInstructions = buildStepTwoPrompt(\n instruction,\n previousAction,\n Object.values(SupportedUnderstudyAction).filter(\n (\n action,\n ): action is Exclude<\n SupportedUnderstudyAction,\n SupportedUnderstudyAction.SELECT_OPTION_FROM_DROPDOWN\n > => action !== SupportedUnderstudyAction.SELECT_OPTION_FROM_DROPDOWN,\n ),\n variables,\n );\n\n ensureTimeRemaining();\n const { action: secondAction } = await this.getActionFromLLM({\n instruction: stepTwoInstructions,\n domElements: diffedTree,\n xpathMap: combinedXpathMap2,\n llmClient,\n });\n\n if (!secondAction) {\n // No second action found \u2014 return first result as-is\n return firstResult;\n }\n\n ensureTimeRemaining();\n const secondResult = await this.takeDeterministicAction(\n secondAction,\n page,\n this.defaultDomSettleTimeoutMs,\n llmClient,\n ensureTimeRemaining,\n variables,\n );\n\n // Combine results\n return {\n success: firstResult.success && secondResult.success,\n message: secondResult.success\n ? `${firstResult.message} \u2192 ${secondResult.message}`\n : `${firstResult.message} \u2192 ${secondResult.message}`,\n actionDescription: firstResult.actionDescription,\n actions: [\n ...(firstResult.actions || []),\n ...(secondResult.actions || []),\n ],\n };\n }\n\n async takeDeterministicAction(\n action: Action,\n page: Page,\n domSettleTimeoutMs?: number,\n llmClientOverride?: LLMClient,\n ensureTimeRemaining?: () => void,\n variables?: Record<string, string>,\n ): Promise<ActResult> {\n ensureTimeRemaining?.();\n const settleTimeout = domSettleTimeoutMs ?? this.defaultDomSettleTimeoutMs;\n const effectiveClient = llmClientOverride ?? this.llmClient;\n const method = action.method?.trim();\n if (!method || method === \"not-supported\") {\n v3Logger({\n category: \"action\",\n message: \"action has no supported method\",\n level: 0,\n auxiliary: {\n act: { value: JSON.stringify(action), type: \"object\" },\n },\n });\n return {\n success: false,\n message: `Unable to perform action: The method '${method ?? \"\"}' is not supported in Action. Please use a supported Playwright locator method.`,\n actionDescription:\n action.description || `Action (${method ?? \"unknown\"})`,\n actions: [],\n };\n }\n\n const placeholderArgs = Array.isArray(action.arguments)\n ? [...action.arguments]\n : [];\n const resolvedArgs =\n substituteVariablesInArguments(action.arguments, variables) ?? [];\n\n try {\n ensureTimeRemaining?.();\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n method,\n action.selector,\n resolvedArgs,\n settleTimeout,\n );\n return {\n success: true,\n message: `Action [${method}] performed successfully on selector: ${action.selector}`,\n actionDescription: action.description || `action (${method})`,\n actions: [\n {\n selector: action.selector,\n description: action.description || `action (${method})`,\n method,\n arguments: placeholderArgs,\n },\n ],\n };\n } catch (err) {\n if (err instanceof ActTimeoutError) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : String(err);\n\n // Attempt self-heal: rerun actInference and retry with updated selector\n if (this.selfHeal) {\n v3Logger({\n category: \"action\",\n message:\n \"Error performing action. Reprocessing the page and trying again\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n action: {\n value: JSON.stringify(action),\n type: \"object\",\n },\n },\n });\n\n try {\n // Build an instruction combining method + description, avoiding duplication\n const actCommand = action.description\n ? action.description.toLowerCase().startsWith(method.toLowerCase())\n ? action.description\n : `${method} ${action.description}`\n : method;\n\n // Take a fresh snapshot and ask for a new actionable element\n ensureTimeRemaining?.();\n const { combinedTree, combinedXpathMap } =\n await captureHybridSnapshot(page, {\n experimental: true,\n });\n\n const instruction = buildActPrompt(\n actCommand,\n Object.values(SupportedUnderstudyAction),\n {},\n );\n\n ensureTimeRemaining?.();\n const { action: fallbackAction, response: fallbackResponse } =\n await this.getActionFromLLM({\n instruction,\n domElements: combinedTree,\n xpathMap: combinedXpathMap,\n llmClient: effectiveClient,\n requireMethodAndArguments: false,\n });\n\n const fallbackElement = fallbackResponse.element;\n if (!fallbackElement) {\n return {\n success: false,\n message:\n \"Failed to self-heal act: No observe results found for action\",\n actionDescription: actCommand,\n actions: [],\n };\n }\n\n // Retry with original method/args but new selector from fallback\n let newSelector = action.selector;\n if (fallbackAction?.selector) {\n newSelector = fallbackAction.selector;\n }\n\n ensureTimeRemaining?.();\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n method,\n newSelector,\n resolvedArgs,\n settleTimeout,\n );\n\n return {\n success: true,\n message: `Action [${method}] performed successfully on selector: ${newSelector}`,\n actionDescription: action.description || `action (${method})`,\n actions: [\n {\n selector: newSelector,\n description: action.description || `action (${method})`,\n method,\n arguments: placeholderArgs,\n },\n ],\n };\n } catch (retryErr) {\n if (retryErr instanceof ActTimeoutError) {\n throw retryErr;\n }\n const retryMsg =\n retryErr instanceof Error ? retryErr.message : String(retryErr);\n return {\n success: false,\n message: `Failed to perform act after self-heal: ${retryMsg}`,\n actionDescription: action.description || `action (${method})`,\n actions: [],\n };\n }\n }\n\n return {\n success: false,\n message: `Failed to perform act: ${msg}`,\n actionDescription: action.description || `action (${method})`,\n actions: [],\n };\n }\n }\n}\n\nfunction normalizeActInferenceElement(\n element: ActInferenceElement | undefined,\n xpathMap: Record<string, string>,\n requireMethodAndArguments = true,\n): Action | undefined {\n if (!element) {\n return undefined;\n }\n const { elementId, description, method, arguments: args } = element;\n const hasArgs = Array.isArray(args);\n\n if (\n requireMethodAndArguments &&\n (!method || method === \"not-supported\" || !hasArgs)\n ) {\n return undefined;\n }\n\n if (typeof elementId !== \"string\" || !elementId.includes(\"-\")) {\n return undefined;\n }\n\n const xp = xpathMap[elementId as EncodedId];\n const trimmed = trimTrailingTextNode(xp);\n if (!trimmed) {\n return undefined;\n }\n\n // For dragAndDrop, convert element ID in arguments to xpath (target element)\n let resolvedArgs = hasArgs ? args : undefined;\n if (method === \"dragAndDrop\" && hasArgs && args.length > 0) {\n const targetArg = args[0];\n // Check if argument looks like an element ID (e.g., \"1-67\")\n if (typeof targetArg === \"string\" && /^\\d+-\\d+$/.test(targetArg)) {\n const argXpath = xpathMap[targetArg as EncodedId];\n const trimmedArgXpath = trimTrailingTextNode(argXpath);\n if (trimmedArgXpath) {\n resolvedArgs = [`xpath=${trimmedArgXpath}`, ...args.slice(1)];\n } else {\n // Target element lookup failed, filter out this action\n v3Logger({\n category: \"action\",\n message: \"dragAndDrop target element lookup failed\",\n level: 1,\n auxiliary: {\n targetElementId: { value: targetArg, type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n } else {\n v3Logger({\n category: \"action\",\n message: \"dragAndDrop target element invalid ID format\",\n level: 0,\n auxiliary: {\n targetElementId: { value: String(targetArg), type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n }\n\n return {\n description,\n method,\n arguments: resolvedArgs,\n selector: `xpath=${trimmed}`,\n } as Action;\n}\n\nfunction substituteVariablesInArguments(\n args: string[] | undefined,\n variables?: Record<string, string>,\n): string[] | undefined {\n if (!variables || !Array.isArray(args)) {\n return args;\n }\n\n return args.map((arg: string) => {\n let out = arg;\n for (const [key, value] of Object.entries(variables)) {\n const token = `%${key}%`;\n out = out.split(token).join(String(value));\n }\n return out;\n });\n}\n", "// lib/v3/handlers/handlerUtils/actHandlerUtils.ts\nimport { Protocol } from \"devtools-protocol\";\nimport { Frame } from \"../../understudy/frame.js\";\nimport { Locator } from \"../../understudy/locator.js\";\nimport { MouseButton } from \"../../types/public/locator.js\";\nimport { resolveLocatorWithHops } from \"../../understudy/deepLocator.js\";\nimport type { Page } from \"../../understudy/page.js\";\nimport { v3Logger } from \"../../logger.js\";\nimport { SessionFileLogger } from \"../../flowLogger.js\";\nimport { StagehandClickError } from \"../../types/public/sdkErrors.js\";\n\nexport class UnderstudyCommandException extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UnderstudyCommandException\";\n }\n}\n\nexport interface UnderstudyMethodHandlerContext {\n method: string;\n locator: Locator;\n xpath: string;\n args: ReadonlyArray<string>;\n frame: Frame;\n page: Page;\n initialUrl: string;\n domSettleTimeoutMs?: number;\n}\n\n// Normalize cases where the XPath is the root \"/\" to point to the HTML element.\nfunction normalizeRootXPath(input: string): string {\n const s = String(input ?? \"\").trim();\n if (s === \"/\") return \"/html\";\n if (/^xpath=\\/$/i.test(s)) return \"xpath=/html\";\n return s;\n}\n\nexport async function performUnderstudyMethod(\n page: Page,\n frame: Frame,\n method: string,\n rawXPath: string,\n args: ReadonlyArray<unknown>,\n domSettleTimeoutMs?: number,\n): Promise<void> {\n const selectorRaw = normalizeRootXPath(rawXPath);\n // Unified resolver: supports '>>' hops and XPath across iframes\n const locator: Locator = await resolveLocatorWithHops(\n page,\n frame,\n selectorRaw,\n );\n\n const initialUrl = await getFrameUrl(frame);\n\n v3Logger({\n category: \"action\",\n message: \"performing understudy method\",\n level: 2,\n auxiliary: {\n xpath: { value: selectorRaw, type: \"string\" },\n method: { value: method, type: \"string\" },\n url: { value: initialUrl, type: \"string\" },\n },\n });\n\n const ctx: UnderstudyMethodHandlerContext = {\n method,\n locator,\n xpath: selectorRaw,\n args: args.map((a) => (a == null ? \"\" : String(a))),\n frame,\n page,\n initialUrl,\n domSettleTimeoutMs,\n };\n\n SessionFileLogger.logUnderstudyActionEvent({\n actionType: `Understudy.${method}`,\n target: selectorRaw,\n args: Array.from(args),\n });\n\n try {\n const handler = METHOD_HANDLER_MAP[method] ?? null;\n\n if (handler) {\n await handler(ctx);\n } else {\n // Accept a few common locator method aliases\n switch (method) {\n case \"click\":\n await clickElement(ctx);\n break;\n case \"fill\":\n await fillOrType(ctx);\n break;\n case \"type\":\n await typeText(ctx);\n break;\n default:\n v3Logger({\n category: \"action\",\n message: \"chosen method is invalid\",\n level: 1,\n auxiliary: { method: { value: method, type: \"string\" } },\n });\n throw new UnderstudyCommandException(\n `Method ${method} not supported`,\n );\n }\n }\n\n await handlePossibleNavigation(\"action\", selectorRaw, initialUrl, frame);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const stack = e instanceof Error ? e.stack : undefined;\n v3Logger({\n category: \"action\",\n message: \"error performing method\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n trace: { value: stack ?? \"\", type: \"string\" },\n method: { value: method, type: \"string\" },\n xpath: { value: selectorRaw, type: \"string\" },\n args: { value: JSON.stringify(args), type: \"object\" },\n },\n });\n throw new UnderstudyCommandException(msg);\n } finally {\n SessionFileLogger.logUnderstudyActionCompleted();\n }\n}\n\n/* ===================== Handlers & Map ===================== */\n\nconst METHOD_HANDLER_MAP: Record<\n string,\n (ctx: UnderstudyMethodHandlerContext) => Promise<void>\n> = {\n scrollIntoView,\n scrollByPixelOffset,\n scrollTo: scrollElementToPercentage,\n scroll: scrollElementToPercentage,\n \"mouse.wheel\": wheelScroll,\n fill: fillOrType,\n type: typeText,\n press: pressKey,\n click: clickElement,\n doubleClick,\n dragAndDrop,\n nextChunk: scrollToNextChunk,\n prevChunk: scrollToPreviousChunk,\n selectOptionFromDropdown: selectOption,\n selectOption: selectOption,\n hover: hover,\n};\n\nexport async function selectOption(ctx: UnderstudyMethodHandlerContext) {\n const { locator, xpath, args } = ctx;\n try {\n const text = args[0]?.toString() || \"\";\n await locator.selectOption(text);\n } catch (e) {\n v3Logger({\n category: \"action\",\n message: \"error selecting option\",\n level: 0,\n auxiliary: {\n error: { value: e.message, type: \"string\" },\n trace: { value: e.stack, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(e.message);\n }\n}\n\nasync function scrollIntoView(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath } = ctx;\n v3Logger({\n category: \"action\",\n message: \"scrolling element into view\",\n level: 2,\n auxiliary: { xpath: { value: xpath, type: \"string\" } },\n });\n const { objectId } = await locator.resolveNode();\n const ownerSession = locator.getFrame().session;\n await ownerSession.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n await ownerSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n}\n\nasync function scrollElementToPercentage(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath, args } = ctx;\n v3Logger({\n category: \"action\",\n message: \"scrolling element vertically to specified percentage\",\n level: 2,\n auxiliary: {\n xpath: { value: xpath, type: \"string\" },\n coordinate: { value: JSON.stringify(args), type: \"string\" },\n },\n });\n\n const [yArg = \"0%\"] = args;\n await locator.scrollTo(yArg);\n}\n\n/** Scroll the page by pixel offset, starting from the element's center. */\nasync function scrollByPixelOffset(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, page, args } = ctx;\n const dx = Number(args[0] ?? 0);\n const dy = Number(args[1] ?? 0);\n\n try {\n const { x, y } = await locator.centroid();\n await page.scroll(x, y, dx, dy);\n } catch (e) {\n throw new UnderstudyCommandException(e.message);\n }\n}\n\nasync function wheelScroll(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { frame, args } = ctx;\n const deltaY = Number(args[0] ?? 200);\n v3Logger({\n category: \"action\",\n message: \"dispatching mouse wheel\",\n level: 2,\n auxiliary: { deltaY: { value: String(deltaY), type: \"string\" } },\n });\n await frame.session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseWheel\",\n x: 0,\n y: 0,\n deltaY,\n deltaX: 0,\n } as Protocol.Input.DispatchMouseEventRequest);\n}\n\nasync function fillOrType(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.fill(\"\"); // clear\n await locator.fill(args[0] ?? \"\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error filling element\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg);\n }\n}\n\nasync function typeText(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.type(args[0] ?? \"\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error typing into element\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg);\n }\n}\n\nasync function pressKey(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { args, xpath, page } = ctx;\n const key = args[0] ?? \"\";\n try {\n v3Logger({\n category: \"action\",\n message: \"pressing key\",\n level: 1,\n auxiliary: {\n key: { value: key, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n await page.keyPress(key);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error pressing key\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n key: { value: key, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg);\n }\n}\n\nasync function clickElement(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.click({ button: (args[0] as MouseButton) || undefined });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing click\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new StagehandClickError(ctx.xpath, msg);\n }\n}\n\nasync function doubleClick(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath } = ctx;\n try {\n await locator.click({ clickCount: 2 });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing doubleClick\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg);\n }\n}\n\nasync function dragAndDrop(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { page, frame, locator, args, xpath } = ctx;\n const toXPath = String(args[0] ?? \"\").trim();\n if (!toXPath)\n throw new UnderstudyCommandException(\n \"dragAndDrop requires a target XPath arg\",\n );\n\n const targetLocator = await resolveLocatorWithHops(page, frame, toXPath);\n\n try {\n // 1) Centers in local (owning-frame) viewport\n const { x: fromLocalX, y: fromLocalY } = await locator.centroid();\n const { x: toLocalX, y: toLocalY } = await targetLocator.centroid();\n\n // 2) Convert to main-viewport absolute coordinates\n const fromAbs = await locator\n .getFrame()\n .evaluate<{ x: number; y: number }, { x: number; y: number }>(\n ({ x, y }: { x: number; y: number }) => {\n let X = x;\n let Y = y;\n let w: Window = window;\n while (w !== w.top) {\n const fe = w.frameElement as HTMLElement | null;\n if (!fe) break;\n const r = fe.getBoundingClientRect();\n X += r.left;\n Y += r.top;\n w = w.parent as Window;\n }\n return { x: Math.round(X), y: Math.round(Y) };\n },\n { x: fromLocalX, y: fromLocalY },\n );\n\n const toAbs = await targetLocator\n .getFrame()\n .evaluate<{ x: number; y: number }, { x: number; y: number }>(\n ({ x, y }: { x: number; y: number }) => {\n let X = x;\n let Y = y;\n let w: Window = window;\n while (w !== w.top) {\n const fe = w.frameElement as HTMLElement | null;\n if (!fe) break;\n const r = fe.getBoundingClientRect();\n X += r.left;\n Y += r.top;\n w = w.parent as Window;\n }\n return { x: Math.round(X), y: Math.round(Y) };\n },\n { x: toLocalX, y: toLocalY },\n );\n\n // 3) Perform drag in main session\n await page.dragAndDrop(fromAbs.x, fromAbs.y, toAbs.x, toAbs.y, {\n steps: 10,\n delay: 5,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing dragAndDrop\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n from: { value: xpath, type: \"string\" },\n to: { value: toXPath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg);\n }\n}\n\nasync function scrollToNextChunk(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n await scrollByElementHeight(ctx, /*dir=*/ 1);\n}\n\nasync function scrollToPreviousChunk(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n await scrollByElementHeight(ctx, /*dir=*/ -1);\n}\n\nasync function scrollByElementHeight(\n ctx: UnderstudyMethodHandlerContext,\n direction: 1 | -1,\n): Promise<void> {\n const { locator, xpath } = ctx;\n v3Logger({\n category: \"action\",\n message:\n direction > 0 ? \"scrolling to next chunk\" : \"scrolling to previous chunk\",\n level: 2,\n auxiliary: { xpath: { value: xpath, type: \"string\" } },\n });\n\n const { objectId } = await locator.resolveNode();\n try {\n const ownerSession = locator.getFrame().session;\n await ownerSession.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: `\n function(dir) {\n const waitForScrollEnd = (el) => new Promise((resolve) => {\n let last = el.scrollTop ?? 0;\n const check = () => {\n const cur = el.scrollTop ?? 0;\n if (cur === last) return resolve();\n last = cur;\n requestAnimationFrame(check);\n };\n requestAnimationFrame(check);\n });\n\n const tag = this.tagName?.toLowerCase();\n if (tag === \"html\" || tag === \"body\") {\n const h = window.visualViewport?.height ?? window.innerHeight;\n window.scrollBy({ top: h * dir, left: 0, behavior: \"smooth\" });\n const root = document.scrollingElement ?? document.documentElement;\n return waitForScrollEnd(root);\n }\n const h = this.getBoundingClientRect().height;\n this.scrollBy({ top: h * dir, left: 0, behavior: \"smooth\" });\n return waitForScrollEnd(this);\n }\n `,\n arguments: [{ value: direction }],\n awaitPromise: true,\n returnByValue: true,\n },\n );\n } finally {\n const ownerSession = locator.getFrame().session;\n await ownerSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n}\n\nexport async function hover(ctx: UnderstudyMethodHandlerContext) {\n const { locator, xpath } = ctx;\n try {\n await locator.hover();\n } catch (e) {\n v3Logger({\n category: \"action\",\n message: \"error attempting to hover\",\n level: 0,\n auxiliary: {\n error: { value: e.message, type: \"string\" },\n trace: { value: e.stack, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(e.message);\n }\n}\n\n/* ===================== Helpers ===================== */\n\nasync function getFrameUrl(frame: Frame): Promise<string> {\n // Evaluate from within the frame's isolated world\n const url = await frame.evaluate<string>(\"location.href\");\n return url;\n}\n\n/**\n * More robust DOM settle using Network + Page events to detect network quiet.\n * Closely modeled after the provided snippet, adapted to our Frame/session + logger.\n */\nexport async function waitForDomNetworkQuiet(\n frame: Frame,\n timeoutMs?: number,\n): Promise<void> {\n const overallTimeout =\n typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs)\n ? Math.max(0, timeoutMs)\n : 5_000;\n const client = frame.session;\n const settleStart = Date.now();\n\n // Ensure a document exists; if not, wait for DOMContentLoaded on this frame.\n let hasDoc: boolean;\n try {\n const rs = await frame.evaluate<string>(\"document.readyState\");\n hasDoc = rs === \"interactive\" || rs === \"complete\";\n } catch {\n hasDoc = false;\n }\n if (!hasDoc && overallTimeout > 0) {\n await frame\n .waitForLoadState(\"domcontentloaded\", overallTimeout)\n .catch(() => {});\n }\n\n const elapsed = Date.now() - settleStart;\n const remainingBudget = Math.max(0, overallTimeout - elapsed);\n if (remainingBudget === 0) {\n return;\n }\n\n await client.send(\"Network.enable\").catch(() => {});\n await client.send(\"Page.enable\").catch(() => {});\n // Best-effort; some sessions may not support Target.setAutoAttach here.\n await client\n .send(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: false,\n flatten: true,\n filter: [\n { type: \"worker\", exclude: true },\n { type: \"shared_worker\", exclude: true },\n ],\n })\n .catch(() => {});\n\n return new Promise<void>((resolve) => {\n const inflight = new Set<string>();\n const meta = new Map<string, { url: string; start: number }>();\n const docByFrame = new Map<string, string>();\n\n let quietTimer: NodeJS.Timeout | null = null;\n let stalledRequestSweepTimer: NodeJS.Timeout | null = null;\n\n const clearQuiet = () => {\n if (quietTimer) {\n clearTimeout(quietTimer);\n quietTimer = null;\n }\n };\n\n const maybeQuiet = () => {\n if (inflight.size === 0 && !quietTimer)\n quietTimer = setTimeout(() => resolveDone(), 500);\n };\n\n const finishReq = (id: string) => {\n if (!inflight.delete(id)) return;\n meta.delete(id);\n for (const [fid, rid] of docByFrame)\n if (rid === id) docByFrame.delete(fid);\n clearQuiet();\n maybeQuiet();\n };\n\n const onRequest = (p: Protocol.Network.RequestWillBeSentEvent) => {\n // Ignore long-lived streams\n // ResourceType includes: Document, XHR, Fetch, WebSocket, EventSource, etc.\n if (p.type === \"WebSocket\" || p.type === \"EventSource\") return;\n\n inflight.add(p.requestId);\n meta.set(p.requestId, { url: p.request.url, start: Date.now() });\n\n if (p.type === \"Document\" && p.frameId)\n docByFrame.set(p.frameId, p.requestId);\n\n clearQuiet();\n };\n\n const onFinish = (p: { requestId: string }) => finishReq(p.requestId);\n const onCached = (p: { requestId: string }) => finishReq(p.requestId);\n const onDataUrl = (p: Protocol.Network.ResponseReceivedEvent) => {\n if (p.response.url?.startsWith(\"data:\")) finishReq(p.requestId);\n };\n\n const onFrameStop = (f: Protocol.Page.FrameStoppedLoadingEvent) => {\n const id = docByFrame.get(f.frameId);\n if (id) finishReq(id);\n };\n\n client.on(\"Network.requestWillBeSent\", onRequest);\n client.on(\"Network.loadingFinished\", onFinish);\n client.on(\"Network.loadingFailed\", onFinish);\n client.on(\"Network.requestServedFromCache\", onCached);\n client.on(\"Network.responseReceived\", onDataUrl);\n client.on(\"Page.frameStoppedLoading\", onFrameStop);\n\n stalledRequestSweepTimer = setInterval(() => {\n const now = Date.now();\n for (const [id, m] of meta) {\n if (now - m.start > 2_000) {\n inflight.delete(id);\n meta.delete(id);\n v3Logger({\n category: \"dom\",\n message: \"\u23F3 forcing completion of stalled iframe document\",\n level: 1,\n auxiliary: {\n url: { value: (m.url ?? \"\").slice(0, 120), type: \"string\" },\n },\n });\n }\n }\n maybeQuiet();\n }, 500);\n\n maybeQuiet();\n\n const guard = setTimeout(() => {\n if (inflight.size) {\n v3Logger({\n category: \"dom\",\n message:\n \"\u26A0\uFE0F DOM-settle timeout reached \u2013 network requests still pending\",\n level: 1,\n auxiliary: {\n count: { value: String(inflight.size), type: \"integer\" },\n },\n });\n }\n resolveDone();\n }, remainingBudget);\n\n const resolveDone = () => {\n client.off(\"Network.requestWillBeSent\", onRequest);\n client.off(\"Network.loadingFinished\", onFinish);\n client.off(\"Network.loadingFailed\", onFinish);\n client.off(\"Network.requestServedFromCache\", onCached);\n client.off(\"Network.responseReceived\", onDataUrl);\n client.off(\"Page.frameStoppedLoading\", onFrameStop);\n if (quietTimer) clearTimeout(quietTimer);\n if (stalledRequestSweepTimer) clearInterval(stalledRequestSweepTimer);\n clearTimeout(guard);\n resolve();\n };\n });\n}\n\nasync function handlePossibleNavigation(\n actionDescription: string,\n xpath: string,\n initialUrl: string,\n frame: Frame,\n): Promise<void> {\n v3Logger({\n category: \"action\",\n message: `${actionDescription}, checking for page navigation`,\n level: 1,\n auxiliary: { xpath: { value: xpath, type: \"string\" } },\n });\n\n // We only have a frame-scoped session, so detect navigation by URL change.\n const afterUrl = await getFrameUrl(frame);\n\n if (afterUrl !== initialUrl) {\n v3Logger({\n category: \"action\",\n message: \"new page (frame) URL detected\",\n level: 1,\n auxiliary: { url: { value: afterUrl, type: \"string\" } },\n });\n } else {\n v3Logger({\n category: \"action\",\n message: \"no new (frame) URL detected\",\n level: 1,\n auxiliary: { url: { value: afterUrl, type: \"string\" } },\n });\n }\n}\n", "import { TimeoutError } from \"../../types/public/sdkErrors.js\";\n\nexport type TimeoutGuard = () => void;\n\nexport function createTimeoutGuard(\n timeoutMs?: number,\n errorFactory?: (timeoutMs: number) => Error,\n): TimeoutGuard {\n if (!timeoutMs || timeoutMs <= 0) {\n return () => {};\n }\n\n const startTime = Date.now();\n return () => {\n if (Date.now() - startTime >= timeoutMs) {\n const err =\n errorFactory?.(timeoutMs) ?? new TimeoutError(\"operation\", timeoutMs);\n throw err;\n }\n };\n}\n", "// lib/v3/handlers/extractHandler.ts\nimport { extract as runExtract } from \"../../inference.js\";\nimport {\n getZFactory,\n getZodType,\n injectUrls,\n transformSchema,\n} from \"../../utils.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { V3FunctionName } from \"../types/public/methods.js\";\nimport { captureHybridSnapshot } from \"../understudy/a11y/snapshot/index.js\";\nimport type { ZodTypeAny } from \"zod\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { ExtractHandlerParams } from \"../types/private/handlers.js\";\nimport { EncodedId, ZodPathSegments } from \"../types/private/internal.js\";\nimport {\n defaultExtractSchema,\n pageTextSchema,\n} from \"../types/public/methods.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n} from \"../types/public/model.js\";\nimport {\n StagehandInvalidArgumentError,\n ExtractTimeoutError,\n} from \"../types/public/sdkErrors.js\";\nimport { createTimeoutGuard } from \"./handlerUtils/timeoutGuard.js\";\nimport type {\n InferStagehandSchema,\n StagehandZodObject,\n StagehandZodSchema,\n} from \"../zodCompat.js\";\n\n/**\n * Scans the provided Zod schema for any `z.string().url()` fields and\n * replaces them with `z.number()`.\n *\n * @param schema - The Zod object schema to transform.\n * @returns A tuple containing:\n * 1. The transformed schema (or the original schema if no changes were needed).\n * 2. An array of {@link ZodPathSegments} objects representing all the replaced URL fields,\n * with each path segment showing where in the schema the replacement occurred.\n */\nexport function transformUrlStringsToNumericIds<T extends StagehandZodSchema>(\n schema: T,\n): [StagehandZodSchema, ZodPathSegments[]] {\n const [finalSchema, urlPaths] = transformSchema(schema, []);\n return [finalSchema, urlPaths];\n}\n\ninterface ExtractionResponseBase {\n metadata: { completed: boolean };\n prompt_tokens: number;\n completion_tokens: number;\n reasoning_tokens: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n}\n\ntype ExtractionResponse<T extends StagehandZodObject> = ExtractionResponseBase &\n InferStagehandSchema<T>;\n\nexport class ExtractHandler {\n private readonly llmClient: LLMClient;\n private readonly defaultModelName: AvailableModel;\n private readonly defaultClientOptions: ClientOptions;\n private readonly resolveLlmClient: (model?: ModelConfiguration) => LLMClient;\n private readonly systemPrompt: string;\n private readonly logInferenceToFile: boolean;\n private readonly experimental: boolean;\n private readonly onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n\n constructor(\n llmClient: LLMClient,\n defaultModelName: AvailableModel,\n defaultClientOptions: ClientOptions,\n resolveLlmClient: (model?: ModelConfiguration) => LLMClient,\n systemPrompt?: string,\n logInferenceToFile?: boolean,\n experimental?: boolean,\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void,\n ) {\n this.llmClient = llmClient;\n this.defaultModelName = defaultModelName;\n this.defaultClientOptions = defaultClientOptions;\n this.resolveLlmClient = resolveLlmClient;\n this.systemPrompt = systemPrompt ?? \"\";\n this.logInferenceToFile = logInferenceToFile ?? false;\n this.experimental = experimental ?? false;\n this.onMetrics = onMetrics;\n }\n\n async extract<T extends StagehandZodSchema>(\n params: ExtractHandlerParams<T>,\n ): Promise<InferStagehandSchema<T> | { pageText: string }> {\n const { instruction, schema, page, selector, timeout, model } = params;\n\n const llmClient = this.resolveLlmClient(model);\n\n const effectiveTimeoutMs =\n typeof timeout === \"number\" && timeout > 0 ? timeout : undefined;\n const ensureTimeRemaining = createTimeoutGuard(\n effectiveTimeoutMs,\n (ms) => new ExtractTimeoutError(ms),\n );\n\n // No-args \u2192 page text (parity with v2)\n const noArgs = !instruction && !schema;\n if (noArgs) {\n const focusSelector = selector?.replace(/^xpath=/i, \"\") ?? \"\";\n ensureTimeRemaining();\n const snap = await captureHybridSnapshot(page, {\n experimental: this.experimental,\n focusSelector: focusSelector || undefined,\n });\n\n const result = { pageText: snap.combinedTree };\n // Validate via the same schema used in v2\n return pageTextSchema.parse(result);\n }\n\n if (!instruction && schema) {\n throw new StagehandInvalidArgumentError(\n \"extract() requires an instruction when a schema is provided.\",\n );\n }\n\n const focusSelector = selector?.replace(/^xpath=/, \"\") ?? \"\";\n\n // Build the hybrid snapshot (includes combinedTree; combinedUrlMap optional)\n ensureTimeRemaining();\n const { combinedTree, combinedUrlMap } = await captureHybridSnapshot(page, {\n experimental: this.experimental,\n focusSelector: focusSelector,\n });\n\n v3Logger({\n category: \"extraction\",\n message: \"Starting extraction using a11y snapshot\",\n level: 1,\n auxiliary: instruction\n ? { instruction: { value: instruction, type: \"string\" } }\n : undefined,\n });\n\n // Normalize schema: if instruction provided without schema, use defaultExtractSchema\n const baseSchema: StagehandZodSchema = (schema ??\n defaultExtractSchema) as StagehandZodSchema;\n // Ensure we pass an object schema into inference; wrap non-object schemas\n const isObjectSchema = getZodType(baseSchema) === \"object\";\n const WRAP_KEY = \"value\" as const;\n const factory = getZFactory(baseSchema);\n const objectSchema: StagehandZodObject = isObjectSchema\n ? (baseSchema as StagehandZodObject)\n : (factory.object({\n [WRAP_KEY]: baseSchema as ZodTypeAny,\n }) as StagehandZodObject);\n\n const [transformedSchema, urlFieldPaths] =\n transformUrlStringsToNumericIds(objectSchema);\n\n ensureTimeRemaining();\n const extractionResponse: ExtractionResponse<StagehandZodObject> =\n await runExtract<StagehandZodObject>({\n instruction,\n domElements: combinedTree,\n schema: transformedSchema as StagehandZodObject,\n llmClient,\n userProvidedInstructions: this.systemPrompt,\n logger: v3Logger,\n logInferenceToFile: this.logInferenceToFile,\n });\n\n const {\n metadata: { completed },\n prompt_tokens,\n completion_tokens,\n reasoning_tokens = 0,\n cached_input_tokens = 0,\n inference_time_ms,\n ...rest\n } = extractionResponse;\n let output = rest as InferStagehandSchema<StagehandZodObject>;\n\n // Update EXTRACT metrics from the LLM calls\n this.onMetrics?.(\n V3FunctionName.EXTRACT,\n prompt_tokens,\n completion_tokens,\n reasoning_tokens,\n cached_input_tokens,\n inference_time_ms,\n );\n\n // Re-inject URLs for any url() fields we temporarily converted to number()\n const idToUrl: Record<EncodedId, string> = (combinedUrlMap ?? {}) as Record<\n EncodedId,\n string\n >;\n for (const { segments } of urlFieldPaths) {\n injectUrls(\n output as Record<string, unknown>,\n segments,\n idToUrl as unknown as Record<string, string>,\n );\n }\n // If we wrapped a non-object schema, unwrap the value\n if (!isObjectSchema && output && typeof output === \"object\") {\n output = (output as Record<string, unknown>)[WRAP_KEY];\n }\n\n const resultPreviewLength = 200;\n const resultString = JSON.stringify(output) ?? \"undefined\";\n const resultPreview =\n resultString.length > resultPreviewLength\n ? resultString.slice(0, resultPreviewLength) + \"...\"\n : resultString;\n\n v3Logger({\n category: \"extraction\",\n message: completed\n ? \"Extraction completed successfully\"\n : \"Extraction incomplete after processing all data\",\n level: 1,\n auxiliary: {\n prompt_tokens: { value: String(prompt_tokens), type: \"string\" },\n completion_tokens: { value: String(completion_tokens), type: \"string\" },\n inference_time_ms: {\n value: String(inference_time_ms),\n type: \"string\",\n },\n result: { value: resultPreview, type: \"string\" },\n },\n });\n\n return output as InferStagehandSchema<T>;\n }\n}\n", "// lib/v3/handlers/observeHandler.ts\nimport { observe as runObserve } from \"../../inference.js\";\nimport { trimTrailingTextNode } from \"../../utils.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { V3FunctionName } from \"../types/public/methods.js\";\nimport { captureHybridSnapshot } from \"../understudy/a11y/snapshot/index.js\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport {\n ObserveHandlerParams,\n SupportedUnderstudyAction,\n} from \"../types/private/handlers.js\";\nimport { EncodedId } from \"../types/private/internal.js\";\nimport { Action } from \"../types/public/methods.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n} from \"../types/public/model.js\";\nimport { ObserveTimeoutError } from \"../types/public/sdkErrors.js\";\nimport { createTimeoutGuard } from \"./handlerUtils/timeoutGuard.js\";\n\nexport class ObserveHandler {\n private readonly llmClient: LLMClient;\n private readonly defaultModelName: AvailableModel;\n private readonly defaultClientOptions: ClientOptions;\n private readonly resolveLlmClient: (model?: ModelConfiguration) => LLMClient;\n private readonly systemPrompt: string;\n private readonly logInferenceToFile: boolean;\n private readonly experimental: boolean;\n private readonly onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n\n constructor(\n llmClient: LLMClient,\n defaultModelName: AvailableModel,\n defaultClientOptions: ClientOptions,\n resolveLlmClient: (model?: ModelConfiguration) => LLMClient,\n systemPrompt?: string,\n logInferenceToFile?: boolean,\n experimental?: boolean,\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void,\n ) {\n this.llmClient = llmClient;\n this.defaultModelName = defaultModelName;\n this.defaultClientOptions = defaultClientOptions;\n this.resolveLlmClient = resolveLlmClient;\n this.systemPrompt = systemPrompt ?? \"\";\n this.logInferenceToFile = logInferenceToFile ?? false;\n this.experimental = experimental ?? false;\n this.onMetrics = onMetrics;\n }\n\n async observe(params: ObserveHandlerParams): Promise<Action[]> {\n const { instruction, page, timeout, selector, model } = params;\n\n const llmClient = this.resolveLlmClient(model);\n\n const effectiveTimeoutMs =\n typeof timeout === \"number\" && timeout > 0 ? timeout : undefined;\n const ensureTimeRemaining = createTimeoutGuard(\n effectiveTimeoutMs,\n (ms) => new ObserveTimeoutError(ms),\n );\n\n const effectiveInstruction =\n instruction ??\n \"Find elements that can be used for any future actions in the page. These may be navigation links, related pages, section/subsection links, buttons, or other interactive elements. Be comprehensive: if there are multiple elements that may be relevant for future actions, return all of them.\";\n\n v3Logger({\n category: \"observation\",\n message: \"starting observation\",\n level: 1,\n auxiliary: {\n instruction: {\n value: effectiveInstruction,\n type: \"string\",\n },\n },\n });\n\n // Build the hybrid snapshot (a11y-centric text tree + lookup maps)\n const focusSelector = selector?.replace(/^xpath=/i, \"\") ?? \"\";\n ensureTimeRemaining();\n const snapshot = await captureHybridSnapshot(page, {\n experimental: this.experimental,\n focusSelector: focusSelector || undefined,\n });\n\n const combinedTree = snapshot.combinedTree;\n const combinedXpathMap = snapshot.combinedXpathMap ?? {};\n\n v3Logger({\n category: \"observation\",\n message: \"Got accessibility tree data\",\n level: 1,\n });\n\n // Call the LLM to propose actionable elements\n ensureTimeRemaining();\n const observationResponse = await runObserve({\n instruction: effectiveInstruction,\n domElements: combinedTree,\n llmClient,\n userProvidedInstructions: this.systemPrompt,\n logger: v3Logger,\n logInferenceToFile: this.logInferenceToFile,\n supportedActions: Object.values(SupportedUnderstudyAction),\n });\n\n const {\n prompt_tokens = 0,\n completion_tokens = 0,\n reasoning_tokens = 0,\n cached_input_tokens = 0,\n inference_time_ms = 0,\n } = observationResponse;\n\n // Update OBSERVE metrics from the LLM observation call\n this.onMetrics?.(\n V3FunctionName.OBSERVE,\n prompt_tokens,\n completion_tokens,\n reasoning_tokens,\n cached_input_tokens,\n inference_time_ms,\n );\n\n // Map elementIds -> selectors via combinedXpathMap\n const elementsWithSelectors = (\n await Promise.all(\n observationResponse.elements.map(async (element) => {\n const { elementId, ...rest } = element; // rest may or may not have method/arguments\n if (typeof elementId === \"string\" && elementId.includes(\"-\")) {\n const lookUpIndex = elementId as EncodedId;\n const xpath = combinedXpathMap[lookUpIndex];\n const trimmedXpath = trimTrailingTextNode(xpath);\n if (!trimmedXpath) return undefined;\n\n // For dragAndDrop, convert element ID in arguments to xpath (target element)\n let resolvedArgs = rest.arguments;\n if (\n rest.method === \"dragAndDrop\" &&\n Array.isArray(rest.arguments) &&\n rest.arguments.length > 0\n ) {\n const targetArg = rest.arguments[0];\n // Check if argument looks like an element ID (e.g., \"1-67\")\n if (\n typeof targetArg === \"string\" &&\n /^\\d+-\\d+$/.test(targetArg)\n ) {\n const argXpath = combinedXpathMap[targetArg as EncodedId];\n const trimmedArgXpath = trimTrailingTextNode(argXpath);\n if (trimmedArgXpath) {\n resolvedArgs = [\n `xpath=${trimmedArgXpath}`,\n ...rest.arguments.slice(1),\n ];\n } else {\n // Target element lookup failed, filter out this action\n v3Logger({\n category: \"observation\",\n message: \"dragAndDrop target element lookup failed\",\n level: 0,\n auxiliary: {\n targetElementId: { value: targetArg, type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n } else {\n v3Logger({\n category: \"observation\",\n message: \"dragAndDrop target element invalid ID format\",\n level: 0,\n auxiliary: {\n targetElementId: { value: targetArg, type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n }\n\n return {\n ...rest,\n arguments: resolvedArgs,\n selector: `xpath=${trimmedXpath}`,\n } as {\n description: string;\n method?: string;\n arguments?: string[];\n selector: string;\n };\n }\n // shadow-root fallback:\n return {\n description: \"an element inside a shadow DOM\",\n method: \"not-supported\",\n arguments: [],\n selector: \"not-supported\",\n };\n }),\n )\n ).filter(<T>(e: T | undefined): e is T => e !== undefined);\n\n v3Logger({\n category: \"observation\",\n message: \"found elements\",\n level: 1,\n auxiliary: {\n elements: {\n value: JSON.stringify(elementsWithSelectors),\n type: \"object\",\n },\n },\n });\n\n return elementsWithSelectors;\n }\n}\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport const gotoTool = (v3: V3) =>\n tool({\n description: \"Navigate to a specific URL\",\n inputSchema: z.object({\n url: z.string().describe(\"The URL to navigate to\"),\n }),\n execute: async ({ url }) => {\n try {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: goto`,\n level: 1,\n auxiliary: {\n arguments: {\n value: url,\n type: \"string\",\n },\n },\n });\n const page = await v3.context.awaitActivePage();\n await page.goto(url, { waitUntil: \"load\" });\n v3.recordAgentReplayStep({ type: \"goto\", url, waitUntil: \"load\" });\n return { success: true, url };\n } catch (error) {\n return { success: false, error: error?.message ?? String(error) };\n }\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type { Action } from \"../../types/public/methods.js\";\n\nexport const actTool = (v3: V3, executionModel?: string) =>\n tool({\n description:\n \"Perform an action on the page (click, type). Provide a short, specific phrase that mentions the element type.\",\n inputSchema: z.object({\n action: z\n .string()\n .describe(\n 'Describe what to click or type, e.g. \"click the Login button\" or \"type \"John\" into the first name input\"',\n ),\n }),\n execute: async ({ action }) => {\n try {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: act`,\n level: 1,\n auxiliary: {\n arguments: {\n value: action,\n type: \"string\",\n },\n },\n });\n const options = executionModel ? { model: executionModel } : undefined;\n const result = await v3.act(action, options);\n const actions = (result.actions as Action[] | undefined) ?? [];\n v3.recordAgentReplayStep({\n type: \"act\",\n instruction: action,\n actions,\n actionDescription: result.actionDescription,\n message: result.message,\n });\n // Only include playwrightArguments when actions exist\n // (undefined is not valid JSON and breaks AI SDK validation)\n const response: {\n success: boolean;\n action: string;\n playwrightArguments?: Action;\n } = {\n success: result.success ?? true,\n action: result?.actionDescription ?? action,\n };\n if (actions.length > 0) {\n response.playwrightArguments = actions[0];\n }\n return response;\n } catch (error) {\n return { success: false, error: error?.message ?? String(error) };\n }\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport const screenshotTool = (v3: V3) =>\n tool({\n description:\n \"Takes a screenshot (PNG) of the current page. Use this to quickly verify page state.\",\n inputSchema: z.object({}),\n execute: async () => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: screenshot`,\n level: 1,\n });\n const page = await v3.context.awaitActivePage();\n const buffer = await page.screenshot({ fullPage: false });\n const pageUrl = page.url();\n return {\n base64: buffer.toString(\"base64\"),\n timestamp: Date.now(),\n pageUrl,\n };\n },\n toModelOutput: (result) => ({\n type: \"content\",\n value: [{ type: \"media\", mediaType: \"image/png\", data: result.base64 }],\n }),\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type {\n AgentToolMode,\n WaitToolResult,\n ModelOutputContentItem,\n} from \"../../types/public/agent.js\";\nimport { waitAndCaptureScreenshot } from \"../utils/screenshotHandler.js\";\n\nexport const waitTool = (v3: V3, mode?: AgentToolMode) =>\n tool({\n description: \"Wait for a specified time\",\n inputSchema: z.object({\n timeMs: z.number().describe(\"Time in milliseconds\"),\n }),\n execute: async ({ timeMs }): Promise<WaitToolResult> => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: wait`,\n level: 1,\n auxiliary: {\n arguments: {\n value: `Waiting for ${timeMs} milliseconds`,\n type: \"string\",\n },\n },\n });\n await new Promise((resolve) => setTimeout(resolve, timeMs));\n if (timeMs > 0) {\n v3.recordAgentReplayStep({ type: \"wait\", timeMs });\n }\n\n // Take screenshot after wait in hybrid mode for visual feedback\n if (mode === \"hybrid\") {\n const page = await v3.context.awaitActivePage();\n const screenshotBase64 = await waitAndCaptureScreenshot(page, 0);\n return { success: true, waited: timeMs, screenshotBase64 };\n }\n\n return { success: true, waited: timeMs };\n },\n toModelOutput: (result) => {\n const content: ModelOutputContentItem[] = [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n waited: result.waited,\n }),\n },\n ];\n if (result.screenshotBase64) {\n content.push({\n type: \"media\",\n mediaType: \"image/png\",\n data: result.screenshotBase64,\n });\n }\n return { type: \"content\", value: content };\n },\n });\n", "import type { Page } from \"../../understudy/page.js\";\n\n/**\n * Default delay in milliseconds to wait after vision actions before capturing screenshot.\n * Allows the page to settle after interactions.\n */\nconst DEFAULT_DELAY_MS = 500;\n\n/**\n * Waits for the page to settle and captures a screenshot.\n * If the screenshot fails (e.g., page closed, navigation in progress),\n * returns undefined instead of throwing - allowing the action to still succeed.\n *\n * @param page - The page to capture\n * @param delayMs - Delay before capturing (default: 500ms, pass 0 to skip delay)\n */\nexport async function waitAndCaptureScreenshot(\n page: Page,\n delayMs: number = DEFAULT_DELAY_MS,\n): Promise<string | undefined> {\n if (delayMs > 0) {\n await page.waitForTimeout(delayMs);\n }\n\n try {\n const buffer = await page.screenshot({ fullPage: false });\n return buffer.toString(\"base64\");\n } catch {\n return undefined;\n }\n}\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport const navBackTool = (v3: V3) =>\n tool({\n description: \"Navigate back to the previous page\",\n inputSchema: z.object({\n reasoningText: z.string().describe(\"Why you're going back\"),\n }),\n execute: async () => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: navback`,\n level: 1,\n });\n const page = await v3.context.awaitActivePage();\n await page.goBack({ waitUntil: \"domcontentloaded\" });\n v3.recordAgentReplayStep({\n type: \"navback\",\n waitUntil: \"domcontentloaded\",\n });\n return { success: true };\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport const ariaTreeTool = (v3: V3) =>\n tool({\n description:\n \"gets the accessibility (ARIA) hybrid tree text for the current page. use this to understand structure and content.\",\n inputSchema: z.object({}),\n execute: async () => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: ariaTree`,\n level: 1,\n });\n const page = await v3.context.awaitActivePage();\n const { pageText } = (await v3.extract()) as { pageText: string };\n const pageUrl = page.url();\n\n let content = pageText;\n const MAX_TOKENS = 70000; // rough cap, assume ~4 chars per token for conservative truncation\n const estimatedTokens = Math.ceil(content.length / 4);\n if (estimatedTokens > MAX_TOKENS) {\n const maxChars = MAX_TOKENS * 4;\n content =\n content.substring(0, maxChars) +\n \"\\n\\n[CONTENT TRUNCATED: Exceeded 70,000 token limit]\";\n }\n\n return { content, pageUrl };\n },\n toModelOutput: (result) => ({\n type: \"content\",\n value: [{ type: \"text\", text: `Accessibility Tree:\\n${result.content}` }],\n }),\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type { Action } from \"../../types/public/methods.js\";\n\nexport const fillFormTool = (v3: V3, executionModel?: string) =>\n tool({\n description: `\uD83D\uDCDD FORM FILL - MULTI-FIELD INPUT TOOL\\nFor any form with 2+ inputs/textareas. Faster than individual typing.`,\n inputSchema: z.object({\n fields: z\n .array(\n z.object({\n action: z\n .string()\n .describe(\n 'Description of typing action, e.g. \"type foo into the email field\"',\n ),\n value: z.string().describe(\"Text to type into the target\"),\n }),\n )\n .min(1, \"Provide at least one field to fill\"),\n }),\n execute: async ({ fields }) => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: fillForm`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify(fields),\n type: \"object\",\n },\n },\n });\n const instruction = `Return observation results for the following actions: ${fields\n .map((f) => f.action)\n .join(\", \")}`;\n\n const observeOptions = executionModel\n ? { model: executionModel }\n : undefined;\n const observeResults = await v3.observe(instruction, observeOptions);\n\n const completed = [] as unknown[];\n const replayableActions: Action[] = [];\n for (const res of observeResults) {\n const actResult = await v3.act(res);\n completed.push(actResult);\n if (Array.isArray(actResult.actions)) {\n replayableActions.push(...(actResult.actions as Action[]));\n }\n }\n v3.recordAgentReplayStep({\n type: \"fillForm\",\n fields,\n observeResults,\n actions: replayableActions,\n });\n return {\n success: true,\n actions: completed,\n playwrightArguments: replayableActions,\n };\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type {\n ScrollToolResult,\n ScrollVisionToolResult,\n ModelOutputContentItem,\n} from \"../../types/public/agent.js\";\nimport { processCoordinates } from \"../utils/coordinateNormalization.js\";\nimport { waitAndCaptureScreenshot } from \"../utils/screenshotHandler.js\";\n\n/**\n * Simple scroll tool for DOM mode (non-grounding models).\n * No coordinates - scrolls from viewport center.\n */\nexport const scrollTool = (v3: V3) =>\n tool({\n description:\n \"Scroll the page up or down by a percentage of the viewport height. Default is 80%, and what should be typically used for general page scrolling\",\n inputSchema: z.object({\n direction: z.enum([\"up\", \"down\"]),\n percentage: z.number().min(1).max(200).optional(),\n }),\n execute: async ({\n direction,\n percentage = 80,\n }): Promise<ScrollToolResult> => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: scroll`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ direction, percentage }),\n type: \"object\",\n },\n },\n });\n\n const page = await v3.context.awaitActivePage();\n\n const { w, h } = await page.mainFrame().evaluate<{\n w: number;\n h: number;\n }>(\"({ w: window.innerWidth, h: window.innerHeight })\");\n\n const scrollDistance = Math.round((h * percentage) / 100);\n const cx = Math.floor(w / 2);\n const cy = Math.floor(h / 2);\n const deltaY = direction === \"up\" ? -scrollDistance : scrollDistance;\n\n await page.scroll(cx, cy, 0, deltaY);\n\n v3.recordAgentReplayStep({\n type: \"scroll\",\n deltaX: 0,\n deltaY,\n anchor: { x: cx, y: cy },\n });\n\n return {\n success: true,\n message: `Scrolled ${percentage}% ${direction} (${scrollDistance}px)`,\n scrolledPixels: scrollDistance,\n };\n },\n toModelOutput: (result) => {\n return {\n type: \"json\",\n value: {\n success: result.success,\n message: result.message,\n scrolledPixels: result.scrolledPixels,\n },\n };\n },\n });\n\n/**\n * Scroll tool for hybrid mode (grounding models).\n * Supports optional coordinates for scrolling within nested scrollable elements.\n */\nexport const scrollVisionTool = (v3: V3, provider?: string) =>\n tool({\n description: `Scroll the page up or down. For general page scrolling, no coordinates needed. Only provide coordinates when scrolling inside a nested scrollable element (e.g., a dropdown menu, modal with overflow, or scrollable sidebar). Default is 80%, and what should be typically used for general page scrolling`,\n inputSchema: z.object({\n direction: z.enum([\"up\", \"down\"]),\n coordinates: z\n .array(z.number())\n .optional()\n .describe(\n \"Only use coordinates for scrolling inside a nested scrollable element - provide (x, y) within that element\",\n ),\n percentage: z.number().min(1).max(200).optional(),\n }),\n execute: async ({\n direction,\n coordinates,\n percentage = 80,\n }): Promise<ScrollVisionToolResult> => {\n const page = await v3.context.awaitActivePage();\n\n const { w, h } = await page.mainFrame().evaluate<{\n w: number;\n h: number;\n }>(\"({ w: window.innerWidth, h: window.innerHeight })\");\n\n // Process coordinates if provided, otherwise use viewport center\n let cx: number;\n let cy: number;\n if (coordinates) {\n const processed = processCoordinates(\n coordinates[0],\n coordinates[1],\n provider,\n v3,\n );\n cx = processed.x;\n cy = processed.y;\n } else {\n cx = Math.floor(w / 2);\n cy = Math.floor(h / 2);\n }\n\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: scroll`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({\n direction,\n coordinates,\n percentage,\n processed: { cx, cy },\n }),\n type: \"object\",\n },\n },\n });\n\n const scrollDistance = Math.round((h * percentage) / 100);\n const deltaY = direction === \"up\" ? -scrollDistance : scrollDistance;\n\n await page.scroll(cx, cy, 0, deltaY);\n\n const screenshotBase64 = await waitAndCaptureScreenshot(page, 100);\n\n v3.recordAgentReplayStep({\n type: \"scroll\",\n deltaX: 0,\n deltaY,\n anchor: { x: cx, y: cy },\n });\n\n return {\n success: true,\n message: coordinates\n ? `Scrolled ${percentage}% ${direction} at (${cx}, ${cy})`\n : `Scrolled ${percentage}% ${direction}`,\n scrolledPixels: scrollDistance,\n screenshotBase64,\n };\n },\n toModelOutput: (result) => {\n const content: ModelOutputContentItem[] = [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n message: result.message,\n scrolledPixels: result.scrolledPixels,\n }),\n },\n ];\n if (result.screenshotBase64) {\n content.push({\n type: \"media\",\n mediaType: \"image/png\",\n data: result.screenshotBase64,\n });\n }\n return { type: \"content\", value: content };\n },\n });\n", "import type { V3 } from \"../../v3.js\";\n\n// Default viewport for advancedStealth mode\nconst STEALTH_VIEWPORT = { width: 1288, height: 711 };\n\nexport function isGoogleProvider(provider?: string): boolean {\n if (!provider) return false;\n return provider.toLowerCase().includes(\"google\");\n}\n\n// Google returns coordinates in a 0-1000 range, we need to normalize\n// them to the viewport dimensions\nexport function normalizeGoogleCoordinates(\n x: number,\n y: number,\n viewport: { width: number; height: number },\n): { x: number; y: number } {\n const clampedX = Math.min(999, Math.max(0, x));\n const clampedY = Math.min(999, Math.max(0, y));\n return {\n x: Math.floor((clampedX / 1000) * viewport.width),\n y: Math.floor((clampedY / 1000) * viewport.height),\n };\n}\n\nexport function processCoordinates(\n x: number,\n y: number,\n provider?: string,\n v3?: V3,\n): { x: number; y: number } {\n if (isGoogleProvider(provider) && v3) {\n // advancedStealth uses fixed viewport, otherwise use configured viewport\n const viewport = v3.isAdvancedStealth\n ? STEALTH_VIEWPORT\n : v3.configuredViewport;\n return normalizeGoogleCoordinates(x, y, viewport);\n }\n return { x, y };\n}\n", "import { tool } from \"ai\";\nimport { z, ZodTypeAny } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\ninterface JsonSchema {\n type?: string;\n properties?: Record<string, JsonSchema>;\n items?: JsonSchema;\n enum?: string[];\n format?: \"url\" | \"email\" | \"uuid\";\n}\n\nfunction jsonSchemaToZod(schema: JsonSchema): ZodTypeAny {\n switch (schema.type) {\n case \"object\": {\n const shape: Record<string, ZodTypeAny> = {};\n if (schema.properties) {\n for (const [key, value] of Object.entries(schema.properties)) {\n shape[key] = jsonSchemaToZod(value);\n }\n }\n return z.object(shape);\n }\n case \"array\":\n return z.array(schema.items ? jsonSchemaToZod(schema.items) : z.any());\n case \"string\": {\n let s = z.string();\n if (schema.format === \"url\") s = s.url();\n if (schema.format === \"email\") s = s.email();\n if (schema.format === \"uuid\") s = s.uuid();\n if (schema.enum && schema.enum.length > 0)\n return z.enum(schema.enum as [string, ...string[]]);\n return s;\n }\n case \"number\":\n case \"integer\":\n return z.number();\n case \"boolean\":\n return z.boolean();\n case \"null\":\n return z.null();\n default:\n return z.any();\n }\n}\n\nexport const extractTool = (v3: V3, executionModel?: string) =>\n tool({\n description: `Extract structured data from the current page based on a provided schema.\n \n USAGE GUIDELINES:\n - Keep schemas MINIMAL - only include fields essential for the task\n - IMPORTANT: only use this if explicitly asked for structured output. In most scenarios, you should use the aria tree tool over this.\n - For URL fields, use format: \"url\"\n \n EXAMPLES:\n 1. Extract a single value:\n instruction: \"extract the product price\"\n schema: { type: \"object\", properties: { price: { type: \"number\" } } }\n \n 2. Extract multiple fields:\n instruction: \"extract product name and price\"\n schema: { type: \"object\", properties: { name: { type: \"string\" }, price: { type: \"number\" } } }\n \n 3. Extract arrays:\n instruction: \"extract all product names and prices\"\n schema: { type: \"object\", properties: { products: { type: \"array\", items: { type: \"object\", properties: { name: { type: \"string\" }, price: { type: \"number\" } } } } } }\n \n 4. Extract a URL:\n instruction: \"extract the link\"\n schema: { type: \"object\", properties: { url: { type: \"string\", format: \"url\" } } }`,\n inputSchema: z.object({\n instruction: z.string(),\n schema: z\n .object({\n type: z.string().optional(),\n properties: z.record(z.string(), z.unknown()).optional(),\n items: z.unknown().optional(),\n enum: z.array(z.string()).optional(),\n format: z.enum([\"url\", \"email\", \"uuid\"]).optional(),\n })\n .passthrough()\n .optional()\n .describe(\"JSON Schema object describing the structure to extract\"),\n }),\n execute: async ({ instruction, schema }) => {\n try {\n const parsedSchema = schema\n ? jsonSchemaToZod(schema as JsonSchema)\n : undefined;\n const result = await v3.extract(instruction, parsedSchema, {\n ...(executionModel ? { model: executionModel } : {}),\n });\n return { success: true, result };\n } catch (error) {\n const err = error as Error;\n return { success: false, error: err?.message ?? String(error) };\n }\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type { Action } from \"../../types/public/methods.js\";\nimport type {\n ClickToolResult,\n ModelOutputContentItem,\n} from \"../../types/public/agent.js\";\nimport { processCoordinates } from \"../utils/coordinateNormalization.js\";\nimport { ensureXPath } from \"../utils/xpath.js\";\nimport { waitAndCaptureScreenshot } from \"../utils/screenshotHandler.js\";\n\nexport const clickTool = (v3: V3, provider?: string) =>\n tool({\n description:\n \"Click on an element using its coordinates (this is the most reliable way to click on an element, always use this over act, unless the element is not visible in the screenshot, but shown in ariaTree)\",\n inputSchema: z.object({\n describe: z\n .string()\n .describe(\n \"Describe the element to click on in a short, specific phrase that mentions the element type and a good visual description\",\n ),\n coordinates: z\n .array(z.number())\n .describe(\"The (x, y) coordinates to click on\"),\n }),\n execute: async ({ describe, coordinates }): Promise<ClickToolResult> => {\n try {\n const page = await v3.context.awaitActivePage();\n const processed = processCoordinates(\n coordinates[0],\n coordinates[1],\n provider,\n v3,\n );\n\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: click`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ describe }),\n type: \"object\",\n },\n },\n });\n\n // Only request XPath when caching is enabled to avoid unnecessary computation\n const shouldCollectXpath = v3.isAgentReplayActive();\n const xpath = await page.click(processed.x, processed.y, {\n returnXpath: shouldCollectXpath,\n });\n\n const screenshotBase64 = await waitAndCaptureScreenshot(page);\n\n // Record as an \"act\" step with proper Action for deterministic replay (only when caching)\n if (shouldCollectXpath) {\n const normalizedXpath = ensureXPath(xpath);\n if (normalizedXpath) {\n const action: Action = {\n selector: normalizedXpath,\n description: describe,\n method: \"click\",\n arguments: [],\n };\n v3.recordAgentReplayStep({\n type: \"act\",\n instruction: describe,\n actions: [action],\n actionDescription: describe,\n });\n }\n }\n\n return {\n success: true,\n describe,\n coordinates: [processed.x, processed.y],\n screenshotBase64,\n };\n } catch (error) {\n return {\n success: false,\n error: `Error clicking: ${(error as Error).message}`,\n };\n }\n },\n toModelOutput: (result) => {\n if (result.success) {\n const content: ModelOutputContentItem[] = [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n describe: result.describe,\n coordinates: result.coordinates,\n }),\n },\n ];\n if (result.screenshotBase64) {\n content.push({\n type: \"media\",\n mediaType: \"image/png\",\n data: result.screenshotBase64,\n });\n }\n return { type: \"content\", value: content };\n }\n return {\n type: \"content\",\n value: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n error: result.error,\n }),\n },\n ],\n };\n },\n });\n", "/**\n * Utility functions for XPath handling in agent tools.\n */\n\n/**\n * Ensures a value is properly formatted as an XPath selector.\n * Returns null if the value is not a valid string.\n *\n * @param value - The value to normalize as an XPath\n * @returns The normalized XPath string prefixed with \"xpath=\" or null\n */\nexport function ensureXPath(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n return trimmed.startsWith(\"xpath=\") ? trimmed : `xpath=${trimmed}`;\n}\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type { Action } from \"../../types/public/methods.js\";\nimport type {\n TypeToolResult,\n ModelOutputContentItem,\n} from \"../../types/public/agent.js\";\nimport { processCoordinates } from \"../utils/coordinateNormalization.js\";\nimport { ensureXPath } from \"../utils/xpath.js\";\nimport { waitAndCaptureScreenshot } from \"../utils/screenshotHandler.js\";\n\nexport const typeTool = (v3: V3, provider?: string) =>\n tool({\n description:\n \"Type text into an element using its coordinates. This will click the element and then type the text into it (this is the most reliable way to type into an element, always use this over act, unless the element is not visible in the screenshot, but shown in ariaTree)\",\n inputSchema: z.object({\n describe: z\n .string()\n .describe(\n \"Describe the element to type into in a short, specific phrase that mentions the element type and a good visual description\",\n ),\n text: z.string().describe(\"The text to type into the element\"),\n coordinates: z\n .array(z.number())\n .describe(\"The (x, y) coordinates to type into the element\"),\n }),\n execute: async ({\n describe,\n coordinates,\n text,\n }): Promise<TypeToolResult> => {\n try {\n const page = await v3.context.awaitActivePage();\n const processed = processCoordinates(\n coordinates[0],\n coordinates[1],\n provider,\n v3,\n );\n\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: type`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ describe, text }),\n type: \"object\",\n },\n },\n });\n\n // Only request XPath when caching is enabled to avoid unnecessary computation\n const shouldCollectXpath = v3.isAgentReplayActive();\n const xpath = await page.click(processed.x, processed.y, {\n returnXpath: shouldCollectXpath,\n });\n\n await page.type(text);\n\n const screenshotBase64 = await waitAndCaptureScreenshot(page);\n\n // Record as an \"act\" step with proper Action for deterministic replay (only when caching)\n if (shouldCollectXpath) {\n const normalizedXpath = ensureXPath(xpath);\n if (normalizedXpath) {\n const action: Action = {\n selector: normalizedXpath,\n description: describe,\n method: \"type\",\n arguments: [text],\n };\n v3.recordAgentReplayStep({\n type: \"act\",\n instruction: describe,\n actions: [action],\n actionDescription: describe,\n });\n }\n }\n\n return {\n success: true,\n describe,\n text,\n screenshotBase64,\n };\n } catch (error) {\n return {\n success: false,\n error: `Error typing: ${(error as Error).message}`,\n };\n }\n },\n toModelOutput: (result) => {\n if (result.success) {\n const content: ModelOutputContentItem[] = [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n describe: result.describe,\n text: result.text,\n }),\n },\n ];\n if (result.screenshotBase64) {\n content.push({\n type: \"media\",\n mediaType: \"image/png\",\n data: result.screenshotBase64,\n });\n }\n return { type: \"content\", value: content };\n }\n return {\n type: \"content\",\n value: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n error: result.error,\n }),\n },\n ],\n };\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type { Action } from \"../../types/public/methods.js\";\nimport type {\n DragAndDropToolResult,\n ModelOutputContentItem,\n} from \"../../types/public/agent.js\";\nimport { processCoordinates } from \"../utils/coordinateNormalization.js\";\nimport { ensureXPath } from \"../utils/xpath.js\";\nimport { waitAndCaptureScreenshot } from \"../utils/screenshotHandler.js\";\n\nexport const dragAndDropTool = (v3: V3, provider?: string) =>\n tool({\n description:\n \"Drag and drop an element using its coordinates (this is the most reliable way to drag and drop an element, always use this over act, unless the element is not visible in the screenshot, but shown in ariaTree)\",\n inputSchema: z.object({\n describe: z.string().describe(\"Describe the element to drag and drop\"),\n startCoordinates: z\n .array(z.number())\n .describe(\"The (x, y) coordinates to start the drag and drop from\"),\n endCoordinates: z\n .array(z.number())\n .describe(\"The (x, y) coordinates to end the drag and drop at\"),\n }),\n execute: async ({\n describe,\n startCoordinates,\n endCoordinates,\n }): Promise<DragAndDropToolResult> => {\n try {\n const page = await v3.context.awaitActivePage();\n const processedStart = processCoordinates(\n startCoordinates[0],\n startCoordinates[1],\n provider,\n v3,\n );\n const processedEnd = processCoordinates(\n endCoordinates[0],\n endCoordinates[1],\n provider,\n v3,\n );\n\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: dragAndDrop`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({\n describe,\n }),\n type: \"object\",\n },\n },\n });\n\n // Only request XPath when caching is enabled to avoid unnecessary computation\n const shouldCollectXpath = v3.isAgentReplayActive();\n const [fromXpath, toXpath] = await page.dragAndDrop(\n processedStart.x,\n processedStart.y,\n processedEnd.x,\n processedEnd.y,\n { returnXpath: shouldCollectXpath },\n );\n\n const screenshotBase64 = await waitAndCaptureScreenshot(page);\n\n // Record as \"act\" step with proper Action for deterministic replay (only when caching)\n if (shouldCollectXpath) {\n const normalizedFrom = ensureXPath(fromXpath);\n const normalizedTo = ensureXPath(toXpath);\n if (normalizedFrom && normalizedTo) {\n const action: Action = {\n selector: normalizedFrom,\n description: describe,\n method: \"dragAndDrop\",\n arguments: [normalizedTo],\n };\n v3.recordAgentReplayStep({\n type: \"act\",\n instruction: describe,\n actions: [action],\n actionDescription: describe,\n });\n }\n }\n\n return {\n success: true,\n describe,\n screenshotBase64,\n };\n } catch (error) {\n return {\n success: false,\n error: `Error dragging: ${(error as Error).message}`,\n };\n }\n },\n toModelOutput: (result) => {\n if (result.success) {\n const content: ModelOutputContentItem[] = [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n describe: result.describe,\n }),\n },\n ];\n if (result.screenshotBase64) {\n content.push({\n type: \"media\",\n mediaType: \"image/png\",\n data: result.screenshotBase64,\n });\n }\n return { type: \"content\", value: content };\n }\n return {\n type: \"content\",\n value: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n error: result.error,\n }),\n },\n ],\n };\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type { Action } from \"../../types/public/methods.js\";\nimport { processCoordinates } from \"../utils/coordinateNormalization.js\";\nimport { ensureXPath } from \"../utils/xpath.js\";\n\nexport const clickAndHoldTool = (v3: V3, provider?: string) =>\n tool({\n description: \"Click and hold on an element using its coordinates\",\n inputSchema: z.object({\n describe: z\n .string()\n .describe(\n \"Describe the element to click on in a short, specific phrase that mentions the element type and a good visual description\",\n ),\n duration: z\n .number()\n .describe(\"The duration to hold the element in milliseconds\"),\n coordinates: z\n .array(z.number())\n .describe(\"The (x, y) coordinates to click on\"),\n }),\n execute: async ({ describe, coordinates, duration }) => {\n try {\n const page = await v3.context.awaitActivePage();\n const processed = processCoordinates(\n coordinates[0],\n coordinates[1],\n provider,\n v3,\n );\n\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: clickAndHold`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({\n describe,\n duration,\n }),\n type: \"object\",\n },\n },\n });\n\n // Only request XPath when caching is enabled to avoid unnecessary computation\n const shouldCollectXpath = v3.isAgentReplayActive();\n\n // Use dragAndDrop from same point to same point with delay to simulate click and hold\n const [xpath] = await page.dragAndDrop(\n processed.x,\n processed.y,\n processed.x,\n processed.y,\n { delay: duration, returnXpath: shouldCollectXpath },\n );\n\n // Record as \"act\" step with proper Action for deterministic replay (only when caching)\n if (shouldCollectXpath) {\n const normalizedXpath = ensureXPath(xpath);\n if (normalizedXpath) {\n const action: Action = {\n selector: normalizedXpath,\n description: describe,\n method: \"clickAndHold\",\n arguments: [String(duration)],\n };\n v3.recordAgentReplayStep({\n type: \"act\",\n instruction: describe,\n actions: [action],\n actionDescription: describe,\n });\n }\n }\n\n return { success: true, describe };\n } catch (error) {\n return {\n success: false,\n error: `Error clicking and holding: ${(error as Error).message}`,\n };\n }\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport const keysTool = (v3: V3) =>\n tool({\n description: `Send keyboard input to the page without targeting a specific element. Unlike the type tool which clicks then types into coordinates, this sends keystrokes directly to wherever focus currently is.\n\nUse method=\"type\" to enter text into the currently focused element. Preferred when: input is already focused, text needs to flow across multiple fields (e.g., verification codes)\n\nUse method=\"press\" for navigation keys (Enter, Tab, Escape, Backspace, arrows) and keyboard shortcuts (Cmd+A, Ctrl+C, Shift+Tab).`,\n inputSchema: z.object({\n method: z.enum([\"press\", \"type\"]),\n value: z\n .string()\n .describe(\n \"The text to type, or the key/combo to press (Enter, Tab, Cmd+A)\",\n ),\n repeat: z.number().optional(),\n }),\n execute: async ({ method, value, repeat }) => {\n try {\n const page = await v3.context.awaitActivePage();\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: keys`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ method, value, repeat }),\n type: \"object\",\n },\n },\n });\n\n const times = Math.max(1, repeat ?? 1);\n\n if (method === \"type\") {\n for (let i = 0; i < times; i++) {\n await page.type(value, { delay: 100 });\n }\n v3.recordAgentReplayStep({\n type: \"keys\",\n instruction: `type \"${value}\"`,\n playwrightArguments: { method, text: value, times },\n });\n return { success: true, method, value, times };\n }\n\n if (method === \"press\") {\n for (let i = 0; i < times; i++) {\n await page.keyPress(value, { delay: 100 });\n }\n v3.recordAgentReplayStep({\n type: \"keys\",\n instruction: `press ${value}`,\n playwrightArguments: { method, keys: value, times },\n });\n return { success: true, method, value, times };\n }\n\n return { success: false, error: `Unsupported method: ${method}` };\n } catch (error) {\n return { success: false, error: (error as Error).message };\n }\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\nimport type { Action } from \"../../types/public/methods.js\";\nimport type {\n FillFormVisionToolResult,\n ModelOutputContentItem,\n} from \"../../types/public/agent.js\";\nimport { processCoordinates } from \"../utils/coordinateNormalization.js\";\nimport { ensureXPath } from \"../utils/xpath.js\";\nimport { waitAndCaptureScreenshot } from \"../utils/screenshotHandler.js\";\n\nexport const fillFormVisionTool = (v3: V3, provider?: string) =>\n tool({\n description: `FORM FILL - SPECIALIZED MULTI-FIELD INPUT TOOL\n\nCRITICAL: Use this for ANY form with 2+ input fields (text inputs, textareas, etc.)\nIMPORTANT: Ensure the fields are visible within the current viewport\n\nWHY THIS TOOL EXISTS:\n- Forms are the #1 use case for multi-field input\n- Optimized specifically for input/textarea elements\n- 4-6x faster than individual typing actions\n\nUse fillFormVision: Pure form filling (inputs, textareas only)\nMANDATORY USE CASES (always use fillFormVision for these):\n- Registration forms: name, email, password fields\n- Contact forms: name, email, message fields\n- Checkout forms: address, payment info fields\n- Profile updates: multiple user data fields\n- Search filters: multiple criteria inputs`,\n inputSchema: z.object({\n fields: z\n .array(\n z.object({\n action: z\n .string()\n .describe(\n \"Description of the typing action, e.g. 'type foo into the bar field'\",\n ),\n value: z.string().describe(\"Text to type into the target field\"),\n coordinates: z\n .object({\n x: z.number(),\n y: z.number(),\n })\n .describe(\"Coordinates of the target field\"),\n }),\n )\n .min(2, \"Provide at least two fields to fill\"),\n }),\n execute: async ({ fields }): Promise<FillFormVisionToolResult> => {\n try {\n const page = await v3.context.awaitActivePage();\n\n // Process coordinates for each field\n const processedFields = fields.map((field) => {\n const processed = processCoordinates(\n field.coordinates.x,\n field.coordinates.y,\n provider,\n v3,\n );\n return {\n ...field,\n coordinates: { x: processed.x, y: processed.y },\n };\n });\n\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: fillFormVision`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ fields, processedFields }),\n type: \"object\",\n },\n },\n });\n\n // Only request XPath when caching is enabled to avoid unnecessary computation\n const shouldCollectXpath = v3.isAgentReplayActive();\n const actions: Action[] = [];\n\n for (const field of processedFields) {\n // Click the field, only requesting XPath when caching is enabled\n const xpath = await page.click(\n field.coordinates.x,\n field.coordinates.y,\n {\n returnXpath: shouldCollectXpath,\n },\n );\n await page.type(field.value);\n\n // Build Action with XPath for deterministic replay (only when caching)\n if (shouldCollectXpath) {\n const normalizedXpath = ensureXPath(xpath);\n if (normalizedXpath) {\n actions.push({\n selector: normalizedXpath,\n description: field.action,\n method: \"type\",\n arguments: [field.value],\n });\n }\n }\n\n // Small delay between fields\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n const screenshotBase64 = await waitAndCaptureScreenshot(page, 100);\n\n // Record as \"act\" step with proper Actions for deterministic replay (only when caching)\n if (shouldCollectXpath && actions.length > 0) {\n v3.recordAgentReplayStep({\n type: \"act\",\n instruction: `Fill ${fields.length} form fields`,\n actions,\n actionDescription: `Fill ${fields.length} form fields`,\n });\n }\n\n return {\n success: true,\n playwrightArguments: processedFields,\n screenshotBase64,\n };\n } catch (error) {\n return {\n success: false,\n error: `Error filling form: ${(error as Error).message}`,\n };\n }\n },\n toModelOutput: (result) => {\n if (result.success) {\n const content: ModelOutputContentItem[] = [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n fieldsCount: result.playwrightArguments?.length ?? 0,\n }),\n },\n ];\n if (result.screenshotBase64) {\n content.push({\n type: \"media\",\n mediaType: \"image/png\",\n data: result.screenshotBase64,\n });\n }\n return { type: \"content\", value: content };\n }\n return {\n type: \"content\",\n value: [\n {\n type: \"text\",\n text: JSON.stringify({\n success: result.success,\n error: result.error,\n }),\n },\n ],\n };\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\n\nexport const thinkTool = () =>\n tool({\n description: `Use this tool to think through complex problems or plan a sequence of steps. This is for internal reasoning only and doesn't perform any actions. Use this to:\n\n1. Plan a multi-step approach before taking action\n2. Break down complex tasks\n3. Reason through edge cases\n4. Evaluate options when you're unsure what to do next\n\nThe output is only visible to you; use it to track your own reasoning process.`,\n inputSchema: z.object({\n reasoning: z\n .string()\n .describe(\n \"Your step-by-step reasoning or planning process. Be as detailed as needed.\",\n ),\n }),\n execute: async ({ reasoning }) => {\n return {\n acknowledged: true,\n message: reasoning,\n };\n },\n });\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport interface BraveSearchResult {\n title: string;\n url: string;\n description?: string;\n}\n\ninterface SearchResponse {\n data?: {\n results: BraveSearchResult[];\n };\n error?: string;\n}\n\ninterface BraveWebResult {\n title?: string;\n url?: string;\n description?: string;\n age?: string;\n meta_url?: {\n favicon?: string;\n };\n}\n\ninterface BraveApiResponse {\n web?: {\n results?: BraveWebResult[];\n };\n}\n\nasync function performBraveSearch(query: string): Promise<SearchResponse> {\n try {\n const encodedQuery = encodeURIComponent(query);\n const response = await fetch(\n `https://api.search.brave.com/res/v1/web/search?q=${encodedQuery}`,\n {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Accept-Encoding\": \"gzip\",\n \"X-Subscription-Token\": process.env.BRAVE_API_KEY!,\n },\n },\n );\n\n if (!response.ok) {\n return {\n error: `Brave API error: ${response.status} ${response.statusText}`,\n data: { results: [] },\n };\n }\n\n const data = (await response.json()) as BraveApiResponse;\n const results: BraveSearchResult[] = [];\n\n if (data?.web?.results && Array.isArray(data.web.results)) {\n for (const item of data.web.results.slice(0, 5)) {\n if (item.title && item.url) {\n results.push({\n title: item.title,\n url: item.url,\n description: item.description,\n });\n }\n }\n }\n\n return { data: { results } };\n } catch (error) {\n console.error(\"Search error\", error);\n return {\n error: `Error performing search: ${(error as Error).message}`,\n data: { results: [] },\n };\n }\n}\n\nexport const searchTool = (v3: V3) =>\n tool({\n description:\n \"Perform a web search and returns results. Use this tool when you need information from the web or when you are unsure of the exact URL you want to navigate to. This can be used to find the ideal entry point, resulting in a task that is easier to complete due to starting further in the process.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query to look for on the web\"),\n }),\n execute: async ({ query }) => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: search`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ query }),\n type: \"object\",\n },\n },\n });\n\n const result = await performBraveSearch(query);\n\n v3.recordAgentReplayStep({\n type: \"search\",\n instruction: query,\n playwrightArguments: { query },\n message:\n result.error ?? `Found ${result.data?.results.length ?? 0} results`,\n });\n\n return {\n ...result,\n timestamp: Date.now(),\n };\n },\n });\n", "import { gotoTool } from \"./goto.js\";\nimport { actTool } from \"./act.js\";\nimport { screenshotTool } from \"./screenshot.js\";\nimport { waitTool } from \"./wait.js\";\nimport { navBackTool } from \"./navback.js\";\nimport { ariaTreeTool } from \"./ariaTree.js\";\nimport { fillFormTool } from \"./fillform.js\";\nimport { scrollTool, scrollVisionTool } from \"./scroll.js\";\nimport { extractTool } from \"./extract.js\";\nimport { clickTool } from \"./click.js\";\nimport { typeTool } from \"./type.js\";\nimport { dragAndDropTool } from \"./dragAndDrop.js\";\nimport { clickAndHoldTool } from \"./clickAndHold.js\";\nimport { keysTool } from \"./keys.js\";\nimport { fillFormVisionTool } from \"./fillFormVision.js\";\nimport { thinkTool } from \"./think.js\";\nimport { searchTool } from \"./search.js\";\n\nimport type { ToolSet, InferUITools } from \"ai\";\nimport type { V3 } from \"../../v3.js\";\nimport type { LogLine } from \"../../types/public/logs.js\";\nimport type { AgentToolMode } from \"../../types/public/agent.js\";\n\nexport interface V3AgentToolOptions {\n executionModel?: string;\n logger?: (message: LogLine) => void;\n /**\n * Tool mode determines which set of tools are available.\n * - 'dom' (default): Uses DOM-based tools (act, fillForm) - removes coordinate-based tools\n * - 'hybrid': Uses coordinate-based tools (click, type, dragAndDrop, etc.) - removes fillForm\n */\n mode?: AgentToolMode;\n /**\n * The model provider. Used for model-specific coordinate handling\n */\n provider?: string;\n /**\n * Tools to exclude from the available toolset.\n * These tools will be filtered out after mode-based filtering.\n */\n excludeTools?: string[];\n}\n\n/**\n * Filters tools based on mode and explicit exclusions.\n * - 'dom' mode: Removes coordinate-based tools (click, type, dragAndDrop, clickAndHold, fillFormVision)\n * - 'hybrid' mode: Removes DOM-based form tool (fillForm) in favor of coordinate-based fillFormVision\n * - excludeTools: Additional tools to remove from the toolset\n */\nfunction filterTools(\n tools: ToolSet,\n mode: AgentToolMode,\n excludeTools?: string[],\n): ToolSet {\n const filtered: ToolSet = { ...tools };\n\n // Mode-based filtering\n if (mode === \"hybrid\") {\n delete filtered.fillForm;\n } else {\n // DOM mode (default)\n delete filtered.click;\n delete filtered.type;\n delete filtered.dragAndDrop;\n delete filtered.clickAndHold;\n delete filtered.fillFormVision;\n }\n\n if (excludeTools) {\n for (const toolName of excludeTools) {\n delete filtered[toolName];\n }\n }\n\n return filtered;\n}\n\nexport function createAgentTools(v3: V3, options?: V3AgentToolOptions) {\n const executionModel = options?.executionModel;\n const mode = options?.mode ?? \"dom\";\n const provider = options?.provider;\n const excludeTools = options?.excludeTools;\n\n const allTools: ToolSet = {\n act: actTool(v3, executionModel),\n ariaTree: ariaTreeTool(v3),\n click: clickTool(v3, provider),\n clickAndHold: clickAndHoldTool(v3, provider),\n dragAndDrop: dragAndDropTool(v3, provider),\n extract: extractTool(v3, executionModel),\n fillForm: fillFormTool(v3, executionModel),\n fillFormVision: fillFormVisionTool(v3, provider),\n goto: gotoTool(v3),\n keys: keysTool(v3),\n navback: navBackTool(v3),\n screenshot: screenshotTool(v3),\n scroll: mode === \"hybrid\" ? scrollVisionTool(v3, provider) : scrollTool(v3),\n think: thinkTool(),\n type: typeTool(v3, provider),\n wait: waitTool(v3, mode),\n };\n\n // Only include search tool if BRAVE_API_KEY is configured\n if (process.env.BRAVE_API_KEY) {\n allTools.search = searchTool(v3);\n }\n\n return filterTools(allTools, mode, excludeTools);\n}\n\nexport type AgentTools = ReturnType<typeof createAgentTools>;\n\n/**\n * Type map of all agent tools for strong typing of tool calls and results.\n * Note: `search` is optional as it's only available when BRAVE_API_KEY is configured.\n */\nexport type AgentToolTypesMap = {\n act: ReturnType<typeof actTool>;\n ariaTree: ReturnType<typeof ariaTreeTool>;\n click: ReturnType<typeof clickTool>;\n clickAndHold: ReturnType<typeof clickAndHoldTool>;\n dragAndDrop: ReturnType<typeof dragAndDropTool>;\n extract: ReturnType<typeof extractTool>;\n fillForm: ReturnType<typeof fillFormTool>;\n fillFormVision: ReturnType<typeof fillFormVisionTool>;\n goto: ReturnType<typeof gotoTool>;\n keys: ReturnType<typeof keysTool>;\n navback: ReturnType<typeof navBackTool>;\n screenshot: ReturnType<typeof screenshotTool>;\n scroll: ReturnType<typeof scrollTool> | ReturnType<typeof scrollVisionTool>;\n search?: ReturnType<typeof searchTool>;\n think: ReturnType<typeof thinkTool>;\n type: ReturnType<typeof typeTool>;\n wait: ReturnType<typeof waitTool>;\n};\n\n/**\n * Inferred UI tools type for type-safe tool inputs and outputs.\n * Use with UIMessage for full type safety in UI contexts.\n */\nexport type AgentUITools = InferUITools<AgentToolTypesMap>;\n\n/**\n * Union type for all possible agent tool calls.\n * Provides type-safe access to tool call arguments.\n */\nexport type AgentToolCall = {\n [K in keyof AgentToolTypesMap]: {\n toolName: K;\n toolCallId: string;\n args: AgentUITools[K][\"input\"];\n };\n}[keyof AgentToolTypesMap];\n\n/**\n * Union type for all possible agent tool results.\n * Provides type-safe access to tool result values.\n */\nexport type AgentToolResult = {\n [K in keyof AgentToolTypesMap]: {\n toolName: K;\n toolCallId: string;\n result: AgentUITools[K][\"output\"];\n };\n}[keyof AgentToolTypesMap];\n", "import type { AgentToolMode } from \"../../types/public/agent.js\";\n\nexport interface AgentSystemPromptOptions {\n url: string;\n executionInstruction: string;\n mode: AgentToolMode;\n systemInstructions?: string;\n /** Whether running on Browserbase (enables captcha solver messaging) */\n isBrowserbase?: boolean;\n /** Tools to exclude from the system prompt */\n excludeTools?: string[];\n}\n\n/**\n * Builds the system prompt for the agent based on the tool mode.\n *\n * @param options - The prompt configuration options\n * @returns The formatted system prompt string\n */\ninterface ToolDefinition {\n name: string;\n description: string;\n}\n\nfunction buildToolsSection(\n isHybridMode: boolean,\n hasSearch: boolean,\n excludeTools?: string[],\n): string {\n const excludeSet = new Set(excludeTools ?? []);\n\n const hybridTools: ToolDefinition[] = [\n {\n name: \"screenshot\",\n description: \"Take a compressed JPEG screenshot for quick visual context\",\n },\n {\n name: \"ariaTree\",\n description:\n \"Get an accessibility (ARIA) hybrid tree for full page context\",\n },\n {\n name: \"click\",\n description:\n \"Click on an element (PREFERRED - more reliable when element is visible in viewport)\",\n },\n {\n name: \"type\",\n description:\n \"Type text into an element (PREFERRED - more reliable when element is visible in viewport)\",\n },\n {\n name: \"act\",\n description:\n \"Perform a specific atomic action (click, type, etc.) - ONLY use when element is in ariaTree but NOT visible in screenshot. Less reliable but can interact with out-of-viewport elements.\",\n },\n { name: \"dragAndDrop\", description: \"Drag and drop an element\" },\n { name: \"clickAndHold\", description: \"Click and hold on an element\" },\n { name: \"keys\", description: \"Press a keyboard key\" },\n {\n name: \"fillFormVision\",\n description: \"Fill out a form using coordinates\",\n },\n { name: \"think\", description: \"Think about the task\" },\n { name: \"extract\", description: \"Extract structured data\" },\n { name: \"goto\", description: \"Navigate to a URL\" },\n { name: \"wait\", description: \"Wait for a specified time\" },\n { name: \"navback\", description: \"Navigate back in browser history\" },\n { name: \"scroll\", description: \"Scroll the page x pixels up or down\" },\n ];\n\n const domTools: ToolDefinition[] = [\n {\n name: \"screenshot\",\n description: \"Take a compressed JPEG screenshot for quick visual context\",\n },\n {\n name: \"ariaTree\",\n description:\n \"Get an accessibility (ARIA) hybrid tree for full page context\",\n },\n {\n name: \"act\",\n description: \"Perform a specific atomic action (click, type)\",\n },\n { name: \"keys\", description: \"Press a keyboard key\" },\n { name: \"fillForm\", description: \"Fill out a form\" },\n { name: \"think\", description: \"Think about the task\" },\n { name: \"extract\", description: \"Extract structured data\" },\n { name: \"goto\", description: \"Navigate to a URL\" },\n { name: \"wait\", description: \"Wait for a specified time\" },\n { name: \"navback\", description: \"Navigate back in browser history\" },\n { name: \"scroll\", description: \"Scroll the page x pixels up or down\" },\n ];\n\n const baseTools = isHybridMode ? hybridTools : domTools;\n\n if (hasSearch) {\n baseTools.push({\n name: \"search\",\n description:\n \"Perform a web search and return results. Prefer this over navigating to Google and searching within the page for reliability and efficiency.\",\n });\n }\n\n const filteredTools = baseTools.filter((tool) => !excludeSet.has(tool.name));\n\n const toolLines = filteredTools\n .map((tool) => ` <tool name=\"${tool.name}\">${tool.description}</tool>`)\n .join(\"\\n\");\n\n return `<tools>\\n${toolLines}\\n </tools>`;\n}\n\nexport function buildAgentSystemPrompt(\n options: AgentSystemPromptOptions,\n): string {\n const {\n url,\n executionInstruction,\n mode,\n systemInstructions,\n isBrowserbase = false,\n excludeTools,\n } = options;\n const localeDate = new Date().toLocaleDateString();\n const isoDate = new Date().toISOString();\n const cdata = (text: string) => `<![CDATA[${text}]]>`;\n\n const isHybridMode = mode === \"hybrid\";\n const hasSearch = Boolean(process.env.BRAVE_API_KEY);\n\n // Tools section differs based on mode and excluded tools\n const toolsSection = buildToolsSection(isHybridMode, hasSearch, excludeTools);\n\n // Strategy differs based on mode\n const strategyItems = isHybridMode\n ? [\n `<item>Tool selection priority: Use specific tools (click, type) when elements are visible in viewport for maximum reliability.</item>`,\n `<item>Always use screenshot to get proper grounding of the coordinates you want to type/click into.</item>`,\n `<item>When interacting with an input, always use the type tool to type into the input, over clicking and then typing into it.</item>`,\n `<item>Use ariaTree as a secondary tool when elements aren't visible in screenshot or to get full page context.</item>`,\n `<item>Only use act when element is in ariaTree but NOT visible in screenshot.</item>`,\n ]\n : [\n `<item>Tool selection priority: Use act tool for all clicking and typing on a page.</item>`,\n `<item>Always check ariaTree first to understand full page content without scrolling - it shows all elements including those below the fold.</item>`,\n `<item>When interacting with an input, always use the act tool to type into the input, over clicking and then typing.</item>`,\n `<item>If an element is present in the ariaTree, use act to interact with it directly - this eliminates the need to scroll.</item>`,\n `<item>Use screenshot for visual confirmation when needed, but rely primarily on ariaTree for element detection.</item>`,\n ];\n\n const strategySection = strategyItems.join(\"\\n \");\n\n const commonStrategyItems = `\n <item>CRITICAL: Use extract ONLY when the task explicitly requires structured data output (e.g., \"get job listings\", \"extract product details\"). For reading page content or understanding elements, always use ${isHybridMode ? \"screenshot or ariaTree\" : \"ariaTree\"} instead - it's faster and more reliable.</item>\n <item>Keep actions atomic and verify outcomes before proceeding.</item>\n <item>For each action, provide clear reasoning about why you're taking that step.</item>\n <item>When you need to input text that could be entered character-by-character or through multiple separate inputs, prefer using the keys tool to type the entire sequence at once. This is more efficient for scenarios like verification codes split across multiple fields, or when virtual keyboards are present but direct typing would be faster.</item>\n `;\n\n // Page understanding protocol differs based on mode\n const pageUnderstandingProtocol = isHybridMode\n ? `<page_understanding_protocol>\n <step_1>\n <title>UNDERSTAND THE PAGE</title>\n <primary_tool>\n <name>screenshot</name>\n <usage>Visual confirmation when needed. Ideally after navigating to a new page.</usage>\n </primary_tool>\n <secondary_tool>\n <name>ariaTree</name>\n <usage>Get complete page context before taking actions</usage>\n <benefit>Eliminates the need to scroll and provides full accessible content</benefit>\n </secondary_tool>\n </step_1>\n </page_understanding_protocol>`\n : `<page_understanding_protocol>\n <step_1>\n <title>UNDERSTAND THE PAGE</title>\n <primary_tool>\n <name>ariaTree</name>\n <usage>Get complete page context before taking actions</usage>\n <benefit>Eliminates the need to scroll and provides full accessible content</benefit>\n </primary_tool>\n <secondary_tool>\n <name>screenshot</name>\n <usage>Visual confirmation when needed. Ideally after navigating to a new page.</usage>\n </secondary_tool>\n </step_1>\n </page_understanding_protocol>`;\n\n // Roadblocks section only shown when running on Browserbase (has captcha solver)\n const roadblocksSection = isBrowserbase\n ? `<roadblocks>\n <note>captchas, popups, etc.</note>\n <captcha>If you see a captcha, use the wait tool. It will automatically be solved by our internal solver.</captcha>\n </roadblocks>`\n : \"\";\n\n // Build customInstructions block only if provided\n const customInstructionsBlock = systemInstructions\n ? `<customInstructions>${cdata(systemInstructions)}</customInstructions>\\n `\n : \"\";\n\n return `<system>\n <identity>You are a web automation assistant using browser automation tools to accomplish the user's goal.</identity>\n ${customInstructionsBlock}<task>\n <goal>${cdata(executionInstruction)}</goal>\n <date display=\"local\" iso=\"${isoDate}\">${localeDate}</date>\n <note>You may think the date is different due to knowledge cutoff, but this is the actual date.</note>\n </task>\n <page>\n <startingUrl>you are starting your task on this url: ${url}</startingUrl>\n </page>\n <mindset>\n <note>Be very intentional about your action. The initial instruction is very important, and slight variations of the actual goal can lead to failures.</note>\n <importantNote>If something fails to meet a single condition of the task, move on from it rather than seeing if it meets other criteria. We only care that it meets all of it</importantNote>\n <note>When the task is complete, do not seek more information; you have completed the task.</note>\n </mindset>\n <guidelines>\n <item>Always start by understanding the current page state</item>\n <item>Use the screenshot tool to verify page state when needed</item>\n <item>Use appropriate tools for each action</item>\n </guidelines>\n ${pageUnderstandingProtocol}\n <navigation>\n <rule>If you are confident in the URL, navigate directly to it.</rule>\n ${hasSearch ? `<rule>If you are not confident in the URL, use the search tool to find it.</rule>` : ``}\n </navigation>\n ${toolsSection}\n <strategy>\n ${strategySection}\n ${commonStrategyItems}\n </strategy>\n ${roadblocksSection}\n <completion>\n <note>When you complete the task, explain any information that was found that was relevant to the original task.</note>\n <examples>\n <example>If you were asked for specific flights, list the flights you found.</example>\n <example>If you were asked for information about a product, list the product information you were asked for.</example>\n </examples>\n </completion>\n</system>`;\n}\n", "import { createAgentTools } from \"../agent/tools/index.js\";\nimport { buildAgentSystemPrompt } from \"../agent/prompts/agentSystemPrompt.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { V3 } from \"../v3.js\";\nimport {\n ModelMessage,\n ToolSet,\n wrapLanguageModel,\n stepCountIs,\n LanguageModel,\n type LanguageModelUsage,\n type StepResult,\n type GenerateTextOnStepFinishCallback,\n type StreamTextOnStepFinishCallback,\n type PrepareStepFunction,\n} from \"ai\";\nimport { StagehandZodObject } from \"../zodCompat.js\";\nimport { processMessages } from \"../agent/utils/messageProcessing.js\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { SessionFileLogger } from \"../flowLogger.js\";\nimport {\n AgentExecuteOptions,\n AgentStreamExecuteOptions,\n AgentExecuteOptionsBase,\n AgentResult,\n AgentContext,\n AgentState,\n AgentStreamResult,\n AgentStreamCallbacks,\n AgentToolMode,\n} from \"../types/public/agent.js\";\nimport { V3FunctionName } from \"../types/public/methods.js\";\nimport { mapToolResultToActions } from \"../agent/utils/actionMapping.js\";\nimport {\n MissingLLMConfigurationError,\n StreamingCallbacksInNonStreamingModeError,\n AgentAbortError,\n} from \"../types/public/sdkErrors.js\";\nimport { handleDoneToolCall } from \"../agent/utils/handleDoneToolCall.js\";\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Prepends a system message with cache control to the messages array.\n * The cache control providerOptions are used by Anthropic and ignored by other providers.\n */\nfunction prependSystemMessage(\n systemPrompt: string,\n messages: ModelMessage[],\n): ModelMessage[] {\n return [\n {\n role: \"system\",\n content: systemPrompt,\n providerOptions: {\n anthropic: {\n cacheControl: { type: \"ephemeral\" },\n },\n },\n },\n ...messages,\n ];\n}\n\nexport class V3AgentHandler {\n private v3: V3;\n private logger: (message: LogLine) => void;\n private llmClient: LLMClient;\n private executionModel?: string;\n private systemInstructions?: string;\n private mcpTools?: ToolSet;\n private mode: AgentToolMode;\n\n constructor(\n v3: V3,\n logger: (message: LogLine) => void,\n llmClient: LLMClient,\n executionModel?: string,\n systemInstructions?: string,\n mcpTools?: ToolSet,\n mode?: AgentToolMode,\n ) {\n this.v3 = v3;\n this.logger = logger;\n this.llmClient = llmClient;\n this.executionModel = executionModel;\n this.systemInstructions = systemInstructions;\n this.mcpTools = mcpTools;\n this.mode = mode ?? \"dom\";\n }\n\n private async prepareAgent(\n instructionOrOptions: string | AgentExecuteOptionsBase,\n ): Promise<AgentContext> {\n try {\n const options =\n typeof instructionOrOptions === \"string\"\n ? { instruction: instructionOrOptions }\n : instructionOrOptions;\n\n const maxSteps = options.maxSteps || 20;\n\n // Get the initial page URL first (needed for the system prompt)\n const initialPageUrl = (await this.v3.context.awaitActivePage()).url();\n\n // Build the system prompt with mode-aware tool guidance\n const systemPrompt = buildAgentSystemPrompt({\n url: initialPageUrl,\n executionInstruction: options.instruction,\n mode: this.mode,\n systemInstructions: this.systemInstructions,\n isBrowserbase: this.v3.isBrowserbase,\n excludeTools: options.excludeTools,\n });\n\n const tools = this.createTools(options.excludeTools);\n const allTools: ToolSet = { ...tools, ...this.mcpTools };\n\n // Use provided messages for continuation, or start fresh with the instruction\n const messages: ModelMessage[] = options.messages?.length\n ? [...options.messages, { role: \"user\", content: options.instruction }]\n : [{ role: \"user\", content: options.instruction }];\n\n if (!this.llmClient?.getLanguageModel) {\n throw new MissingLLMConfigurationError();\n }\n const baseModel = this.llmClient.getLanguageModel();\n //to do - we likely do not need middleware anymore\n const wrappedModel = wrapLanguageModel({\n model: baseModel,\n middleware: {\n ...SessionFileLogger.createLlmLoggingMiddleware(baseModel.modelId),\n },\n });\n\n if (\n this.mode === \"hybrid\" &&\n !baseModel.modelId.includes(\"gemini-3-flash\") &&\n !baseModel.modelId.includes(\"claude\")\n ) {\n this.logger({\n category: \"agent\",\n message: `Warning: \"${baseModel.modelId}\" may not perform well in hybrid mode. See recommended models: https://docs.stagehand.dev/v3/basics/agent#hybrid-mode`,\n level: 0,\n });\n }\n\n return {\n options,\n maxSteps,\n systemPrompt,\n allTools,\n messages,\n wrappedModel,\n initialPageUrl,\n };\n } catch (error) {\n this.logger({\n category: \"agent\",\n message: `failed to prepare agent: ${error}`,\n level: 0,\n });\n throw error;\n }\n }\n private createPrepareStep(\n userCallback?: PrepareStepFunction<ToolSet>,\n ): PrepareStepFunction<ToolSet> {\n return async (options) => {\n processMessages(options.messages);\n if (userCallback) {\n return userCallback(options);\n }\n return options;\n };\n }\n\n private createStepHandler(\n state: AgentState,\n userCallback?:\n | GenerateTextOnStepFinishCallback<ToolSet>\n | StreamTextOnStepFinishCallback<ToolSet>,\n ) {\n return async (event: StepResult<ToolSet>) => {\n this.logger({\n category: \"agent\",\n message: `Step finished: ${event.finishReason}`,\n level: 2,\n });\n\n if (event.toolCalls && event.toolCalls.length > 0) {\n for (let i = 0; i < event.toolCalls.length; i++) {\n const toolCall = event.toolCalls[i];\n const args = toolCall.input;\n const toolResult = event.toolResults?.[i];\n\n if (event.text && event.text.length > 0) {\n state.collectedReasoning.push(event.text);\n this.logger({\n category: \"agent\",\n message: `reasoning: ${event.text}`,\n level: 1,\n });\n }\n\n if (toolCall.toolName === \"done\") {\n state.completed = true;\n if (args?.taskComplete) {\n const doneReasoning = args.reasoning;\n const allReasoning = state.collectedReasoning.join(\" \");\n state.finalMessage = doneReasoning\n ? `${allReasoning} ${doneReasoning}`.trim()\n : allReasoning || \"Task completed successfully\";\n }\n }\n const mappedActions = mapToolResultToActions({\n toolCallName: toolCall.toolName,\n toolResult,\n args,\n reasoning: event.text || undefined,\n });\n\n for (const action of mappedActions) {\n action.pageUrl = state.currentPageUrl;\n action.timestamp = Date.now();\n state.actions.push(action);\n }\n }\n state.currentPageUrl = (await this.v3.context.awaitActivePage()).url();\n\n // Capture screenshot after tool execution (only for evals)\n if (process.env.EVALS === \"true\") {\n try {\n await this.captureAndEmitScreenshot();\n } catch (e) {\n this.logger({\n category: \"agent\",\n message: `Warning: Failed to capture screenshot: ${getErrorMessage(e)}`,\n level: 1,\n });\n }\n }\n }\n\n if (userCallback) {\n await userCallback(event);\n }\n };\n }\n\n public async execute(\n instructionOrOptions: string | AgentExecuteOptions,\n ): Promise<AgentResult> {\n const startTime = Date.now();\n const options =\n typeof instructionOrOptions === \"object\" ? instructionOrOptions : null;\n const signal = options?.signal;\n\n // Highlight cursor defaults to true for hybrid mode, can be overridden\n const shouldHighlightCursor =\n options?.highlightCursor ?? this.mode === \"hybrid\";\n\n const state: AgentState = {\n collectedReasoning: [],\n actions: [],\n finalMessage: \"\",\n completed: false,\n currentPageUrl: \"\",\n };\n\n let messages: ModelMessage[] = [];\n\n try {\n const {\n options: preparedOptions,\n maxSteps,\n systemPrompt,\n allTools,\n messages: preparedMessages,\n wrappedModel,\n initialPageUrl,\n } = await this.prepareAgent(instructionOrOptions);\n\n // Enable cursor overlay for hybrid mode (coordinate-based interactions)\n if (shouldHighlightCursor && this.mode === \"hybrid\") {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay().catch(() => {});\n }\n\n messages = preparedMessages;\n state.currentPageUrl = initialPageUrl;\n\n const callbacks = (instructionOrOptions as AgentExecuteOptions).callbacks;\n\n if (callbacks) {\n const streamingOnlyCallbacks = [\n \"onChunk\",\n \"onFinish\",\n \"onError\",\n \"onAbort\",\n ];\n const invalidCallbacks = streamingOnlyCallbacks.filter(\n (name) => callbacks[name as keyof typeof callbacks] != null,\n );\n if (invalidCallbacks.length > 0) {\n throw new StreamingCallbacksInNonStreamingModeError(invalidCallbacks);\n }\n }\n\n const result = await this.llmClient.generateText({\n model: wrappedModel,\n messages: prependSystemMessage(systemPrompt, messages),\n tools: allTools,\n stopWhen: (result) => this.handleStop(result, maxSteps),\n temperature: 1,\n toolChoice: \"auto\",\n\n prepareStep: this.createPrepareStep(callbacks?.prepareStep),\n onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),\n abortSignal: preparedOptions.signal,\n providerOptions: wrappedModel.modelId.includes(\"gemini-3\")\n ? {\n google: {\n mediaResolution: \"MEDIA_RESOLUTION_HIGH\",\n },\n }\n : undefined,\n });\n\n const allMessages = [...messages, ...(result.response?.messages || [])];\n const doneResult = await this.ensureDone(\n state,\n wrappedModel,\n allMessages,\n preparedOptions.instruction,\n preparedOptions.output,\n this.logger,\n );\n\n return this.consolidateMetricsAndResult(\n startTime,\n state,\n doneResult.messages,\n result,\n maxSteps,\n doneResult.output,\n );\n } catch (error) {\n // Re-throw validation errors that should propagate to the caller\n if (error instanceof StreamingCallbacksInNonStreamingModeError) {\n throw error;\n }\n\n // Re-throw abort errors wrapped in AgentAbortError for consistent error typing\n if (signal?.aborted) {\n const reason = signal.reason ? String(signal.reason) : \"aborted\";\n throw new AgentAbortError(reason);\n }\n\n const errorMessage = getErrorMessage(error);\n this.logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n // For non-abort errors, return a failure result instead of throwing\n return {\n success: false,\n actions: state.actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n messages,\n };\n }\n }\n\n public async stream(\n instructionOrOptions: string | AgentStreamExecuteOptions,\n ): Promise<AgentStreamResult> {\n const streamOptions =\n typeof instructionOrOptions === \"object\" ? instructionOrOptions : null;\n\n // Highlight cursor defaults to true for hybrid mode, can be overridden\n const shouldHighlightCursor =\n streamOptions?.highlightCursor ?? this.mode === \"hybrid\";\n\n const {\n options,\n maxSteps,\n systemPrompt,\n allTools,\n messages,\n wrappedModel,\n initialPageUrl,\n } = await this.prepareAgent(instructionOrOptions);\n\n // Enable cursor overlay for hybrid mode (coordinate-based interactions)\n if (shouldHighlightCursor && this.mode === \"hybrid\") {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay().catch(() => {});\n }\n\n const callbacks = (instructionOrOptions as AgentStreamExecuteOptions)\n .callbacks as AgentStreamCallbacks | undefined;\n\n const state: AgentState = {\n collectedReasoning: [],\n actions: [],\n finalMessage: \"\",\n completed: false,\n currentPageUrl: initialPageUrl,\n };\n const startTime = Date.now();\n\n let resolveResult: (value: AgentResult | PromiseLike<AgentResult>) => void;\n let rejectResult: (reason: unknown) => void;\n const resultPromise = new Promise<AgentResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const handleError = (error: unknown) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger({\n category: \"agent\",\n message: `Error during streaming: ${errorMessage}`,\n level: 0,\n });\n rejectResult(error);\n };\n\n const streamResult = this.llmClient.streamText({\n model: wrappedModel,\n messages: prependSystemMessage(systemPrompt, messages),\n tools: allTools,\n stopWhen: (result) => this.handleStop(result, maxSteps),\n temperature: 1,\n toolChoice: \"auto\",\n prepareStep: this.createPrepareStep(callbacks?.prepareStep),\n onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),\n onError: (event) => {\n if (callbacks?.onError) {\n callbacks.onError(event);\n }\n handleError(event.error);\n },\n onChunk: callbacks?.onChunk,\n onFinish: (event) => {\n if (callbacks?.onFinish) {\n callbacks.onFinish(event);\n }\n\n const allMessages = [...messages, ...(event.response?.messages || [])];\n this.ensureDone(\n state,\n wrappedModel,\n allMessages,\n options.instruction,\n options.output,\n this.logger,\n ).then((doneResult) => {\n const result = this.consolidateMetricsAndResult(\n startTime,\n state,\n doneResult.messages,\n event,\n maxSteps,\n doneResult.output,\n );\n resolveResult(result);\n });\n },\n onAbort: (event) => {\n if (callbacks?.onAbort) {\n callbacks.onAbort(event);\n }\n // Reject the result promise with AgentAbortError when stream is aborted\n const reason = options.signal?.reason\n ? String(options.signal.reason)\n : \"Stream was aborted\";\n rejectResult(new AgentAbortError(reason));\n },\n abortSignal: options.signal,\n providerOptions: wrappedModel.modelId.includes(\"gemini-3\")\n ? {\n google: {\n mediaResolution: \"MEDIA_RESOLUTION_HIGH\",\n },\n }\n : undefined,\n });\n\n const agentStreamResult = streamResult as AgentStreamResult;\n agentStreamResult.result = resultPromise;\n return agentStreamResult;\n }\n\n private consolidateMetricsAndResult(\n startTime: number,\n state: AgentState,\n inputMessages: ModelMessage[],\n result: {\n text?: string;\n totalUsage?: LanguageModelUsage;\n response?: { messages?: ModelMessage[] };\n steps?: StepResult<ToolSet>[];\n },\n maxSteps?: number,\n output?: Record<string, unknown>,\n ): AgentResult {\n if (!state.finalMessage) {\n const allReasoning = state.collectedReasoning.join(\" \").trim();\n\n if (!state.completed && maxSteps && result.steps?.length >= maxSteps) {\n this.logger({\n category: \"agent\",\n message: `Agent stopped: reached maximum steps (${maxSteps})`,\n level: 1,\n });\n state.finalMessage = `Agent stopped: reached maximum steps (${maxSteps})`;\n } else {\n state.finalMessage = allReasoning || result.text || \"\";\n }\n }\n\n const endTime = Date.now();\n const inferenceTimeMs = endTime - startTime;\n if (result.totalUsage) {\n this.v3.updateMetrics(\n V3FunctionName.AGENT,\n result.totalUsage.inputTokens || 0,\n result.totalUsage.outputTokens || 0,\n result.totalUsage.reasoningTokens || 0,\n result.totalUsage.cachedInputTokens || 0,\n inferenceTimeMs,\n );\n }\n\n return {\n success: state.completed,\n message: state.finalMessage || \"Task execution completed\",\n actions: state.actions,\n completed: state.completed,\n output,\n usage: result.totalUsage\n ? {\n input_tokens: result.totalUsage.inputTokens || 0,\n output_tokens: result.totalUsage.outputTokens || 0,\n reasoning_tokens: result.totalUsage.reasoningTokens || 0,\n cached_input_tokens: result.totalUsage.cachedInputTokens || 0,\n inference_time_ms: inferenceTimeMs,\n }\n : undefined,\n messages: inputMessages,\n };\n }\n\n private createTools(excludeTools?: string[]) {\n const provider = this.llmClient?.getLanguageModel?.()?.provider;\n return createAgentTools(this.v3, {\n executionModel: this.executionModel,\n logger: this.logger,\n mode: this.mode,\n provider,\n excludeTools,\n });\n }\n\n private handleStop(\n result: Parameters<ReturnType<typeof stepCountIs>>[0],\n maxSteps: number,\n ): boolean | PromiseLike<boolean> {\n const lastStep = result.steps[result.steps.length - 1];\n if (lastStep?.toolCalls?.some((tc) => tc.toolName === \"done\")) {\n return true;\n }\n return stepCountIs(maxSteps)(result);\n }\n\n /**\n * Ensures the done tool is called at the end of agent execution.\n * Returns the messages and any extracted output from the done call.\n */\n private async ensureDone(\n state: AgentState,\n model: LanguageModel,\n messages: ModelMessage[],\n instruction: string,\n outputSchema?: StagehandZodObject,\n logger?: (message: LogLine) => void,\n ): Promise<{ messages: ModelMessage[]; output?: Record<string, unknown> }> {\n if (state.completed) return { messages };\n\n const doneResult = await handleDoneToolCall({\n model,\n inputMessages: messages,\n instruction,\n outputSchema,\n logger,\n });\n\n state.completed = doneResult.taskComplete;\n state.finalMessage = doneResult.reasoning;\n\n const doneAction = mapToolResultToActions({\n toolCallName: \"done\",\n toolResult: {\n success: true,\n reasoning: doneResult.reasoning,\n taskComplete: doneResult.taskComplete,\n },\n args: {\n reasoning: doneResult.reasoning,\n taskComplete: doneResult.taskComplete,\n },\n reasoning: doneResult.reasoning,\n });\n\n for (const action of doneAction) {\n action.pageUrl = state.currentPageUrl;\n action.timestamp = Date.now();\n state.actions.push(action);\n }\n\n return {\n messages: [...messages, ...doneResult.messages],\n output: doneResult.output,\n };\n }\n\n /**\n * Capture a screenshot and emit it via the event bus\n */\n private async captureAndEmitScreenshot(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n const screenshot = await page.screenshot({ fullPage: false });\n this.v3.bus.emit(\"agent_screenshot_taken_event\", screenshot);\n } catch (error) {\n this.logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${getErrorMessage(error)}`,\n level: 0,\n });\n }\n }\n}\n", "import type { ModelMessage } from \"ai\";\n\n// Vision action tools that include screenshots in their results\nconst VISION_ACTION_TOOLS = [\n \"click\",\n \"type\",\n \"dragAndDrop\",\n \"wait\",\n \"fillFormVision\",\n \"scroll\",\n];\n\nfunction isToolMessage(\n message: unknown,\n): message is { role: \"tool\"; content: unknown[] } {\n return (\n !!message &&\n typeof message === \"object\" &&\n (message as { role?: unknown }).role === \"tool\" &&\n Array.isArray((message as { content?: unknown }).content)\n );\n}\n\nfunction isScreenshotPart(part: unknown): boolean {\n return (\n !!part &&\n typeof part === \"object\" &&\n (part as { toolName?: unknown }).toolName === \"screenshot\"\n );\n}\n\nfunction isVisionActionPart(part: unknown): boolean {\n if (!part || typeof part !== \"object\") return false;\n const toolName = (part as { toolName?: unknown }).toolName;\n return typeof toolName === \"string\" && VISION_ACTION_TOOLS.includes(toolName);\n}\n\nfunction isVisionPart(part: unknown): boolean {\n return isScreenshotPart(part) || isVisionActionPart(part);\n}\n\nfunction isAriaTreePart(part: unknown): boolean {\n return (\n !!part &&\n typeof part === \"object\" &&\n (part as { toolName?: unknown }).toolName === \"ariaTree\"\n );\n}\n\n/**\n * Compress old screenshot/ariaTree data in messages in-place.\n *\n * Strategy:\n * - Keep only the 2 most recent vision results (screenshots OR vision action tools like click/type/etc)\n * - Keep only the 1 most recent ariaTree (replace older ones with placeholder)\n *\n * @param messages - The messages array to modify in-place\n * @returns Number of items compressed\n */\nexport function processMessages(messages: ModelMessage[]): number {\n let compressedCount = 0;\n\n // Find indices of all vision-related tool results (screenshots + vision actions)\n // and ariaTree results\n const visionIndices: number[] = [];\n const ariaTreeIndices: number[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n if (isToolMessage(message)) {\n const content = message.content as unknown[];\n if (content.some(isVisionPart)) {\n visionIndices.push(i);\n }\n if (content.some(isAriaTreePart)) {\n ariaTreeIndices.push(i);\n }\n }\n }\n\n // Compress old vision results (keep 2 most recent across all vision tools)\n if (visionIndices.length > 2) {\n const toCompress = visionIndices.slice(0, visionIndices.length - 2);\n for (const index of toCompress) {\n const message = messages[index];\n if (isToolMessage(message)) {\n // Both functions are safe to call - they only modify their respective part types\n compressScreenshotMessage(message);\n compressVisionActionMessage(message);\n compressedCount++;\n }\n }\n }\n\n // Compress old ariaTree results (keep 1 most recent)\n if (ariaTreeIndices.length > 1) {\n const toCompress = ariaTreeIndices.slice(0, ariaTreeIndices.length - 1);\n for (const idx of toCompress) {\n const message = messages[idx];\n if (isToolMessage(message)) {\n compressAriaTreeMessage(message);\n compressedCount++;\n }\n }\n }\n\n return compressedCount;\n}\n\n/**\n * Tool result part structure from AI SDK.\n * The output field uses a discriminated union - type determines value format:\n * - type: \"content\" -> value: Array<{type: \"text\", ...} | {type: \"media\", ...}>\n * - type: \"text\" -> value: string\n * - type: \"json\" -> value: JSONValue\n * - type: \"error-text\" -> value: string\n * - type: \"error-json\" -> value: JSONValue\n */\ninterface ToolResultPart {\n output?: {\n type: string;\n value?: unknown;\n };\n}\n\n/**\n * Check if output has type \"content\" (array-based value format).\n * Only outputs with type \"content\" should have array values.\n */\nfunction isContentTypeOutput(output: {\n type: string;\n value?: unknown;\n}): boolean {\n return output.type === \"content\";\n}\n\n/**\n * Compress screenshot message content in-place.\n * Only modifies outputs with type \"content\" to maintain schema validity.\n * Replaces entire output object to ensure type/value consistency.\n */\nfunction compressScreenshotMessage(message: {\n role: \"tool\";\n content: unknown[];\n}): void {\n for (const part of message.content) {\n if (isScreenshotPart(part)) {\n const typedPart = part as ToolResultPart;\n // Only compress if output exists and has type \"content\"\n if (typedPart.output && isContentTypeOutput(typedPart.output)) {\n // Replace entire output to ensure type/value consistency\n typedPart.output = {\n type: \"content\",\n value: [{ type: \"text\", text: \"screenshot taken\" }],\n };\n }\n }\n }\n}\n\n/**\n * Compress vision action message content in-place by removing the screenshot\n * but keeping the action result text.\n * Only modifies outputs with type \"content\" to maintain schema validity.\n */\nfunction compressVisionActionMessage(message: {\n role: \"tool\";\n content: unknown[];\n}): void {\n for (const part of message.content) {\n if (isVisionActionPart(part)) {\n const typedPart = part as ToolResultPart;\n\n // Only compress if output is type \"content\" (array-based value)\n if (\n typedPart.output &&\n isContentTypeOutput(typedPart.output) &&\n Array.isArray(typedPart.output.value)\n ) {\n // Filter out media content but keep text results\n const filteredValue = (\n typedPart.output.value as Array<{ type?: string }>\n ).filter(\n (item) => item && typeof item === \"object\" && item.type !== \"media\",\n );\n // Replace entire output to ensure type/value consistency\n typedPart.output = {\n type: \"content\",\n value: filteredValue,\n };\n }\n }\n }\n}\n\n/**\n * Compress ariaTree message content in-place.\n * Only modifies outputs with type \"content\" to maintain schema validity.\n * Replaces entire output object to ensure type/value consistency.\n */\nfunction compressAriaTreeMessage(message: {\n role: \"tool\";\n content: unknown[];\n}): void {\n for (const part of message.content) {\n if (isAriaTreePart(part)) {\n const typedPart = part as ToolResultPart;\n // Only compress if output exists and has type \"content\"\n if (typedPart.output && isContentTypeOutput(typedPart.output)) {\n typedPart.output = {\n type: \"content\",\n value: [\n {\n type: \"text\",\n text: \"ARIA tree extracted for context of page elements\",\n },\n ],\n };\n }\n }\n }\n}\n", "import { AgentAction } from \"../../types/public/agent.js\";\nimport { ActionMappingOptions } from \"../../types/private/agent.js\";\n\n/**\n * Keys to exclude from tool outputs when mapping to actions.\n * These are large data fields that shouldn't be included in the actions array.\n * Users can access this data through result.messages if needed.\n */\nconst EXCLUDED_OUTPUT_KEYS = [\"screenshotBase64\"] as const;\n\n/**\n * Strips excluded keys (like screenshotBase64) from a tool output object.\n */\nfunction stripExcludedKeys(\n output: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(output)) {\n if (\n !EXCLUDED_OUTPUT_KEYS.includes(\n key as (typeof EXCLUDED_OUTPUT_KEYS)[number],\n )\n ) {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function mapToolResultToActions({\n toolCallName,\n toolResult,\n args,\n reasoning,\n}: ActionMappingOptions): AgentAction[] {\n switch (toolCallName) {\n case \"act\":\n return mapActToolResult(toolResult, args, reasoning);\n case \"fillForm\":\n return mapFillFormToolResult(toolResult, args, reasoning);\n default:\n return [createStandardAction(toolCallName, toolResult, args, reasoning)];\n }\n}\n\nfunction mapActToolResult(\n toolResult: unknown,\n args: Record<string, unknown>,\n reasoning?: string,\n): AgentAction[] {\n if (!toolResult || typeof toolResult !== \"object\") {\n return [createStandardAction(\"act\", toolResult, args, reasoning)];\n }\n\n const result = toolResult as Record<string, unknown>;\n\n // AI SDK wraps the tool result in an output property\n const output = (result.output as Record<string, unknown>) || result;\n\n // Extract playwright arguments if they exist\n const action: AgentAction = {\n type: \"act\",\n reasoning,\n taskCompleted: false,\n ...args,\n };\n\n if (output.playwrightArguments) {\n action.playwrightArguments = output.playwrightArguments;\n }\n\n return [action];\n}\n\nfunction mapFillFormToolResult(\n toolResult: unknown,\n args: Record<string, unknown>,\n reasoning?: string,\n): AgentAction[] {\n if (!toolResult || typeof toolResult !== \"object\") {\n return [createStandardAction(\"fillForm\", toolResult, args, reasoning)];\n }\n\n const result = toolResult as Record<string, unknown>;\n\n // AI SDK wraps the tool result in an output property\n const output = (result.output as Record<string, unknown>) || result;\n\n const observeResults = Array.isArray(output?.playwrightArguments)\n ? output.playwrightArguments\n : [];\n\n const actions: AgentAction[] = [];\n\n actions.push({\n type: \"fillForm\",\n reasoning,\n taskCompleted: false,\n ...args,\n });\n\n for (const observeResult of observeResults) {\n actions.push({\n type: \"act\",\n reasoning: \"acting from fillform tool\",\n taskCompleted: false,\n playwrightArguments: observeResult,\n });\n }\n\n return actions;\n}\n\nfunction createStandardAction(\n toolCallName: string,\n toolResult: unknown,\n args: Record<string, unknown>,\n reasoning?: string,\n): AgentAction {\n const action: AgentAction = {\n type: toolCallName,\n reasoning,\n taskCompleted:\n toolCallName === \"done\" ? (args?.taskComplete as boolean) : false,\n ...args,\n };\n\n // For screenshot tool, exclude base64 data and just indicate a screenshot was taken,\n // if somebody really wants the base64 data, they can access it through messages\n if (toolCallName === \"screenshot\") {\n action.result = \"screenshotTaken\";\n return action;\n }\n\n // Spread the output from the tool result if it exists\n // Exclude ariaTree tool result as it is very large and unnecessary\n if (toolCallName !== \"ariaTree\" && toolResult) {\n const result = toolResult as { output?: unknown };\n const output = result.output;\n\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const cleanedOutput = stripExcludedKeys(\n output as Record<string, unknown>,\n );\n Object.assign(action, cleanedOutput);\n }\n }\n\n return action;\n}\n", "import { generateText, ModelMessage, LanguageModel, ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport { tool } from \"ai\";\nimport { LogLine } from \"../../types/public/logs.js\";\nimport { StagehandZodObject } from \"../../zodCompat.js\";\nimport { getZFactory } from \"../../../utils.js\";\nimport type { StagehandZodSchema } from \"../../zodCompat.js\";\n\ninterface DoneResult {\n reasoning: string;\n taskComplete: boolean;\n messages: ModelMessage[];\n output?: Record<string, unknown>;\n}\n\nfunction buildBaseDoneSchema(factory: typeof z) {\n return factory.object({\n reasoning: factory\n .string()\n .describe(\"Brief summary of what actions were taken and the outcome\"),\n taskComplete: factory\n .boolean()\n .describe(\"true if the task was fully completed, false otherwise\"),\n });\n}\n\n/**\n * Force a done tool call at the end of an agent run.\n * This ensures we always get a structured final response,\n * even if the main loop ended without calling done.\n */\nexport async function handleDoneToolCall(options: {\n model: LanguageModel;\n inputMessages: ModelMessage[];\n instruction: string;\n outputSchema?: StagehandZodObject;\n logger: (message: LogLine) => void;\n}): Promise<DoneResult> {\n const { model, inputMessages, instruction, outputSchema, logger } = options;\n\n logger({\n category: \"agent\",\n message: \"Agent calling tool: done\",\n level: 1,\n });\n // Use the same Zod version as the user's outputSchema to avoid v3/v4 mixing\n const factory = outputSchema\n ? getZFactory(outputSchema as StagehandZodSchema)\n : z;\n const baseDoneSchema = buildBaseDoneSchema(factory);\n\n // Merge base done schema with user-provided output schema if present\n const doneToolSchema = outputSchema\n ? baseDoneSchema.extend({\n output: outputSchema.describe(\n \"The specific data the user requested from this task\",\n ),\n })\n : baseDoneSchema;\n\n const outputInstructions = outputSchema\n ? `\\n\\nThe user also requested the following information from this task. Provide it in the \"output\" field:\\n${JSON.stringify(\n Object.fromEntries(\n Object.entries(outputSchema.shape).map(\n ([key, value]: [string, StagehandZodSchema]) => [\n key,\n value.description || \"no description\",\n ],\n ),\n ),\n null,\n 2,\n )}`\n : \"\";\n\n const systemPrompt = `You are a web automation assistant that was tasked with completing a task.\n\nThe task was:\n\"${instruction}\"\n\nReview what was accomplished and provide your final assessment in whether the task was completed successfully. you have been provided with the history of the actions taken so far, use this to determine if the task was completed successfully.${outputInstructions}\n\nCall the \"done\" tool with:\n1. A brief summary of what was done\n2. Whether the task was completed successfully${outputSchema ? \"\\n3. The requested output data based on what you found\" : \"\"}`;\n\n const doneTool = tool({\n description: outputSchema\n ? \"Complete the task with your assessment and the requested output data.\"\n : \"Complete the task with your final assessment.\",\n inputSchema: doneToolSchema,\n execute: async (params) => {\n return { success: true, ...params };\n },\n });\n\n const userPrompt: ModelMessage = {\n role: \"user\",\n content: outputSchema\n ? \"Provide your final assessment and the requested output data.\"\n : \"Provide your final assessment.\",\n };\n\n const result = await generateText({\n model,\n system: systemPrompt,\n messages: [...inputMessages, userPrompt],\n tools: { done: doneTool } as ToolSet,\n toolChoice: { type: \"tool\", toolName: \"done\" },\n });\n\n const doneToolCall = result.toolCalls.find((tc) => tc.toolName === \"done\");\n const outputMessages: ModelMessage[] = [\n userPrompt,\n ...(result.response?.messages || []),\n ];\n\n if (!doneToolCall) {\n return {\n reasoning: result.text || \"Task execution completed\",\n taskComplete: false,\n messages: outputMessages,\n };\n }\n\n const input = doneToolCall.input as {\n reasoning: string;\n taskComplete: boolean;\n output?: Record<string, unknown>;\n };\n logger({\n category: \"agent\",\n message: `Task completed`,\n level: 1,\n });\n\n return {\n reasoning: input.reasoning,\n taskComplete: input.taskComplete,\n messages: outputMessages,\n output: input.output,\n };\n}\n", "import { computeActiveElementXpath } from \"../understudy/a11y/snapshot/index.js\";\nimport { V3 } from \"../v3.js\";\nimport { ToolSet } from \"ai\";\nimport { AgentClient } from \"../agent/AgentClient.js\";\nimport { AgentProvider } from \"../agent/AgentProvider.js\";\nimport { GoogleCUAClient } from \"../agent/GoogleCUAClient.js\";\nimport { OpenAICUAClient } from \"../agent/OpenAICUAClient.js\";\nimport { mapKeyToPlaywright } from \"../agent/utils/cuaKeyMapping.js\";\nimport { ensureXPath } from \"../agent/utils/xpath.js\";\nimport {\n ActionExecutionResult,\n AgentAction,\n AgentExecuteOptions,\n AgentHandlerOptions,\n AgentResult,\n SafetyConfirmationHandler,\n} from \"../types/public/agent.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { type Action, V3FunctionName } from \"../types/public/methods.js\";\nimport { SessionFileLogger } from \"../flowLogger.js\";\nimport { StagehandClosedError } from \"../types/public/sdkErrors.js\";\n\nexport class V3CuaAgentHandler {\n private v3: V3;\n private agent: AgentClient;\n private provider: AgentProvider;\n private logger: (message: LogLine) => void;\n private agentClient: AgentClient;\n private options: AgentHandlerOptions;\n private highlightCursor: boolean;\n\n constructor(\n v3: V3,\n logger: (message: LogLine) => void,\n options: AgentHandlerOptions,\n tools?: ToolSet,\n ) {\n this.v3 = v3;\n this.logger = logger;\n this.options = options;\n\n this.provider = new AgentProvider(logger);\n const client = this.provider.getClient(\n options.modelName,\n options.clientOptions || {},\n options.userProvidedInstructions,\n tools,\n );\n this.agentClient = client;\n this.setupAgentClient();\n this.agent = client;\n }\n\n /**\n * Ensures the V3 context is still available (not closed).\n * Throws StagehandClosedError if stagehand.close() was called.\n */\n private ensureNotClosed(): void {\n if (!this.v3.context) {\n throw new StagehandClosedError();\n }\n }\n\n private setupAgentClient(): void {\n // Provide screenshots to the agent client\n this.agentClient.setScreenshotProvider(async () => {\n this.ensureNotClosed();\n const page = await this.v3.context.awaitActivePage();\n const screenshotBuffer = await page.screenshot({ fullPage: false });\n return screenshotBuffer.toString(\"base64\"); // base64 png\n });\n\n // Provide action executor\n this.agentClient.setActionHandler(async (action) => {\n this.ensureNotClosed();\n action.pageUrl = (await this.v3.context.awaitActivePage()).url();\n\n const defaultDelay = 500;\n const waitBetween =\n (this.options.clientOptions?.waitBetweenActions as number) ||\n defaultDelay;\n try {\n // Try to inject cursor before each action if enabled\n if (this.highlightCursor) {\n try {\n await this.injectCursor();\n } catch {\n // Ignore cursor injection failures\n }\n }\n await new Promise((r) => setTimeout(r, 300));\n // Skip logging for screenshot actions - they're no-ops, the actual\n // Page.screenshot in captureAndSendScreenshot() is logged separately\n const shouldLog = action.type !== \"screenshot\";\n if (shouldLog) {\n SessionFileLogger.logUnderstudyActionEvent({\n actionType: `v3CUA.${action.type}`,\n target: this.computePointerTarget(action),\n args: [action],\n });\n }\n try {\n await this.executeAction(action);\n } finally {\n if (shouldLog) SessionFileLogger.logUnderstudyActionCompleted();\n }\n\n action.timestamp = Date.now();\n\n await new Promise((r) => setTimeout(r, waitBetween));\n try {\n await this.captureAndSendScreenshot();\n } catch (e) {\n this.logger({\n category: \"agent\",\n message: `Warning: Failed to take screenshot after action: ${String(\n (e as Error)?.message ?? e,\n )}`,\n level: 1,\n });\n }\n } catch (error) {\n const msg = (error as Error)?.message ?? String(error);\n this.logger({\n category: \"agent\",\n message: `Error executing action ${action.type}: ${msg}`,\n level: 0,\n });\n throw error;\n }\n });\n\n void this.updateClientViewport();\n void this.updateClientUrl();\n }\n\n setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void {\n if (\n this.agentClient instanceof GoogleCUAClient ||\n this.agentClient instanceof OpenAICUAClient\n ) {\n this.agentClient.setSafetyConfirmationHandler(handler);\n }\n }\n\n async execute(\n optionsOrInstruction: AgentExecuteOptions | string,\n ): Promise<AgentResult> {\n const options =\n typeof optionsOrInstruction === \"string\"\n ? { instruction: optionsOrInstruction }\n : optionsOrInstruction;\n\n this.setSafetyConfirmationHandler(options.callbacks?.onSafetyConfirmation);\n\n this.highlightCursor = options.highlightCursor !== false;\n\n // Redirect if blank\n const page = await this.v3.context.awaitActivePage();\n const currentUrl = page.url();\n if (!currentUrl || currentUrl === \"about:blank\") {\n this.logger({\n category: \"agent\",\n message: `Page URL is empty. Navigating to https://www.google.com ...`,\n level: 1,\n });\n await page.goto(\"https://www.google.com\", { waitUntil: \"load\" });\n }\n\n if (this.highlightCursor) {\n try {\n await this.injectCursor();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger({\n category: \"agent\",\n message: `Warning: Failed to inject cursor: ${errorMessage}. Continuing with execution.`,\n level: 1,\n });\n // Continue execution even if cursor injection fails\n }\n }\n\n const start = Date.now();\n const result = await this.agent.execute({ options, logger: this.logger });\n const inferenceTimeMs = Date.now() - start;\n if (result.usage) {\n this.v3.updateMetrics(\n V3FunctionName.AGENT,\n result.usage.input_tokens,\n result.usage.output_tokens,\n result.usage.reasoning_tokens ?? 0,\n result.usage.cached_input_tokens ?? 0,\n inferenceTimeMs,\n );\n }\n return result;\n }\n\n private async executeAction(\n action: AgentAction,\n ): Promise<ActionExecutionResult> {\n const page = await this.v3.context.awaitActivePage();\n const recording = this.v3.isAgentReplayActive();\n switch (action.type) {\n case \"click\": {\n const { x, y, button = \"left\", clickCount } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: (button as \"left\" | \"right\" | \"middle\") ?? \"left\",\n clickCount: (clickCount as number) ?? 1,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"click\", x, y),\n method: \"click\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n button: (button as \"left\" | \"right\" | \"middle\") ?? \"left\",\n clickCount: (clickCount as number) ?? 1,\n });\n }\n return { success: true };\n }\n case \"double_click\":\n case \"doubleClick\": {\n const { x, y } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 2,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"double click\", x, y),\n method: \"doubleClick\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 2,\n });\n }\n return { success: true };\n }\n case \"tripleClick\": {\n const { x, y } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 3,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"triple click\", x, y),\n method: \"tripleClick\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n clickCount: 3,\n });\n }\n return { success: true };\n }\n case \"type\": {\n const { text } = action;\n await page.type(String(text ?? \"\"));\n if (recording) {\n const xpath = await computeActiveElementXpath(page);\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describeTypeAction(String(text ?? \"\")),\n method: \"type\",\n arguments: [String(text ?? \"\")],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n }\n return { success: true };\n }\n case \"keypress\": {\n const { keys } = action;\n const keyList = Array.isArray(keys) ? keys : [keys];\n const stagehandActions: Action[] = [];\n for (const rawKey of keyList) {\n const mapped = mapKeyToPlaywright(String(rawKey ?? \"\"));\n await page.keyPress(mapped);\n if (recording) {\n stagehandActions.push({\n selector: \"xpath=/html\",\n description: `press ${mapped}`,\n method: \"press\",\n arguments: [mapped],\n });\n }\n }\n if (recording && stagehandActions.length > 0) {\n this.recordCuaActStep(\n action,\n stagehandActions,\n stagehandActions\n .map((a) => a.description)\n .filter(Boolean)\n .join(\", \") || \"keypress\",\n );\n }\n return { success: true };\n }\n case \"scroll\": {\n const { x, y, scroll_x = 0, scroll_y = 0 } = action;\n await page.scroll(\n (x as number) ?? 0,\n (y as number) ?? 0,\n (scroll_x as number) ?? 0,\n (scroll_y as number) ?? 0,\n );\n this.v3.recordAgentReplayStep({\n type: \"scroll\",\n deltaX: Number(scroll_x ?? 0),\n deltaY: Number(scroll_y ?? 0),\n anchor:\n typeof x === \"number\" && typeof y === \"number\"\n ? { x: Math.round(x), y: Math.round(y) }\n : undefined,\n });\n return { success: true };\n }\n case \"drag\": {\n const { path } = action;\n if (Array.isArray(path) && path.length >= 2) {\n const start = path[0];\n const end = path[path.length - 1];\n if (recording) {\n const xps = await page.dragAndDrop(start.x, start.y, end.x, end.y, {\n steps: Math.min(20, Math.max(5, path.length)),\n delay: 10,\n returnXpath: true,\n });\n const [fromXpath, toXpath] = (xps as [string, string]) || [\"\", \"\"];\n const from = ensureXPath(fromXpath);\n const to = ensureXPath(toXpath);\n if (from && to) {\n const stagehandAction: Action = {\n selector: from,\n description: this.describeDragAction(),\n method: \"dragAndDrop\",\n arguments: [to],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.dragAndDrop(start.x, start.y, end.x, end.y, {\n steps: Math.min(20, Math.max(5, path.length)),\n delay: 10,\n });\n }\n }\n return { success: true };\n }\n case \"move\": {\n const { x, y } = action;\n if (typeof x === \"number\" && typeof y === \"number\") {\n if (recording) {\n const xpath = await page.hover(x, y, { returnXpath: true });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"hover\", x, y),\n method: \"hover\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.hover(x, y);\n }\n }\n return { success: true };\n }\n case \"wait\": {\n const time = action?.timeMs ?? 1000;\n await new Promise((r) => setTimeout(r, time));\n if (time > 0 && recording) {\n this.v3.recordAgentReplayStep({ type: \"wait\", timeMs: Number(time) });\n }\n return { success: true };\n }\n case \"screenshot\": {\n // No-op - screenshot is captured by captureAndSendScreenshot() after all actions\n return { success: true };\n }\n case \"goto\": {\n const { url } = action;\n await page.goto(String(url ?? \"\"), { waitUntil: \"load\" });\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"goto\",\n url: String(url ?? \"\"),\n });\n }\n return { success: true };\n }\n case \"back\": {\n await page.goBack();\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"back\",\n });\n }\n return { success: true };\n }\n case \"forward\": {\n await page.goForward();\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"forward\",\n });\n }\n return { success: true };\n }\n case \"open_web_browser\": {\n // Browser is already open, this is a no-op\n return { success: true };\n }\n case \"custom_tool\": {\n // Custom tools are handled by the agent client directly\n return { success: true };\n }\n default:\n this.logger({\n category: \"agent\",\n message: `Unknown action type: ${String(action.type)}`,\n level: 1,\n });\n return {\n success: false,\n error: `Unknown action ${String(action.type)}`,\n };\n }\n }\n\n // helper to make pointer target human-readable for logging\n private computePointerTarget(action: AgentAction): string | undefined {\n return typeof action.x === \"number\" && typeof action.y === \"number\"\n ? `(${action.x}, ${action.y})`\n : typeof action.selector === \"string\"\n ? action.selector\n : typeof action.input === \"string\"\n ? action.input\n : typeof action.description === \"string\"\n ? action.description\n : undefined;\n }\n\n private describePointerAction(kind: string, x: unknown, y: unknown): string {\n const nx = Number(x);\n const ny = Number(y);\n if (Number.isFinite(nx) && Number.isFinite(ny)) {\n return `${kind} at (${Math.round(nx)}, ${Math.round(ny)})`;\n }\n return kind;\n }\n\n private describeTypeAction(text: string): string {\n const snippet = text.length > 30 ? `${text.slice(0, 27)}...` : text;\n return `type \"${snippet}\"`;\n }\n\n private describeDragAction(): string {\n return \"drag and drop\";\n }\n\n private buildInstructionFallback(\n agentAction: AgentAction,\n fallback: string,\n ): string {\n const raw =\n (typeof agentAction.action === \"string\" && agentAction.action.trim()) ||\n (typeof agentAction.reasoning === \"string\" &&\n agentAction.reasoning.trim());\n return raw && raw.length > 0 ? raw : fallback;\n }\n\n private recordCuaActStep(\n agentAction: AgentAction,\n stagehandActions: Action[],\n fallback: string,\n ): void {\n if (!stagehandActions.length) return;\n const instruction = this.buildInstructionFallback(agentAction, fallback);\n const description = stagehandActions[0]?.description || instruction;\n const actions = stagehandActions.map((act) => ({\n ...act,\n description: act.description || description,\n }));\n this.v3.recordAgentReplayStep({\n type: \"act\",\n instruction,\n actions,\n actionDescription: description,\n message:\n typeof agentAction.reasoning === \"string\" &&\n agentAction.reasoning.trim().length > 0\n ? agentAction.reasoning.trim()\n : undefined,\n });\n }\n\n private async updateClientViewport(): Promise<void> {\n try {\n // For Google CUA, use configured viewport for coordinate normalization\n // advancedStealth uses fixed 1288x711, otherwise use configured viewport\n if (this.agentClient instanceof GoogleCUAClient) {\n const dims = this.v3.isAdvancedStealth\n ? { width: 1288, height: 711 }\n : this.v3.configuredViewport;\n this.agentClient.setViewport(dims.width, dims.height);\n } else {\n // For other clients, use actual window dimensions\n const page = await this.v3.context.awaitActivePage();\n const { w, h } = await page.mainFrame().evaluate<{\n w: number;\n h: number;\n }>(\"({ w: window.innerWidth, h: window.innerHeight })\");\n if (w && h) this.agentClient.setViewport(w, h);\n }\n } catch {\n //\n }\n }\n\n private async updateClientUrl(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n const url = page.url();\n this.agentClient.setCurrentUrl(url);\n } catch {\n //\n }\n }\n\n async captureAndSendScreenshot(): Promise<unknown> {\n this.logger({\n category: \"agent\",\n message: \"Capturing screenshot\",\n level: 1,\n });\n try {\n const page = await this.v3.context.awaitActivePage();\n const screenshotBuffer = await page.screenshot({ fullPage: false });\n\n // Emit screenshot event via the bus\n this.v3.bus.emit(\"agent_screenshot_taken_event\", screenshotBuffer);\n const currentUrl = page.url();\n return await this.agentClient.captureScreenshot({\n base64Image: screenshotBuffer.toString(\"base64\"),\n currentUrl,\n });\n } catch (e) {\n this.logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String((e as Error)?.message ?? e)}`,\n level: 0,\n });\n return null;\n }\n }\n\n private async injectCursor(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay();\n } catch {\n // Best-effort only\n }\n }\n}\n", "import { ToolSet } from \"ai/dist\";\nimport { AgentProviderType } from \"../types/public/agent.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\nimport {\n UnsupportedModelError,\n UnsupportedModelProviderError,\n} from \"../types/public/sdkErrors.js\";\nimport { AgentClient } from \"./AgentClient.js\";\nimport { AnthropicCUAClient } from \"./AnthropicCUAClient.js\";\nimport { OpenAICUAClient } from \"./OpenAICUAClient.js\";\nimport { GoogleCUAClient } from \"./GoogleCUAClient.js\";\nimport { MicrosoftCUAClient } from \"./MicrosoftCUAClient.js\";\n\n// Map model names to their provider types\nexport const modelToAgentProviderMap: Record<string, AgentProviderType> = {\n \"computer-use-preview\": \"openai\",\n \"computer-use-preview-2025-03-11\": \"openai\",\n \"claude-3-7-sonnet-latest\": \"anthropic\",\n \"claude-sonnet-4-20250514\": \"anthropic\",\n \"claude-sonnet-4-5-20250929\": \"anthropic\",\n \"claude-opus-4-5-20251101\": \"anthropic\",\n \"claude-opus-4-6\": \"anthropic\",\n \"claude-haiku-4-5-20251001\": \"anthropic\",\n \"gemini-2.5-computer-use-preview-10-2025\": \"google\",\n \"gemini-3-flash-preview\": \"google\",\n \"gemini-3-pro-preview\": \"google\",\n \"fara-7b\": \"microsoft\",\n};\n\n/**\n * Provider for agent clients\n * This class is responsible for creating the appropriate agent client\n * based on the provider type\n */\nexport class AgentProvider {\n private logger: (message: LogLine) => void;\n\n /**\n * Create a new agent provider\n */\n constructor(logger: (message: LogLine) => void) {\n this.logger = logger;\n }\n\n getClient(\n modelName: string,\n clientOptions?: ClientOptions,\n userProvidedInstructions?: string,\n tools?: ToolSet,\n ): AgentClient {\n // Check if provider is explicitly set in clientOptions\n const explicitProvider = clientOptions?.provider as\n | AgentProviderType\n | undefined;\n const type = explicitProvider || AgentProvider.getAgentProvider(modelName);\n\n this.logger({\n category: \"agent\",\n message: `Getting agent client for type: ${type}, model: ${modelName}${explicitProvider ? \" (explicit provider)\" : \"\"}`,\n level: 2,\n });\n\n try {\n switch (type) {\n case \"openai\":\n return new OpenAICUAClient(\n type,\n modelName,\n userProvidedInstructions,\n clientOptions,\n tools,\n );\n case \"anthropic\":\n return new AnthropicCUAClient(\n type,\n modelName,\n userProvidedInstructions,\n clientOptions,\n tools,\n );\n case \"google\":\n return new GoogleCUAClient(\n type,\n modelName,\n userProvidedInstructions,\n clientOptions,\n tools,\n );\n case \"microsoft\":\n return new MicrosoftCUAClient(\n type,\n modelName,\n userProvidedInstructions,\n clientOptions,\n );\n default:\n throw new UnsupportedModelProviderError(\n [\"openai\", \"anthropic\", \"google\", \"microsoft\"],\n \"Computer Use Agent\",\n );\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger({\n category: \"agent\",\n message: `Error creating agent client: ${errorMessage}`,\n level: 0,\n });\n throw error;\n }\n }\n\n static getAgentProvider(modelName: string): AgentProviderType {\n const normalized = modelName.includes(\"/\")\n ? modelName.split(\"/\")[1]\n : modelName;\n\n if (normalized in modelToAgentProviderMap) {\n return modelToAgentProviderMap[normalized];\n }\n\n throw new UnsupportedModelError(\n Object.keys(modelToAgentProviderMap),\n \"Computer Use Agent\",\n );\n }\n}\n", "import {\n AgentAction,\n AgentResult,\n AgentType,\n AnthropicContentBlock,\n AnthropicMessage,\n AnthropicTextBlock,\n AnthropicToolResult,\n AgentExecutionOptions,\n ToolUseItem,\n} from \"../types/public/agent.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\nimport {\n AgentScreenshotProviderError,\n StagehandClosedError,\n} from \"../types/public/sdkErrors.js\";\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport { ToolSet } from \"ai\";\nimport { AgentClient } from \"./AgentClient.js\";\nimport { compressConversationImages } from \"./utils/imageCompression.js\";\nimport { toJsonSchema } from \"../zodCompat.js\";\nimport type { StagehandZodSchema } from \"../zodCompat.js\";\nimport {\n SessionFileLogger,\n formatCuaPromptPreview,\n formatCuaResponsePreview,\n} from \"../flowLogger.js\";\nimport { v7 as uuidv7 } from \"uuid\";\n\nexport type ResponseInputItem = AnthropicMessage | AnthropicToolResult;\n\n/**\n * Client for Anthropic's Computer Use API\n * This implementation uses the official Anthropic Messages API for Computer Use\n */\nexport class AnthropicCUAClient extends AgentClient {\n private apiKey: string;\n private baseURL?: string;\n private client: Anthropic;\n public lastMessageId?: string;\n private currentViewport = { width: 1288, height: 711 };\n private currentUrl?: string;\n private screenshotProvider?: () => Promise<string>;\n private actionHandler?: (action: AgentAction) => Promise<void>;\n private thinkingBudget: number | null = null;\n private tools?: ToolSet;\n\n constructor(\n type: AgentType,\n modelName: string,\n userProvidedInstructions?: string,\n clientOptions?: ClientOptions,\n tools?: ToolSet,\n ) {\n super(type, modelName, userProvidedInstructions);\n\n // Process client options\n this.apiKey =\n (clientOptions?.apiKey as string) || process.env.ANTHROPIC_API_KEY || \"\";\n this.baseURL = (clientOptions?.baseURL as string) || undefined;\n\n // Get thinking budget if specified\n if (\n clientOptions?.thinkingBudget &&\n typeof clientOptions.thinkingBudget === \"number\"\n ) {\n this.thinkingBudget = clientOptions.thinkingBudget;\n }\n\n // Store client options for reference\n this.clientOptions = {\n apiKey: this.apiKey,\n };\n\n if (this.baseURL) {\n this.clientOptions.baseURL = this.baseURL;\n }\n\n // Initialize the Anthropic client\n this.client = new Anthropic(this.clientOptions);\n\n this.tools = tools;\n }\n\n setViewport(width: number, height: number): void {\n this.currentViewport = { width, height };\n }\n\n setCurrentUrl(url: string): void {\n this.currentUrl = url;\n }\n\n setScreenshotProvider(provider: () => Promise<string>): void {\n this.screenshotProvider = provider;\n }\n\n setActionHandler(handler: (action: AgentAction) => Promise<void>): void {\n this.actionHandler = handler;\n }\n\n setTools(tools: ToolSet): void {\n this.tools = tools;\n }\n\n /**\n * Execute a task with the Anthropic CUA\n * This is the main entry point for the agent\n * @implements AgentClient.execute\n */\n async execute(executionOptions: AgentExecutionOptions): Promise<AgentResult> {\n const { options, logger } = executionOptions;\n const { instruction } = options;\n const maxSteps = options.maxSteps || 10;\n\n let currentStep = 0;\n let completed = false;\n const actions: AgentAction[] = [];\n const messageList: string[] = [];\n let finalMessage = \"\";\n\n // Start with the initial instruction\n let inputItems: ResponseInputItem[] =\n this.createInitialInputItems(instruction);\n\n logger({\n category: \"agent\",\n message: `Starting Anthropic agent execution with instruction: ${instruction}`,\n level: 1,\n });\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalInferenceTime = 0;\n\n try {\n // Execute steps until completion or max steps reached\n while (!completed && currentStep < maxSteps) {\n logger({\n category: \"agent\",\n message: `Executing step ${currentStep + 1}/${maxSteps}`,\n level: 1,\n });\n\n const result = await this.executeStep(inputItems, logger);\n totalInputTokens += result.usage.input_tokens;\n totalOutputTokens += result.usage.output_tokens;\n totalInferenceTime += result.usage.inference_time_ms;\n\n // Add actions to the list\n if (result.actions.length > 0) {\n logger({\n category: \"agent\",\n message: `Step ${currentStep + 1} performed ${result.actions.length} actions`,\n level: 2,\n });\n actions.push(...result.actions);\n }\n\n // Update completion status\n completed = result.completed;\n\n // Update the input items for the next step if we're continuing\n if (!completed) {\n inputItems = result.nextInputItems;\n }\n\n // Record any message for this step\n if (result.message) {\n messageList.push(result.message);\n finalMessage = result.message;\n }\n\n // Increment step counter\n currentStep++;\n }\n\n logger({\n category: \"agent\",\n message: `Anthropic agent execution completed: ${completed}, with ${actions.length} total actions performed`,\n level: 1,\n });\n\n // Return the final result\n return {\n success: completed,\n actions,\n message: finalMessage,\n completed,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n return {\n success: false,\n actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n }\n }\n\n async executeStep(\n inputItems: ResponseInputItem[],\n logger: (message: LogLine) => void,\n ): Promise<{\n actions: AgentAction[];\n message: string;\n completed: boolean;\n nextInputItems: ResponseInputItem[];\n usage: {\n input_tokens: number;\n output_tokens: number;\n inference_time_ms: number;\n };\n }> {\n try {\n // Get response from the model\n const result = await this.getAction(inputItems);\n const content = result.content;\n const usage = {\n input_tokens: result.usage.input_tokens,\n output_tokens: result.usage.output_tokens,\n inference_time_ms: result.usage.inference_time_ms,\n };\n\n logger({\n category: \"agent\",\n message: `Received response with ${content.length} content blocks`,\n level: 2,\n });\n\n // Extract actions from the content\n const stepActions: AgentAction[] = [];\n const toolUseItems: ToolUseItem[] = [];\n let message = \"\";\n\n // Process content blocks to find tool use items and text content\n for (const block of content) {\n logger({\n category: \"agent\",\n message: `Processing block type: ${block.type}, id: ${block.id || \"unknown\"}`,\n level: 2,\n });\n\n if (block.type === \"tool_use\") {\n // Direct handling of tool_use type\n logger({\n category: \"agent\",\n message: `Found tool_use block: ${JSON.stringify(block)}`,\n level: 2,\n });\n\n // Cast to ToolUseItem and add to list\n const toolUseItem = block as ToolUseItem;\n toolUseItems.push(toolUseItem);\n\n logger({\n category: \"agent\",\n message: `Added tool_use item: ${toolUseItem.name}, action: ${JSON.stringify(toolUseItem.input)}`,\n level: 2,\n });\n\n // Convert tool use to action and add to actions list\n const action = this.convertToolUseToAction(toolUseItem);\n if (action) {\n logger({\n category: \"agent\",\n message: `Created action from tool_use: ${toolUseItem.name}, action: ${action.type}`,\n level: 2,\n });\n stepActions.push(action);\n } else if (this.tools && toolUseItem.name in this.tools) {\n stepActions.push({\n type: \"custom_tool\",\n tool: toolUseItem.name,\n input: toolUseItem.input,\n } as AgentAction);\n }\n } else if (block.type === \"text\") {\n // Safe to cast here since we've verified it's a text block\n const textBlock = block as unknown as AnthropicTextBlock;\n message += textBlock.text + \"\\n\";\n\n logger({\n category: \"agent\",\n message: `Found text block: ${textBlock.text}`,\n level: 2,\n });\n } else {\n logger({\n category: \"agent\",\n message: `Found unknown block type: ${block.type}`,\n level: 2,\n });\n }\n }\n\n // Execute actions if an action handler is provided\n if (this.actionHandler && stepActions.length > 0) {\n for (const action of stepActions) {\n try {\n logger({\n category: \"agent\",\n message: `Executing action: ${action.type}`,\n level: 1,\n });\n await this.actionHandler(action);\n } catch (error) {\n if (error instanceof StagehandClosedError) {\n throw error;\n }\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing action ${action.type}: ${errorMessage}`,\n level: 0,\n });\n }\n }\n }\n\n // Create the assistant response message with all content blocks\n const assistantMessage: AnthropicMessage = {\n role: \"assistant\",\n content: content as unknown as AnthropicContentBlock[],\n };\n\n // Keep track of the conversation history by preserving all previous messages\n // and adding new messages at the end\n const nextInputItems: ResponseInputItem[] = [...inputItems];\n\n // Add the assistant message with tool_use blocks to the history\n compressConversationImages(nextInputItems);\n\n nextInputItems.push(assistantMessage);\n\n // Generate tool results and add them as a user message\n if (toolUseItems.length > 0) {\n const toolResults = await this.takeAction(toolUseItems, logger);\n\n if (toolResults.length > 0) {\n // Tool results are AnthropicToolResult[] which are compatible with AnthropicContentBlock[]\n const userToolResultsMessage: AnthropicMessage = {\n role: \"user\",\n content: toolResults as unknown as AnthropicContentBlock[],\n };\n nextInputItems.push(userToolResultsMessage);\n }\n }\n\n // The step is completed only if there were no tool_use items\n const completed = toolUseItems.length === 0;\n\n logger({\n category: \"agent\",\n message: `Step processed ${toolUseItems.length} tool use items, completed: ${completed}`,\n level: 2,\n });\n\n return {\n actions: stepActions,\n message: message.trim(),\n completed,\n nextInputItems,\n usage: usage,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing step: ${errorMessage}`,\n level: 0,\n });\n\n throw error;\n }\n }\n\n private createInitialInputItems(instruction: string): AnthropicMessage[] {\n // For the initial request, we use a simple array with the user's instruction\n return [\n {\n role: \"system\",\n content: this.userProvidedInstructions,\n },\n {\n role: \"user\",\n content: instruction,\n },\n ];\n }\n\n async getAction(inputItems: ResponseInputItem[]): Promise<{\n content: AnthropicContentBlock[];\n id: string;\n usage: Record<string, number>;\n }> {\n try {\n // For the API request, we use the inputItems directly\n // These should already be properly formatted as a sequence of user/assistant messages\n const messages: AnthropicMessage[] = [];\n\n for (const item of inputItems) {\n if (\"role\" in item) {\n // Skip system messages as Anthropic requires system as a top-level parameter\n if (item.role !== \"system\") {\n messages.push(item);\n }\n }\n // Note: We don't need special handling for tool_result items here anymore\n // as they should already be properly wrapped in user messages\n }\n\n // Configure thinking capability if available\n const thinking = this.thinkingBudget\n ? { type: \"enabled\" as const, budget_tokens: this.thinkingBudget }\n : undefined;\n\n // Create the request parameters\n const requestParams: Record<string, unknown> = {\n model: this.modelName,\n max_tokens: 4096,\n messages: messages,\n tools: [\n {\n type: \"computer_20250124\", // Use the latest version for Claude 3.7 Sonnet\n name: \"computer\",\n display_width_px: this.currentViewport.width,\n display_height_px: this.currentViewport.height,\n display_number: 1,\n },\n ],\n betas: [\"computer-use-2025-01-24\"],\n };\n\n // Add custom tools if available\n if (this.tools && Object.keys(this.tools).length > 0) {\n const customTools = Object.entries(this.tools).map(([name, tool]) => {\n const schema = tool.inputSchema as StagehandZodSchema;\n\n // Convert Zod schema to proper JSON schema format for Anthropic\n const jsonSchema = toJsonSchema(schema) as {\n properties?: Record<string, unknown>;\n required?: string[];\n };\n\n const inputSchema = {\n type: \"object\",\n properties: jsonSchema.properties || {},\n required: jsonSchema.required || [],\n };\n\n return {\n name,\n description: tool.description,\n input_schema: inputSchema,\n };\n });\n\n requestParams.tools = [\n ...(requestParams.tools as Record<string, unknown>[]),\n ...customTools,\n ];\n }\n\n // Add system parameter if provided\n if (this.userProvidedInstructions) {\n requestParams.system = this.userProvidedInstructions;\n }\n\n // Add thinking parameter if available\n if (thinking) {\n requestParams.thinking = thinking;\n }\n\n // Log LLM request\n const llmRequestId = uuidv7();\n SessionFileLogger.logLlmRequest({\n requestId: llmRequestId,\n model: this.modelName,\n operation: \"CUA.getAction\",\n prompt: formatCuaPromptPreview(messages),\n });\n\n const startTime = Date.now();\n // Create the message using the Anthropic Messages API\n // @ts-expect-error - The Anthropic SDK types are stricter than what we need\n const response = await this.client.beta.messages.create(requestParams);\n const endTime = Date.now();\n const elapsedMs = endTime - startTime;\n const usage = {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n inference_time_ms: elapsedMs,\n };\n\n // Log LLM response\n SessionFileLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.modelName,\n operation: \"CUA.getAction\",\n output: formatCuaResponsePreview(response.content),\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n });\n\n // Store the message ID for future use\n this.lastMessageId = response.id;\n\n // Return the content and message ID\n return {\n // Cast the response content to our internal type\n content: response.content as unknown as AnthropicContentBlock[],\n id: response.id,\n usage,\n };\n } catch (error) {\n console.error(\"Error getting action from Anthropic:\", error);\n throw error;\n }\n }\n\n async takeAction(\n toolUseItems: ToolUseItem[],\n logger: (message: LogLine) => void,\n ): Promise<AnthropicToolResult[]> {\n const toolResults: AnthropicToolResult[] = [];\n\n logger({\n category: \"agent\",\n message: `Taking action on ${toolUseItems.length} tool use items`,\n level: 2,\n });\n\n // Process each tool use item\n for (const item of toolUseItems) {\n try {\n logger({\n category: \"agent\",\n message: `Processing tool use: ${item.name}, id: ${item.id}, action: ${JSON.stringify(item.input)}`,\n level: 2,\n });\n\n // TODO: Normalize and migrate to agentHandler\n\n // For computer tool, capture screenshot and return image\n if (item.name === \"computer\") {\n // Get action type\n const action = item.input.action as string;\n logger({\n category: \"agent\",\n message: `Computer action type: ${action}`,\n level: 2,\n });\n\n // Capture a screenshot for the response\n const screenshot = await this.captureScreenshot();\n logger({\n category: \"agent\",\n message: `Screenshot captured, length: ${screenshot.length}`,\n level: 2,\n });\n\n // Create proper image content block for Anthropic\n const imageContent = [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: screenshot.replace(/^data:image\\/png;base64,/, \"\"),\n },\n },\n ];\n\n // Add current URL if available\n if (this.currentUrl) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: item.id,\n content: [\n ...imageContent,\n {\n type: \"text\",\n text: `Current URL: ${this.currentUrl}`,\n },\n ],\n });\n } else {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: item.id,\n content: imageContent,\n });\n }\n\n logger({\n category: \"agent\",\n message: `Added computer tool result for tool_use_id: ${item.id}`,\n level: 2,\n });\n } else {\n // Handle custom tools\n let toolResult = \"Tool executed successfully\";\n if (this.tools && item.name in this.tools) {\n try {\n const tool = this.tools[item.name];\n\n logger({\n category: \"agent\",\n message: `Executing tool call: ${item.name} with args: ${JSON.stringify(item.input)}`,\n level: 1,\n });\n\n const result = await tool.execute(item.input, {\n toolCallId: item.id,\n messages: [],\n });\n toolResult = JSON.stringify(result);\n\n logger({\n category: \"agent\",\n message: `Tool ${item.name} completed successfully. Result: ${toolResult}`,\n level: 1,\n });\n } catch (toolError) {\n const errorMessage =\n toolError instanceof Error\n ? toolError.message\n : String(toolError);\n toolResult = `Error executing tool: ${errorMessage}`;\n\n logger({\n category: \"agent\",\n message: `Error executing tool ${item.name}: ${errorMessage}`,\n level: 0,\n });\n }\n }\n\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: item.id,\n content: [\n {\n type: \"text\",\n text: toolResult,\n },\n ],\n });\n\n logger({\n category: \"agent\",\n message: `Added custom tool result for tool ${item.name}, tool_use_id: ${item.id}`,\n level: 2,\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n logger({\n category: \"agent\",\n message: `Error executing tool use: ${errorMessage}`,\n level: 0,\n });\n\n try {\n // For computer tool, try to capture a screenshot even on error\n if (item.name === \"computer\") {\n const screenshot = await this.captureScreenshot();\n\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: item.id,\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: screenshot.replace(/^data:image\\/png;base64,/, \"\"),\n },\n },\n {\n type: \"text\",\n text: `Error: ${errorMessage}`,\n },\n ],\n });\n\n logger({\n category: \"agent\",\n message: `Added error tool result with screenshot for tool_use_id: ${item.id}`,\n level: 1,\n });\n } else {\n // For other tools, return an error message as a text content block\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: item.id,\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMessage}`,\n },\n ],\n });\n\n logger({\n category: \"agent\",\n message: `Added error tool result for tool_use_id: ${item.id}`,\n level: 1,\n });\n }\n } catch (screenshotError) {\n // If we can't capture a screenshot, just send the error\n logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String(screenshotError)}`,\n level: 0,\n });\n\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: item.id,\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMessage}`,\n },\n ],\n });\n\n logger({\n category: \"agent\",\n message: `Added text error tool result for tool_use_id: ${item.id}`,\n level: 1,\n });\n }\n }\n }\n\n logger({\n category: \"agent\",\n message: `Prepared ${toolResults.length} tool results for next request`,\n level: 2,\n });\n\n return toolResults;\n }\n\n private convertToolUseToAction(item: ToolUseItem): AgentAction | null {\n try {\n const { name, input } = item;\n\n if (name === \"computer\") {\n // For computer actions, format according to the action type\n const action = input.action as string;\n\n if (!action) {\n console.warn(\"Missing action in tool use item:\", item);\n return null;\n }\n\n // Handle different action types specifically\n if (action === \"screenshot\") {\n return {\n type: \"screenshot\",\n ...input,\n };\n } else if (action === \"click\") {\n return {\n type: \"click\",\n x: input.x as number,\n y: input.y as number,\n button: (input.button as string) || \"left\",\n ...input,\n };\n } else if (action === \"type\") {\n return {\n type: \"type\",\n text: input.text as string,\n ...input,\n };\n } else if (action === \"keypress\" || action === \"key\") {\n return {\n type: \"keypress\",\n keys: [input.text as string],\n ...input,\n };\n } else if (action === \"double_click\" || action === \"doubleClick\") {\n return {\n type: \"doubleClick\",\n x:\n (input.x as number) ||\n (input.coordinate ? (input.coordinate as number[])[0] : 0),\n y:\n (input.y as number) ||\n (input.coordinate ? (input.coordinate as number[])[1] : 0),\n ...input,\n };\n } else if (action === \"scroll\") {\n // Convert Anthropic's coordinate, scroll_amount and scroll_direction into scroll_x and scroll_y\n const x =\n (input.x as number) ||\n (input.coordinate ? (input.coordinate as number[])[0] : 0);\n const y =\n (input.y as number) ||\n (input.coordinate ? (input.coordinate as number[])[1] : 0);\n\n // Calculate scroll_x and scroll_y based on scroll_amount and scroll_direction\n let scroll_x = 0;\n let scroll_y = 0;\n\n const scrollAmount = (input.scroll_amount as number) || 5;\n const scrollMultiplier = 100; // Pixels per unit of scroll_amount\n\n if (input.scroll_direction) {\n const direction = input.scroll_direction as string;\n if (direction === \"down\") {\n scroll_y = scrollAmount * scrollMultiplier;\n } else if (direction === \"up\") {\n scroll_y = -scrollAmount * scrollMultiplier;\n } else if (direction === \"right\") {\n scroll_x = scrollAmount * scrollMultiplier;\n } else if (direction === \"left\") {\n scroll_x = -scrollAmount * scrollMultiplier;\n }\n } else {\n // Use direct scroll_x and scroll_y if provided\n scroll_x = (input.scroll_x as number) || 0;\n scroll_y = (input.scroll_y as number) || 0;\n }\n\n return {\n type: \"scroll\",\n x: x,\n y: y,\n scroll_x: scroll_x,\n scroll_y: scroll_y,\n ...input,\n };\n } else if (action === \"move\") {\n // Handle Anthropic's coordinate format\n const coordinates = input.coordinate as number[] | undefined;\n const x = coordinates ? coordinates[0] : (input.x as number) || 0;\n const y = coordinates ? coordinates[1] : (input.y as number) || 0;\n\n return {\n type: \"move\",\n x: x,\n y: y,\n ...input,\n };\n } else if (action === \"drag\" || action === \"left_click_drag\") {\n // Make sure path is properly formatted\n const path =\n (input.path as { x: number; y: number }[]) ||\n (input.coordinate\n ? [\n {\n x: (input.start_coordinate as number[])[0],\n y: (input.start_coordinate as number[])[1],\n },\n {\n x: (input.coordinate as number[])[0],\n y: (input.coordinate as number[])[1],\n },\n ]\n : []);\n\n return {\n type: \"drag\",\n path: path,\n ...input,\n };\n } else if (action === \"wait\") {\n return {\n type: \"wait\",\n ...input,\n };\n } else if (action === \"left_click\") {\n // Convert left_click to regular click\n const coordinates = input.coordinate as number[] | undefined;\n const x = coordinates ? coordinates[0] : (input.x as number) || 0;\n const y = coordinates ? coordinates[1] : (input.y as number) || 0;\n\n return {\n type: \"click\",\n x: x,\n y: y,\n button: \"left\",\n ...input,\n };\n } else {\n // For other computer actions, use the action type directly\n return {\n type: action,\n ...input,\n };\n }\n } else if (name === \"str_replace_editor\" || name === \"bash\") {\n // For editor or bash tools\n return {\n type: name,\n params: input,\n };\n } else if (this.tools && name in this.tools) {\n return null;\n }\n\n console.warn(`Unknown tool name: ${name}`);\n return null;\n } catch (error) {\n console.error(\"Error converting tool use to action:\", error);\n return null;\n }\n }\n\n async captureScreenshot(options?: {\n base64Image?: string;\n currentUrl?: string;\n }): Promise<string> {\n // Use provided options if available\n if (options?.base64Image) {\n return `data:image/png;base64,${options.base64Image}`;\n }\n\n // Use the screenshot provider if available\n if (this.screenshotProvider) {\n try {\n const base64Image = await this.screenshotProvider();\n return `data:image/png;base64,${base64Image}`;\n } catch (error) {\n console.error(\"Error capturing screenshot:\", error);\n throw error;\n }\n }\n\n throw new AgentScreenshotProviderError(\n \"`screenshotProvider` has not been set. \" +\n \"Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image\",\n );\n }\n}\n", "import {\n AgentAction,\n AgentResult,\n AgentType,\n AgentExecutionOptions,\n} from \"../types/public/agent.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\n\n/**\n * Abstract base class for agent clients\n * This provides a common interface for all agent implementations\n */\nexport abstract class AgentClient {\n public type: AgentType;\n public modelName: string;\n public clientOptions: ClientOptions;\n public userProvidedInstructions?: string;\n\n constructor(\n type: AgentType,\n modelName: string,\n userProvidedInstructions?: string,\n ) {\n this.type = type;\n this.modelName = modelName;\n this.userProvidedInstructions = userProvidedInstructions;\n this.clientOptions = {};\n }\n\n abstract execute(options: AgentExecutionOptions): Promise<AgentResult>;\n\n abstract captureScreenshot(\n options?: Record<string, unknown>,\n ): Promise<unknown>;\n\n abstract setViewport(width: number, height: number): void;\n\n abstract setCurrentUrl(url: string): void;\n\n abstract setScreenshotProvider(provider: () => Promise<string>): void;\n\n abstract setActionHandler(\n handler: (action: AgentAction) => Promise<void>,\n ): void;\n}\n", "import {\n AnthropicMessage,\n AnthropicContentBlock,\n AnthropicToolResult,\n ResponseInputItem as OpenAIResponseInputItem,\n} from \"../../types/public/agent.js\";\nimport type {\n Content as GoogleContent,\n Part as GooglePart,\n} from \"@google/genai\";\n\nexport type ResponseInputItem = AnthropicMessage | AnthropicToolResult;\n\ninterface FunctionResponseData {\n inlineData?: {\n mimeType?: string;\n data?: string;\n };\n}\nexport type AnthropicResponseInputItem = AnthropicMessage | AnthropicToolResult;\nexport type SupportedInputItem =\n | AnthropicResponseInputItem\n | OpenAIResponseInputItem\n | GoogleContent;\n\n/**\n * Finds all items in the conversation history that contain images\n * @param items - Array of conversation items to check\n * @returns Array of indices where images were found\n */\nexport function findItemsWithImages(items: ResponseInputItem[]): number[] {\n const itemsWithImages: number[] = [];\n\n items.forEach((item, index) => {\n let hasImage = false;\n\n if (Array.isArray(item.content)) {\n hasImage = item.content.some(\n (contentItem: AnthropicContentBlock) =>\n contentItem.type === \"tool_result\" &&\n \"content\" in contentItem &&\n Array.isArray(contentItem.content) &&\n (contentItem.content as AnthropicContentBlock[]).some(\n (nestedItem: AnthropicContentBlock) => nestedItem.type === \"image\",\n ),\n );\n }\n\n if (hasImage) {\n itemsWithImages.push(index);\n }\n });\n\n return itemsWithImages;\n}\n\n/**\n * Compresses conversation history by removing images from older items\n * while keeping the most recent images intact\n * @param items - Array of conversation items to process\n * @param keepMostRecentCount - Number of most recent image-containing items to preserve (default: 2)\n * @returns Object with processed items\n */\nexport function compressConversationImages(\n items: ResponseInputItem[],\n keepMostRecentCount: number = 2,\n): { items: ResponseInputItem[] } {\n const itemsWithImages = findItemsWithImages(items);\n\n items.forEach((item, index) => {\n const imageIndex = itemsWithImages.indexOf(index);\n const shouldCompress =\n imageIndex >= 0 &&\n imageIndex < itemsWithImages.length - keepMostRecentCount;\n\n if (shouldCompress) {\n if (Array.isArray(item.content)) {\n item.content = item.content.map(\n (contentItem: AnthropicContentBlock) => {\n if (\n contentItem.type === \"tool_result\" &&\n \"content\" in contentItem &&\n Array.isArray(contentItem.content) &&\n (contentItem.content as AnthropicContentBlock[]).some(\n (nestedItem: AnthropicContentBlock) =>\n nestedItem.type === \"image\",\n )\n ) {\n return {\n ...contentItem,\n content: \"screenshot taken\",\n } as AnthropicContentBlock;\n }\n return contentItem;\n },\n );\n }\n }\n });\n\n return {\n items,\n };\n}\n\n/**\n * Finds all items in the conversation history that contain images (Google format)\n * @param items - Array of conversation items to check\n * @returns Array of indices where images were found\n */\nexport function findGoogleItemsWithImages(items: GoogleContent[]): number[] {\n const itemsWithImages: number[] = [];\n\n items.forEach((item, index) => {\n let hasImage = false;\n\n if (item.parts && Array.isArray(item.parts)) {\n hasImage = item.parts.some((part: GooglePart) => {\n // Check for functionResponse with data containing images\n if (part.functionResponse?.response?.data) {\n const data = part.functionResponse.response\n .data as FunctionResponseData[];\n return data.some((dataItem) =>\n dataItem.inlineData?.mimeType?.startsWith(\"image/\"),\n );\n }\n\n // Check for functionResponse with parts containing images\n if (part.functionResponse?.parts) {\n return part.functionResponse.parts.some((responsePart) =>\n responsePart.inlineData?.mimeType?.startsWith(\"image/\"),\n );\n }\n\n // Check for direct inline data\n return part.inlineData?.mimeType?.startsWith(\"image/\");\n });\n }\n\n if (hasImage) {\n itemsWithImages.push(index);\n }\n });\n\n return itemsWithImages;\n}\n\n/**\n * Finds all items in the conversation history that contain images (OpenAI format)\n * @param items - Array of conversation items to check\n * @returns Array of indices where images were found\n */\nexport function findOpenAIItemsWithImages(\n items: OpenAIResponseInputItem[],\n): number[] {\n const itemsWithImages: number[] = [];\n\n items.forEach((item, index) => {\n let hasImage = false;\n\n // Check for computer_call_output with image\n if (\n \"type\" in item &&\n item.type === \"computer_call_output\" &&\n \"output\" in item\n ) {\n const output = item.output as unknown as {\n type: string;\n image_url: string;\n };\n hasImage = output?.type === \"input_image\" && !!output?.image_url;\n }\n\n if (hasImage) {\n itemsWithImages.push(index);\n }\n });\n\n return itemsWithImages;\n}\n\n/**\n * Compresses OpenAI conversation history by removing images from older items\n * while keeping the most recent images intact\n * @param items - Array of conversation items to process\n * @param keepMostRecentCount - Number of most recent image-containing items to preserve (default: 2)\n * @returns Object with processed items\n */\nexport function compressOpenAIConversationImages(\n items: OpenAIResponseInputItem[],\n keepMostRecentCount: number = 2,\n): { items: OpenAIResponseInputItem[] } {\n const itemsWithImages = findOpenAIItemsWithImages(items);\n\n items.forEach((item, index) => {\n const imageIndex = itemsWithImages.indexOf(index);\n const shouldCompress =\n imageIndex >= 0 &&\n imageIndex < itemsWithImages.length - keepMostRecentCount;\n\n if (shouldCompress) {\n // For computer_call_output with image, replace with text\n if (\n \"type\" in item &&\n item.type === \"computer_call_output\" &&\n \"output\" in item\n ) {\n const output = item.output as unknown as { type: string };\n if (output?.type === \"input_image\") {\n // Replace the image with a text message\n (item as unknown as { output: string }).output = \"screenshot taken\";\n }\n }\n }\n });\n\n return {\n items,\n };\n}\n\n/**\n * Compresses Google conversation history by removing images from older items\n * while keeping the most recent images intact\n * @param items - Array of conversation items to process\n * @param keepMostRecentCount - Number of most recent image-containing items to preserve (default: 2)\n * @returns Object with processed items\n */\nexport function compressGoogleConversationImages(\n items: GoogleContent[],\n keepMostRecentCount: number = 2,\n): { items: GoogleContent[] } {\n const itemsWithImages = findGoogleItemsWithImages(items);\n\n items.forEach((item, index) => {\n const imageIndex = itemsWithImages.indexOf(index);\n const shouldCompress =\n imageIndex >= 0 &&\n imageIndex < itemsWithImages.length - keepMostRecentCount;\n\n if (shouldCompress && item.parts && Array.isArray(item.parts)) {\n item.parts = item.parts.map((part: GooglePart) => {\n // Replace functionResponse with data containing images\n if (part.functionResponse?.response?.data) {\n const data = part.functionResponse.response\n .data as FunctionResponseData[];\n const hasImage = data.some((dataItem) =>\n dataItem.inlineData?.mimeType?.startsWith(\"image/\"),\n );\n if (hasImage) {\n return {\n ...part,\n functionResponse: {\n ...part.functionResponse,\n data: [] as FunctionResponseData[],\n response: {\n ...part.functionResponse.response,\n compressed: \"screenshot taken\",\n },\n },\n };\n }\n }\n\n // Replace functionResponse with parts containing images\n if (part.functionResponse?.parts) {\n const hasImageInParts = part.functionResponse.parts.some(\n (responsePart) =>\n responsePart.inlineData?.mimeType?.startsWith(\"image/\"),\n );\n if (hasImageInParts) {\n return {\n ...part,\n functionResponse: {\n ...part.functionResponse,\n parts: part.functionResponse.parts.filter(\n (responsePart) =>\n !responsePart.inlineData?.mimeType?.startsWith(\"image/\"),\n ),\n response: {\n ...part.functionResponse.response,\n compressed: \"screenshot taken\",\n },\n },\n };\n }\n }\n\n // Replace direct inline data images\n if (part.inlineData?.mimeType?.startsWith(\"image/\")) {\n return {\n text: \"screenshot taken\",\n };\n }\n return part;\n });\n }\n });\n\n return {\n items,\n };\n}\n", "import OpenAI from \"openai\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport {\n AgentAction,\n AgentResult,\n AgentType,\n AgentExecutionOptions,\n ResponseInputItem,\n ResponseItem,\n ComputerCallItem,\n FunctionCallItem,\n SafetyCheck,\n SafetyConfirmationHandler,\n} from \"../types/public/agent.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\nimport { AgentClient } from \"./AgentClient.js\";\nimport {\n AgentScreenshotProviderError,\n StagehandClosedError,\n} from \"../types/public/sdkErrors.js\";\nimport { ToolSet } from \"ai\";\nimport {\n SessionFileLogger,\n formatCuaPromptPreview,\n formatCuaResponsePreview,\n} from \"../flowLogger.js\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * Client for OpenAI's Computer Use Assistant API\n * This implementation uses the official OpenAI Responses API for Computer Use\n */\nexport class OpenAICUAClient extends AgentClient {\n private apiKey: string;\n private organization?: string;\n private baseURL: string;\n private client: OpenAI;\n public lastResponseId?: string;\n private currentViewport = { width: 1288, height: 711 };\n private currentUrl?: string;\n private screenshotProvider?: () => Promise<string>;\n private actionHandler?: (action: AgentAction) => Promise<void>;\n private reasoningItems: Map<string, ResponseItem> = new Map();\n private environment: string = \"browser\"; // \"browser\", \"mac\", \"windows\", or \"ubuntu\"\n private tools?: ToolSet;\n private safetyConfirmationHandler?: SafetyConfirmationHandler;\n\n constructor(\n type: AgentType,\n modelName: string,\n userProvidedInstructions?: string,\n clientOptions?: ClientOptions,\n tools?: ToolSet,\n ) {\n super(type, modelName, userProvidedInstructions);\n\n // Process client options\n this.apiKey =\n (clientOptions?.apiKey as string) || process.env.OPENAI_API_KEY || \"\";\n this.baseURL = (clientOptions?.baseURL as string) || undefined;\n this.organization =\n (clientOptions?.organization as string) || process.env.OPENAI_ORG;\n\n // Get environment if specified\n if (\n clientOptions?.environment &&\n typeof clientOptions.environment === \"string\"\n ) {\n this.environment = clientOptions.environment;\n }\n\n // Store client options for reference\n this.clientOptions = {\n apiKey: this.apiKey,\n };\n\n if (this.baseURL) {\n this.clientOptions.baseURL = this.baseURL;\n }\n\n // Initialize the OpenAI client\n this.client = new OpenAI(this.clientOptions);\n\n this.tools = tools;\n }\n\n setViewport(width: number, height: number): void {\n this.currentViewport = { width, height };\n }\n\n setCurrentUrl(url: string): void {\n this.currentUrl = url;\n }\n\n setScreenshotProvider(provider: () => Promise<string>): void {\n this.screenshotProvider = provider;\n }\n\n setActionHandler(handler: (action: AgentAction) => Promise<void>): void {\n this.actionHandler = handler;\n }\n\n setTools(tools: ToolSet): void {\n this.tools = tools;\n }\n\n setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void {\n this.safetyConfirmationHandler = handler;\n }\n\n /**\n * Execute a task with the OpenAI CUA\n * This is the main entry point for the agent\n * @implements AgentClient.execute\n */\n async execute(executionOptions: AgentExecutionOptions): Promise<AgentResult> {\n const { options, logger } = executionOptions;\n const { instruction } = options;\n const maxSteps = options.maxSteps || 10;\n\n let currentStep = 0;\n let completed = false;\n const actions: AgentAction[] = [];\n const messageList: string[] = [];\n let finalMessage = \"\";\n this.reasoningItems.clear(); // Clear any previous reasoning items\n\n // Start with the initial instruction\n let inputItems = this.createInitialInputItems(instruction);\n let previousResponseId: string | undefined = undefined;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalInferenceTime = 0;\n\n try {\n // Execute steps until completion or max steps reached\n while (!completed && currentStep < maxSteps) {\n logger({\n category: \"agent\",\n message: `Executing step ${currentStep + 1}/${maxSteps}`,\n level: 1,\n });\n\n const result = await this.executeStep(\n inputItems,\n previousResponseId,\n logger,\n );\n totalInputTokens += result.usage.input_tokens;\n totalOutputTokens += result.usage.output_tokens;\n totalInferenceTime += result.usage.inference_time_ms;\n\n // Add actions to the list\n actions.push(...result.actions);\n\n // Update completion status\n completed = result.completed;\n\n // Store the previous response ID for the next request\n previousResponseId = result.responseId;\n\n // Update the input items for the next step if we're continuing\n if (!completed) {\n inputItems = result.nextInputItems;\n }\n\n // Record any message for this step\n if (result.message) {\n messageList.push(result.message);\n finalMessage = result.message;\n }\n\n // Increment step counter\n currentStep++;\n }\n\n // Return the final result\n return {\n success: completed,\n actions,\n message: finalMessage,\n completed,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n return {\n success: false,\n actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n }\n }\n\n /**\n * Execute a single step of the agent\n * This coordinates the flow: Request \u2192 Get Action \u2192 Execute Action\n */\n async executeStep(\n inputItems: ResponseInputItem[],\n previousResponseId: string | undefined,\n logger: (message: LogLine) => void,\n ): Promise<{\n actions: AgentAction[];\n message: string;\n completed: boolean;\n nextInputItems: ResponseInputItem[];\n responseId: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n inference_time_ms: number;\n };\n }> {\n try {\n // Get response from the model\n const result = await this.getAction(inputItems, previousResponseId);\n const output = result.output;\n const responseId = result.responseId;\n const usage = {\n input_tokens: result.usage.input_tokens,\n output_tokens: result.usage.output_tokens,\n inference_time_ms: result.usage.inference_time_ms,\n };\n\n // Add any reasoning items to our map\n for (const item of output) {\n if (item.type === \"reasoning\") {\n this.reasoningItems.set(item.id, item);\n logger({\n category: \"agent\",\n message: `Reasoning: ${String(item.content || \"\")}`,\n level: 1,\n });\n }\n }\n\n // Extract actions from the output\n const stepActions: AgentAction[] = [];\n for (const item of output) {\n if (item.type === \"computer_call\" && this.isComputerCallItem(item)) {\n logger({\n category: \"agent\",\n message: `Found computer_call: ${item.action.type}, call_id: ${item.call_id}`,\n level: 2,\n });\n const action = this.convertComputerCallToAction(item);\n if (action) {\n stepActions.push(action);\n logger({\n category: \"agent\",\n message: `Converted computer_call to action: ${action.type}`,\n level: 2,\n });\n }\n } else if (\n item.type === \"function_call\" &&\n this.isFunctionCallItem(item)\n ) {\n logger({\n category: \"agent\",\n message: `Found function_call: ${item.name}, call_id: ${item.call_id}`,\n level: 2,\n });\n const action = this.convertFunctionCallToAction(item);\n if (action) {\n stepActions.push(action);\n logger({\n category: \"agent\",\n message: `Converted function_call to action: ${action.type}`,\n level: 2,\n });\n }\n }\n }\n\n // Extract message text\n let message = \"\";\n for (const item of output) {\n if (item.type === \"message\") {\n logger({\n category: \"agent\",\n message: `Found message block`,\n level: 2,\n });\n if (item.content && Array.isArray(item.content)) {\n for (const content of item.content) {\n if (content.type === \"output_text\" && content.text) {\n message += content.text + \"\\n\";\n logger({\n category: \"agent\",\n message: `Message text: ${String(content.text || \"\")}`,\n level: 1,\n });\n }\n }\n }\n }\n }\n\n // Take actions and get results\n const nextInputItems = await this.takeAction(output, logger);\n\n // Check if completed\n const completed =\n output.length === 0 ||\n output.every(\n (item) => item.type === \"message\" || item.type === \"reasoning\",\n );\n\n return {\n actions: stepActions,\n message: message.trim(),\n completed,\n nextInputItems,\n responseId,\n usage: usage,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing step: ${errorMessage}`,\n level: 0,\n });\n\n throw error;\n }\n }\n\n private isComputerCallItem(item: ResponseItem): item is ComputerCallItem {\n return (\n item.type === \"computer_call\" &&\n \"call_id\" in item &&\n \"action\" in item &&\n typeof item.action === \"object\"\n );\n }\n\n private async handleSafetyConfirmation(\n pendingSafetyChecks: SafetyCheck[],\n logger: (message: LogLine) => void,\n ): Promise<SafetyCheck[] | undefined> {\n if (this.safetyConfirmationHandler) {\n logger({\n category: \"agent\",\n message: `Requesting safety confirmation for ${pendingSafetyChecks.length} check(s): ${pendingSafetyChecks.map((c) => c.code).join(\", \")}`,\n level: 1,\n });\n\n const response =\n await this.safetyConfirmationHandler(pendingSafetyChecks);\n\n if (response.acknowledged) {\n logger({\n category: \"agent\",\n message: `Safety checks acknowledged by user`,\n level: 1,\n });\n return pendingSafetyChecks;\n } else {\n logger({\n category: \"agent\",\n message: `Safety checks rejected by user`,\n level: 1,\n });\n return undefined;\n }\n }\n\n logger({\n category: \"agent\",\n message: `Auto-acknowledging ${pendingSafetyChecks.length} safety check(s)`,\n level: 2,\n });\n return pendingSafetyChecks;\n }\n\n private isFunctionCallItem(item: ResponseItem): item is FunctionCallItem {\n return (\n item.type === \"function_call\" &&\n \"call_id\" in item &&\n \"name\" in item &&\n \"arguments\" in item\n );\n }\n\n private createInitialInputItems(instruction: string): ResponseInputItem[] {\n // For the initial request, we use a simple array with the user's instruction\n return [\n {\n role: \"system\",\n content: this.userProvidedInstructions,\n },\n {\n role: \"user\",\n content: instruction,\n },\n ];\n }\n\n async getAction(\n inputItems: ResponseInputItem[],\n previousResponseId?: string,\n ): Promise<{\n output: ResponseItem[];\n responseId: string;\n usage: Record<string, number>;\n }> {\n try {\n // Create the request parameters\n const requestParams: Record<string, unknown> = {\n model: this.modelName,\n tools: [\n {\n type: \"computer_use_preview\",\n display_width: this.currentViewport.width,\n display_height: this.currentViewport.height,\n environment: this.environment,\n },\n ],\n input: inputItems,\n truncation: \"auto\",\n };\n\n // Add custom tools if available\n if (this.tools && Object.keys(this.tools).length > 0) {\n const customTools = Object.entries(this.tools).map(([name, tool]) => ({\n type: \"function\" as const,\n name,\n function: {\n name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n\n requestParams.tools = [\n ...(requestParams.tools as Record<string, unknown>[]),\n ...customTools,\n ];\n }\n\n // Add previous_response_id if available\n if (previousResponseId) {\n requestParams.previous_response_id = previousResponseId;\n }\n\n // Log LLM request\n const llmRequestId = uuidv7();\n SessionFileLogger.logLlmRequest({\n requestId: llmRequestId,\n model: this.modelName,\n operation: \"CUA.getAction\",\n prompt: formatCuaPromptPreview(inputItems),\n });\n\n const startTime = Date.now();\n // Create the response using the OpenAI Responses API\n // @ts-expect-error - Force type to match what the OpenAI SDK expects\n const response = await this.client.responses.create(requestParams);\n const endTime = Date.now();\n const elapsedMs = endTime - startTime;\n\n // Extract only the input_tokens and output_tokens\n const usage = {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n inference_time_ms: elapsedMs,\n };\n\n // Log LLM response\n SessionFileLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.modelName,\n operation: \"CUA.getAction\",\n output: formatCuaResponsePreview(response.output),\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n });\n\n // Store the response ID for future use\n this.lastResponseId = response.id;\n\n // Return the output and response ID\n return {\n output: response.output as unknown as ResponseItem[],\n responseId: response.id,\n usage,\n };\n } catch (error) {\n console.error(\"Error getting action from OpenAI:\", error);\n throw error;\n }\n }\n\n async takeAction(\n output: ResponseItem[],\n logger: (message: LogLine) => void,\n ): Promise<ResponseInputItem[]> {\n const nextInputItems: ResponseInputItem[] = [];\n\n // Process each output item\n for (const item of output) {\n if (item.type === \"computer_call\" && this.isComputerCallItem(item)) {\n // Handle computer calls\n try {\n const action = this.convertComputerCallToAction(item);\n\n if (action && this.actionHandler) {\n logger({\n category: \"agent\",\n message: `Executing computer action: ${action.type}`,\n level: 1,\n });\n await this.actionHandler(action);\n }\n\n // Capture a screenshot\n const screenshot = await this.captureScreenshot();\n\n // Create a computer_call_output for the next request\n const outputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: \"input_image\" as const,\n image_url: screenshot,\n },\n } as ResponseInputItem;\n\n logger({\n category: \"agent\",\n message: `Added computer_call_output for call_id: ${item.call_id}`,\n level: 2,\n });\n\n // Add current URL if available\n if (this.currentUrl) {\n const computerCallOutput = outputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\";\n image_url: string;\n current_url?: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.output.current_url = this.currentUrl;\n }\n\n if (\n item.pending_safety_checks &&\n item.pending_safety_checks.length > 0\n ) {\n const acknowledgedChecks = await this.handleSafetyConfirmation(\n item.pending_safety_checks,\n logger,\n );\n\n if (acknowledgedChecks) {\n const computerCallOutput = outputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\";\n image_url: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.acknowledged_safety_checks =\n acknowledgedChecks;\n }\n }\n\n nextInputItems.push(outputItem);\n } catch (error) {\n if (error instanceof StagehandClosedError) {\n throw error;\n }\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n logger({\n category: \"agent\",\n message: `Error executing computer call: ${errorMessage}`,\n level: 0,\n });\n\n try {\n // Capture a screenshot even on error\n const screenshot = await this.captureScreenshot();\n\n const errorOutputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: \"input_image\" as const,\n image_url: screenshot,\n error: errorMessage,\n },\n } as ResponseInputItem;\n\n // Add current URL if available\n if (this.currentUrl) {\n const computerCallOutput = errorOutputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\";\n image_url: string;\n current_url?: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.output.current_url = this.currentUrl;\n }\n\n if (\n item.pending_safety_checks &&\n item.pending_safety_checks.length > 0\n ) {\n const acknowledgedChecks = await this.handleSafetyConfirmation(\n item.pending_safety_checks,\n logger,\n );\n\n if (acknowledgedChecks) {\n const computerCallOutput = errorOutputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\";\n image_url: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.acknowledged_safety_checks =\n acknowledgedChecks;\n }\n }\n\n nextInputItems.push(errorOutputItem);\n } catch (screenshotError) {\n if (screenshotError instanceof StagehandClosedError) {\n throw screenshotError;\n }\n // If we can't capture a screenshot, just send the error\n logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String(screenshotError)}`,\n level: 0,\n });\n\n // For error cases without a screenshot, we need to use a string output\n nextInputItems.push({\n type: \"computer_call_output\",\n call_id: item.call_id,\n output: `Error: ${errorMessage}`,\n } as ResponseInputItem);\n }\n }\n } else if (\n item.type === \"function_call\" &&\n this.isFunctionCallItem(item)\n ) {\n // Handle function calls (tool calls)\n try {\n const action = this.convertFunctionCallToAction(item);\n\n if (action && this.actionHandler) {\n await this.actionHandler(action);\n }\n\n // Execute the tool if available\n let toolResult = \"Tool executed successfully\";\n if (this.tools && item.name in this.tools) {\n try {\n const tool = this.tools[item.name];\n const args = JSON.parse(item.arguments);\n\n logger({\n category: \"agent\",\n message: `Executing tool call: ${item.name} with args: ${item.arguments}`,\n level: 1,\n });\n\n const result = await tool.execute(args, {\n toolCallId: item.call_id,\n messages: [],\n });\n toolResult = JSON.stringify(result);\n\n logger({\n category: \"agent\",\n message: `Tool ${item.name} completed successfully. Result: ${toolResult}`,\n level: 1,\n });\n } catch (toolError) {\n const errorMessage =\n toolError instanceof Error\n ? toolError.message\n : String(toolError);\n toolResult = `Error executing tool: ${errorMessage}`;\n\n logger({\n category: \"agent\",\n message: `Error executing tool ${item.name}: ${errorMessage}`,\n level: 0,\n });\n }\n }\n\n // Create a function_call_output for the next request\n const outputItem: ResponseInputItem = {\n type: \"function_call_output\",\n call_id: item.call_id,\n output: toolResult,\n };\n\n nextInputItems.push(outputItem);\n } catch (error) {\n if (error instanceof StagehandClosedError) {\n throw error;\n }\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n logger({\n category: \"agent\",\n message: `Error executing function call: ${errorMessage}`,\n level: 0,\n });\n\n // Send error result back\n const errorOutputItem: ResponseInputItem = {\n type: \"function_call_output\",\n call_id: item.call_id,\n output: `Error: ${errorMessage}`,\n };\n\n nextInputItems.push(errorOutputItem);\n }\n }\n }\n\n return nextInputItems;\n }\n\n private convertComputerCallToAction(\n call: ComputerCallItem,\n ): AgentAction | null {\n const { action } = call;\n\n // Instead of wrapping the action in a params object, spread the action properties directly\n // This ensures properties like x, y, button, etc. are directly accessible on the AgentAction\n return {\n type: action.type as string,\n ...action, // Spread all properties from the action\n };\n }\n\n private convertFunctionCallToAction(\n call: FunctionCallItem,\n ): AgentAction | null {\n try {\n const args = JSON.parse(call.arguments);\n\n return {\n type: call.name,\n params: args,\n };\n } catch (error) {\n console.error(\"Error parsing function call arguments:\", error);\n return null;\n }\n }\n\n async captureScreenshot(options?: {\n base64Image?: string;\n currentUrl?: string;\n }): Promise<string> {\n // Use provided options if available\n if (options?.base64Image) {\n return `data:image/png;base64,${options.base64Image}`;\n }\n\n // Use the screenshot provider if available\n if (this.screenshotProvider) {\n try {\n const base64Image = await this.screenshotProvider();\n return `data:image/png;base64,${base64Image}`;\n } catch (error) {\n console.error(\"Error capturing screenshot:\", error);\n throw error;\n }\n }\n\n throw new AgentScreenshotProviderError(\n \"`screenshotProvider` has not been set. \" +\n \"Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image\",\n );\n }\n}\n", "import {\n GoogleGenAI,\n Content,\n Part,\n GenerateContentResponse,\n FunctionCall,\n GenerateContentConfig,\n Tool,\n GoogleGenAIOptions,\n} from \"@google/genai\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport {\n AgentAction,\n AgentResult,\n AgentType,\n AgentExecutionOptions,\n SafetyCheck,\n SafetyConfirmationHandler,\n} from \"../types/public/agent.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\nimport { AgentClient } from \"./AgentClient.js\";\nimport {\n AgentScreenshotProviderError,\n LLMResponseError,\n StagehandClosedError,\n} from \"../types/public/sdkErrors.js\";\nimport { buildGoogleCUASystemPrompt } from \"../../prompt.js\";\nimport { compressGoogleConversationImages } from \"./utils/imageCompression.js\";\nimport { mapKeyToPlaywright } from \"./utils/cuaKeyMapping.js\";\nimport {\n executeGoogleCustomTool,\n isCustomTool,\n convertToolSetToFunctionDeclarations,\n} from \"./utils/googleCustomToolHandler.js\";\nimport { ToolSet } from \"ai\";\nimport {\n SessionFileLogger,\n formatCuaPromptPreview,\n formatCuaResponsePreview,\n} from \"../flowLogger.js\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * Client for Google's Computer Use Assistant API\n * This implementation uses the Google Generative AI SDK for Computer Use\n */\nexport class GoogleCUAClient extends AgentClient {\n private apiKey: string;\n private client: GoogleGenAI;\n private currentViewport = { width: 1288, height: 711 };\n private currentUrl?: string;\n private screenshotProvider?: () => Promise<string>;\n private actionHandler?: (action: AgentAction) => Promise<void>;\n private history: Content[] = [];\n private environment: \"ENVIRONMENT_BROWSER\" | \"ENVIRONMENT_DESKTOP\" =\n \"ENVIRONMENT_BROWSER\";\n private generateContentConfig: GenerateContentConfig;\n private tools?: ToolSet;\n private baseURL?: string;\n private safetyConfirmationHandler?: SafetyConfirmationHandler;\n constructor(\n type: AgentType,\n modelName: string,\n userProvidedInstructions?: string,\n clientOptions?: ClientOptions,\n tools?: ToolSet,\n ) {\n super(type, modelName, userProvidedInstructions);\n\n this.tools = tools;\n // Process client options\n this.apiKey =\n (clientOptions?.apiKey as string) ||\n process.env.GEMINI_API_KEY ||\n process.env.GOOGLE_GENERATIVE_AI_API_KEY ||\n process.env.GOOGLE_API_KEY ||\n \"\";\n this.baseURL = clientOptions?.baseURL as string | undefined;\n\n // Initialize the Google Generative AI client\n const genAIOptions: GoogleGenAIOptions = {\n apiKey: this.apiKey,\n ...(this.baseURL ? { httpOptions: { baseUrl: this.baseURL } } : {}),\n };\n this.client = new GoogleGenAI(genAIOptions);\n\n // Get environment if specified\n if (\n clientOptions?.environment &&\n typeof clientOptions.environment === \"string\"\n ) {\n this.environment = clientOptions.environment as typeof this.environment;\n }\n\n this.generateContentConfig = {\n temperature: 1,\n topP: 0.95,\n topK: 40,\n maxOutputTokens: 8192,\n // systemInstruction: this.userProvidedInstructions\n // ? { parts: [{ text: this.userProvidedInstructions }] }\n // : { parts: [{ text: buildGoogleCUASystemPrompt() }] },\n tools: [\n {\n computerUse: {\n environment: this.environment,\n },\n } as Tool,\n ],\n };\n\n // Store client options for reference\n this.clientOptions = {\n apiKey: this.apiKey,\n ...(this.baseURL ? { baseURL: this.baseURL } : {}),\n };\n\n // Initialize tools if provided\n if (this.tools && Object.keys(this.tools).length > 0) {\n this.updateGenerateContentConfig();\n }\n }\n\n public setViewport(width: number, height: number): void {\n this.currentViewport = { width, height };\n }\n\n setCurrentUrl(url: string): void {\n this.currentUrl = url;\n }\n\n setScreenshotProvider(provider: () => Promise<string>): void {\n this.screenshotProvider = provider;\n }\n\n setActionHandler(handler: (action: AgentAction) => Promise<void>): void {\n this.actionHandler = handler;\n }\n\n setTools(tools: ToolSet): void {\n this.tools = tools;\n this.updateGenerateContentConfig();\n }\n\n setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void {\n this.safetyConfirmationHandler = handler;\n }\n\n private async handleSafetyConfirmation(\n safetyDecision: unknown,\n logger: (message: LogLine) => void,\n ): Promise<string | undefined> {\n const safetyMessage =\n typeof safetyDecision === \"object\"\n ? JSON.stringify(safetyDecision, null, 2)\n : String(safetyDecision);\n\n const safetyChecks: SafetyCheck[] = [\n {\n id: \"google-safety-decision\",\n code: \"safety_decision\",\n message: safetyMessage,\n },\n ];\n\n if (this.safetyConfirmationHandler) {\n logger({\n category: \"agent\",\n message: `Requesting safety confirmation for Google safety decision: ${safetyMessage}`,\n level: 1,\n });\n\n const response = await this.safetyConfirmationHandler(safetyChecks);\n\n if (response.acknowledged) {\n logger({\n category: \"agent\",\n message: `Safety decision acknowledged by user`,\n level: 1,\n });\n return \"true\";\n } else {\n logger({\n category: \"agent\",\n message: `Safety decision rejected by user`,\n level: 1,\n });\n return undefined;\n }\n }\n\n logger({\n category: \"agent\",\n message: `Auto-acknowledging Google safety decision`,\n level: 2,\n });\n return \"true\";\n }\n\n /**\n * Update the generateContentConfig with current tools\n */\n private updateGenerateContentConfig(): void {\n const functionDeclarations =\n this.tools && Object.keys(this.tools).length > 0\n ? convertToolSetToFunctionDeclarations(this.tools)\n : [];\n\n this.generateContentConfig = {\n ...this.generateContentConfig,\n tools: [\n {\n computerUse: {\n environment: this.environment,\n },\n ...(functionDeclarations.length > 0 ? { functionDeclarations } : {}),\n } as Tool,\n ],\n };\n }\n\n /**\n * Execute a task with the Google CUA\n * This is the main entry point for the agent\n * @implements AgentClient.execute\n */\n async execute(executionOptions: AgentExecutionOptions): Promise<AgentResult> {\n const { options, logger } = executionOptions;\n const { instruction } = options;\n const maxSteps = options.maxSteps || 10;\n\n let currentStep = 0;\n let completed = false;\n const actions: AgentAction[] = [];\n const messageList: string[] = [];\n let finalMessage = \"\";\n this.history = []; // Clear history for new execution\n\n // Start with the initial instruction\n await this.initializeHistory(instruction);\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalInferenceTime = 0;\n\n try {\n // Execute steps until completion or max steps reached\n while (!completed && currentStep < maxSteps) {\n logger({\n category: \"agent\",\n message: `Executing step ${currentStep + 1}/${maxSteps}`,\n level: 1,\n });\n\n const result = await this.executeStep(logger);\n totalInputTokens += result.usage.input_tokens;\n totalOutputTokens += result.usage.output_tokens;\n totalInferenceTime += result.usage.inference_time_ms;\n\n // Add actions to the list\n actions.push(...result.actions);\n\n // Update completion status\n completed = result.completed;\n\n // Record any message for this step\n if (result.message) {\n messageList.push(result.message);\n finalMessage = result.message;\n }\n\n // Increment step counter\n currentStep++;\n }\n\n // Return the final result\n return {\n success: completed,\n actions,\n message: finalMessage,\n completed,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n return {\n success: false,\n actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n }\n }\n\n /**\n * Initialize conversation history with the initial instruction\n */\n private async initializeHistory(instruction: string): Promise<void> {\n const parts: Part[] = [{ text: instruction }];\n\n // Note: The Python implementation doesn't include the initial screenshot\n // Following the same pattern here\n\n const systemPromptContent = this.userProvidedInstructions\n ? this.userProvidedInstructions\n : buildGoogleCUASystemPrompt().content;\n\n this.history = [\n {\n role: \"user\",\n parts: [\n {\n text: \"System prompt: \" + systemPromptContent,\n },\n ],\n },\n {\n role: \"user\",\n parts,\n },\n ];\n }\n\n /**\n * Execute a single step of the agent\n */\n async executeStep(logger: (message: LogLine) => void): Promise<{\n actions: AgentAction[];\n message: string;\n completed: boolean;\n usage: {\n input_tokens: number;\n output_tokens: number;\n inference_time_ms: number;\n };\n }> {\n try {\n const startTime = Date.now();\n\n // Compress images in conversation history before sending to the model\n const compressedResult = compressGoogleConversationImages(\n this.history,\n 2,\n );\n const compressedHistory = compressedResult.items;\n\n // Use the SDK's generateContent method with retry logic (matching Python's get_model_response)\n const maxRetries = 5;\n const baseDelayS = 1;\n let lastError: Error | null = null;\n let response: GenerateContentResponse | null = null;\n\n // Log LLM request\n const llmRequestId = uuidv7();\n SessionFileLogger.logLlmRequest({\n requestId: llmRequestId,\n model: this.modelName,\n operation: \"CUA.generateContent\",\n prompt: formatCuaPromptPreview(compressedHistory),\n });\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n // Add exponential backoff delay for retries\n if (attempt > 0) {\n const delay = baseDelayS * Math.pow(2, attempt) * 1000; // Convert to ms\n logger({\n category: \"agent\",\n message: `Generating content failed on attempt ${attempt + 1}. Retrying in ${delay / 1000} seconds...`,\n level: 2,\n });\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n // Use the SDK's generateContent method - following Python SDK pattern\n response = await this.client.models.generateContent({\n model: this.modelName,\n contents: compressedHistory,\n config: this.generateContentConfig,\n });\n\n // Check if we have valid response content\n if (!response.candidates || response.candidates.length === 0) {\n throw new LLMResponseError(\"agent\", \"Response has no candidates!\");\n }\n\n const candidate = response.candidates[0];\n if (!candidate.content || !candidate.content.parts) {\n const reason = candidate.finishReason || \"unknown\";\n throw new LLMResponseError(\n \"agent\",\n `Response has no content (finish reason: ${reason})`,\n );\n }\n\n // Success - we have a valid response\n break;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n logger({\n category: \"agent\",\n message: `API call error: ${lastError.message}`,\n level: 2,\n });\n\n // If this was the last attempt, throw the error\n if (attempt === maxRetries - 1) {\n logger({\n category: \"agent\",\n message: `Generating content failed after ${maxRetries} attempts.`,\n level: 0,\n });\n throw lastError;\n }\n }\n }\n\n if (!response) {\n throw (\n lastError || new Error(\"Failed to get response after all retries\")\n );\n }\n\n const endTime = Date.now();\n const elapsedMs = endTime - startTime;\n const { usageMetadata } = response;\n\n // Log LLM response\n SessionFileLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.modelName,\n operation: \"CUA.generateContent\",\n output: formatCuaResponsePreview(response),\n inputTokens: usageMetadata?.promptTokenCount,\n outputTokens: usageMetadata?.candidatesTokenCount,\n });\n\n // Process the response\n const result = await this.processResponse(response, logger);\n\n // Add model response to history\n if (response.candidates && response.candidates[0]) {\n // Sanitize any out-of-range coordinates in function calls before adding to history\n const sanitizedContent = JSON.parse(\n JSON.stringify(response.candidates[0].content),\n );\n if (sanitizedContent.parts) {\n for (const part of sanitizedContent.parts) {\n if (part.functionCall?.args) {\n if (\n typeof part.functionCall.args.x === \"number\" &&\n part.functionCall.args.x > 999\n ) {\n part.functionCall.args.x = 999;\n }\n if (\n typeof part.functionCall.args.y === \"number\" &&\n part.functionCall.args.y > 999\n ) {\n part.functionCall.args.y = 999;\n }\n }\n }\n }\n this.history.push(sanitizedContent);\n }\n\n // Execute actions and collect function responses\n const functionResponses: Part[] = [];\n\n if (result.actions.length > 0) {\n let hasError = false;\n\n // Execute all actions\n for (let i = 0; i < result.actions.length; i++) {\n const action = result.actions[i];\n\n logger({\n category: \"agent\",\n message: `Executing action ${i + 1}/${result.actions.length}: ${action.type}`,\n level: 2,\n });\n\n // Special handling for open_web_browser - don't execute it\n if (action.type === \"open_web_browser\") {\n // Set pageUrl for open_web_browser since it doesn't go through action handler\n action.pageUrl = this.currentUrl;\n logger({\n category: \"agent\",\n message: \"Skipping open_web_browser action\",\n level: 2,\n });\n } else if (action.type === \"custom_tool\") {\n const toolName = action.name as string;\n const toolArgs = action.arguments as Record<string, unknown>;\n\n if (this.tools && toolName in this.tools) {\n const correspondingFunctionCall = result.functionCalls.find(\n (fc) => fc.name === toolName,\n );\n\n if (correspondingFunctionCall) {\n const executionResult = await executeGoogleCustomTool(\n toolName,\n toolArgs,\n this.tools,\n correspondingFunctionCall,\n logger,\n );\n\n functionResponses.push(executionResult.functionResponse);\n\n if (!executionResult.success) {\n hasError = true;\n }\n }\n }\n } else if (this.actionHandler) {\n try {\n await this.actionHandler(action);\n\n // Add a delay between actions to ensure they complete properly\n // Longer delay for typing actions to ensure fields are ready\n if (i < result.actions.length - 1) {\n const nextAction = result.actions[i + 1];\n const isTypingAction =\n action.type === \"type\" || nextAction.type === \"type\";\n const delay = isTypingAction ? 500 : 200;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n } catch (actionError) {\n if (actionError instanceof StagehandClosedError) {\n throw actionError;\n }\n logger({\n category: \"agent\",\n message: `Error executing action ${action.type}: ${actionError}`,\n level: 0,\n });\n hasError = true;\n // Continue processing other actions even if one fails\n }\n }\n }\n\n // Create function responses for computer use actions (non-custom tools)\n // We need exactly one response per function call, regardless of how many actions were generated\n if (result.functionCalls.length > 0 || hasError) {\n // Filter out custom tool function calls as they've already been handled\n const computerUseFunctionCalls = result.functionCalls.filter(\n (fc) => !isCustomTool(fc, this.tools),\n );\n\n if (computerUseFunctionCalls.length > 0) {\n try {\n logger({\n category: \"agent\",\n message: `Taking screenshot after executing ${result.actions.length} actions${hasError ? \" (with errors)\" : \"\"}`,\n level: 2,\n });\n\n const screenshot = await this.captureScreenshot();\n const base64Data = screenshot.replace(\n /^data:image\\/png;base64,/,\n \"\",\n );\n\n // Create one function response for each computer use function call\n // Following Python SDK pattern: FunctionResponse with parts containing inline_data\n for (const functionCall of computerUseFunctionCalls) {\n let safetyAcknowledgement: string | undefined;\n if (functionCall.args?.safety_decision) {\n safetyAcknowledgement = await this.handleSafetyConfirmation(\n functionCall.args.safety_decision,\n logger,\n );\n }\n\n const functionResponsePart: Part = {\n functionResponse: {\n name: functionCall.name,\n response: {\n url: this.currentUrl || \"\",\n ...(safetyAcknowledgement !== undefined\n ? {\n safety_acknowledgement: safetyAcknowledgement,\n }\n : {}),\n },\n parts: [\n {\n inlineData: {\n mimeType: \"image/png\",\n data: base64Data,\n },\n },\n ],\n },\n };\n functionResponses.push(functionResponsePart);\n }\n } catch (error) {\n logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${error}`,\n level: 0,\n });\n }\n }\n }\n\n // Add all function responses to history in a single user message\n if (functionResponses.length > 0) {\n logger({\n category: \"agent\",\n message: `Adding ${functionResponses.length} function responses to history`,\n level: 2,\n });\n this.history.push({\n role: \"user\",\n parts: functionResponses,\n });\n }\n }\n\n return {\n actions: result.actions,\n message: result.message,\n completed: result.completed,\n usage: {\n input_tokens: usageMetadata?.promptTokenCount || 0,\n output_tokens: usageMetadata?.candidatesTokenCount || 0,\n inference_time_ms: elapsedMs,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing step: ${errorMessage}`,\n level: 0,\n });\n\n throw error;\n }\n }\n\n /**\n * Process the response from Google's API\n */\n private async processResponse(\n response: GenerateContentResponse,\n logger: (message: LogLine) => void,\n ): Promise<{\n actions: AgentAction[];\n message: string;\n completed: boolean;\n functionCalls: FunctionCall[];\n }> {\n const actions: AgentAction[] = [];\n let message = \"\";\n const functionCalls: FunctionCall[] = [];\n\n if (!response.candidates || response.candidates.length === 0) {\n return {\n actions: [],\n message: \"No candidates in response\",\n completed: true,\n functionCalls: [],\n };\n }\n const candidate = response.candidates[0];\n\n // Log the raw response for debugging\n logger({\n category: \"agent\",\n message: `Raw response from Google: ${JSON.stringify(candidate.content, null, 2)}`,\n level: 2,\n });\n\n // Process all parts - Google can send multiple function calls\n for (const part of candidate.content.parts) {\n if (part.text) {\n message += part.text + \"\\n\";\n logger({\n category: \"agent\",\n message: `Reasoning: ${part.text}`,\n level: 1,\n });\n }\n if (part.functionCall) {\n functionCalls.push(part.functionCall);\n logger({\n category: \"agent\",\n message: `Found function call: ${part.functionCall.name} with args: ${JSON.stringify(part.functionCall.args)}`,\n level: 2,\n });\n\n // Convert function call to action(s)\n const action = this.convertFunctionCallToAction(part.functionCall);\n if (action) {\n // Special handling for type_text_at - we need to click first\n if (\n part.functionCall.name === \"type_text_at\" &&\n action.type === \"type\"\n ) {\n logger({\n category: \"agent\",\n message: `Adding action: ${JSON.stringify(action)}`,\n level: 2,\n });\n // First add a click action at the same coordinates\n actions.push({\n type: \"click\",\n x: action.x,\n y: action.y,\n button: \"left\",\n });\n\n // If clear_before_typing is true (default), add a select all\n if (action.clearBeforeTyping) {\n // Select all text in the field\n actions.push({\n type: \"keypress\",\n keys: [\"ControlOrMeta+A\"],\n });\n actions.push({\n type: \"keypress\",\n keys: [\"Backspace\"],\n });\n }\n\n // Then add the type action\n actions.push(action);\n if (action.pressEnter) {\n actions.push({\n type: \"keypress\",\n keys: [\"Enter\"],\n });\n }\n } else {\n actions.push(action);\n }\n } else {\n logger({\n category: \"agent\",\n message: `Warning: Could not convert function call ${part.functionCall.name} to action`,\n level: 1,\n });\n }\n }\n }\n\n // Log summary of what we found\n logger({\n category: \"agent\",\n message: `Found ${functionCalls.length} function calls, converted to ${actions.length} actions`,\n level: 2,\n });\n\n // Check if task is completed\n const completed =\n functionCalls.length === 0 ||\n (candidate.finishReason && candidate.finishReason !== \"STOP\");\n\n return {\n actions,\n message: message.trim(),\n completed,\n functionCalls,\n };\n }\n\n /**\n * Convert Google function call to Stagehand action\n */\n private convertFunctionCallToAction(\n functionCall: FunctionCall,\n ): AgentAction | null {\n const { name, args } = functionCall;\n\n if (!name || !args) {\n return null;\n }\n\n switch (name) {\n case \"open_web_browser\":\n return {\n type: \"open_web_browser\",\n timestamp: Date.now(),\n };\n\n case \"click_at\": {\n const { x, y } = this.normalizeCoordinates(\n args.x as number,\n args.y as number,\n );\n return {\n type: \"click\",\n x,\n y,\n button: args.button || \"left\",\n };\n }\n\n case \"type_text_at\": {\n const { x, y } = this.normalizeCoordinates(\n args.x as number,\n args.y as number,\n );\n // Google's type_text_at includes press_enter and clear_before_typing parameters\n const pressEnter = (args.press_enter as boolean) ?? false;\n const clearBeforeTyping = (args.clear_before_typing as boolean) ?? true;\n\n // For type_text_at, we need to click first then type\n // This matches the behavior expected by Google's CUA\n // We'll handle this in the executeStep method by converting to two actions\n return {\n type: \"type\",\n text: args.text as string,\n x,\n y,\n pressEnter,\n clearBeforeTyping,\n };\n }\n\n case \"key_combination\": {\n const keys = (args.keys as string)\n .split(\"+\")\n .map((key: string) => key.trim())\n .map((key: string) => mapKeyToPlaywright(key));\n return {\n type: \"keypress\",\n keys,\n };\n }\n\n case \"scroll_document\": {\n const direction = (args.direction as string).toLowerCase();\n return {\n type: \"keypress\",\n keys: [direction === \"up\" ? \"PageUp\" : \"PageDown\"],\n };\n }\n\n case \"scroll_at\": {\n const { x, y } = this.normalizeCoordinates(\n args.x as number,\n args.y as number,\n );\n const direction = ((args.direction as string) || \"down\").toLowerCase();\n const magnitude =\n typeof args.magnitude === \"number\" ? (args.magnitude as number) : 800;\n\n let scroll_x = 0;\n let scroll_y = 0;\n if (direction === \"up\") {\n scroll_y = -magnitude;\n } else if (direction === \"down\") {\n scroll_y = magnitude;\n } else if (direction === \"left\") {\n scroll_x = -magnitude;\n } else if (direction === \"right\") {\n scroll_x = magnitude;\n } else {\n // Default to down if unknown direction\n scroll_y = magnitude;\n }\n\n return {\n type: \"scroll\",\n x,\n y,\n scroll_x,\n scroll_y,\n };\n }\n\n case \"navigate\":\n return {\n type: \"goto\",\n url: args.url as string,\n };\n\n case \"go_back\":\n return {\n type: \"back\",\n };\n\n case \"go_forward\":\n return {\n type: \"forward\",\n };\n\n case \"wait_5_seconds\":\n return {\n type: \"wait\",\n timeMs: 5000, // Google CUA waits for 5 seconds\n };\n\n case \"hover_at\": {\n const { x, y } = this.normalizeCoordinates(\n args.x as number,\n args.y as number,\n );\n return {\n type: \"move\",\n x,\n y,\n };\n }\n\n case \"search\":\n return {\n type: \"goto\",\n url: \"https://www.google.com\",\n };\n\n case \"drag_and_drop\": {\n const startPoint = this.normalizeCoordinates(\n args.x as number,\n args.y as number,\n );\n const endPoint = this.normalizeCoordinates(\n args.destination_x as number,\n args.destination_y as number,\n );\n return {\n type: \"drag\",\n path: [\n { x: startPoint.x, y: startPoint.y },\n { x: endPoint.x, y: endPoint.y },\n ],\n };\n }\n\n default:\n if (isCustomTool(functionCall, this.tools)) {\n return {\n type: \"custom_tool\",\n name,\n arguments: args,\n timestamp: Date.now(),\n pageUrl: this.currentUrl,\n };\n }\n console.warn(`Unsupported Google CUA function: ${name}`);\n return null;\n }\n }\n\n /**\n * Normalize coordinates from Google's 0-1000 range to viewport dimensions\n */\n private normalizeCoordinates(x: number, y: number): { x: number; y: number } {\n const clampedX = Math.min(999, Math.max(0, x));\n const clampedY = Math.min(999, Math.max(0, y));\n return {\n x: Math.floor((clampedX / 1000) * this.currentViewport.width),\n y: Math.floor((clampedY / 1000) * this.currentViewport.height),\n };\n }\n\n async captureScreenshot(options?: {\n base64Image?: string;\n currentUrl?: string;\n }): Promise<string> {\n // Update current URL if provided\n if (options?.currentUrl) {\n this.currentUrl = options.currentUrl;\n }\n\n // Use provided options if available\n if (options?.base64Image) {\n return `data:image/png;base64,${options.base64Image}`;\n }\n\n // Use the screenshot provider if available\n if (this.screenshotProvider) {\n try {\n const base64Image = await this.screenshotProvider();\n return `data:image/png;base64,${base64Image}`;\n } catch (error) {\n console.error(\"Error capturing screenshot:\", error);\n throw error;\n }\n }\n\n throw new AgentScreenshotProviderError(\n \"`screenshotProvider` has not been set. \" +\n \"Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image\",\n );\n }\n}\n", "/**\n * Universal key mapping utility for converting various key representations\n * to Playwright-compatible key names. Used by all CUA clients and handlers.\n */\n\n/**\n * map of key variations to Playwright key names\n * This handles keys from both Anthropic and OpenAI CUA APIs\n */\nconst KEY_MAP: Record<string, string> = {\n ENTER: \"Enter\",\n RETURN: \"Enter\",\n ESCAPE: \"Escape\",\n ESC: \"Escape\",\n BACKSPACE: \"Backspace\",\n TAB: \"Tab\",\n SPACE: \" \",\n DELETE: \"Delete\",\n DEL: \"Delete\",\n ARROWUP: \"ArrowUp\",\n ARROWDOWN: \"ArrowDown\",\n ARROWLEFT: \"ArrowLeft\",\n ARROWRIGHT: \"ArrowRight\",\n ARROW_UP: \"ArrowUp\",\n ARROW_DOWN: \"ArrowDown\",\n ARROW_LEFT: \"ArrowLeft\",\n ARROW_RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n SHIFT: \"Shift\",\n CONTROL: \"Control\",\n CTRL: \"Control\",\n ALT: \"Alt\",\n OPTION: \"Alt\", // macOS alternative name\n META: \"Meta\",\n COMMAND: \"Meta\", // macOS\n CMD: \"Meta\", // macOS shorthand\n SUPER: \"Meta\", // Linux\n WINDOWS: \"Meta\", // Windows\n WIN: \"Meta\", // Windows shorthand\n HOME: \"Home\",\n END: \"End\",\n PAGEUP: \"PageUp\",\n PAGEDOWN: \"PageDown\",\n PAGE_UP: \"PageUp\",\n PAGE_DOWN: \"PageDown\",\n PGUP: \"PageUp\",\n PGDN: \"PageDown\",\n};\n\n/**\n * Maps a key name from various formats to Playwright-compatible format\n * @param key The key name in any supported format\n * @returns The Playwright-compatible key name\n */\nexport function mapKeyToPlaywright(key: string): string {\n if (!key) return key;\n const upperKey = key.toUpperCase();\n return KEY_MAP[upperKey] || key;\n}\n", "import { Part, FunctionCall, FunctionDeclaration, Type } from \"@google/genai\";\nimport { ToolSet } from \"ai\";\nimport { LogLine } from \"../../types/public/logs.js\";\nimport { toJsonSchema } from \"../../zodCompat.js\";\nimport type { StagehandZodSchema } from \"../../zodCompat.js\";\n\n/**\n * Result of executing a custom tool for Google CUA\n */\nexport interface CustomToolExecutionResult {\n functionResponse: Part;\n success: boolean;\n}\n\n/**\n * Execute a custom tool and format the response for Google's API\n * This handles tool execution, result formatting, and error handling\n * specific to Google's function response format\n */\nexport async function executeGoogleCustomTool(\n toolName: string,\n toolArgs: Record<string, unknown>,\n tools: ToolSet,\n functionCall: FunctionCall,\n logger: (message: LogLine) => void,\n): Promise<CustomToolExecutionResult> {\n try {\n logger({\n category: \"agent\",\n message: `Executing custom tool: ${toolName} with args: ${JSON.stringify(toolArgs)}`,\n level: 1,\n });\n\n const tool = tools[toolName];\n const toolResult = await tool.execute(toolArgs, {\n toolCallId: `tool_${Date.now()}`,\n messages: [],\n });\n\n logger({\n category: \"agent\",\n message: `Tool ${toolName} completed successfully. Result: ${JSON.stringify(toolResult)}`,\n level: 1,\n });\n\n // Create function response with the result\n const functionResponsePart: Part = {\n functionResponse: {\n name: toolName,\n response: {\n result: JSON.stringify(toolResult),\n },\n },\n };\n\n return {\n functionResponse: functionResponsePart,\n success: true,\n };\n } catch (toolError) {\n const errorMessage =\n toolError instanceof Error ? toolError.message : String(toolError);\n\n logger({\n category: \"agent\",\n message: `Error executing custom tool ${toolName}: ${errorMessage}`,\n level: 0,\n });\n\n // Create error function response\n const functionResponsePart: Part = {\n functionResponse: {\n name: toolName,\n response: {\n error: errorMessage,\n },\n },\n };\n\n return {\n functionResponse: functionResponsePart,\n success: false,\n };\n }\n}\n\n/**\n * Check if a function call is a custom tool\n */\nexport function isCustomTool(\n functionCall: FunctionCall,\n tools?: ToolSet,\n): boolean {\n return !!(tools && functionCall.name && functionCall.name in tools);\n}\n\n/**\n * Convert ToolSet to Google's FunctionDeclaration array\n * Handles the conversion of Zod schemas to Google's parameter format\n */\nexport function convertToolSetToFunctionDeclarations(\n tools: ToolSet,\n): FunctionDeclaration[] {\n const functionDeclarations: FunctionDeclaration[] = [];\n\n for (const [name, tool] of Object.entries(tools)) {\n const functionDeclaration = convertToolToFunctionDeclaration(name, tool);\n if (functionDeclaration) {\n functionDeclarations.push(functionDeclaration);\n }\n }\n\n return functionDeclarations;\n}\n\n/**\n * Convert a single ToolSet tool to Google's FunctionDeclaration format\n */\nfunction convertToolToFunctionDeclaration(\n name: string,\n tool: { description?: string; inputSchema: unknown },\n): FunctionDeclaration | null {\n try {\n // Convert Zod schema to JSON schema\n const schema = tool.inputSchema as StagehandZodSchema;\n const jsonSchema = toJsonSchema(schema) as {\n properties?: Record<string, unknown>;\n required?: string[];\n type?: string;\n };\n\n const parameters = convertJsonSchemaToGoogleParameters(jsonSchema);\n\n return {\n name,\n description: tool.description || `Execute ${name}`,\n parameters,\n };\n } catch (error) {\n console.error(\n `Error converting tool ${name} to function declaration:`,\n error,\n );\n return null;\n }\n}\n\n/**\n * Convert JSON schema to Google's parameter format\n */\nfunction convertJsonSchemaToGoogleParameters(schema: {\n properties?: Record<string, unknown>;\n required?: string[];\n type?: string;\n}): {\n type: Type;\n properties: Record<string, { type: Type; description?: string }>;\n required?: string[];\n} {\n const properties: Record<string, { type: Type; description?: string }> = {};\n\n if (schema.properties) {\n for (const [key, value] of Object.entries(schema.properties)) {\n const propSchema = value as {\n type?: string;\n description?: string;\n items?: { type?: string };\n };\n properties[key] = {\n type: mapJsonTypeToGoogleType(propSchema.type || \"string\"),\n ...(propSchema.description\n ? { description: propSchema.description }\n : {}),\n };\n }\n }\n\n return {\n type: Type.OBJECT,\n properties,\n ...(schema.required && schema.required.length > 0\n ? { required: schema.required }\n : {}),\n };\n}\n\n/**\n * Map JSON schema types to Google's Type enum\n */\nfunction mapJsonTypeToGoogleType(jsonType: string): Type {\n switch (jsonType.toLowerCase()) {\n case \"string\":\n return Type.STRING;\n case \"number\":\n case \"integer\":\n return Type.NUMBER;\n case \"boolean\":\n return Type.BOOLEAN;\n case \"array\":\n return Type.ARRAY;\n case \"object\":\n return Type.OBJECT;\n default:\n return Type.STRING;\n }\n}\n", "import OpenAI from \"openai\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport {\n AgentAction,\n AgentResult,\n AgentType,\n AgentExecutionOptions,\n} from \"../types/public/agent.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\nimport { AgentClient } from \"./AgentClient.js\";\nimport { AgentScreenshotProviderError } from \"../types/public/sdkErrors.js\";\nimport { mapKeyToPlaywright } from \"./utils/cuaKeyMapping.js\";\nimport { ChatCompletionMessageParam } from \"openai/resources/chat/completions\";\n\n/**\n * Message types for FARA agent\n */\ninterface FaraMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | FaraMessageContent[];\n}\n\ninterface FaraMessageContent {\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string; // data:image/png;base64,...\n };\n}\n\n/**\n * FARA function call structure (parsed from XML tags)\n */\ninterface FaraFunctionCall {\n name: string; // Always \"computer_use\"\n arguments: {\n action: string;\n thoughts?: string;\n [key: string]: unknown;\n };\n}\n\n/**\n * Client for FARA (Function-based Autonomous Research Agent) by Microsoft\n * This implementation uses OpenAI-compatible API with XML-based tool calling\n */\nexport class MicrosoftCUAClient extends AgentClient {\n private apiKey: string;\n private baseURL: string;\n private client: OpenAI;\n private currentViewport = { width: 1288, height: 711 };\n private currentUrl?: string;\n private screenshotProvider?: () => Promise<string>;\n private actionHandler?: (action: AgentAction) => Promise<void>;\n\n // Dual history system\n private conversationHistory: FaraMessage[] = []; // Conceptual flow\n private actionHistory: FaraMessage[] = []; // Raw model responses\n\n private maxImages: number = 3;\n private temperature: number = 0;\n private facts: string[] = [];\n\n // FARA-specific MLM processor config\n private readonly MLM_PROCESSOR_IM_CFG = {\n min_pixels: 3136,\n max_pixels: 12845056,\n patch_size: 14,\n merge_size: 2,\n };\n\n // Resized dimensions for model input\n private resizedViewport = { width: 1288, height: 711 };\n\n constructor(\n type: AgentType,\n modelName: string,\n userProvidedInstructions?: string,\n clientOptions?: ClientOptions,\n ) {\n super(type, modelName || \"fara-7b\", userProvidedInstructions);\n\n // Process client options\n this.apiKey =\n (clientOptions?.apiKey as string) ||\n process.env.AZURE_API_KEY ||\n process.env.FIREWORKS_API_KEY ||\n \"\";\n this.baseURL =\n (clientOptions?.baseURL as string) ||\n process.env.AZURE_ENDPOINT ||\n process.env.FIREWORKS_ENDPOINT ||\n \"\";\n\n // Store client options for reference\n this.clientOptions = {\n apiKey: this.apiKey,\n baseURL: this.baseURL,\n };\n\n // Validate API key\n if (!this.apiKey || this.apiKey === \"\") {\n throw new Error(\n \"API key is required. Please provide it via clientOptions.apiKey or AZURE_API_KEY or FIREWORKS_API_KEY environment variables.\",\n );\n }\n\n // Initialize the OpenAI client (FARA uses OpenAI-compatible API)\n this.client = new OpenAI({\n apiKey: this.apiKey,\n baseURL: this.baseURL,\n });\n\n // Max images to keep in history\n if (clientOptions?.maxImages !== undefined) {\n this.maxImages = clientOptions.maxImages as number;\n }\n\n // Temperature\n if (clientOptions?.temperature !== undefined) {\n this.temperature = clientOptions.temperature as number;\n }\n }\n\n setViewport(width: number, height: number): void {\n this.currentViewport = { width, height };\n // Compute resized viewport using smart_resize logic\n this.resizedViewport = this.smartResize(width, height);\n }\n\n setCurrentUrl(url: string): void {\n this.currentUrl = url;\n }\n\n setScreenshotProvider(provider: () => Promise<string>): void {\n this.screenshotProvider = provider;\n }\n\n setActionHandler(handler: (action: AgentAction) => Promise<void>): void {\n this.actionHandler = handler;\n }\n\n /**\n * Smart resize algorithm from FARA\n * Ensures dimensions are divisible by factor and within pixel limits\n */\n private smartResize(\n width: number,\n height: number,\n ): { width: number; height: number } {\n const { patch_size, merge_size, min_pixels, max_pixels } =\n this.MLM_PROCESSOR_IM_CFG;\n const factor = patch_size * merge_size;\n\n const roundByFactor = (num: number, f: number) => Math.round(num / f) * f;\n const ceilByFactor = (num: number, f: number) => Math.ceil(num / f) * f;\n const floorByFactor = (num: number, f: number) => Math.floor(num / f) * f;\n\n let h_bar = Math.max(factor, roundByFactor(height, factor));\n let w_bar = Math.max(factor, roundByFactor(width, factor));\n\n if (h_bar * w_bar > max_pixels) {\n const beta = Math.sqrt((height * width) / max_pixels);\n h_bar = floorByFactor(height / beta, factor);\n w_bar = floorByFactor(width / beta, factor);\n } else if (h_bar * w_bar < min_pixels) {\n const beta = Math.sqrt(min_pixels / (height * width));\n h_bar = ceilByFactor(height * beta, factor);\n w_bar = ceilByFactor(width * beta, factor);\n }\n\n return { width: w_bar, height: h_bar };\n }\n\n /**\n * Generate system prompt with tool description\n * Simplified to match Python's minimal approach\n */\n private generateSystemPrompt(): string {\n const { width, height } = this.resizedViewport;\n\n // Base prompt - Minimalist like Python\n let basePrompt = \"You are a helpful assistant.\";\n\n // Add user-provided instructions if available\n if (this.userProvidedInstructions) {\n basePrompt = `${basePrompt}\\n\\n${this.userProvidedInstructions}`;\n }\n\n // Tool description from FaraComputerUse\n const toolDescription = `Use a mouse and keyboard to interact with a computer, and take screenshots.\n* This is an interface to a desktop GUI. You do not have access to a terminal or applications menu. You must click on desktop icons to start applications.\n* Some applications may take time to start or process actions, so you may need to wait and take successive screenshots to see the results of your actions. E.g. if you click on Firefox and a window doesn't open, try wait and taking another screenshot.\n* The screen's resolution is ${width}x${height}.\n* Whenever you intend to move the cursor to click on an element like an icon, you should consult a screenshot to determine the coordinates of the element before moving the cursor.\n* If you tried clicking on a program or link but it failed to load, even after waiting, try adjusting your cursor position so that the tip of the cursor visually falls on the element that you want to click.\n* Make sure to click any buttons, links, icons, etc with the cursor tip in the center of the element. Don't click boxes on their edges unless asked.\n* When a separate scrollable container prominently overlays the webpage, if you want to scroll within it, you typically need to mouse_move() over it first and then scroll().\n* If a popup window appears that you want to close, if left_click() on the 'X' or close button doesn't work, try key(keys=['Escape']) to close it.\n* On some search bars, when you type(), you may need to press_enter=False and instead separately call left_click() on the search button to submit the search query. This is especially true of search bars that have auto-suggest popups for e.g. locations\n* For calendar widgets, you usually need to left_click() on arrows to move between months and left_click() on dates to select them; type() is not typically used to input dates there.`;\n\n // Tool parameters description\n const actionsDescription = `The action to perform. The available actions are:\n* \\`key\\`: Performs key down presses on the arguments passed in order, then performs key releases in reverse order. Includes \"Enter\", \"Alt\", \"Shift\", \"Tab\", \"Control\", \"Backspace\", \"Delete\", \"Escape\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"PageDown\", \"PageUp\", \"Shift\", etc.\n* \\`type\\`: Type a string of text on the keyboard.\n* \\`mouse_move\\`: Move the cursor to a specified (x, y) pixel coordinate on the screen.\n* \\`left_click\\`: Click the left mouse button.\n* \\`scroll\\`: Performs a scroll of the mouse scroll wheel.\n* \\`history_back\\`: Go back to the previous page in the browser history.\n* \\`pause_and_memorize_fact\\`: Pause and memorize a fact for future reference.\n* \\`visit_url\\`: Visit a specified URL.\n* \\`web_search\\`: Perform a web search with a specified query.\n* \\`wait\\`: Wait specified seconds for the change to happen.\n* \\`terminate\\`: Terminate the current task and report its completion status.`;\n\n // Tool JSON schema\n const toolSchema = {\n name: \"computer_use\",\n description: toolDescription,\n parameters: {\n type: \"object\",\n required: [\"action\"],\n properties: {\n action: {\n type: \"string\",\n description: actionsDescription,\n enum: [\n \"key\",\n \"type\",\n \"mouse_move\",\n \"left_click\",\n \"scroll\",\n \"visit_url\",\n \"web_search\",\n \"history_back\",\n \"pause_and_memorize_fact\",\n \"wait\",\n \"terminate\",\n ],\n },\n keys: {\n type: \"array\",\n description: \"Required only by `action=key`.\",\n },\n text: {\n type: \"string\",\n description: \"Required only by `action=type`.\",\n },\n press_enter: {\n type: \"boolean\",\n description:\n \"Whether to press the Enter key after typing. Required only by `action=type`.\",\n },\n delete_existing_text: {\n type: \"boolean\",\n description:\n \"Whether to delete existing text before typing. Required only by `action=type`.\",\n },\n coordinate: {\n type: \"array\",\n description:\n \"(x, y): The x (pixels from the left edge) and y (pixels from the top edge) coordinates to move the mouse to. Required only by `action=left_click`, `action=mouse_move`, and `action=type`.\",\n },\n pixels: {\n type: \"number\",\n description:\n \"The amount of scrolling to perform. Positive values scroll up, negative values scroll down. Required only by `action=scroll`.\",\n },\n fact: {\n type: \"string\",\n description:\n \"The fact to remember for the future. Required only by `action=pause_and_memorize_fact`.\",\n },\n time: {\n type: \"number\",\n description: \"The seconds to wait. Required only by `action=wait`.\",\n },\n status: {\n type: \"string\",\n description:\n \"The status of the task. Required only by `action=terminate`.\",\n enum: [\"success\", \"failure\"],\n },\n },\n },\n };\n\n // Format as FARA function calling template (FN_CALL_TEMPLATE format)\n const toolDescs = JSON.stringify(toolSchema, null, 2);\n const functionCallTemplate = `\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>\n${toolDescs}\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{{\"name\": <function-name>, \"arguments\": <args-json-object>}}\n</tool_call>`;\n\n return `${basePrompt}\\n\\n${functionCallTemplate}`;\n }\n\n /**\n * Parse thoughts and action from model response\n * FARA uses XML-based tool calling: <tool_call>\\n{...}\\n</tool_call>\n */\n private parseThoughtsAndAction(response: string): {\n thoughts: string;\n functionCall: FaraFunctionCall;\n } {\n try {\n const parts = response.split(\"<tool_call>\\n\");\n const thoughts = parts[0].trim();\n const actionText = parts[1].split(\"\\n</tool_call>\")[0].trim();\n\n let parsedAction;\n try {\n parsedAction = JSON.parse(actionText);\n } catch (jsonError) {\n // Fix common malformed JSON: double opening brackets {{\"name\": ...}}\n // This happens when the model adds an extra opening brace\n if (actionText.startsWith(\"{{\") && actionText.endsWith(\"}\")) {\n // Remove the extra opening brace\n const fixedText = actionText.slice(1);\n try {\n parsedAction = JSON.parse(fixedText);\n } catch (retryError) {\n throw new Error(\n `Failed to parse action text even after fixing double brackets. Original: ${actionText}. Fixed: ${fixedText}. Error: ${retryError}`,\n );\n }\n } else {\n throw new Error(\n `Failed to parse action text as JSON: ${actionText}. Error: ${jsonError}`,\n );\n }\n }\n\n return {\n thoughts,\n functionCall: {\n name: parsedAction.name || \"computer_use\",\n arguments: {\n ...parsedAction.arguments,\n thoughts,\n },\n },\n };\n } catch (error) {\n throw new Error(\n `Failed to parse FARA tool call from response: ${response}. Error: ${error}`,\n );\n }\n }\n\n /**\n * Convert FARA function call to Stagehand AgentAction\n */\n private convertFunctionCallToAction(\n functionCall: FaraFunctionCall,\n ): AgentAction {\n const args = functionCall.arguments;\n const action = args.action as string;\n\n // Transform coordinates from resized to original viewport\n const transformCoordinate = (coord: number[]): number[] => {\n if (!coord || coord.length !== 2) return coord;\n const [x, y] = coord;\n const scaleX = this.currentViewport.width / this.resizedViewport.width;\n const scaleY = this.currentViewport.height / this.resizedViewport.height;\n return [Math.round(x * scaleX), Math.round(y * scaleY)];\n };\n\n const baseAction = {\n type: action,\n reasoning: args.thoughts as string,\n };\n\n switch (action) {\n case \"left_click\": {\n const clickCoord = transformCoordinate(args.coordinate as number[]);\n return {\n ...baseAction,\n type: \"click\",\n x: clickCoord[0],\n y: clickCoord[1],\n button: \"left\" as const,\n };\n }\n\n case \"mouse_move\": {\n const moveCoord = transformCoordinate(args.coordinate as number[]);\n return {\n ...baseAction,\n type: \"move\",\n coordinate: moveCoord,\n };\n }\n\n case \"type\": {\n const typeCoord = args.coordinate\n ? transformCoordinate(args.coordinate as number[])\n : undefined;\n return {\n ...baseAction,\n text: args.text as string,\n ...(typeCoord && { x: typeCoord[0], y: typeCoord[1] }),\n press_enter:\n args.press_enter !== undefined\n ? (args.press_enter as boolean)\n : true,\n ...(args.delete_existing_text !== undefined && {\n delete_existing_text: args.delete_existing_text as boolean,\n }),\n };\n }\n\n case \"key\":\n case \"keypress\": {\n const keys = (args.keys as string[]) || [];\n // Normalize keys to Playwright format\n const normalizedKeys = keys.map((k) => mapKeyToPlaywright(k));\n return {\n ...baseAction,\n type: \"keypress\",\n keys: normalizedKeys,\n };\n }\n\n case \"scroll\": {\n const pixels = (args.pixels as number) || 0;\n // FARA: positive = scroll up, negative = scroll down\n // Convert to scroll_x/scroll_y\n return {\n ...baseAction,\n scroll_x: 0,\n scroll_y: -pixels, // Invert: negative pixels = scroll down\n };\n }\n\n case \"visit_url\": {\n let url = args.url as string;\n // Enhanced URL processing like Python\n if (\n !url.startsWith(\"https://\") &&\n !url.startsWith(\"http://\") &&\n !url.startsWith(\"file://\") &&\n !url.startsWith(\"about:\")\n ) {\n // If URL contains space, treat as search query\n if (url.includes(\" \")) {\n url = `https://www.bing.com/search?q=${encodeURIComponent(url)}&FORM=QBLH`;\n } else {\n // Otherwise prefix with https://\n url = \"https://\" + url;\n }\n }\n return {\n ...baseAction,\n type: \"goto\",\n url,\n };\n }\n\n case \"web_search\": {\n // Convert web search to visit_url with Bing search\n const query = args.query as string;\n const searchUrl = `https://www.bing.com/search?q=${encodeURIComponent(query)}&FORM=QBLH`;\n return {\n ...baseAction,\n type: \"goto\",\n url: searchUrl,\n };\n }\n\n case \"history_back\":\n return {\n ...baseAction,\n type: \"back\",\n };\n\n case \"wait\": {\n // Support both 'time' and 'duration' parameters with default (matches Python)\n const durationSeconds =\n (args.time as number) || (args.duration as number) || 3.0;\n return {\n ...baseAction,\n timeMs: durationSeconds * 1000, // Convert seconds to ms\n };\n }\n\n case \"pause_and_memorize_fact\": {\n // Store the fact for future reference (matches Python)\n const fact = args.fact as string;\n this.facts.push(fact);\n return {\n ...baseAction,\n fact,\n };\n }\n\n case \"terminate\":\n return {\n ...baseAction,\n status: args.status as string,\n };\n\n default:\n return {\n ...baseAction,\n ...args,\n };\n }\n }\n\n /**\n * Capture a screenshot and return as base64 data URL\n */\n async captureScreenshot(): Promise<string> {\n if (!this.screenshotProvider) {\n throw new AgentScreenshotProviderError(\"Screenshot provider not set\");\n }\n\n const base64Screenshot = await this.screenshotProvider();\n return `data:image/png;base64,${base64Screenshot}`;\n }\n\n /**\n * Remove old screenshots from history\n * Matches Python's maybe_remove_old_screenshots\n */\n private maybeRemoveOldScreenshots(\n history: FaraMessage[],\n includesCurrent: boolean = false,\n ): FaraMessage[] {\n if (this.maxImages <= 0) {\n return history;\n }\n\n const maxImages = includesCurrent ? this.maxImages : this.maxImages - 1;\n const newHistory: FaraMessage[] = [];\n let nImages = 0;\n\n // Iterate backwards\n for (let i = history.length - 1; i >= 0; i--) {\n const msg = history[i];\n\n // Check if message has image\n let hasImage = false;\n if (Array.isArray(msg.content)) {\n hasImage = msg.content.some((c) => c.type === \"image_url\");\n }\n\n if (i === 0 && nImages >= maxImages) {\n // First message (task) - preserve text, remove image\n if (Array.isArray(msg.content)) {\n const newContent = msg.content.filter((c) => c.type !== \"image_url\");\n // If no content left, skip (unless it's the only message, but Python logic says continue)\n if (newContent.length === 0) {\n continue;\n }\n newHistory.push({ ...msg, content: newContent });\n } else {\n newHistory.push(msg);\n }\n continue;\n }\n\n if (hasImage) {\n if (nImages < maxImages) {\n newHistory.push(msg);\n nImages++;\n } else {\n // Remove image, keep text\n if (Array.isArray(msg.content)) {\n const newContent = msg.content.filter(\n (c) => c.type !== \"image_url\",\n );\n // If content becomes empty, we can skip this message entirely (unless it's meaningful text)\n // Python logic: if msg is None continue.\n if (newContent.length > 0) {\n newHistory.push({ ...msg, content: newContent });\n }\n } else {\n newHistory.push(msg);\n }\n }\n } else {\n newHistory.push(msg);\n }\n }\n\n return newHistory.reverse();\n }\n\n /**\n * Reconstruct history for API call\n * Merges conceptual chat history with raw action history\n */\n private reconstructHistory(): FaraMessage[] {\n const history: FaraMessage[] = [];\n let actionTurn = 0;\n\n for (let i = 0; i < this.conversationHistory.length; i++) {\n const m = this.conversationHistory[i];\n if (m.role === \"assistant\") {\n if (actionTurn >= this.actionHistory.length) {\n // Should not happen if synced correctly\n console.warn(\"OUT OF SYNC: Action history shorter than chat history\");\n history.push(m);\n } else {\n history.push(this.actionHistory[actionTurn]);\n actionTurn++;\n }\n } else {\n history.push(m);\n }\n }\n\n return this.maybeRemoveOldScreenshots(history);\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n logger: (message: LogLine) => void,\n isFirstRound: boolean = false,\n ): Promise<{\n actions: AgentAction[];\n completed: boolean;\n usage: {\n input_tokens: number;\n output_tokens: number;\n inference_time_ms: number;\n };\n }> {\n // Capture screenshot\n const screenshotDataUrl = await this.captureScreenshot();\n\n // Update conversation history with new screenshot/message\n if (isFirstRound) {\n // First round: modify the last message (initial user instruction) to include screenshot\n const lastMessage =\n this.conversationHistory[this.conversationHistory.length - 1];\n if (lastMessage && lastMessage.role === \"user\") {\n const originalContent =\n typeof lastMessage.content === \"string\"\n ? lastMessage.content\n : (lastMessage.content.find((c) => c.type === \"text\")?.text ??\n \"Start task\");\n\n lastMessage.content = [\n {\n type: \"image_url\",\n image_url: { url: screenshotDataUrl },\n },\n {\n type: \"text\",\n text: originalContent,\n },\n ];\n }\n } else {\n // Subsequent rounds: add new user message with screenshot\n const userContent: FaraMessageContent[] = [\n {\n type: \"image_url\",\n image_url: { url: screenshotDataUrl },\n },\n ];\n\n // Add current URL if available\n let textPrompt =\n \"Here is the next screenshot. Think about what to do next.\";\n if (this.currentUrl) {\n const trimmedUrl =\n this.currentUrl.length > 100\n ? this.currentUrl.slice(0, 100) + \"...\"\n : this.currentUrl;\n textPrompt = `Current URL: ${trimmedUrl}\\n${textPrompt}`;\n }\n\n userContent.push({\n type: \"text\",\n text: textPrompt,\n });\n\n this.conversationHistory.push({\n role: \"user\",\n content: userContent,\n });\n }\n\n // Reconstruct history for model call\n let history = this.reconstructHistory();\n\n // Prepend system prompt (generated fresh)\n const systemMessage: FaraMessage = {\n role: \"system\",\n content: this.generateSystemPrompt(),\n };\n history = [systemMessage, ...history];\n\n // Make API call\n logger({\n category: \"agent\",\n message: `Making API call to FARA model with ${history.length} messages`,\n level: 2,\n });\n\n const startTime = Date.now();\n let response;\n try {\n response = await this.client.chat.completions.create({\n model: this.modelName,\n messages: history as unknown as ChatCompletionMessageParam[],\n temperature: this.temperature,\n });\n } catch (apiError) {\n logger({\n category: \"agent\",\n message: `API call failed: ${apiError instanceof Error ? apiError.message : String(apiError)}`,\n level: 0,\n });\n throw apiError;\n }\n const inferenceTime = Date.now() - startTime;\n\n logger({\n category: \"agent\",\n message: `API call completed in ${inferenceTime}ms`,\n level: 2,\n });\n\n const content = response.choices[0].message.content || \"\";\n const usage = response.usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n };\n\n // Add assistant response to both histories\n const assistantMsg: FaraMessage = {\n role: \"assistant\",\n content,\n };\n this.conversationHistory.push(assistantMsg);\n this.actionHistory.push(assistantMsg);\n\n logger({\n category: \"agent\",\n message: `Model response: ${content}`,\n level: 2,\n });\n\n // Parse tool call\n const { thoughts, functionCall } = this.parseThoughtsAndAction(content);\n\n logger({\n category: \"agent\",\n message: `Thoughts: ${thoughts}`,\n level: 2,\n });\n\n logger({\n category: \"agent\",\n message: `Action: ${JSON.stringify(functionCall.arguments)}`,\n level: 2,\n });\n\n // Convert to AgentAction\n const agentAction = this.convertFunctionCallToAction(functionCall);\n\n // Expand type action into multiple actions if it has coordinates\n const actions: AgentAction[] = [];\n if (\n agentAction.type === \"type\" &&\n typeof agentAction.x === \"number\" &&\n typeof agentAction.y === \"number\"\n ) {\n // First, click at the coordinates to focus the field\n actions.push({\n type: \"click\",\n x: agentAction.x,\n y: agentAction.y,\n button: \"left\",\n });\n\n // If delete_existing_text is true, clear the field first\n if (agentAction.delete_existing_text) {\n actions.push({\n type: \"keypress\",\n keys: [\"Command+A\"],\n });\n actions.push({\n type: \"keypress\",\n keys: [\"Backspace\"],\n });\n }\n\n // Add the type action (without coordinates since we already clicked)\n actions.push({\n type: \"type\",\n text: agentAction.text,\n });\n\n // If press_enter is true (default), press Enter after typing\n if (agentAction.press_enter !== false) {\n actions.push({\n type: \"keypress\",\n keys: [\"Enter\"],\n });\n }\n } else {\n // For all other actions, just add as-is\n actions.push(agentAction);\n }\n\n // Execute all actions if handler is available\n if (this.actionHandler && agentAction.type !== \"terminate\") {\n for (const action of actions) {\n await this.actionHandler(action);\n }\n }\n\n // Check if completed\n const completed = functionCall.arguments.action === \"terminate\";\n\n return {\n actions,\n completed,\n usage: {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n inference_time_ms: inferenceTime,\n },\n };\n }\n\n /**\n * Execute a task with the FARA CUA\n * This is the main entry point for the agent\n * @implements AgentClient.execute\n */\n async execute(executionOptions: AgentExecutionOptions): Promise<AgentResult> {\n const { options, logger } = executionOptions;\n const { instruction } = options;\n const maxSteps = options.maxSteps || 10;\n\n let currentStep = 0;\n let completed = false;\n const actions: AgentAction[] = [];\n const messageList: string[] = [];\n let finalMessage = \"\";\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalInferenceTime = 0;\n\n // Initialize conversation with user instruction\n // System prompt is NOT added here, it's added dynamically in executeStep\n this.conversationHistory = [\n {\n role: \"user\",\n content: instruction,\n },\n ];\n this.actionHistory = [];\n\n try {\n // Execute steps until completion or max steps reached\n while (!completed && currentStep < maxSteps) {\n logger({\n category: \"agent\",\n message: `Executing step ${currentStep + 1}/${maxSteps}`,\n level: 1,\n });\n\n const isFirstRound = currentStep === 0;\n const result = await this.executeStep(logger, isFirstRound);\n totalInputTokens += result.usage.input_tokens;\n totalOutputTokens += result.usage.output_tokens;\n totalInferenceTime += result.usage.inference_time_ms;\n\n // Add actions to the list\n actions.push(...result.actions);\n\n // Update completion status\n completed = result.completed;\n\n currentStep++;\n\n // Record message for this step\n const lastAction = result.actions[result.actions.length - 1];\n if (lastAction?.reasoning) {\n messageList.push(lastAction.reasoning);\n }\n }\n\n // Generate final message\n if (completed) {\n const lastAction = actions[actions.length - 1];\n finalMessage =\n (lastAction as { status?: string })?.status === \"success\"\n ? \"Task completed successfully.\"\n : \"Task completed with failures.\";\n } else {\n finalMessage = `Reached maximum steps (${maxSteps}) without completion.`;\n }\n\n if (messageList.length > 0) {\n finalMessage = `${messageList.join(\"\\n\\n\")}\\n\\n${finalMessage}`;\n }\n\n return {\n success: completed,\n completed,\n message: finalMessage,\n actions,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n } catch (error) {\n logger({\n category: \"agent\",\n message: `Error during execution: ${error}`,\n level: 0,\n });\n\n // Rethrow to allow eval runner's retry logic to handle transient errors\n throw error;\n }\n }\n}\n", "import Browserbase from \"@browserbasehq/sdk\";\nimport {\n BrowserbaseSessionNotFoundError,\n StagehandInitError,\n} from \"../types/public/sdkErrors.js\";\nimport type { BrowserbaseSessionCreateParams } from \"../types/public/api.js\";\nimport { getEnvTimeoutMs, withTimeout } from \"../timeoutConfig.js\";\n\nexport async function createBrowserbaseSession(\n apiKey: string,\n projectId: string,\n params?: BrowserbaseSessionCreateParams,\n resumeSessionId?: string,\n): Promise<{ ws: string; sessionId: string; bb: Browserbase }> {\n const bb = new Browserbase({ apiKey });\n const sessionCreateTimeoutMs = getEnvTimeoutMs(\n \"BROWSERBASE_SESSION_CREATE_MAX_MS\",\n );\n\n // Resume an existing session if provided\n if (resumeSessionId) {\n const retrievePromise = bb.sessions.retrieve(resumeSessionId);\n const existing = (sessionCreateTimeoutMs\n ? await withTimeout(\n retrievePromise,\n sessionCreateTimeoutMs,\n \"Browserbase session retrieve\",\n )\n : await retrievePromise) as unknown as {\n id: string;\n connectUrl?: string;\n status?: string;\n };\n if (!existing?.id) {\n throw new BrowserbaseSessionNotFoundError();\n }\n\n const ws = existing.connectUrl;\n if (!ws) {\n throw new StagehandInitError(\n `Browserbase session resume missing connectUrl for ${resumeSessionId}`,\n );\n }\n return { ws, sessionId: resumeSessionId, bb };\n }\n\n // Create a new session with optional overrides and a default viewport\n const {\n projectId: overrideProjectId,\n browserSettings,\n userMetadata,\n ...rest\n } = params ?? {};\n\n // satisfies check ensures our BrowserbaseSessionCreateParamsSchema stays in sync with SDK\n const createPayload = {\n projectId: overrideProjectId ?? projectId,\n ...rest,\n browserSettings: {\n ...(browserSettings ?? {}),\n viewport: browserSettings?.viewport ?? { width: 1288, height: 711 },\n },\n userMetadata: {\n ...(userMetadata ?? {}),\n stagehand: \"true\",\n },\n } satisfies Browserbase.Sessions.SessionCreateParams;\n\n const createPromise = bb.sessions.create(createPayload);\n const created = (sessionCreateTimeoutMs\n ? await withTimeout(\n createPromise,\n sessionCreateTimeoutMs,\n \"Browserbase session create\",\n )\n : await createPromise) as unknown as { id: string; connectUrl: string };\n\n if (!created?.connectUrl || !created?.id) {\n throw new StagehandInitError(\n \"Browserbase session creation returned an unexpected shape.\",\n );\n }\n\n return { ws: created.connectUrl, sessionId: created.id, bb };\n}\n", "import { launch, LaunchedChrome } from \"chrome-launcher\";\nimport WebSocket from \"ws\";\nimport { ConnectionTimeoutError } from \"../types/public/sdkErrors.js\";\n\ninterface LaunchLocalOptions {\n chromePath?: string;\n chromeFlags?: string[];\n headless?: boolean;\n userDataDir?: string;\n port?: number;\n connectTimeoutMs?: number;\n handleSIGINT?: boolean;\n}\n\nexport async function launchLocalChrome(\n opts: LaunchLocalOptions,\n): Promise<{ ws: string; chrome: LaunchedChrome }> {\n const connectTimeoutMs = opts.connectTimeoutMs ?? 15_000;\n const deadlineMs = Date.now() + connectTimeoutMs;\n const connectionPollInterval = 250;\n const maxConnectionRetries = Math.max(\n 1,\n Math.ceil(connectTimeoutMs / connectionPollInterval),\n );\n const headless = opts.headless ?? false;\n const chromeFlags = [\n headless ? \"--headless=new\" : undefined,\n \"--remote-allow-origins=*\",\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-dev-shm-usage\",\n \"--site-per-process\",\n ...(opts.chromeFlags ?? []),\n ].filter((f): f is string => typeof f === \"string\");\n\n const chrome = await launch({\n chromePath: opts.chromePath,\n chromeFlags,\n port: opts.port,\n userDataDir: opts.userDataDir,\n handleSIGINT: opts.handleSIGINT,\n connectionPollInterval,\n maxConnectionRetries,\n });\n\n const ws = await waitForWebSocketDebuggerUrl(chrome.port, deadlineMs);\n await waitForWebSocketReady(ws, deadlineMs);\n\n return { ws, chrome };\n}\n\nasync function waitForWebSocketDebuggerUrl(\n port: number,\n deadlineMs: number,\n): Promise<string> {\n let lastErrMsg = \"\";\n\n while (Date.now() < deadlineMs) {\n try {\n const resp = await fetch(`http://127.0.0.1:${port}/json/version`);\n if (resp.ok) {\n const json = (await resp.json()) as unknown;\n const url = (json as { webSocketDebuggerUrl?: string })\n .webSocketDebuggerUrl;\n if (typeof url === \"string\") return url;\n } else {\n lastErrMsg = `${resp.status} ${resp.statusText}`;\n }\n } catch (err) {\n lastErrMsg = err instanceof Error ? err.message : String(err);\n }\n await new Promise((r) => setTimeout(r, 250));\n }\n\n throw new ConnectionTimeoutError(\n `Timed out waiting for /json/version on port ${port} ${\n lastErrMsg ? ` (last error: ${lastErrMsg})` : \"\"\n }`,\n );\n}\n\nasync function waitForWebSocketReady(\n wsUrl: string,\n deadlineMs: number,\n): Promise<void> {\n let lastErrMsg = \"\";\n while (Date.now() < deadlineMs) {\n const remainingMs = Math.max(200, deadlineMs - Date.now());\n try {\n await probeWebSocket(wsUrl, Math.min(2_000, remainingMs));\n return;\n } catch (error) {\n lastErrMsg = error instanceof Error ? error.message : String(error);\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n throw new ConnectionTimeoutError(\n `Timed out waiting for CDP websocket to accept connections at ${wsUrl}${\n lastErrMsg ? ` (last error: ${lastErrMsg})` : \"\"\n }`,\n );\n}\n\nfunction probeWebSocket(wsUrl: string, timeoutMs: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n let settled = false;\n const finish = (error?: unknown) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n try {\n ws.terminate();\n } catch {\n // best-effort cleanup\n }\n if (error) {\n reject(error);\n return;\n }\n resolve();\n };\n const timer = setTimeout(() => {\n finish(new Error(`websocket probe timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n ws.once(\"open\", () => finish());\n ws.once(\"error\", (error) => finish(error));\n });\n}\n", "import {\n ExperimentalNotConfiguredError,\n UnsupportedAISDKModelProviderError,\n UnsupportedModelError,\n UnsupportedModelProviderError,\n} from \"../types/public/sdkErrors.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelProvider,\n} from \"../types/public/model.js\";\nimport { AISdkClient } from \"./aisdk.js\";\nimport { AnthropicClient } from \"./AnthropicClient.js\";\nimport { CerebrasClient } from \"./CerebrasClient.js\";\nimport { GoogleClient } from \"./GoogleClient.js\";\nimport { GroqClient } from \"./GroqClient.js\";\nimport { LLMClient } from \"./LLMClient.js\";\nimport { OpenAIClient } from \"./OpenAIClient.js\";\nimport { openai, createOpenAI } from \"@ai-sdk/openai\";\nimport { bedrock, createAmazonBedrock } from \"@ai-sdk/amazon-bedrock\";\nimport { vertex, createVertex } from \"@ai-sdk/google-vertex\";\nimport { anthropic, createAnthropic } from \"@ai-sdk/anthropic\";\nimport { google, createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { xai, createXai } from \"@ai-sdk/xai\";\nimport { azure, createAzure } from \"@ai-sdk/azure\";\nimport { groq, createGroq } from \"@ai-sdk/groq\";\nimport { cerebras, createCerebras } from \"@ai-sdk/cerebras\";\nimport { togetherai, createTogetherAI } from \"@ai-sdk/togetherai\";\nimport { mistral, createMistral } from \"@ai-sdk/mistral\";\nimport { deepseek, createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { perplexity, createPerplexity } from \"@ai-sdk/perplexity\";\nimport { ollama, createOllama } from \"ollama-ai-provider-v2\";\nimport { gateway, createGateway } from \"ai\";\nimport { AISDKProvider, AISDKCustomProvider } from \"../types/public/model.js\";\n\nconst AISDKProviders: Record<string, AISDKProvider> = {\n openai,\n bedrock,\n anthropic,\n google,\n xai,\n azure,\n groq,\n cerebras,\n togetherai,\n mistral,\n deepseek,\n perplexity,\n ollama,\n vertex,\n gateway,\n};\nconst AISDKProvidersWithAPIKey: Record<string, AISDKCustomProvider> = {\n openai: createOpenAI,\n bedrock: createAmazonBedrock,\n anthropic: createAnthropic,\n google: createGoogleGenerativeAI,\n vertex: createVertex,\n xai: createXai,\n azure: createAzure,\n groq: createGroq,\n cerebras: createCerebras,\n togetherai: createTogetherAI,\n mistral: createMistral,\n deepseek: createDeepSeek,\n perplexity: createPerplexity,\n ollama: createOllama,\n gateway: createGateway,\n};\n\nconst modelToProviderMap: { [key in AvailableModel]: ModelProvider } = {\n \"gpt-4.1\": \"openai\",\n \"gpt-4.1-mini\": \"openai\",\n \"gpt-4.1-nano\": \"openai\",\n \"o4-mini\": \"openai\",\n //prettier-ignore\n \"o3\": \"openai\",\n \"o3-mini\": \"openai\",\n //prettier-ignore\n \"o1\": \"openai\",\n \"o1-mini\": \"openai\",\n \"gpt-4o\": \"openai\",\n \"gpt-4o-mini\": \"openai\",\n \"gpt-4o-2024-08-06\": \"openai\",\n \"gpt-4.5-preview\": \"openai\",\n \"o1-preview\": \"openai\",\n \"claude-3-5-sonnet-latest\": \"anthropic\",\n \"claude-3-5-sonnet-20240620\": \"anthropic\",\n \"claude-3-5-sonnet-20241022\": \"anthropic\",\n \"claude-3-7-sonnet-20250219\": \"anthropic\",\n \"claude-3-7-sonnet-latest\": \"anthropic\",\n \"cerebras-llama-3.3-70b\": \"cerebras\",\n \"cerebras-llama-3.1-8b\": \"cerebras\",\n \"groq-llama-3.3-70b-versatile\": \"groq\",\n \"groq-llama-3.3-70b-specdec\": \"groq\",\n \"moonshotai/kimi-k2-instruct\": \"groq\",\n \"gemini-1.5-flash\": \"google\",\n \"gemini-1.5-pro\": \"google\",\n \"gemini-1.5-flash-8b\": \"google\",\n \"gemini-2.0-flash-lite\": \"google\",\n \"gemini-2.0-flash\": \"google\",\n \"gemini-2.5-flash-preview-04-17\": \"google\",\n \"gemini-2.5-pro-preview-03-25\": \"google\",\n};\n\nexport function getAISDKLanguageModel(\n subProvider: string,\n subModelName: string,\n clientOptions?: ClientOptions,\n) {\n const hasValidOptions =\n clientOptions &&\n Object.values(clientOptions).some((v) => v !== undefined && v !== null);\n\n if (hasValidOptions) {\n const creator = AISDKProvidersWithAPIKey[subProvider];\n if (!creator) {\n throw new UnsupportedAISDKModelProviderError(\n subProvider,\n Object.keys(AISDKProvidersWithAPIKey),\n );\n }\n const provider = creator(clientOptions);\n // Get the specific model from the provider\n return provider(subModelName);\n } else {\n const provider = AISDKProviders[subProvider];\n if (!provider) {\n throw new UnsupportedAISDKModelProviderError(\n subProvider,\n Object.keys(AISDKProviders),\n );\n }\n return provider(subModelName);\n }\n}\n\nexport class LLMProvider {\n private logger: (message: LogLine) => void;\n\n constructor(logger: (message: LogLine) => void) {\n this.logger = logger;\n }\n\n getClient(\n modelName: AvailableModel,\n clientOptions?: ClientOptions,\n options?: { experimental?: boolean; disableAPI?: boolean },\n ): LLMClient {\n if (modelName.includes(\"/\")) {\n const firstSlashIndex = modelName.indexOf(\"/\");\n const subProvider = modelName.substring(0, firstSlashIndex);\n const subModelName = modelName.substring(firstSlashIndex + 1);\n if (\n subProvider === \"vertex\" &&\n !options?.disableAPI &&\n !options?.experimental\n ) {\n throw new ExperimentalNotConfiguredError(\"Vertex provider\");\n }\n\n const languageModel = getAISDKLanguageModel(\n subProvider,\n subModelName,\n clientOptions,\n );\n\n return new AISdkClient({\n model: languageModel,\n logger: this.logger,\n });\n }\n\n // Model name doesn't include \"/\" - this format is deprecated\n const provider = modelToProviderMap[modelName];\n if (!provider) {\n throw new UnsupportedModelError(Object.keys(modelToProviderMap));\n }\n\n this.logger({\n category: \"llm\",\n message: `Deprecation warning: Model format \"${modelName}\" is deprecated. Please use the provider/model format (e.g., \"openai/gpt-5\" or \"anthropic/claude-sonnet-4\").`,\n level: 0,\n });\n\n const availableModel = modelName as AvailableModel;\n switch (provider) {\n case \"openai\":\n return new OpenAIClient({\n logger: this.logger,\n modelName: availableModel,\n clientOptions,\n });\n case \"anthropic\":\n return new AnthropicClient({\n logger: this.logger,\n modelName: availableModel,\n clientOptions,\n });\n case \"cerebras\":\n return new CerebrasClient({\n logger: this.logger,\n modelName: availableModel,\n clientOptions,\n });\n case \"groq\":\n return new GroqClient({\n logger: this.logger,\n modelName: availableModel,\n clientOptions,\n });\n case \"google\":\n return new GoogleClient({\n logger: this.logger,\n modelName: availableModel,\n clientOptions,\n });\n default:\n // This default case handles unknown providers that exist in modelToProviderMap\n // but aren't implemented in the switch. This is an internal consistency issue.\n throw new UnsupportedModelProviderError([\n ...new Set(Object.values(modelToProviderMap)),\n ]);\n }\n }\n\n static getModelProvider(modelName: AvailableModel): ModelProvider {\n if (modelName.includes(\"/\")) {\n const firstSlashIndex = modelName.indexOf(\"/\");\n const subProvider = modelName.substring(0, firstSlashIndex);\n if (AISDKProviders[subProvider]) {\n return \"aisdk\";\n }\n }\n const provider = modelToProviderMap[modelName];\n return provider;\n }\n}\n", "import {\n CoreAssistantMessage,\n ModelMessage,\n CoreSystemMessage,\n CoreUserMessage,\n generateObject,\n generateText,\n ImagePart,\n NoObjectGeneratedError,\n TextPart,\n ToolSet,\n Tool,\n} from \"ai\";\nimport type { LanguageModelV2 } from \"@ai-sdk/provider\";\nimport { ChatCompletion } from \"openai/resources\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { AvailableModel } from \"../types/public/model.js\";\nimport { CreateChatCompletionOptions, LLMClient } from \"./LLMClient.js\";\nimport { SessionFileLogger, formatLlmPromptPreview } from \"../flowLogger.js\";\nimport { toJsonSchema } from \"../zodCompat.js\";\n\nexport class AISdkClient extends LLMClient {\n public type = \"aisdk\" as const;\n private model: LanguageModelV2;\n private logger?: (message: LogLine) => void;\n\n constructor({\n model,\n logger,\n }: {\n model: LanguageModelV2;\n logger?: (message: LogLine) => void;\n }) {\n super(model.modelId as AvailableModel);\n this.model = model;\n this.logger = logger;\n }\n\n public getLanguageModel(): LanguageModelV2 {\n return this.model;\n }\n\n async createChatCompletion<T = ChatCompletion>({\n options,\n }: CreateChatCompletionOptions): Promise<T> {\n this.logger?.({\n category: \"aisdk\",\n message: \"creating chat completion\",\n level: 2,\n auxiliary: {\n options: {\n value: JSON.stringify({\n ...options,\n image: undefined,\n messages: options.messages.map((msg) => ({\n ...msg,\n content: Array.isArray(msg.content)\n ? msg.content.map((c) =>\n \"image_url\" in c\n ? { ...c, image_url: { url: \"[IMAGE_REDACTED]\" } }\n : c,\n )\n : msg.content,\n })),\n }),\n type: \"object\",\n },\n modelName: {\n value: this.model.modelId,\n type: \"string\",\n },\n },\n });\n\n const formattedMessages: ModelMessage[] = options.messages.map(\n (message) => {\n if (Array.isArray(message.content)) {\n if (message.role === \"system\") {\n const systemMessage: CoreSystemMessage = {\n role: \"system\",\n content: message.content\n .map((c) => (\"text\" in c ? c.text : \"\"))\n .join(\"\\n\"),\n };\n return systemMessage;\n }\n\n const contentParts = message.content.map((content) => {\n if (\"image_url\" in content) {\n const imageContent: ImagePart = {\n type: \"image\",\n image: content.image_url.url,\n };\n return imageContent;\n } else {\n const textContent: TextPart = {\n type: \"text\",\n text: content.text,\n };\n return textContent;\n }\n });\n\n if (message.role === \"user\") {\n const userMessage: CoreUserMessage = {\n role: \"user\",\n content: contentParts,\n };\n return userMessage;\n } else {\n const textOnlyParts = contentParts.map((part) => ({\n type: \"text\" as const,\n text: part.type === \"image\" ? \"[Image]\" : part.text,\n }));\n const assistantMessage: CoreAssistantMessage = {\n role: \"assistant\",\n content: textOnlyParts,\n };\n return assistantMessage;\n }\n }\n\n return {\n role: message.role,\n content: message.content,\n };\n },\n );\n\n let objectResponse: Awaited<ReturnType<typeof generateObject>>;\n const isGPT5 = this.model.modelId.includes(\"gpt-5\");\n const isCodex = this.model.modelId.includes(\"codex\");\n const usesLowReasoningEffort =\n (this.model.modelId.includes(\"gpt-5.1\") ||\n this.model.modelId.includes(\"gpt-5.2\")) &&\n !isCodex;\n const isDeepSeek = this.model.modelId.includes(\"deepseek\");\n // Kimi models only support temperature=1\n const isKimi = this.model.modelId.includes(\"kimi\");\n const temperature = isKimi ? 1 : options.temperature;\n\n if (options.response_model) {\n // Log LLM request for generateObject (extract)\n const llmRequestId = uuidv7();\n const promptPreview = formatLlmPromptPreview(options.messages, {\n hasSchema: true,\n });\n SessionFileLogger.logLlmRequest({\n requestId: llmRequestId,\n model: this.model.modelId,\n operation: \"generateObject\",\n prompt: promptPreview,\n });\n\n // For models that don't support native structured outputs, add a prompt instruction\n if (isDeepSeek || isKimi) {\n const parsedSchema = JSON.stringify(\n toJsonSchema(options.response_model.schema),\n );\n\n formattedMessages.push({\n role: \"user\",\n content: `Respond in this zod schema format:\\n${parsedSchema}\\n\nYou must respond in JSON format. respond WITH JSON. Do not include any other text, formatting or markdown in your output. Do not include \\`\\`\\` or \\`\\`\\`json in your response. Only the JSON object itself.`,\n });\n }\n\n try {\n objectResponse = await generateObject({\n model: this.model,\n messages: formattedMessages,\n schema: options.response_model.schema,\n temperature,\n providerOptions: isGPT5\n ? {\n openai: {\n textVerbosity: isCodex ? \"medium\" : \"low\", // codex models only support 'medium'\n reasoningEffort: isCodex\n ? \"medium\"\n : usesLowReasoningEffort\n ? \"low\"\n : \"minimal\",\n },\n }\n : undefined,\n });\n } catch (err) {\n // Log error response to maintain request/response pairing\n SessionFileLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.model.modelId,\n operation: \"generateObject\",\n output: `[error: ${err instanceof Error ? err.message : \"unknown\"}]`,\n });\n\n if (NoObjectGeneratedError.isInstance(err)) {\n this.logger?.({\n category: \"AISDK error\",\n message: err.message,\n level: 0,\n auxiliary: {\n cause: {\n value: JSON.stringify(err.cause ?? {}),\n type: \"object\",\n },\n text: {\n value: err.text ?? \"\",\n type: \"string\",\n },\n response: {\n value: JSON.stringify(err.response ?? {}),\n type: \"object\",\n },\n usage: {\n value: JSON.stringify(err.usage ?? {}),\n type: \"object\",\n },\n finishReason: {\n value: err.finishReason ?? \"unknown\",\n type: \"string\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n\n throw err;\n }\n throw err;\n }\n\n const result = {\n data: objectResponse.object,\n usage: {\n prompt_tokens: objectResponse.usage.inputTokens ?? 0,\n completion_tokens: objectResponse.usage.outputTokens ?? 0,\n reasoning_tokens: objectResponse.usage.reasoningTokens ?? 0,\n cached_input_tokens: objectResponse.usage.cachedInputTokens ?? 0,\n total_tokens: objectResponse.usage.totalTokens ?? 0,\n },\n } as T;\n\n // Log LLM response for generateObject\n SessionFileLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.model.modelId,\n operation: \"generateObject\",\n output: JSON.stringify(objectResponse.object),\n inputTokens: objectResponse.usage.inputTokens,\n outputTokens: objectResponse.usage.outputTokens,\n });\n\n this.logger?.({\n category: \"aisdk\",\n message: \"response\",\n level: 1,\n auxiliary: {\n response: {\n value: JSON.stringify({\n object: objectResponse.object,\n usage: objectResponse.usage,\n finishReason: objectResponse.finishReason,\n // Omit request and response properties that might contain images\n }),\n type: \"object\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n\n return result;\n }\n\n const tools: ToolSet = {};\n if (options.tools && options.tools.length > 0) {\n for (const tool of options.tools) {\n tools[tool.name] = {\n description: tool.description,\n inputSchema: tool.parameters,\n } as Tool;\n }\n }\n\n // Log LLM request for generateText (act/observe)\n const llmRequestId = uuidv7();\n const toolCount = Object.keys(tools).length;\n const promptPreview = formatLlmPromptPreview(options.messages, {\n toolCount,\n });\n SessionFileLogger.logLlmRequest({\n requestId: llmRequestId,\n model: this.model.modelId,\n operation: \"generateText\",\n prompt: promptPreview,\n });\n\n let textResponse: Awaited<ReturnType<typeof generateText>>;\n try {\n textResponse = await generateText({\n model: this.model,\n messages: formattedMessages,\n tools: Object.keys(tools).length > 0 ? tools : undefined,\n toolChoice:\n Object.keys(tools).length > 0\n ? options.tool_choice === \"required\"\n ? \"required\"\n : options.tool_choice === \"none\"\n ? \"none\"\n : \"auto\"\n : undefined,\n temperature,\n });\n } catch (err) {\n // Log error response to maintain request/response pairing\n SessionFileLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.model.modelId,\n operation: \"generateText\",\n output: `[error: ${err instanceof Error ? err.message : \"unknown\"}]`,\n });\n throw err;\n }\n\n // Transform AI SDK response to match LLMResponse format expected by operator handler\n const transformedToolCalls = (textResponse.toolCalls || []).map(\n (toolCall) => ({\n id:\n toolCall.toolCallId ||\n `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n type: \"function\",\n function: {\n name: toolCall.toolName,\n arguments: JSON.stringify(toolCall.input),\n },\n }),\n );\n\n const result = {\n id: `chatcmpl_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n object: \"chat.completion\",\n created: Math.floor(Date.now() / 1000),\n model: this.model.modelId,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: textResponse.text || null,\n tool_calls: transformedToolCalls,\n },\n finish_reason: textResponse.finishReason || \"stop\",\n },\n ],\n usage: {\n prompt_tokens: textResponse.usage.inputTokens ?? 0,\n completion_tokens: textResponse.usage.outputTokens ?? 0,\n reasoning_tokens: textResponse.usage.reasoningTokens ?? 0,\n cached_input_tokens: textResponse.usage.cachedInputTokens ?? 0,\n total_tokens: textResponse.usage.totalTokens ?? 0,\n },\n } as T;\n\n // Log LLM response for generateText\n SessionFileLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.model.modelId,\n operation: \"generateText\",\n output:\n textResponse.text ||\n (transformedToolCalls.length > 0\n ? `[${transformedToolCalls.length} tool calls]`\n : \"\"),\n inputTokens: textResponse.usage.inputTokens,\n outputTokens: textResponse.usage.outputTokens,\n });\n\n this.logger?.({\n category: \"aisdk\",\n message: \"response\",\n level: 2,\n auxiliary: {\n response: {\n value: JSON.stringify({\n text: textResponse.text,\n usage: textResponse.usage,\n finishReason: textResponse.finishReason,\n // Omit request and response properties that might contain images\n }),\n type: \"object\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n\n return result;\n }\n}\n", "import Anthropic, { ClientOptions } from \"@anthropic-ai/sdk\";\nimport {\n ImageBlockParam,\n MessageParam,\n TextBlockParam,\n Tool,\n} from \"@anthropic-ai/sdk/resources\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport {\n AnthropicJsonSchemaObject,\n AvailableModel,\n} from \"../types/public/model.js\";\nimport {\n CreateChatCompletionOptions,\n LLMClient,\n LLMResponse,\n} from \"./LLMClient.js\";\nimport { CreateChatCompletionResponseError } from \"../types/public/sdkErrors.js\";\nimport { toJsonSchema } from \"../zodCompat.js\";\n\nexport class AnthropicClient extends LLMClient {\n public type = \"anthropic\" as const;\n private client: Anthropic;\n declare public clientOptions: ClientOptions;\n\n constructor({\n modelName,\n clientOptions,\n userProvidedInstructions,\n }: {\n logger: (message: LogLine) => void;\n modelName: AvailableModel;\n clientOptions?: ClientOptions;\n userProvidedInstructions?: string;\n }) {\n super(modelName);\n this.client = new Anthropic(clientOptions);\n this.modelName = modelName;\n this.clientOptions = clientOptions;\n this.userProvidedInstructions = userProvidedInstructions;\n }\n\n async createChatCompletion<T = LLMResponse>({\n options,\n retries,\n logger,\n }: CreateChatCompletionOptions): Promise<T> {\n const optionsWithoutImage = { ...options };\n delete optionsWithoutImage.image;\n\n logger({\n category: \"anthropic\",\n message: \"creating chat completion\",\n level: 2,\n auxiliary: {\n options: {\n value: JSON.stringify(optionsWithoutImage),\n type: \"object\",\n },\n },\n });\n\n const systemMessage = options.messages.find((msg) => {\n if (msg.role === \"system\") {\n if (typeof msg.content === \"string\") {\n return true;\n } else if (Array.isArray(msg.content)) {\n return msg.content.every((content) => content.type !== \"image_url\");\n }\n }\n return false;\n });\n\n const userMessages = options.messages.filter(\n (msg) => msg.role !== \"system\",\n );\n\n const formattedMessages: MessageParam[] = userMessages.map((msg) => {\n if (typeof msg.content === \"string\") {\n return {\n role: msg.role as \"user\" | \"assistant\", // ensure its not checking for system types\n content: msg.content,\n };\n } else {\n return {\n role: msg.role as \"user\" | \"assistant\",\n content: msg.content.map((content) => {\n if (\"image_url\" in content) {\n const formattedContent: ImageBlockParam = {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/jpeg\",\n data: content.image_url.url,\n },\n };\n\n return formattedContent;\n } else {\n return { type: \"text\", text: content.text };\n }\n }),\n };\n }\n });\n\n if (options.image) {\n const screenshotMessage: MessageParam = {\n role: \"user\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/jpeg\",\n data: options.image.buffer.toString(\"base64\"),\n },\n },\n ],\n };\n if (\n options.image.description &&\n Array.isArray(screenshotMessage.content)\n ) {\n screenshotMessage.content.push({\n type: \"text\",\n text: options.image.description,\n });\n }\n\n formattedMessages.push(screenshotMessage);\n }\n\n let anthropicTools: Tool[] = options.tools?.map((tool) => {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: \"object\",\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n };\n });\n\n let toolDefinition: Tool | undefined;\n if (options.response_model) {\n const jsonSchema = toJsonSchema(options.response_model.schema);\n const { properties: schemaProperties, required: schemaRequired } =\n extractSchemaProperties(jsonSchema);\n\n toolDefinition = {\n name: \"print_extracted_data\",\n description: \"Prints the extracted data based on the provided schema.\",\n input_schema: {\n type: \"object\",\n properties: schemaProperties,\n required: schemaRequired,\n },\n };\n }\n\n if (toolDefinition) {\n anthropicTools = anthropicTools ?? [];\n anthropicTools.push(toolDefinition);\n }\n\n const response = await this.client.messages.create({\n model: this.modelName,\n max_tokens: options.maxOutputTokens || 8192,\n messages: formattedMessages,\n tools: anthropicTools,\n system: systemMessage\n ? (systemMessage.content as string | TextBlockParam[]) // we can cast because we already filtered out image content\n : undefined,\n temperature: options.temperature,\n });\n\n logger({\n category: \"anthropic\",\n message: \"response\",\n level: 2,\n auxiliary: {\n response: {\n value: JSON.stringify(response),\n type: \"object\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n\n // We'll compute usage data from the response\n const usageData = {\n prompt_tokens: response.usage.input_tokens,\n completion_tokens: response.usage.output_tokens,\n total_tokens: response.usage.input_tokens + response.usage.output_tokens,\n };\n\n const transformedResponse: LLMResponse = {\n id: response.id,\n object: \"chat.completion\",\n created: Date.now(),\n model: response.model,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content:\n response.content.find((c) => c.type === \"text\")?.text || null,\n tool_calls: response.content\n .filter((c) => c.type === \"tool_use\")\n .map((toolUse) => ({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n })),\n },\n finish_reason: response.stop_reason,\n },\n ],\n usage: usageData,\n };\n\n logger({\n category: \"anthropic\",\n message: \"transformed response\",\n level: 2,\n auxiliary: {\n transformedResponse: {\n value: JSON.stringify(transformedResponse),\n type: \"object\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n\n if (options.response_model) {\n const toolUse = response.content.find((c) => c.type === \"tool_use\");\n if (toolUse && \"input\" in toolUse) {\n const result = toolUse.input;\n\n const finalParsedResponse = {\n data: result,\n usage: usageData,\n } as unknown as T;\n\n return finalParsedResponse;\n } else {\n if (!retries || retries < 5) {\n return this.createChatCompletion({\n options,\n logger,\n retries: (retries ?? 0) + 1,\n });\n }\n logger({\n category: \"anthropic\",\n message: \"error creating chat completion\",\n level: 0,\n auxiliary: {\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n throw new CreateChatCompletionResponseError(\n \"No tool use with input in response\",\n );\n }\n }\n\n // if the function was called with a response model, it would have returned earlier\n // so we can safely cast here to T, which defaults to AnthropicTransformedResponse\n return transformedResponse as T;\n }\n}\n\nconst extractSchemaProperties = (jsonSchema: AnthropicJsonSchemaObject) => {\n const schemaRoot = jsonSchema.definitions?.MySchema || jsonSchema;\n\n return {\n properties: schemaRoot.properties,\n required: schemaRoot.required,\n };\n};\n", "import OpenAI from \"openai\";\nimport type { ClientOptions } from \"openai\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { AvailableModel } from \"../types/public/model.js\";\nimport {\n ChatMessage,\n CreateChatCompletionOptions,\n LLMClient,\n LLMResponse,\n} from \"./LLMClient.js\";\nimport { CreateChatCompletionResponseError } from \"../types/public/sdkErrors.js\";\nimport { toJsonSchema } from \"../zodCompat.js\";\n\nexport class CerebrasClient extends LLMClient {\n public type = \"cerebras\" as const;\n private client: OpenAI;\n declare public clientOptions: ClientOptions;\n public hasVision = false;\n\n constructor({\n modelName,\n clientOptions,\n userProvidedInstructions,\n }: {\n logger: (message: LogLine) => void;\n modelName: AvailableModel;\n clientOptions?: ClientOptions;\n userProvidedInstructions?: string;\n }) {\n super(modelName, userProvidedInstructions);\n\n // Create OpenAI client with the base URL set to Cerebras API\n this.client = new OpenAI({\n baseURL: \"https://api.cerebras.ai/v1\",\n apiKey: clientOptions?.apiKey || process.env.CEREBRAS_API_KEY,\n ...clientOptions,\n });\n\n this.modelName = modelName;\n this.clientOptions = clientOptions;\n }\n\n async createChatCompletion<T = LLMResponse>({\n options,\n retries,\n logger,\n }: CreateChatCompletionOptions): Promise<T> {\n const optionsWithoutImage = { ...options };\n delete optionsWithoutImage.image;\n\n logger({\n category: \"cerebras\",\n message: \"creating chat completion\",\n level: 2,\n auxiliary: {\n options: {\n value: JSON.stringify(optionsWithoutImage),\n type: \"object\",\n },\n },\n });\n\n // Format messages for Cerebras API (using OpenAI format)\n const formattedMessages = options.messages.map((msg: ChatMessage) => {\n const baseMessage = {\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : Array.isArray(msg.content) &&\n msg.content.length > 0 &&\n \"text\" in msg.content[0]\n ? msg.content[0].text\n : \"\",\n };\n\n // Cerebras only supports system, user, and assistant roles\n if (msg.role === \"system\") {\n return { ...baseMessage, role: \"system\" as const };\n } else if (msg.role === \"assistant\") {\n return { ...baseMessage, role: \"assistant\" as const };\n } else {\n // Default to user for any other role\n return { ...baseMessage, role: \"user\" as const };\n }\n });\n\n // Format tools if provided\n let tools = options.tools?.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n },\n }));\n\n // Add response model as a tool if provided\n if (options.response_model) {\n const jsonSchema = toJsonSchema(options.response_model.schema) as {\n properties?: Record<string, unknown>;\n required?: string[];\n };\n const schemaProperties = jsonSchema.properties || {};\n const schemaRequired = jsonSchema.required || [];\n\n const responseTool = {\n type: \"function\" as const,\n function: {\n name: \"print_extracted_data\",\n description:\n \"Prints the extracted data based on the provided schema.\",\n parameters: {\n type: \"object\",\n properties: schemaProperties,\n required: schemaRequired,\n },\n },\n };\n\n tools = tools ? [...tools, responseTool] : [responseTool];\n }\n\n try {\n // Use OpenAI client with Cerebras API\n const apiResponse = await this.client.chat.completions.create({\n model: this.modelName.split(\"cerebras-\")[1],\n messages: [\n ...formattedMessages,\n // Add explicit instruction to return JSON if we have a response model\n ...(options.response_model\n ? [\n {\n role: \"system\" as const,\n content: `IMPORTANT: Your response must be valid JSON that matches this schema: ${JSON.stringify(\n options.response_model.schema,\n )}`,\n },\n ]\n : []),\n ],\n temperature: options.temperature || 0.7,\n max_tokens: options.maxOutputTokens,\n tools: tools,\n tool_choice: options.tool_choice || \"auto\",\n });\n\n // Format the response to match the expected LLMResponse format\n const response: LLMResponse = {\n id: apiResponse.id,\n object: \"chat.completion\",\n created: Date.now(),\n model: this.modelName.split(\"cerebras-\")[1],\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: apiResponse.choices[0]?.message?.content || null,\n tool_calls: apiResponse.choices[0]?.message?.tool_calls || [],\n },\n finish_reason: apiResponse.choices[0]?.finish_reason || \"stop\",\n },\n ],\n usage: {\n prompt_tokens: apiResponse.usage?.prompt_tokens || 0,\n completion_tokens: apiResponse.usage?.completion_tokens || 0,\n total_tokens: apiResponse.usage?.total_tokens || 0,\n },\n };\n\n logger({\n category: \"cerebras\",\n message: \"response\",\n level: 2,\n auxiliary: {\n response: {\n value: JSON.stringify(response),\n type: \"object\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n\n // If we have no response model, just return the entire LLMResponse\n if (!options.response_model) {\n return response as T;\n }\n\n // If we have a response model, parse JSON from tool calls or content\n const toolCall = response.choices[0]?.message?.tool_calls?.[0];\n if (toolCall?.function?.arguments) {\n try {\n const result = JSON.parse(toolCall.function.arguments);\n const finalResponse = {\n data: result,\n usage: response.usage,\n };\n return finalResponse as T;\n } catch (e) {\n logger({\n category: \"cerebras\",\n message: \"failed to parse tool call arguments as JSON, retrying\",\n level: 0,\n auxiliary: {\n error: {\n value: e.message,\n type: \"string\",\n },\n },\n });\n }\n }\n\n // If we have content but no tool calls, try to parse the content as JSON\n const content = response.choices[0]?.message?.content;\n if (content) {\n try {\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const result = JSON.parse(jsonMatch[0]);\n const finalResponse = {\n data: result,\n usage: response.usage,\n };\n return finalResponse as T;\n }\n } catch (e) {\n logger({\n category: \"cerebras\",\n message: \"failed to parse content as JSON\",\n level: 0,\n auxiliary: {\n error: {\n value: e.message,\n type: \"string\",\n },\n },\n });\n }\n }\n\n // If we still haven't found valid JSON and have retries left, try again\n if (!retries || retries < 5) {\n return this.createChatCompletion({\n options,\n logger,\n retries: (retries ?? 0) + 1,\n });\n }\n\n throw new CreateChatCompletionResponseError(\"Invalid response schema\");\n } catch (error) {\n logger({\n category: \"cerebras\",\n message: \"error creating chat completion\",\n level: 0,\n auxiliary: {\n error: {\n value: error.message,\n type: \"string\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n throw error;\n }\n }\n}\n", "import {\n GoogleGenAI,\n HarmCategory,\n HarmBlockThreshold,\n Content,\n Part,\n Tool,\n FunctionCall,\n Schema,\n Type,\n} from \"@google/genai\";\n\nimport { LogLine } from \"../types/public/logs.js\";\nimport { AvailableModel, ClientOptions } from \"../types/public/model.js\";\nimport {\n validateZodSchema,\n toGeminiSchema,\n loadApiKeyFromEnv,\n} from \"../../utils.js\";\nimport {\n ChatCompletionOptions,\n ChatMessage,\n CreateChatCompletionOptions,\n LLMClient,\n LLMResponse,\n AnnotatedScreenshotText,\n} from \"./LLMClient.js\";\nimport {\n CreateChatCompletionResponseError,\n StagehandError,\n} from \"../types/public/sdkErrors.js\";\n\n// Mapping from generic roles to Gemini roles\nconst roleMap: { [key in ChatMessage[\"role\"]]: string } = {\n user: \"user\",\n assistant: \"model\",\n system: \"user\", // Gemini API prefers system instructions either via system_instruction or at the start of 'user' content\n};\n\n// Basic safety settings - adjust as needed\nconst safetySettings = [\n {\n category: HarmCategory.HARM_CATEGORY_HARASSMENT,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n {\n category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n {\n category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n {\n category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n];\n\nexport class GoogleClient extends LLMClient {\n public type = \"google\" as const;\n private client: GoogleGenAI;\n declare public clientOptions: ClientOptions;\n declare public hasVision: boolean;\n private logger: (message: LogLine) => void;\n\n constructor({\n logger, // Added logger based on other clients\n modelName,\n clientOptions,\n }: {\n logger: (message: LogLine) => void; // Added logger type\n modelName: AvailableModel;\n clientOptions?: ClientOptions; // Expecting { apiKey: string } here\n }) {\n super(modelName);\n if (!clientOptions?.apiKey) {\n // Try to get the API key from the environment variable GOOGLE_API_KEY\n clientOptions.apiKey = loadApiKeyFromEnv(\"google_legacy\", logger);\n }\n this.clientOptions = clientOptions;\n this.client = new GoogleGenAI({ apiKey: clientOptions.apiKey });\n this.modelName = modelName;\n this.logger = logger;\n // Determine vision capability based on model name (adjust as needed)\n this.hasVision =\n modelName.includes(\"vision\") || modelName.includes(\"gemini-1.5\"); // Example logic\n }\n\n // Helper to convert project's ChatMessage[] to Gemini's Content[]\n private formatMessages(\n messages: ChatMessage[],\n image?: ChatCompletionOptions[\"image\"],\n ): Content[] {\n const contents: Content[] = [];\n let systemInstruction: string | null = null;\n\n messages.forEach((msg, index) => {\n const role = roleMap[msg.role];\n if (!role) {\n this.logger({\n category: \"google\",\n message: `WARNING: Unsupported role: ${msg.role}`,\n level: 1,\n });\n return; // Skip unsupported roles\n }\n\n // Handle system messages - prepend to the first user message or use system_instruction if available\n if (msg.role === \"system\") {\n if (typeof msg.content === \"string\") {\n systemInstruction =\n (systemInstruction ? systemInstruction + \"\\n\\n\" : \"\") + msg.content;\n }\n return; // Don't add system messages directly to contents yet\n }\n\n const parts: Part[] = [];\n\n if (Array.isArray(msg.content)) {\n msg.content.forEach((partContent) => {\n if (partContent.type === \"text\") {\n parts.push({ text: partContent.text });\n } else if (partContent.type === \"image_url\") {\n if (\"image_url\" in partContent && partContent.image_url?.url) {\n // Assuming base64 data URI format: data:[<mediatype>];base64,<data>\n const base64Data = partContent.image_url.url.split(\",\")[1];\n const mimeTypeMatch = partContent.image_url.url.match(\n /^data:(image\\/\\w+);base64,/,\n );\n if (base64Data && mimeTypeMatch) {\n parts.push({\n inlineData: { mimeType: mimeTypeMatch[1], data: base64Data },\n });\n } else {\n this.logger({\n category: \"google\",\n message: \"WARNING: Could not parse image data URI format\",\n level: 1,\n });\n }\n }\n }\n });\n } else if (typeof msg.content === \"string\") {\n parts.push({ text: msg.content });\n }\n\n // Add image from options if this is the last message and it's a user message\n if (image && index === messages.length - 1 && msg.role === \"user\") {\n const imageDesc = image.description || AnnotatedScreenshotText;\n parts.push({ text: imageDesc }); // Add description first\n parts.push({\n inlineData: {\n mimeType: \"image/jpeg\", // Assuming JPEG, adjust if needed\n data: image.buffer.toString(\"base64\"),\n },\n });\n }\n\n // Apply system instruction to the first non-system message if needed\n if (systemInstruction && contents.length === 0 && role === \"user\") {\n const firstPartText = parts.find((p) => \"text\" in p);\n if (firstPartText && \"text\" in firstPartText) {\n firstPartText.text = `${systemInstruction}\\n\\n${firstPartText.text}`;\n } else {\n parts.unshift({ text: systemInstruction });\n }\n systemInstruction = null; // Clear after applying\n }\n\n if (parts.length > 0) {\n contents.push({ role, parts });\n }\n });\n\n // If system instruction wasn't applied (e.g., no user messages followed it), add it as a final user message\n if (systemInstruction) {\n contents.unshift({ role: \"user\", parts: [{ text: systemInstruction }] });\n }\n\n return contents;\n }\n\n // Helper to convert LLMTool[] to Gemini's Tool[]\n private formatTools(\n tools?: ChatCompletionOptions[\"tools\"],\n ): Tool[] | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n\n return [\n {\n functionDeclarations: tools.map((tool) => {\n let parameters: Schema | undefined = undefined;\n if (tool.parameters) {\n parameters = {\n type: Type.OBJECT,\n properties: tool.parameters.properties as {\n [key: string]: Schema;\n },\n required: tool.parameters.required as string[] | undefined,\n };\n }\n return {\n name: tool.name,\n description: tool.description,\n parameters: parameters,\n };\n }),\n },\n ];\n }\n\n async createChatCompletion<T = LLMResponse>({\n // Ensure LLMResponse is compatible\n options,\n logger,\n retries = 3,\n }: CreateChatCompletionOptions): Promise<T> {\n const {\n image,\n requestId,\n response_model,\n tools,\n temperature,\n top_p,\n maxOutputTokens,\n } = options;\n\n const formattedMessages = this.formatMessages(options.messages, image);\n const formattedTools = this.formatTools(tools);\n\n const generationConfig = {\n maxOutputTokens: maxOutputTokens,\n temperature: temperature,\n topP: top_p,\n responseMimeType: response_model ? \"application/json\" : undefined,\n responseSchema: response_model\n ? toGeminiSchema(response_model.schema)\n : undefined,\n };\n\n logger({\n category: \"google\",\n message: \"creating chat completion\",\n level: 2,\n auxiliary: {\n modelName: { value: this.modelName, type: \"string\" },\n requestId: { value: requestId, type: \"string\" },\n requestPayloadSummary: {\n value: `Model: ${this.modelName}, Messages: ${formattedMessages.length}, Config Keys: ${Object.keys(generationConfig).join(\", \")}, Tools: ${formattedTools ? formattedTools.length : 0}, Safety Categories: ${safetySettings.map((s) => s.category).join(\", \")}`,\n type: \"string\",\n },\n },\n });\n\n // Construct the full request object\n const requestPayload = {\n model: this.modelName,\n contents: formattedMessages,\n config: {\n ...generationConfig,\n safetySettings: safetySettings,\n tools: formattedTools,\n },\n };\n\n // Log the full payload safely\n try {\n logger({\n category: \"google\",\n message: \"Full request payload\",\n level: 2,\n auxiliary: {\n requestId: { value: requestId, type: \"string\" },\n fullPayload: {\n value: JSON.stringify(requestPayload),\n type: \"object\",\n },\n },\n });\n } catch (e) {\n logger({\n category: \"google\",\n message: \"Failed to stringify full request payload for logging\",\n level: 0,\n auxiliary: {\n requestId: { value: requestId, type: \"string\" },\n error: { value: e.message, type: \"string\" },\n },\n });\n }\n\n try {\n const result = await this.client.models.generateContent(requestPayload); // Pass the constructed payload\n\n logger({\n category: \"google\",\n message: \"received response\",\n level: 2,\n auxiliary: {\n requestId: { value: requestId, type: \"string\" },\n response: {\n value: JSON.stringify(result),\n type: \"object\",\n },\n },\n });\n\n const finishReason = result.candidates?.[0]?.finishReason || \"unknown\";\n const toolCalls = result.functionCalls?.map(\n (fc: FunctionCall, index: number) => ({\n id: `tool_call_${requestId}_${index}`,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args),\n },\n }),\n );\n\n let content: string | null = null;\n try {\n content = result.text;\n } catch (e) {\n logger({\n category: \"google\",\n message: `Could not extract text content: ${e.message}`,\n level: 1,\n auxiliary: { requestId: { value: requestId, type: \"string\" } },\n });\n content = null;\n }\n\n // Construct LLMResponse shape\n const llmResponse: LLMResponse = {\n id: result.candidates?.[0]?.index?.toString() || requestId,\n object: \"chat.completion\",\n created: Math.floor(Date.now() / 1000),\n model: this.modelName,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: content,\n tool_calls: toolCalls,\n },\n finish_reason: finishReason,\n },\n ],\n usage: {\n prompt_tokens: result.usageMetadata?.promptTokenCount || 0,\n completion_tokens: result.usageMetadata?.candidatesTokenCount || 0,\n total_tokens: result.usageMetadata?.totalTokenCount || 0,\n },\n };\n\n // Validate schema if response_model was provided\n if (response_model) {\n let parsedData;\n try {\n // Need to handle potential markdown fences if the model didn't follow instructions perfectly\n const potentialJson =\n content?.trim().replace(/^```json\\n?|\\n?```$/g, \"\") || \"{}\";\n parsedData = JSON.parse(potentialJson);\n } catch (e) {\n logger({\n category: \"google\",\n message: `Failed to parse JSON response: ${e.message}`,\n level: 0,\n auxiliary: {\n content: { value: content || \"null\", type: \"string\" },\n },\n });\n if (retries > 0) {\n return this.createChatCompletion({\n options,\n logger,\n retries: retries - 1,\n });\n }\n throw new CreateChatCompletionResponseError(\n `Failed to parse JSON response: ${e.message}`,\n );\n }\n\n try {\n validateZodSchema(response_model.schema, parsedData);\n } catch (err) {\n logger({\n category: \"google\",\n message: \"Response failed Zod schema validation\",\n level: 0,\n });\n if (retries > 0) {\n return this.createChatCompletion({\n options,\n logger,\n retries: retries - 1,\n });\n }\n throw err;\n }\n\n // If schema validation passes, structure the response for extraction use case\n const extractionResult = {\n data: parsedData,\n usage: llmResponse.usage,\n };\n\n return extractionResult as T;\n }\n\n return llmResponse as T;\n } catch (error) {\n logger({\n category: \"google\",\n message: `Error during Google AI chat completion: ${error.message}`,\n level: 0,\n auxiliary: {\n errorDetails: {\n value: `Message: ${error.message}${error.stack ? \"\\nStack: \" + error.stack : \"\"}`,\n type: \"string\",\n },\n requestId: { value: requestId, type: \"string\" },\n },\n });\n\n // Basic retry logic\n if (retries > 0) {\n logger({\n category: \"google\",\n message: `Retrying... (${retries} attempts left)`,\n level: 1,\n });\n await new Promise((resolve) =>\n setTimeout(resolve, 1000 * (4 - retries)),\n ); // Simple backoff\n return this.createChatCompletion({\n options,\n logger,\n retries: retries - 1,\n });\n }\n\n // Re-throw specific Stagehand errors or a generic one\n if (error instanceof StagehandError) {\n throw error;\n }\n throw new StagehandError(\n `Google AI API request failed: ${error.message}`,\n );\n }\n }\n}\n", "import type { ClientOptions } from \"openai\";\nimport OpenAI from \"openai\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { AvailableModel } from \"../types/public/model.js\";\nimport {\n ChatMessage,\n CreateChatCompletionOptions,\n LLMClient,\n LLMResponse,\n} from \"./LLMClient.js\";\nimport { CreateChatCompletionResponseError } from \"../types/public/sdkErrors.js\";\nimport { toJsonSchema } from \"../zodCompat.js\";\n\nexport class GroqClient extends LLMClient {\n public type = \"groq\" as const;\n private client: OpenAI;\n declare public clientOptions: ClientOptions;\n public hasVision = false;\n\n constructor({\n modelName,\n clientOptions,\n userProvidedInstructions,\n }: {\n logger: (message: LogLine) => void;\n modelName: AvailableModel;\n clientOptions?: ClientOptions;\n userProvidedInstructions?: string;\n }) {\n super(modelName, userProvidedInstructions);\n\n // Create OpenAI client with the base URL set to Groq API\n this.client = new OpenAI({\n baseURL: \"https://api.groq.com/openai/v1\",\n apiKey: clientOptions?.apiKey || process.env.GROQ_API_KEY,\n ...clientOptions,\n });\n\n this.modelName = modelName;\n this.clientOptions = clientOptions;\n }\n\n async createChatCompletion<T = LLMResponse>({\n options,\n retries,\n logger,\n }: CreateChatCompletionOptions): Promise<T> {\n const optionsWithoutImage = { ...options };\n delete optionsWithoutImage.image;\n\n logger({\n category: \"groq\",\n message: \"creating chat completion\",\n level: 2,\n auxiliary: {\n options: {\n value: JSON.stringify(optionsWithoutImage),\n type: \"object\",\n },\n },\n });\n\n // Format messages for Groq API (using OpenAI format)\n const formattedMessages = options.messages.map((msg: ChatMessage) => {\n const baseMessage = {\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : Array.isArray(msg.content) &&\n msg.content.length > 0 &&\n \"text\" in msg.content[0]\n ? msg.content[0].text\n : \"\",\n };\n\n // Groq supports system, user, and assistant roles\n if (msg.role === \"system\") {\n return { ...baseMessage, role: \"system\" as const };\n } else if (msg.role === \"assistant\") {\n return { ...baseMessage, role: \"assistant\" as const };\n } else {\n // Default to user for any other role\n return { ...baseMessage, role: \"user\" as const };\n }\n });\n\n // Format tools if provided\n let tools = options.tools?.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n },\n }));\n\n // Add response model as a tool if provided\n if (options.response_model) {\n const jsonSchema = toJsonSchema(options.response_model.schema) as {\n properties?: Record<string, unknown>;\n required?: string[];\n };\n const schemaProperties = jsonSchema.properties || {};\n const schemaRequired = jsonSchema.required || [];\n\n const responseTool = {\n type: \"function\" as const,\n function: {\n name: \"print_extracted_data\",\n description:\n \"Prints the extracted data based on the provided schema.\",\n parameters: {\n type: \"object\",\n properties: schemaProperties,\n required: schemaRequired,\n },\n },\n };\n\n tools = tools ? [...tools, responseTool] : [responseTool];\n }\n\n try {\n // Use OpenAI client with Groq API\n const apiResponse = await this.client.chat.completions.create({\n model: this.modelName.split(\"groq-\")[1],\n messages: [\n ...formattedMessages,\n // Add explicit instruction to return JSON if we have a response model\n ...(options.response_model\n ? [\n {\n role: \"system\" as const,\n content: `IMPORTANT: Your response must be valid JSON that matches this schema: ${JSON.stringify(\n options.response_model.schema,\n )}`,\n },\n ]\n : []),\n ],\n temperature: options.temperature || 0.7,\n max_tokens: options.maxOutputTokens,\n tools: tools,\n tool_choice: options.tool_choice || \"auto\",\n });\n\n // Format the response to match the expected LLMResponse format\n const response: LLMResponse = {\n id: apiResponse.id,\n object: \"chat.completion\",\n created: Date.now(),\n model: this.modelName.split(\"groq-\")[1],\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: apiResponse.choices[0]?.message?.content || null,\n tool_calls: apiResponse.choices[0]?.message?.tool_calls || [],\n },\n finish_reason: apiResponse.choices[0]?.finish_reason || \"stop\",\n },\n ],\n usage: {\n prompt_tokens: apiResponse.usage?.prompt_tokens || 0,\n completion_tokens: apiResponse.usage?.completion_tokens || 0,\n total_tokens: apiResponse.usage?.total_tokens || 0,\n },\n };\n\n logger({\n category: \"groq\",\n message: \"response\",\n level: 2,\n auxiliary: {\n response: {\n value: JSON.stringify(response),\n type: \"object\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n\n // If there's no response model, return the entire response object\n if (!options.response_model) {\n return response as T;\n }\n\n // Otherwise, try parsing the JSON from the tool call or content\n const toolCall = response.choices[0]?.message?.tool_calls?.[0];\n if (toolCall?.function?.arguments) {\n try {\n const result = JSON.parse(toolCall.function.arguments);\n const finalResponse = {\n data: result,\n usage: response.usage,\n };\n return finalResponse as T;\n } catch (e) {\n logger({\n category: \"groq\",\n message: \"failed to parse tool call arguments as JSON, retrying\",\n level: 0,\n auxiliary: {\n error: {\n value: e.message,\n type: \"string\",\n },\n },\n });\n }\n }\n\n // If we have content but no tool calls, try to parse the content as JSON\n const content = response.choices[0]?.message?.content;\n if (content) {\n try {\n // Try to extract JSON from the content\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const result = JSON.parse(jsonMatch[0]);\n const finalResponse = {\n data: result,\n usage: response.usage,\n };\n return finalResponse as T;\n }\n } catch (e) {\n logger({\n category: \"groq\",\n message: \"failed to parse content as JSON\",\n level: 0,\n auxiliary: {\n error: {\n value: e.message,\n type: \"string\",\n },\n },\n });\n }\n }\n\n // If we still haven't found valid JSON and have retries left, try again\n if (!retries || retries < 5) {\n return this.createChatCompletion({\n options,\n logger,\n retries: (retries ?? 0) + 1,\n });\n }\n\n throw new CreateChatCompletionResponseError(\"Invalid response schema\");\n } catch (error) {\n logger({\n category: \"groq\",\n message: \"error creating chat completion\",\n level: 0,\n auxiliary: {\n error: {\n value: error.message,\n type: \"string\",\n },\n requestId: {\n value: options.requestId,\n type: \"string\",\n },\n },\n });\n throw error;\n }\n }\n}\n", "import OpenAI, { ClientOptions } from \"openai\";\nimport {\n ChatCompletionAssistantMessageParam,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartText,\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionMessageParam,\n ChatCompletionSystemMessageParam,\n ChatCompletionUserMessageParam,\n} from \"openai/resources/chat\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { AvailableModel } from \"../types/public/model.js\";\nimport { validateZodSchema } from \"../../utils.js\";\nimport {\n ChatCompletionOptions,\n ChatMessage,\n CreateChatCompletionOptions,\n LLMClient,\n LLMResponse,\n} from \"./LLMClient.js\";\nimport {\n CreateChatCompletionResponseError,\n StagehandError,\n ZodSchemaValidationError,\n} from \"../types/public/sdkErrors.js\";\nimport { toJsonSchema } from \"../zodCompat.js\";\n\nexport class OpenAIClient extends LLMClient {\n public type = \"openai\" as const;\n private client: OpenAI;\n declare public clientOptions: ClientOptions;\n\n constructor({\n modelName,\n clientOptions,\n }: {\n logger: (message: LogLine) => void;\n modelName: AvailableModel;\n clientOptions?: ClientOptions;\n }) {\n super(modelName);\n this.clientOptions = clientOptions;\n this.client = new OpenAI(clientOptions);\n this.modelName = modelName;\n }\n\n async createChatCompletion<T = LLMResponse>({\n options: optionsInitial,\n logger,\n retries = 3,\n }: CreateChatCompletionOptions): Promise<T> {\n let options: Partial<ChatCompletionOptions> = optionsInitial;\n\n // O1 models do not support most of the options. So we override them.\n // For schema and tools, we add them as user messages.\n let isToolsOverridedForO1 = false;\n if (this.modelName.startsWith(\"o1\") || this.modelName.startsWith(\"o3\")) {\n /* eslint-disable */\n // Remove unsupported options\n let {\n tool_choice,\n top_p,\n frequency_penalty,\n presence_penalty,\n temperature,\n } = options;\n ({\n tool_choice,\n top_p,\n frequency_penalty,\n presence_penalty,\n temperature,\n ...options\n } = options);\n /* eslint-enable */\n // Remove unsupported options\n options.messages = options.messages.map((message) => ({\n ...message,\n role: \"user\",\n }));\n if (options.tools && options.response_model) {\n throw new StagehandError(\n \"Cannot use both tool and response_model for o1 models\",\n );\n }\n\n if (options.tools) {\n // Remove unsupported options\n let { tools } = options;\n ({ tools, ...options } = options);\n isToolsOverridedForO1 = true;\n options.messages.push({\n role: \"user\",\n content: `You have the following tools available to you:\\n${JSON.stringify(\n tools,\n )}\n\n Respond with the following zod schema format to use a method: {\n \"name\": \"<tool_name>\",\n \"arguments\": <tool_args>\n }\n \n Do not include any other text or formattings like \\`\\`\\` in your response. Just the JSON object.`,\n });\n }\n }\n if (\n options.temperature &&\n (this.modelName.startsWith(\"o1\") || this.modelName.startsWith(\"o3\"))\n ) {\n throw new StagehandError(\"Temperature is not supported for o1 models\");\n }\n\n const { requestId, ...optionsWithoutImageAndRequestId } = options;\n\n logger({\n category: \"openai\",\n message: \"creating chat completion\",\n level: 2,\n auxiliary: {\n options: {\n value: JSON.stringify({\n ...optionsWithoutImageAndRequestId,\n requestId,\n }),\n type: \"object\",\n },\n modelName: {\n value: this.modelName,\n type: \"string\",\n },\n },\n });\n\n if (options.image) {\n const screenshotMessage: ChatMessage = {\n role: \"user\",\n content: [\n {\n type: \"image_url\",\n image_url: {\n url: `data:image/jpeg;base64,${options.image.buffer.toString(\"base64\")}`,\n },\n },\n ...(options.image.description\n ? [{ type: \"text\", text: options.image.description }]\n : []),\n ],\n };\n\n options.messages.push(screenshotMessage);\n }\n\n let responseFormat:\n | ChatCompletionCreateParamsNonStreaming[\"response_format\"]\n | undefined;\n if (options.response_model) {\n // For O1 models, we need to add the schema as a user message.\n if (this.modelName.startsWith(\"o1\") || this.modelName.startsWith(\"o3\")) {\n try {\n const parsedSchema = JSON.stringify(\n toJsonSchema(options.response_model.schema),\n );\n options.messages.push({\n role: \"user\",\n content: `Respond in this zod schema format:\\n${parsedSchema}\\n\n\n Do not include any other text, formatting or markdown in your output. Do not include \\`\\`\\` or \\`\\`\\`json in your response. Only the JSON object itself.`,\n });\n } catch (error) {\n logger({\n category: \"openai\",\n message: \"Failed to parse response model schema\",\n level: 0,\n });\n\n if (retries > 0) {\n // as-casting to account for o1 models not supporting all options\n return this.createChatCompletion({\n options: options as ChatCompletionOptions,\n logger,\n retries: retries - 1,\n });\n }\n\n throw error;\n }\n } else {\n responseFormat = {\n type: \"json_schema\",\n json_schema: {\n name: options.response_model.name,\n schema: toJsonSchema(options.response_model.schema),\n },\n };\n }\n }\n\n /* eslint-disable */\n // Remove unsupported options\n const { response_model, ...openAiOptions } = {\n ...optionsWithoutImageAndRequestId,\n model: this.modelName,\n };\n /* eslint-enable */\n\n logger({\n category: \"openai\",\n message: \"creating chat completion\",\n level: 2,\n auxiliary: {\n openAiOptions: {\n value: JSON.stringify(openAiOptions),\n type: \"object\",\n },\n },\n });\n\n const formattedMessages: ChatCompletionMessageParam[] =\n options.messages.map((message) => {\n if (Array.isArray(message.content)) {\n const contentParts = message.content.map((content) => {\n if (\"image_url\" in content) {\n const imageContent: ChatCompletionContentPartImage = {\n image_url: {\n url: content.image_url.url,\n },\n type: \"image_url\",\n };\n return imageContent;\n } else {\n const textContent: ChatCompletionContentPartText = {\n text: content.text,\n type: \"text\",\n };\n return textContent;\n }\n });\n\n if (message.role === \"system\") {\n const formattedMessage: ChatCompletionSystemMessageParam = {\n ...message,\n role: \"system\",\n content: contentParts.filter(\n (content): content is ChatCompletionContentPartText =>\n content.type === \"text\",\n ),\n };\n return formattedMessage;\n } else if (message.role === \"user\") {\n const formattedMessage: ChatCompletionUserMessageParam = {\n ...message,\n role: \"user\",\n content: contentParts,\n };\n return formattedMessage;\n } else {\n const formattedMessage: ChatCompletionAssistantMessageParam = {\n ...message,\n role: \"assistant\",\n content: contentParts.filter(\n (content): content is ChatCompletionContentPartText =>\n content.type === \"text\",\n ),\n };\n return formattedMessage;\n }\n }\n\n const formattedMessage: ChatCompletionUserMessageParam = {\n role: \"user\",\n content: message.content,\n };\n\n return formattedMessage;\n });\n\n const body: ChatCompletionCreateParamsNonStreaming = {\n ...openAiOptions,\n model: this.modelName,\n messages: formattedMessages,\n response_format: responseFormat,\n stream: false,\n tools: options.tools?.map((tool) => ({\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n type: \"function\",\n })),\n };\n\n const response = await this.client.chat.completions.create(body);\n\n // For O1 models, we need to parse the tool call response manually and add it to the response.\n if (isToolsOverridedForO1) {\n try {\n const parsedContent = JSON.parse(response.choices[0].message.content);\n\n response.choices[0].message.tool_calls = [\n {\n function: {\n name: parsedContent[\"name\"],\n arguments: JSON.stringify(parsedContent[\"arguments\"]),\n },\n type: \"function\",\n id: \"-1\",\n },\n ];\n response.choices[0].message.content = null;\n } catch (error) {\n logger({\n category: \"openai\",\n message: \"Failed to parse tool call response\",\n level: 0,\n auxiliary: {\n error: {\n value: error.message,\n type: \"string\",\n },\n content: {\n value: response.choices[0].message.content,\n type: \"string\",\n },\n },\n });\n\n if (retries > 0) {\n // as-casting to account for o1 models not supporting all options\n return this.createChatCompletion({\n options: options as ChatCompletionOptions,\n logger,\n retries: retries - 1,\n });\n }\n\n throw error;\n }\n }\n\n logger({\n category: \"openai\",\n message: \"response\",\n level: 2,\n auxiliary: {\n response: {\n value: JSON.stringify(response),\n type: \"object\",\n },\n requestId: {\n value: requestId,\n type: \"string\",\n },\n },\n });\n\n if (options.response_model) {\n const extractedData = response.choices[0].message.content;\n const parsedData = JSON.parse(extractedData);\n\n try {\n validateZodSchema(options.response_model.schema, parsedData);\n } catch (e) {\n logger({\n category: \"openai\",\n message: \"Response failed Zod schema validation\",\n level: 0,\n });\n if (retries > 0) {\n // as-casting to account for o1 models not supporting all options\n return this.createChatCompletion({\n options: options as ChatCompletionOptions,\n logger,\n retries: retries - 1,\n });\n }\n\n if (e instanceof ZodSchemaValidationError) {\n logger({\n category: \"openai\",\n message: `Error during OpenAI chat completion: ${e.message}`,\n level: 0,\n auxiliary: {\n errorDetails: {\n value: `Message: ${e.message}${e.stack ? \"\\nStack: \" + e.stack : \"\"}`,\n type: \"string\",\n },\n requestId: { value: requestId, type: \"string\" },\n },\n });\n throw new CreateChatCompletionResponseError(e.message);\n }\n throw e;\n }\n\n return {\n data: parsedData,\n usage: response.usage,\n } as T;\n }\n\n // if the function was called with a response model, it would have returned earlier\n // so we can safely cast here to T, which defaults to ChatCompletion\n return response as T;\n }\n}\n", "import fs from \"node:fs\";\n\n/**\n * Shared cleanup logic for locally launched Chrome.\n *\n * Used by both `V3.close()` (normal shutdown) and the supervisor process\n * (crash cleanup). The caller provides a `killChrome` callback since the\n * kill mechanism differs: chrome-launcher's `chrome.kill()` in-process\n * vs raw `process.kill(pid)` from the supervisor.\n */\nexport async function cleanupLocalBrowser(opts: {\n killChrome?: () => Promise<void> | void;\n userDataDir?: string;\n createdTempProfile?: boolean;\n preserveUserDataDir?: boolean;\n}): Promise<void> {\n if (opts.killChrome) {\n try {\n await opts.killChrome();\n } catch {\n // best-effort\n }\n }\n if (\n opts.createdTempProfile &&\n !opts.preserveUserDataDir &&\n opts.userDataDir\n ) {\n try {\n fs.rmSync(opts.userDataDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n", "/**\n * Parent-side helper for spawning the shutdown supervisor process.\n *\n * The supervisor runs out-of-process and watches a lifeline pipe. If the parent\n * dies, the supervisor performs best-effort cleanup (Chrome kill or Browserbase\n * session release) when keepAlive is false.\n */\n\nimport fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n ShutdownSupervisorConfig,\n ShutdownSupervisorHandle,\n} from \"../types/private/shutdown.js\";\nimport {\n ShutdownSupervisorResolveError,\n ShutdownSupervisorSpawnError,\n} from \"../types/private/shutdownErrors.js\";\n// Resolve module path for both CJS and ESM builds.\nconst normalizedFilename =\n typeof __filename === \"string\" ? __filename.replaceAll(\"\\\\\", \"/\") : \"\";\nconst hasAbsoluteFilename =\n normalizedFilename.startsWith(\"/\") || /^[A-Za-z]:\\//.test(normalizedFilename);\nconst modulePath = hasAbsoluteFilename\n ? __filename\n : fileURLToPath(import.meta.url);\nconst normalizedModulePath = modulePath.replaceAll(\"\\\\\", \"/\");\nconst moduleDir = normalizedModulePath.slice(\n 0,\n normalizedModulePath.lastIndexOf(\"/\"),\n);\nconst require = createRequire(modulePath);\n\nconst isSeaRuntime = (): boolean => {\n try {\n const sea = require(\"node:sea\") as { isSea?: () => boolean };\n return Boolean(sea.isSea?.());\n } catch {\n return false;\n }\n};\n\n// SEA: re-exec current binary with supervisor args.\n// Non-SEA: execute Stagehand CLI entrypoint with supervisor args.\nconst resolveSupervisorCommand = (\n config: ShutdownSupervisorConfig,\n): {\n command: string;\n args: string[];\n} | null => {\n const baseArgs = [\"--supervisor\", serializeConfigArg(config)];\n\n if (isSeaRuntime()) {\n return { command: process.execPath, args: baseArgs };\n }\n\n const cliPathCandidates = [`${moduleDir}/../cli.js`, `${moduleDir}/cli.js`];\n const cliPath =\n cliPathCandidates.find((candidate) => fs.existsSync(candidate)) ?? null;\n if (!cliPath) return null;\n const needsTsxLoader =\n fs.existsSync(`${moduleDir}/supervisor.ts`) &&\n !fs.existsSync(`${moduleDir}/supervisor.js`);\n return {\n command: process.execPath,\n args: needsTsxLoader\n ? [\"--import\", \"tsx\", cliPath, ...baseArgs]\n : [cliPath, ...baseArgs],\n };\n};\n\n// Single JSON arg keeps supervisor bootstrap parsing tiny and versionable.\nconst serializeConfigArg = (config: ShutdownSupervisorConfig): string =>\n `--supervisor-config=${JSON.stringify({\n ...config,\n parentPid: process.pid,\n })}`;\n\n/**\n * Start a supervisor process for crash cleanup. Returns a handle that can\n * stop the supervisor during a normal shutdown.\n */\nexport function startShutdownSupervisor(\n config: ShutdownSupervisorConfig,\n opts?: { onError?: (error: Error, context: string) => void },\n): ShutdownSupervisorHandle | null {\n const resolved = resolveSupervisorCommand(config);\n if (!resolved) {\n opts?.onError?.(\n new ShutdownSupervisorResolveError(\n \"Shutdown supervisor entry missing (expected Stagehand CLI entrypoint).\",\n ),\n \"resolve\",\n );\n return null;\n }\n\n const child = spawn(resolved.command, resolved.args, {\n // stdin is the parent lifeline.\n stdio: [\"pipe\", \"ignore\", \"ignore\"],\n detached: true,\n });\n child.on(\"error\", (error) => {\n opts?.onError?.(\n new ShutdownSupervisorSpawnError(\n `Shutdown supervisor failed to start: ${error.message}`,\n ),\n \"spawn\",\n );\n });\n\n try {\n child.unref();\n const stdin = child.stdin as unknown as { unref?: () => void } | null;\n stdin?.unref?.();\n } catch {\n // best-effort: avoid keeping the event loop alive\n }\n\n const stop = () => {\n // Normal close path: terminate supervisor directly.\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // ignore\n }\n };\n\n return { stop };\n}\n", "/**\n * Internal-only errors for the shutdown supervisor.\n */\n\nexport class ShutdownSupervisorError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ShutdownSupervisorError\";\n }\n}\n\nexport class ShutdownSupervisorResolveError extends ShutdownSupervisorError {\n constructor(message: string) {\n super(message);\n this.name = \"ShutdownSupervisorResolveError\";\n }\n}\n\nexport class ShutdownSupervisorSpawnError extends ShutdownSupervisorError {\n constructor(message: string) {\n super(message);\n this.name = \"ShutdownSupervisorSpawnError\";\n }\n}\n", "import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { ToolSet } from \"ai\";\nimport { JsonSchema, jsonSchemaToZod } from \"../../utils.js\";\nimport { connectToMCPServer } from \"./connection.js\";\n\nexport const resolveTools = async (\n clients: (Client | string)[],\n userTools: ToolSet,\n): Promise<ToolSet> => {\n const tools: ToolSet = { ...userTools };\n\n for (const client of clients) {\n let clientInstance: Client;\n if (typeof client === \"string\") {\n clientInstance = await connectToMCPServer(client);\n } else {\n clientInstance = client;\n }\n\n let nextCursor: string | undefined = undefined;\n\n do {\n const clientTools = await clientInstance.listTools({\n cursor: nextCursor,\n });\n\n for (const tool of clientTools.tools) {\n tools[tool.name] = {\n description: tool.description,\n inputSchema: jsonSchemaToZod(tool.inputSchema as JsonSchema),\n execute: async (input) => {\n const result = await clientInstance.callTool({\n name: tool.name,\n arguments: input,\n });\n return result;\n },\n };\n }\n nextCursor = clientTools.nextCursor;\n } while (nextCursor);\n }\n\n return tools;\n};\n", "import {\n Client,\n ClientOptions,\n} from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { MCPConnectionError } from \"../types/public/sdkErrors.js\";\n\nexport interface ConnectToMCPServerOptions {\n serverUrl: string | URL;\n clientOptions?: ClientOptions;\n}\n\nexport interface StdioServerConfig {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport const connectToMCPServer = async (\n serverConfig: string | URL | StdioServerConfig | ConnectToMCPServerOptions,\n): Promise<Client> => {\n try {\n let transport;\n let clientOptions: ClientOptions | undefined;\n\n // Check if it's a stdio config (has 'command' property)\n if (typeof serverConfig === \"object\" && \"command\" in serverConfig) {\n transport = new StdioClientTransport(serverConfig);\n } else {\n // Handle URL-based connection\n let serverUrl: string | URL;\n\n if (typeof serverConfig === \"string\" || serverConfig instanceof URL) {\n serverUrl = serverConfig;\n } else {\n serverUrl = (serverConfig as ConnectToMCPServerOptions).serverUrl;\n clientOptions = (serverConfig as ConnectToMCPServerOptions)\n .clientOptions;\n }\n\n transport = new StreamableHTTPClientTransport(new URL(serverUrl));\n }\n\n const client = new Client({\n name: \"Stagehand\",\n version: \"1.0.0\",\n ...clientOptions,\n });\n\n await client.connect(transport);\n\n try {\n await client.ping();\n } catch (pingError) {\n await client.close();\n throw new MCPConnectionError(serverConfig.toString(), pingError);\n }\n\n return client;\n } catch (error) {\n // Handle any errors during transport/client creation or connection\n if (error instanceof MCPConnectionError) {\n throw error; // Re-throw our custom error\n }\n throw new MCPConnectionError(serverConfig.toString(), error);\n }\n};\n", "// lib/v3/understudy/context.ts\nimport type { Protocol } from \"devtools-protocol\";\nimport { v3Logger } from \"../logger.js\";\nimport { CdpConnection, CDPSessionLike } from \"./cdp.js\";\nimport { Page } from \"./page.js\";\nimport { installV3PiercerIntoSession } from \"./piercer.js\";\nimport { v3ScriptContent } from \"../dom/build/scriptV3Content.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\nimport type { StagehandAPIClient } from \"../api.js\";\nimport { LocalBrowserLaunchOptions } from \"../types/public/index.js\";\nimport { InitScriptSource } from \"../types/private/index.js\";\nimport { normalizeInitScriptSource } from \"./initScripts.js\";\nimport { TimeoutError, PageNotFoundError } from \"../types/public/sdkErrors.js\";\nimport { getEnvTimeoutMs, withTimeout } from \"../timeoutConfig.js\";\n\ntype TargetId = string;\ntype SessionId = string;\n\ntype TargetType = \"page\" | \"iframe\" | string;\n\nconst DEFAULT_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS = 5000;\nconst CI_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS = 30000;\nconst FIRST_TOP_LEVEL_PAGE_TIMEOUT_ENV =\n \"STAGEHAND_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS\";\n\nfunction getFirstTopLevelPageTimeoutMs(): number {\n return (\n getEnvTimeoutMs(FIRST_TOP_LEVEL_PAGE_TIMEOUT_ENV) ??\n (process.env.CI\n ? CI_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS\n : DEFAULT_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS)\n );\n}\n\nfunction isTopLevelPage(info: Protocol.Target.TargetInfo): boolean {\n const ti = info as unknown as { subtype?: string };\n return info.type === \"page\" && ti.subtype !== \"iframe\";\n}\n\n/**\n * V3Context\n *\n * Owns the root CDP connection and wires Target/Page events into Page.\n * Maintains one Page per top-level target, adopts OOPIF child sessions into the owner Page,\n * and tracks target\u2192page and (root) frame\u2192target mappings for lookups.\n *\n * IMPORTANT: FrameId \u2192 session ownership is managed inside Page (via its FrameRegistry).\n * Context never \u201Cguesses\u201D owners; it simply forwards events (with the emitting session)\n * so Page can record the correct owner at event time.\n */\nexport class V3Context {\n private constructor(\n readonly conn: CdpConnection,\n private readonly env: \"LOCAL\" | \"BROWSERBASE\" = \"LOCAL\",\n private readonly apiClient: StagehandAPIClient | null = null,\n private readonly localBrowserLaunchOptions: LocalBrowserLaunchOptions | null = null,\n ) {}\n\n private readonly _piercerInstalled = new Set<string>();\n // Timestamp for most recent popup/open signal\n private _lastPopupSignalAt = 0;\n private readonly _targetSessionListeners = new Set<SessionId>();\n\n private readonly _sessionInit = new Set<SessionId>();\n private pagesByTarget = new Map<TargetId, Page>();\n private mainFrameToTarget = new Map<string, TargetId>();\n private sessionOwnerPage = new Map<SessionId, Page>();\n private frameOwnerPage = new Map<string, Page>();\n private pendingOopifByMainFrame = new Map<string, SessionId>();\n private createdAtByTarget = new Map<TargetId, number>();\n private typeByTarget = new Map<TargetId, TargetType>();\n private _pageOrder: TargetId[] = [];\n private pendingCreatedTargetUrl = new Map<TargetId, string>();\n private readonly initScripts: string[] = [];\n\n private installTargetSessionListeners(session: CDPSessionLike): void {\n const sessionId = session.id;\n if (!sessionId) return;\n if (this._targetSessionListeners.has(sessionId)) return;\n this._targetSessionListeners.add(sessionId);\n\n session.on<Protocol.Target.AttachedToTargetEvent>(\n \"Target.attachedToTarget\",\n (evt) => {\n void this.onAttachedToTarget(evt.targetInfo, evt.sessionId);\n },\n );\n session.on<Protocol.Target.DetachedFromTargetEvent>(\n \"Target.detachedFromTarget\",\n (evt) => {\n this.onDetachedFromTarget(evt.sessionId, evt.targetId ?? null);\n },\n );\n session.on<Protocol.Target.TargetDestroyedEvent>(\n \"Target.targetDestroyed\",\n (evt) => {\n this.cleanupByTarget(evt.targetId);\n },\n );\n }\n\n /**\n * Create a Context for a given CDP websocket URL and bootstrap target wiring.\n */\n static async create(\n wsUrl: string,\n opts?: {\n env?: \"LOCAL\" | \"BROWSERBASE\";\n apiClient?: StagehandAPIClient | null;\n localBrowserLaunchOptions?: LocalBrowserLaunchOptions | null;\n },\n ): Promise<V3Context> {\n const connectTask = async () => {\n const conn = await CdpConnection.connect(wsUrl);\n const ctx = new V3Context(\n conn,\n opts?.env ?? \"LOCAL\",\n opts?.apiClient ?? null,\n opts?.localBrowserLaunchOptions ?? null,\n );\n await ctx.bootstrap();\n await ctx.waitForFirstTopLevelPage(getFirstTopLevelPageTimeoutMs());\n return ctx;\n };\n\n const cdpTimeoutMs =\n opts?.env === \"BROWSERBASE\"\n ? getEnvTimeoutMs(\"BROWSERBASE_CDP_CONNECT_MAX_MS\")\n : undefined;\n\n if (cdpTimeoutMs) {\n let timedOut = false;\n const connectPromise = connectTask();\n const guarded = withTimeout(\n connectPromise,\n cdpTimeoutMs,\n \"Browserbase CDP connect\",\n ).catch((err) => {\n timedOut = true;\n throw err;\n });\n connectPromise\n .then((ctx) => {\n if (timedOut) void ctx.close();\n })\n .catch(() => {});\n return await guarded;\n }\n\n return await connectTask();\n }\n\n /**\n * Wait until at least one top-level Page has been created and registered.\n * We poll internal maps that bootstrap/onAttachedToTarget populate.\n */\n private async waitForFirstTopLevelPage(timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n // A top-level Page is present if typeByTarget has an entry \"page\"\n // and pagesByTarget has the corresponding Page object.\n for (const [tid, ttype] of this.typeByTarget) {\n if (ttype === \"page\") {\n const p = this.pagesByTarget.get(tid);\n if (p) return;\n }\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new TimeoutError(\n \"waitForFirstTopLevelPage (no top-level Page)\",\n timeoutMs,\n );\n }\n\n private async waitForInitialTopLevelTargets(\n targetIds: TargetId[],\n timeoutMs = 3000,\n ): Promise<void> {\n if (!targetIds.length) return;\n const pending = new Set(targetIds);\n const deadline = Date.now() + timeoutMs;\n while (pending.size && Date.now() < deadline) {\n for (const tid of Array.from(pending)) {\n if (this.pagesByTarget.has(tid)) {\n pending.delete(tid);\n }\n }\n if (!pending.size) return;\n await new Promise((r) => setTimeout(r, 25));\n }\n if (pending.size) {\n v3Logger({\n category: \"ctx\",\n message: \"Timed out waiting for existing top-level targets to attach\",\n level: 2,\n auxiliary: {\n remainingTargets: {\n value: JSON.stringify(Array.from(pending)),\n type: \"object\",\n },\n },\n });\n }\n }\n\n private async ensurePiercer(session: CDPSessionLike): Promise<boolean> {\n const id = session.id ?? \"\";\n if (this._piercerInstalled.has(id)) return true;\n\n const installed = await installV3PiercerIntoSession(session);\n if (installed) {\n this._piercerInstalled.add(id);\n }\n return installed;\n }\n\n /** Mark a page target as the most-recent one (active). */\n private _pushActive(tid: TargetId): void {\n // remove prior entry if any\n const i = this._pageOrder.indexOf(tid);\n if (i !== -1) this._pageOrder.splice(i, 1);\n this._pageOrder.push(tid);\n }\n\n /** Remove a page target from the recency list (used on close). */\n private _removeFromOrder(tid: TargetId): void {\n const i = this._pageOrder.indexOf(tid);\n if (i !== -1) this._pageOrder.splice(i, 1);\n }\n\n /** Return the current active Page (most-recent page that still exists). */\n public activePage(): Page | undefined {\n // prune any stale ids from the tail\n for (let i = this._pageOrder.length - 1; i >= 0; i--) {\n const tid = this._pageOrder[i]!;\n const p = this.pagesByTarget.get(tid);\n if (p) return p;\n // stale \u2014 remove and continue\n this._pageOrder.splice(i, 1);\n }\n // fallback: pick the newest by createdAt if order is empty\n let newestTid: TargetId | undefined;\n let newestTs = -1;\n for (const [tid] of this.pagesByTarget) {\n const ts = this.createdAtByTarget.get(tid) ?? 0;\n if (ts > newestTs) {\n newestTs = ts;\n newestTid = tid;\n }\n }\n return newestTid ? this.pagesByTarget.get(newestTid) : undefined;\n }\n\n /** Explicitly mark a known Page as the most-recent active page (and focus it). */\n public setActivePage(page: Page): void {\n let targetId = page.targetId();\n if (this.pagesByTarget.get(targetId) !== page) {\n const lookup = this.findTargetIdByPage(page);\n if (!lookup) {\n v3Logger({\n category: \"ctx\",\n message: \"setActivePage called with unknown Page\",\n level: 2,\n auxiliary: {\n targetId: { value: String(targetId), type: \"string\" },\n },\n });\n return;\n }\n targetId = lookup;\n }\n\n this._pushActive(targetId);\n\n // Bring the tab to the foreground in headful Chrome (best effort).\n void this.conn.send(\"Target.activateTarget\", { targetId }).catch(() => {});\n }\n\n public async addInitScript<Arg>(\n script: InitScriptSource<Arg>,\n arg?: Arg,\n ): Promise<void> {\n const source = await normalizeInitScriptSource(script, arg);\n if (this.initScripts.includes(source)) return;\n this.initScripts.push(source);\n const pages = this.pages();\n await Promise.all(pages.map((page) => page.registerInitScript(source)));\n }\n\n /**\n * Return top-level `Page`s (oldest \u2192 newest). OOPIF targets are not included.\n */\n pages(): Page[] {\n const rows: Array<{ tid: TargetId; page: Page; created: number }> = [];\n for (const [tid, page] of this.pagesByTarget) {\n if (this.typeByTarget.get(tid) === \"page\") {\n rows.push({ tid, page, created: this.createdAtByTarget.get(tid) ?? 0 });\n }\n }\n rows.sort((a, b) => a.created - b.created);\n return rows.map((r) => r.page);\n }\n\n private async applyInitScriptsToPage(\n page: Page,\n opts?: { seedOnly?: boolean },\n ): Promise<void> {\n if (opts?.seedOnly) {\n for (const source of this.initScripts) {\n page.seedInitScript(source);\n }\n return;\n }\n for (const source of this.initScripts) {\n await page.registerInitScript(source);\n }\n }\n\n /**\n * Resolve an owning `Page` by the **top-level main frame id**.\n * Note: child (OOPIF) roots are intentionally not present in this mapping.\n */\n resolvePageByMainFrameId(frameId: string): Page | undefined {\n const targetId = this.mainFrameToTarget.get(frameId);\n return targetId ? this.pagesByTarget.get(targetId) : undefined;\n }\n\n /**\n * Serialize the full frame tree for a given top-level main frame id.\n */\n async getFullFrameTreeByMainFrameId(\n rootMainFrameId: string,\n ): Promise<Protocol.Page.FrameTree> {\n const owner = this.resolvePageByMainFrameId(rootMainFrameId);\n if (!owner) throw new PageNotFoundError(`mainFrameId=${rootMainFrameId}`);\n return owner.asProtocolFrameTree(rootMainFrameId);\n }\n\n /**\n * Create a new top-level page (tab) with the given URL and return its Page object.\n * Waits until the target is attached and registered.\n */\n public async newPage(url = \"about:blank\"): Promise<Page> {\n const targetUrl = String(url ?? \"about:blank\");\n const { targetId } = await this.conn.send<{ targetId: string }>(\n \"Target.createTarget\",\n // Create at about:blank so init scripts can install before first real navigation.\n { url: \"about:blank\" },\n );\n this.pendingCreatedTargetUrl.set(targetId, \"about:blank\");\n // Best-effort bring-to-front\n await this.conn.send(\"Target.activateTarget\", { targetId }).catch(() => {});\n\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n const page = this.pagesByTarget.get(targetId);\n if (page) {\n // we created at about:blank; navigate only after attach so init scripts run\n // on the first real document. Fire-and-forget so newPage() resolves on attach.\n if (targetUrl !== \"about:blank\") {\n // Seed requested URL into the page cache before navigation events arrive.\n page.seedCurrentUrl(targetUrl);\n void page\n .sendCDP(\"Page.navigate\", { url: targetUrl })\n .catch(() => {});\n }\n return page;\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new TimeoutError(`newPage: target not attached (${targetId})`, 5000);\n }\n\n /**\n * Close CDP and clear all mappings. Best-effort cleanup.\n */\n async close(): Promise<void> {\n await this.conn.close();\n this.pagesByTarget.clear();\n this.mainFrameToTarget.clear();\n this.sessionOwnerPage.clear();\n this.frameOwnerPage.clear();\n this.pendingOopifByMainFrame.clear();\n this.createdAtByTarget.clear();\n this.typeByTarget.clear();\n this.pendingCreatedTargetUrl.clear();\n }\n\n /**\n * Bootstrap target lifecycle:\n * - Attach to existing targets.\n * - Handle auto-attach events.\n * - Clean up on detach/destroy.\n */\n private async bootstrap(): Promise<void> {\n // Live attach via auto-attach (normal path)\n this.conn.on<Protocol.Target.AttachedToTargetEvent>(\n \"Target.attachedToTarget\",\n async (evt) => {\n await this.onAttachedToTarget(evt.targetInfo, evt.sessionId);\n },\n );\n\n // Live detach (clean up session from owner page & frame graph)\n this.conn.on<Protocol.Target.DetachedFromTargetEvent>(\n \"Target.detachedFromTarget\",\n (evt) => {\n this.onDetachedFromTarget(evt.sessionId, evt.targetId ?? null);\n },\n );\n\n // Destroyed targets (fallback cleanup by targetId)\n this.conn.on<Protocol.Target.TargetDestroyedEvent>(\n \"Target.targetDestroyed\",\n (evt) => {\n this.cleanupByTarget(evt.targetId);\n },\n );\n\n this.conn.on<Protocol.Target.TargetCreatedEvent>(\n \"Target.targetCreated\",\n async (evt) => {\n const info = evt.targetInfo;\n // Note popups to help activePage settle\n const ti = info;\n if (info.type === \"page\" && (ti?.openerId || ti?.openerFrameId)) {\n this._notePopupSignal();\n }\n },\n );\n\n // Only enable auto-attach after listeners are ready so replayed targets are captured.\n await this.conn.enableAutoAttach();\n\n const targets = await this.conn.getTargets();\n for (const t of targets) {\n if (t.attached) continue; // auto-attach already handled this target\n try {\n await this.conn.attachToTarget(t.targetId);\n } catch {\n // ignore attach race\n }\n }\n\n const topLevelTargetIds = targets\n .filter((t) => isTopLevelPage(t))\n .map((t) => t.targetId);\n await this.waitForInitialTopLevelTargets(topLevelTargetIds);\n }\n\n /**\n * Handle a newly attached target (top-level or potential OOPIF):\n * - Enable Page domain and lifecycle events.\n * - If top-level \u2192 create Page, wire listeners, resume.\n * - Else \u2192 probe child root frame id via `Page.getFrameTree` and adopt immediately\n * if the parent is known; otherwise stage until parent `frameAttached`.\n * - Resume the target only after listeners are wired.\n */\n private async onAttachedToTarget(\n info: Protocol.Target.TargetInfo,\n sessionId: SessionId,\n ): Promise<void> {\n // Workers are ignored by Stagehand, but with waitForDebuggerOnStart enabled\n // they still need to be resumed so we don't leave them paused.\n if (\n info.type === \"worker\" ||\n info.type === \"service_worker\" ||\n info.type === \"shared_worker\"\n ) {\n const session = this.conn.getSession(sessionId);\n if (session) {\n await session.send(\"Runtime.runIfWaitingForDebugger\").catch(() => {});\n }\n return;\n }\n\n const session = this.conn.getSession(sessionId);\n if (!session) return;\n\n // Init guard\n if (this._sessionInit.has(sessionId)) return;\n this._sessionInit.add(sessionId);\n\n this.installTargetSessionListeners(session);\n\n // Register for Runtime events before enabling it so we don't miss initial contexts.\n executionContexts.attachSession(session);\n\n // Ensure we only resume once even if multiple code paths hit finally.\n let resumed = false;\n const resume = async (): Promise<void> => {\n if (resumed) return;\n resumed = true;\n // waitForDebuggerOnStart pauses new targets; resume once we've done\n // any \"must happen before first document\" work.\n await session.send(\"Runtime.runIfWaitingForDebugger\").catch(() => {});\n };\n\n // Install any context-level init scripts as early as possible on this session.\n // If this throws, we still resume the target but avoid re-installing later.\n let scriptsInstalled = true;\n let piercerPreRegistered = false;\n const installPromises: Array<Promise<unknown>> = [];\n try {\n const send = (method: string, params?: object) =>\n session.send(method, params).catch(() => {});\n // make sure init scripts land before any subframe work.\n installPromises.push(send(\"Page.enable\"));\n installPromises.push(send(\"Runtime.enable\"));\n installPromises.push(\n session\n .send(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: true,\n flatten: true,\n })\n .catch(() => {}),\n );\n // Send init scripts only after auto-attach has been issued.\n if (this.initScripts.length) {\n for (const source of this.initScripts) {\n installPromises.push(\n session.send(\"Page.addScriptToEvaluateOnNewDocument\", {\n source,\n runImmediately: true,\n }),\n );\n }\n }\n // register piercer (shadow-DOM hook) before resume so it runs\n // before page scripts\n installPromises.push(\n session\n .send(\"Page.addScriptToEvaluateOnNewDocument\", {\n source: v3ScriptContent,\n runImmediately: true,\n })\n .then(() => {\n piercerPreRegistered = true;\n })\n .catch(() => {}),\n );\n installPromises.push(resume());\n } catch {\n scriptsInstalled = false;\n }\n if (installPromises.length) {\n const results = await Promise.allSettled(installPromises);\n if (results.some((r) => r.status === \"rejected\")) {\n scriptsInstalled = false;\n }\n }\n\n // Only mark the piercer as installed when the pre-registration actually\n // succeeded. This lets ensurePiercer() short-circuit (avoiding sequential\n // CDP round-trips that delay Page.create / installFrameEventBridges and\n // cause same-process iframe frame-events to be missed) while still falling\n // back to the full install path when registration failed.\n if (piercerPreRegistered) {\n this._piercerInstalled.add(sessionId);\n }\n\n try {\n const piercerReady = await this.ensurePiercer(session);\n if (!piercerReady) return;\n\n await session\n .send(\"Page.setLifecycleEventsEnabled\", { enabled: true })\n .catch(() => {});\n\n // Top-level handling\n if (isTopLevelPage(info)) {\n const page = await Page.create(\n this.conn,\n session,\n info.targetId,\n this.apiClient,\n this.localBrowserLaunchOptions,\n this.env === \"BROWSERBASE\",\n );\n this.wireSessionToOwnerPage(sessionId, page);\n this.pagesByTarget.set(info.targetId, page);\n this.mainFrameToTarget.set(page.mainFrameId(), info.targetId);\n this.sessionOwnerPage.set(sessionId, page);\n this.frameOwnerPage.set(page.mainFrameId(), page);\n this.typeByTarget.set(info.targetId, \"page\");\n if (!this.createdAtByTarget.has(info.targetId)) {\n this.createdAtByTarget.set(info.targetId, Date.now());\n }\n const pendingSeedUrl = this.pendingCreatedTargetUrl.get(info.targetId);\n this.pendingCreatedTargetUrl.delete(info.targetId);\n page.seedCurrentUrl(pendingSeedUrl ?? info.url ?? \"\");\n this._pushActive(info.targetId);\n this.installFrameEventBridges(sessionId, page);\n // If we already installed scripts at the session level, only seed the\n // Page's registry to avoid double-installing DOMContentLoaded handlers.\n await this.applyInitScriptsToPage(page, {\n seedOnly: scriptsInstalled,\n });\n\n return;\n }\n\n // Child (iframe / OOPIF)\n try {\n const { frameTree } =\n await session.send<Protocol.Page.GetFrameTreeResponse>(\n \"Page.getFrameTree\",\n );\n const childMainId = frameTree.frame.id;\n\n // Try to find owner Page now (it may already have the node in its tree)\n let owner = this.frameOwnerPage.get(childMainId);\n if (!owner) {\n for (const p of this.pagesByTarget.values()) {\n const tree = p.asProtocolFrameTree(p.mainFrameId());\n const has = (function find(n: Protocol.Page.FrameTree): boolean {\n if (n.frame.id === childMainId) return true;\n for (const c of n.childFrames ?? []) if (find(c)) return true;\n return false;\n })(tree);\n if (has) {\n owner = p;\n break;\n }\n }\n }\n\n if (owner) {\n owner.adoptOopifSession(session, childMainId);\n this.sessionOwnerPage.set(sessionId, owner);\n this.installFrameEventBridges(sessionId, owner);\n // Prime the execution-context registry so later lookups succeed even if\n // the frame navigates before we issue a command.\n void executionContexts\n .waitForMainWorld(session, childMainId)\n .catch(() => {});\n } else {\n this.pendingOopifByMainFrame.set(childMainId, sessionId);\n }\n } catch {\n // page.getFrameTree failed. Most likely was an ad iframe\n // that opened & closed before we could attach. ignore\n }\n } finally {\n await resume();\n }\n }\n\n /**\n * Detach handler:\n * - Remove child session ownership and prune its subtree.\n * - If a top-level target, cleanup its `Page` and mappings.\n * - Drop any staged child for this session.\n */\n private onDetachedFromTarget(\n sessionId: SessionId,\n targetId: string | null,\n ): void {\n const owner = this.sessionOwnerPage.get(sessionId);\n if (owner) {\n owner.detachOopifSession(sessionId);\n this.sessionOwnerPage.delete(sessionId);\n }\n\n if (targetId && this.pagesByTarget.has(targetId)) {\n this.cleanupByTarget(targetId);\n }\n\n for (const [fid, sid] of Array.from(\n this.pendingOopifByMainFrame.entries(),\n )) {\n if (sid === sessionId) this.pendingOopifByMainFrame.delete(fid);\n }\n\n this._targetSessionListeners.delete(sessionId);\n this._sessionInit.delete(sessionId);\n this._piercerInstalled.delete(sessionId);\n }\n\n /**\n * Cleanup a top-level Page by target id, removing its root and staged children.\n */\n private cleanupByTarget(targetId: TargetId): void {\n const page = this.pagesByTarget.get(targetId);\n if (!page) return;\n\n const mainId = page.mainFrameId();\n this.mainFrameToTarget.delete(mainId);\n this.frameOwnerPage.delete(mainId);\n\n for (const [sid, p] of Array.from(this.sessionOwnerPage.entries())) {\n if (p === page) this.sessionOwnerPage.delete(sid);\n }\n\n for (const [fid] of Array.from(this.pendingOopifByMainFrame.entries())) {\n const owner = this.frameOwnerPage.get(fid);\n if (!owner || owner === page) this.pendingOopifByMainFrame.delete(fid);\n }\n\n this._removeFromOrder(targetId);\n this.pagesByTarget.delete(targetId);\n this.createdAtByTarget.delete(targetId);\n this.typeByTarget.delete(targetId);\n this.pendingCreatedTargetUrl.delete(targetId);\n }\n\n /**\n * Wire Page-domain frame events for a session into the owning Page & mappings.\n * We forward the *emitting session* with every event so Page can stamp ownership precisely.\n */\n private installFrameEventBridges(sessionId: SessionId, owner: Page): void {\n const session = this.conn.getSession(sessionId);\n if (!session) return;\n\n session.on<Protocol.Page.FrameAttachedEvent>(\n \"Page.frameAttached\",\n (evt) => {\n const { frameId, parentFrameId } = evt;\n\n owner.onFrameAttached(frameId, parentFrameId ?? null, session);\n\n // If we were waiting for this id (OOPIF child), adopt now.\n const pendingChildSessionId = this.pendingOopifByMainFrame.get(frameId);\n if (pendingChildSessionId) {\n const child = this.conn.getSession(pendingChildSessionId);\n if (child) {\n owner.adoptOopifSession(child, frameId);\n this.sessionOwnerPage.set(child.id, owner);\n // Wire bridges for the child so its Page events keep flowing.\n this.installFrameEventBridges(pendingChildSessionId, owner);\n }\n this.pendingOopifByMainFrame.delete(frameId);\n }\n\n // Track Page ownership for quick reverse lookups (debug helpers).\n this.frameOwnerPage.set(frameId, owner);\n\n // Root handoff: keep mainFrameToTarget aligned for the page\n if (!parentFrameId) {\n const newRoot = owner.mainFrameId();\n const topTargetId = this.findTargetIdByPage(owner);\n if (topTargetId) {\n this.mainFrameToTarget.set(newRoot, topTargetId);\n }\n this.frameOwnerPage.set(newRoot, owner);\n }\n },\n );\n\n session.on<Protocol.Page.FrameDetachedEvent>(\n \"Page.frameDetached\",\n (evt) => {\n owner.onFrameDetached(evt.frameId, evt.reason ?? \"remove\");\n if (evt.reason !== \"swap\") {\n this.frameOwnerPage.delete(evt.frameId);\n }\n },\n );\n\n session.on<Protocol.Page.FrameNavigatedEvent>(\n \"Page.frameNavigated\",\n (evt) => {\n owner.onFrameNavigated(evt.frame, session);\n },\n );\n\n session.on<Protocol.Page.NavigatedWithinDocumentEvent>(\n \"Page.navigatedWithinDocument\",\n (evt) => {\n owner.onNavigatedWithinDocument(evt.frameId, evt.url, session);\n },\n );\n\n // Observe window.open to anticipate default page changes\n session.on<Protocol.Page.WindowOpenEvent>(\"Page.windowOpen\", () => {\n this._notePopupSignal();\n });\n }\n\n /**\n * Register that a session belongs to a Page (used by event routing).\n */\n private wireSessionToOwnerPage(sessionId: SessionId, owner: Page): void {\n this.sessionOwnerPage.set(sessionId, owner);\n }\n\n /**\n * Utility: reverse-lookup the top-level target id that owns a given Page.\n */\n private findTargetIdByPage(page: Page): TargetId | undefined {\n for (const [tid, p] of this.pagesByTarget) {\n if (p === page) return tid;\n }\n return undefined;\n }\n\n private _notePopupSignal(): void {\n this._lastPopupSignalAt = Date.now();\n }\n\n /**\n * Await the current active page, waiting briefly if a popup/open was just triggered.\n * Normal path returns immediately; popup path waits up to timeoutMs for the new page.\n */\n async awaitActivePage(timeoutMs?: number): Promise<Page> {\n const defaultTimeout = this.env === \"BROWSERBASE\" ? 4000 : 2000;\n timeoutMs = timeoutMs ?? defaultTimeout;\n // If a popup was just triggered, Chrome (especially on Browserbase)\n // may briefly pause new targets at document start (\"waiting for debugger\").\n const recentWindowMs = this.env === \"BROWSERBASE\" ? 1000 : 300;\n const now = Date.now();\n const hasRecentPopup = now - this._lastPopupSignalAt <= recentWindowMs;\n\n const immediate = this.activePage();\n if (!hasRecentPopup && immediate) return immediate;\n\n const deadline = now + timeoutMs;\n while (Date.now() < deadline) {\n // Prefer most-recent by createdAt\n let newestTid: TargetId | undefined;\n let newestTs = -1;\n for (const [tid] of this.pagesByTarget) {\n const ts = this.createdAtByTarget.get(tid) ?? 0;\n if (ts > newestTs) {\n newestTs = ts;\n newestTid = tid;\n }\n }\n if (newestTid) {\n const p = this.pagesByTarget.get(newestTid);\n if (p && newestTs >= this._lastPopupSignalAt) return p;\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n if (immediate) return immediate;\n throw new PageNotFoundError(\"awaitActivePage: no page available\");\n }\n}\n", "// lib/v3/understudy/cdp.ts\nimport WebSocket from \"ws\";\nimport type { Protocol } from \"devtools-protocol\";\nimport { STAGEHAND_VERSION } from \"../../version.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 \u2014 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.emitTransportClosed(why);\n });\n\n this.ws.on(\"error\", (err) => {\n const why = `socket-error ${err?.message ?? String(err)}`;\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 await new Promise<void>((resolve) => {\n this.ws.once(\"close\", () => resolve());\n this.ws.close();\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", "import type { Protocol } from \"devtools-protocol\";\nimport { v3Logger } from \"../logger.js\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport { v3ScriptContent } from \"../dom/build/scriptV3Content.js\";\nimport { reRenderScriptContent } from \"../dom/build/reRenderScriptContent.js\";\n\nexport async function installV3PiercerIntoSession(\n session: CDPSessionLike,\n): Promise<boolean> {\n const pageEnabled = await session\n .send(\"Page.enable\")\n .then(() => true)\n .catch(() => false);\n if (!pageEnabled) return false;\n\n await session.send(\"Runtime.enable\").catch(() => {});\n try {\n await session.send<Protocol.Page.AddScriptToEvaluateOnNewDocumentResponse>(\n \"Page.addScriptToEvaluateOnNewDocument\",\n { source: v3ScriptContent, runImmediately: true },\n );\n } catch (e) {\n const msg = String((e as Error)?.message ?? e ?? \"\");\n // If the session vanished during attach (common with short-lived OOPIFs),\n // swallow and report failure so callers can early-return.\n if (msg.includes(\"Session with given id not found\")) return false;\n // For other errors, keep going but don't throw \u2014 the next evaluate is idempotent.\n }\n await session\n .send<Protocol.Runtime.EvaluateResponse>(\"Runtime.evaluate\", {\n expression: v3ScriptContent,\n returnByValue: true,\n awaitPromise: true,\n })\n .catch(() => {});\n\n // After the piercer is in place, re-render any custom elements whose\n // shadow roots were created before we patched attachShadow so their\n // closed roots are recreated under the hook.\n await session\n .send<Protocol.Runtime.EvaluateResponse>(\"Runtime.evaluate\", {\n expression: reRenderScriptContent,\n returnByValue: true,\n awaitPromise: false,\n })\n .catch(() => {});\n return true;\n}\n\n/** (Optional) stream patch logs in your node console during bring-up */\nexport function tapPiercerConsole(\n session: CDPSessionLike,\n label: string,\n): void {\n session.on<Protocol.Runtime.ConsoleAPICalledEvent>(\n \"Runtime.consoleAPICalled\",\n (evt) => {\n const head = evt.args?.[0]?.value as string | undefined;\n if (head?.startsWith?.(\"[v3-piercer]\")) {\n v3Logger({\n category: \"piercer\",\n message: `[${label}] ${head}`,\n level: 2,\n auxiliary: {\n value: {\n value: String(evt.args?.[1]?.value ?? \"\"),\n type: \"string\",\n },\n },\n });\n }\n },\n );\n}\n", "export const v3ScriptContent = \"(()=>{function s(c={}){let r=e=>{let{hostToRoot:o}=e;window.__stagehandV3__={getClosedRoot:a=>o.get(a),stats:()=>({installed:!0,url:location.href,isTop:window.top===window,open:e.openCount,closed:e.closedCount})}},n=Element.prototype.attachShadow;if(n.__v3Patched&&n.__v3State){n.__v3State.debug=!0,r(n.__v3State);return}let t={hostToRoot:new WeakMap,openCount:0,closedCount:0,debug:!0},l=n,d=function(e){let o=e?.mode??\\\"open\\\",a=l.call(this,e);try{t.hostToRoot.set(this,a),o===\\\"closed\\\"?t.closedCount++:t.openCount++,t.debug&&console.info(\\\"[v3-piercer] attachShadow\\\",{tag:this.tagName?.toLowerCase()??\\\"\\\",mode:o,url:location.href})}catch{}return a};if(d.__v3Patched=!0,d.__v3State=t,Object.defineProperty(Element.prototype,\\\"attachShadow\\\",{configurable:!0,writable:!0,value:d}),c.tagExisting)try{let e=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT);for(;e.nextNode();){let o=e.currentNode;o.shadowRoot&&(t.hostToRoot.set(o,o.shadowRoot),t.openCount++)}}catch{}window.__stagehandV3Injected=!0,r(t),t.debug&&console.info(\\\"[v3-piercer] installed\\\",{url:location.href,isTop:window.top===window,readyState:document.readyState})}s({debug:!0,tagExisting:!1});})();\\n\";", "export const reRenderScriptContent = \"(()=>{function s(){try{let o=window.__stagehandV3__;if(!o||typeof o.getClosedRoot!=\\\"function\\\")return;let t=[],r=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT);for(;r.nextNode();){let e=r.currentNode,n=e.tagName?.toLowerCase()??\\\"\\\";if(!n.includes(\\\"-\\\")||typeof customElements?.get!=\\\"function\\\"||!customElements.get(n))continue;let c=!!e.shadowRoot,i=!!o.getClosedRoot(e);c||i||t.push(e)}for(let e of t)try{let n=e.cloneNode(!0);e.replaceWith(n)}catch{}o.stats&&t.length&&console.info(\\\"[v3-piercer] rerender\\\",{count:t.length})}catch(o){console.info(\\\"[v3-piercer] rerender error\\\",{message:String(o??\\\"\\\")})}}s();})();\\n\";", "import { ClientOptions, ModelConfiguration } from \"./v3/types/public/model.js\";\nimport {\n AVAILABLE_CUA_MODELS,\n AvailableCuaModel,\n} from \"./v3/types/public/agent.js\";\n\nexport function splitModelName(model: string): {\n provider: string;\n modelName: string;\n} {\n const firstSlashIndex = model.indexOf(\"/\");\n const provider = model.substring(0, firstSlashIndex);\n const modelName = model.substring(firstSlashIndex + 1);\n return { provider, modelName };\n}\n\nexport function resolveModel(model: string | ModelConfiguration): {\n provider: string;\n modelName: string;\n clientOptions: ClientOptions;\n isCua: boolean;\n} {\n // Extract the model string and client options\n const modelString = typeof model === \"string\" ? model : model.modelName;\n const clientOptions =\n typeof model === \"string\"\n ? {}\n : (() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { modelName: _, ...rest } = model;\n return rest;\n })();\n\n // Check if provider is explicitly set in clientOptions\n const hasExplicitProvider = clientOptions.provider !== undefined;\n\n // If provider is explicitly set, don't split the model name - pass it through as-is\n let provider: string;\n let parsedModelName: string;\n\n if (hasExplicitProvider) {\n provider = clientOptions.provider as string;\n parsedModelName = modelString; // Keep the full model name\n } else {\n // Parse the model string normally\n const split = splitModelName(modelString);\n provider = split.provider;\n parsedModelName = split.modelName;\n }\n\n // Check if it's a CUA model\n const isCua =\n hasExplicitProvider ||\n AVAILABLE_CUA_MODELS.includes(modelString as AvailableCuaModel);\n\n return {\n provider,\n modelName: parsedModelName,\n clientOptions,\n isCua,\n };\n}\n", "import makeFetchCookie from \"fetch-cookie\";\nimport { loadApiKeyFromEnv } from \"../utils.js\";\nimport { STAGEHAND_VERSION } from \"../version.js\";\nimport {\n StagehandAPIError,\n StagehandAPIUnauthorizedError,\n StagehandHttpError,\n StagehandResponseBodyError,\n StagehandResponseParseError,\n StagehandServerError,\n ExperimentalNotConfiguredError,\n} from \"./types/public/index.js\";\nimport type {\n Action,\n ActResult,\n AgentConfig,\n AgentExecuteOptions,\n AgentResult,\n ExtractResult,\n LogLine,\n StagehandMetrics,\n ActOptions,\n ExtractOptions,\n ObserveOptions,\n Api,\n} from \"./types/public/index.js\";\nimport type {\n SerializableResponse,\n AgentCacheTransferPayload,\n} from \"./types/private/index.js\";\nimport type { ModelConfiguration } from \"./types/public/model.js\";\nimport { toJsonSchema } from \"./zodCompat.js\";\nimport type { StagehandZodSchema } from \"./zodCompat.js\";\n\n// =============================================================================\n// Client-specific types (can't be Zod schemas due to functions/Page objects)\n// =============================================================================\n//\n// These types mirror the Api.* schemas from types/public/api.ts but include\n// non-serializable SDK fields (like Page objects) that get stripped before\n// sending requests over the wire.\n//\n// Relationship to wire format:\n// - Client accepts: SDK types (ActOptions, ExtractOptions, etc.) with optional `page`\n// - Wire sends: Api.* types (page stripped, Zod schema converted to JSON schema)\n// - Client returns: SDK result types (ActResult, ExtractResult, etc.)\n// =============================================================================\n\n/**\n * Constructor parameters for StagehandAPIClient\n */\ninterface StagehandAPIConstructorParams {\n apiKey: string;\n projectId: string;\n logger: (message: LogLine) => void;\n}\n\n/**\n * Parameters for starting a session via the API client.\n * Extends Api.SessionStartRequest with client-specific field (modelApiKey).\n *\n * Wire format: Api.SessionStartRequest (modelApiKey sent via header, not body)\n */\ninterface ClientSessionStartParams extends Api.SessionStartRequest {\n /** Model API key - sent via x-model-api-key header, not in request body */\n modelApiKey: string;\n}\n\n/**\n * Generic API response wrapper matching Api.*Response schemas\n */\ntype ApiResponse<T> =\n | { success: true; data: T }\n | { success: false; message: string };\n\n/**\n * Union of all API request body types for type-safe execute() calls\n */\ntype ApiRequestBody =\n | Api.ActRequest\n | Api.ExtractRequest\n | Api.ObserveRequest\n | Api.NavigateRequest\n | Api.AgentExecuteRequest;\n\n/**\n * Parameters for executing an action via the streaming API\n */\ninterface ExecuteActionParams {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"end\" | \"agentExecute\";\n args?: ApiRequestBody;\n params?: Record<string, string>;\n}\n\n/**\n * Client parameters for act() method.\n * Derives structure from Api.ActRequest but uses SDK's ActOptions (which includes `page`).\n * Before serialization, `page` is stripped to produce Api.ActRequest wire format.\n */\ninterface ClientActParameters {\n input: Api.ActRequest[\"input\"];\n options?: ActOptions;\n frameId?: Api.ActRequest[\"frameId\"];\n}\n\n/**\n * Client parameters for extract() method.\n * Derives structure from Api.ExtractRequest but uses SDK's ExtractOptions (which includes `page`)\n * and accepts Zod schema (converted to JSON schema for wire format).\n */\ninterface ClientExtractParameters {\n instruction?: Api.ExtractRequest[\"instruction\"];\n schema?: StagehandZodSchema;\n options?: ExtractOptions;\n frameId?: Api.ExtractRequest[\"frameId\"];\n}\n\n/**\n * Client parameters for observe() method.\n * Derives structure from Api.ObserveRequest but uses SDK's ObserveOptions (which includes `page`).\n * Before serialization, `page` is stripped to produce Api.ObserveRequest wire format.\n */\ninterface ClientObserveParameters {\n instruction?: Api.ObserveRequest[\"instruction\"];\n options?: ObserveOptions;\n frameId?: Api.ObserveRequest[\"frameId\"];\n}\n\nexport class StagehandAPIClient {\n private apiKey: string;\n private projectId: string;\n private sessionId?: string;\n private modelApiKey: string;\n private modelProvider?: string;\n private logger: (message: LogLine) => void;\n private fetchWithCookies;\n private lastFinishedEventData: Record<string, unknown> | null = null;\n private latestAgentCacheEntry: AgentCacheTransferPayload | null = null;\n\n constructor({ apiKey, projectId, logger }: StagehandAPIConstructorParams) {\n this.apiKey = apiKey;\n this.projectId = projectId;\n this.logger = logger;\n // Create a single cookie jar instance that will persist across all requests\n this.fetchWithCookies = makeFetchCookie(fetch);\n }\n\n async init({\n modelName,\n modelApiKey,\n domSettleTimeoutMs,\n verbose,\n systemPrompt,\n selfHeal,\n browserbaseSessionCreateParams,\n browserbaseSessionID,\n // browser, TODO for local browsers\n }: ClientSessionStartParams): Promise<Api.SessionStartResult> {\n if (!modelApiKey) {\n throw new StagehandAPIError(\"modelApiKey is required\");\n }\n this.modelApiKey = modelApiKey;\n // Extract provider from modelName (e.g., \"openai/gpt-5-nano\" -> \"openai\")\n this.modelProvider = modelName?.includes(\"/\")\n ? modelName.split(\"/\")[0]\n : undefined;\n\n const region = browserbaseSessionCreateParams?.region;\n if (region && region !== \"us-west-2\") {\n return { sessionId: browserbaseSessionID ?? null, available: false };\n }\n\n this.logger({\n category: \"init\",\n message: \"Creating new browserbase session...\",\n level: 1,\n });\n\n // Build wire-format request body (Api.SessionStartRequest shape)\n const requestBody: Api.SessionStartRequest = {\n modelName,\n domSettleTimeoutMs,\n verbose,\n systemPrompt,\n selfHeal,\n browserbaseSessionCreateParams,\n browserbaseSessionID,\n // browser, TODO: only send when connected to local fastify\n };\n\n const sessionResponse = await this.request(\"/sessions/start\", {\n method: \"POST\",\n body: JSON.stringify(requestBody),\n });\n\n if (sessionResponse.status === 401) {\n throw new StagehandAPIUnauthorizedError(\n \"Unauthorized. Ensure you provided a valid API key.\",\n );\n } else if (sessionResponse.status !== 200) {\n const errorText = await sessionResponse.text();\n this.logger({\n category: \"api\",\n message: `API error (${sessionResponse.status}): ${errorText}`,\n level: 0,\n });\n throw new StagehandHttpError(`Unknown error: ${sessionResponse.status}`);\n }\n\n const sessionResponseBody =\n (await sessionResponse.json()) as ApiResponse<Api.SessionStartResult>;\n\n if (sessionResponseBody.success === false) {\n throw new StagehandAPIError(sessionResponseBody.message);\n }\n\n // Temporary reroute for rollout\n if (!sessionResponseBody.data?.available && browserbaseSessionID) {\n sessionResponseBody.data.sessionId = browserbaseSessionID;\n }\n\n this.sessionId = sessionResponseBody.data.sessionId;\n\n return sessionResponseBody.data;\n }\n\n async act({\n input,\n options,\n frameId,\n }: ClientActParameters): Promise<ActResult> {\n // Strip non-serializable `page` from options before wire serialization\n let wireOptions: Api.ActRequest[\"options\"];\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, ...restOptions } = options;\n if (Object.keys(restOptions).length > 0) {\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n }\n wireOptions = restOptions as unknown as Api.ActRequest[\"options\"];\n }\n }\n\n // Build wire-format request body\n const requestBody: Api.ActRequest = {\n input,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ActResult>({\n method: \"act\",\n args: requestBody,\n });\n }\n\n async extract<T extends StagehandZodSchema>({\n instruction,\n schema: zodSchema,\n options,\n frameId,\n }: ClientExtractParameters): Promise<ExtractResult<T>> {\n // Convert Zod schema to JSON schema for wire format\n const jsonSchema = zodSchema ? toJsonSchema(zodSchema) : undefined;\n\n // Strip non-serializable `page` from options before wire serialization\n let wireOptions: Api.ExtractRequest[\"options\"];\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, ...restOptions } = options;\n if (Object.keys(restOptions).length > 0) {\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n }\n wireOptions = restOptions as unknown as Api.ExtractRequest[\"options\"];\n }\n }\n\n // Build wire-format request body\n const requestBody: Api.ExtractRequest = {\n instruction,\n schema: jsonSchema,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ExtractResult<T>>({\n method: \"extract\",\n args: requestBody,\n });\n }\n\n async observe({\n instruction,\n options,\n frameId,\n }: ClientObserveParameters): Promise<Action[]> {\n // Strip non-serializable `page` from options before wire serialization\n let wireOptions: Api.ObserveRequest[\"options\"];\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, ...restOptions } = options;\n if (Object.keys(restOptions).length > 0) {\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n }\n wireOptions = restOptions as unknown as Api.ObserveRequest[\"options\"];\n }\n }\n\n // Build wire-format request body\n const requestBody: Api.ObserveRequest = {\n instruction,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<Action[]>({\n method: \"observe\",\n args: requestBody,\n });\n }\n\n async goto(\n url: string,\n options?: Api.NavigateRequest[\"options\"],\n frameId?: string,\n ): Promise<SerializableResponse | null> {\n const requestBody: Api.NavigateRequest = { url, options, frameId };\n\n return this.execute<SerializableResponse | null>({\n method: \"navigate\",\n args: requestBody,\n });\n }\n\n async agentExecute(\n agentConfig: AgentConfig,\n executeOptions: AgentExecuteOptions | string,\n frameId?: string,\n shouldCache?: boolean,\n ): Promise<AgentResult> {\n // Check if integrations are being used in API mode (not supported)\n if (agentConfig.integrations && agentConfig.integrations.length > 0) {\n throw new ExperimentalNotConfiguredError(\"MCP integrations\");\n }\n\n // Strip non-serializable `page` from executeOptions before wire serialization\n let wireExecuteOptions: Api.AgentExecuteRequest[\"executeOptions\"];\n if (typeof executeOptions === \"string\") {\n wireExecuteOptions = { instruction: executeOptions };\n } else if (executeOptions.page) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, ...rest } = executeOptions;\n wireExecuteOptions = rest;\n } else {\n wireExecuteOptions = executeOptions;\n }\n\n const wireAgentConfig: Api.AgentExecuteRequest[\"agentConfig\"] = {\n systemPrompt: agentConfig.systemPrompt,\n mode: agentConfig.mode ?? (agentConfig.cua === true ? \"cua\" : undefined),\n cua: agentConfig.mode === undefined ? agentConfig.cua : undefined,\n model: agentConfig.model\n ? this.prepareModelConfig(agentConfig.model)\n : undefined,\n executionModel: agentConfig.executionModel\n ? this.prepareModelConfig(agentConfig.executionModel)\n : undefined,\n };\n\n // Build wire-format request body\n const requestBody: Api.AgentExecuteRequest = {\n agentConfig: wireAgentConfig,\n executeOptions: wireExecuteOptions,\n frameId,\n shouldCache,\n };\n\n const result = await this.execute<AgentResult>({\n method: \"agentExecute\",\n args: requestBody,\n });\n\n const finishedData =\n this.consumeFinishedEventData<Api.AgentExecuteResult>() ?? null;\n this.latestAgentCacheEntry =\n finishedData?.cacheEntry !== undefined\n ? (finishedData.cacheEntry as AgentCacheTransferPayload)\n : null;\n return result;\n }\n\n consumeLatestAgentCacheEntry(): AgentCacheTransferPayload | null {\n const entry = this.latestAgentCacheEntry;\n this.latestAgentCacheEntry = null;\n return entry;\n }\n\n async end(): Promise<Response> {\n const url = `/sessions/${this.sessionId}/end`;\n const response = await this.request(url, {\n method: \"POST\",\n });\n return response;\n }\n\n async getReplayMetrics(): Promise<StagehandMetrics> {\n if (!this.sessionId) {\n throw new StagehandAPIError(\"sessionId is required to fetch metrics.\");\n }\n\n const response = await this.request(`/sessions/${this.sessionId}/replay`, {\n method: \"GET\",\n });\n\n if (response.status !== 200) {\n const errorText = await response.text();\n this.logger({\n category: \"api\",\n message: `Failed to fetch metrics. Status ${response.status}: ${errorText}`,\n level: 0,\n });\n throw new StagehandHttpError(\n `Failed to fetch metrics with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as\n | Api.ReplayResponse\n | { success: false; error?: string };\n\n if (!data.success) {\n const errorData = data as { success: false; error?: string };\n throw new StagehandAPIError(\n `Failed to fetch metrics: ${errorData.error || \"Unknown error\"}`,\n );\n }\n\n // Parse the API data into StagehandMetrics format\n const apiData = (data as Api.ReplayResponse).data;\n const metrics: StagehandMetrics = {\n actPromptTokens: 0,\n actCompletionTokens: 0,\n actReasoningTokens: 0,\n actCachedInputTokens: 0,\n actInferenceTimeMs: 0,\n extractPromptTokens: 0,\n extractCompletionTokens: 0,\n extractReasoningTokens: 0,\n extractCachedInputTokens: 0,\n extractInferenceTimeMs: 0,\n observePromptTokens: 0,\n observeCompletionTokens: 0,\n observeReasoningTokens: 0,\n observeCachedInputTokens: 0,\n observeInferenceTimeMs: 0,\n agentPromptTokens: 0,\n agentCompletionTokens: 0,\n agentReasoningTokens: 0,\n agentCachedInputTokens: 0,\n agentInferenceTimeMs: 0,\n totalPromptTokens: 0,\n totalCompletionTokens: 0,\n totalReasoningTokens: 0,\n totalCachedInputTokens: 0,\n totalInferenceTimeMs: 0,\n };\n\n // Parse pages and their actions\n const pages = apiData?.pages || [];\n for (const page of pages) {\n const actions = page.actions || [];\n for (const action of actions) {\n // Get method name and token usage\n const method = (action.method || \"\").toLowerCase();\n const tokenUsage = action.tokenUsage;\n\n if (tokenUsage) {\n const inputTokens = tokenUsage.inputTokens || 0;\n const outputTokens = tokenUsage.outputTokens || 0;\n const reasoningTokens =\n \"reasoningTokens\" in tokenUsage\n ? Number(\n (tokenUsage as { reasoningTokens?: number })\n .reasoningTokens ?? 0,\n )\n : 0;\n const cachedInputTokens =\n \"cachedInputTokens\" in tokenUsage\n ? Number(\n (tokenUsage as { cachedInputTokens?: number })\n .cachedInputTokens ?? 0,\n )\n : 0;\n const timeMs = tokenUsage.timeMs || 0;\n\n // Map method to metrics fields\n if (method === \"act\") {\n metrics.actPromptTokens += inputTokens;\n metrics.actCompletionTokens += outputTokens;\n metrics.actReasoningTokens += reasoningTokens;\n metrics.actCachedInputTokens += cachedInputTokens;\n metrics.actInferenceTimeMs += timeMs;\n } else if (method === \"extract\") {\n metrics.extractPromptTokens += inputTokens;\n metrics.extractCompletionTokens += outputTokens;\n metrics.extractReasoningTokens += reasoningTokens;\n metrics.extractCachedInputTokens += cachedInputTokens;\n metrics.extractInferenceTimeMs += timeMs;\n } else if (method === \"observe\") {\n metrics.observePromptTokens += inputTokens;\n metrics.observeCompletionTokens += outputTokens;\n metrics.observeReasoningTokens += reasoningTokens;\n metrics.observeCachedInputTokens += cachedInputTokens;\n metrics.observeInferenceTimeMs += timeMs;\n } else if (method === \"agent\") {\n metrics.agentPromptTokens += inputTokens;\n metrics.agentCompletionTokens += outputTokens;\n metrics.agentReasoningTokens += reasoningTokens;\n metrics.agentCachedInputTokens += cachedInputTokens;\n metrics.agentInferenceTimeMs += timeMs;\n }\n\n // Always update totals for any method with token usage\n metrics.totalPromptTokens += inputTokens;\n metrics.totalCompletionTokens += outputTokens;\n metrics.totalReasoningTokens += reasoningTokens;\n metrics.totalCachedInputTokens += cachedInputTokens;\n metrics.totalInferenceTimeMs += timeMs;\n }\n }\n }\n\n return metrics;\n }\n\n /**\n * Prepares a model configuration for the API payload by ensuring the `apiKey`\n * is included. If the model is passed as a string, converts it to an object\n * with `modelName` and `apiKey`.\n *\n * In API mode, we only attempt to load an API key from env vars when the\n * model provider differs from the one used to init the session.\n */\n private prepareModelConfig(\n model: ModelConfiguration,\n ): { modelName: string; apiKey: string } & Record<string, unknown> {\n if (typeof model === \"string\") {\n // Extract provider from model string (e.g., \"openai/gpt-5-nano\" -> \"openai\")\n const provider = model.includes(\"/\") ? model.split(\"/\")[0] : undefined;\n const apiKey =\n provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : this.modelApiKey;\n return {\n modelName: model,\n apiKey,\n };\n }\n\n if (!model.apiKey) {\n const provider = model.modelName?.includes(\"/\")\n ? model.modelName.split(\"/\")[0]\n : undefined;\n const apiKey =\n provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : this.modelApiKey;\n return {\n ...model,\n apiKey,\n };\n }\n\n return model as { modelName: string; apiKey: string } & Record<\n string,\n unknown\n >;\n }\n\n private consumeFinishedEventData<T>(): T | null {\n const data = this.lastFinishedEventData as T | null;\n this.lastFinishedEventData = null;\n return data;\n }\n\n private async execute<T>({\n method,\n args,\n params,\n }: ExecuteActionParams): Promise<T> {\n this.lastFinishedEventData = null;\n const urlParams = new URLSearchParams(params as Record<string, string>);\n const queryString = urlParams.toString();\n const url = `/sessions/${this.sessionId}/${method}${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.request(url, {\n method: \"POST\",\n body: JSON.stringify(args),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new StagehandHttpError(\n `HTTP error! status: ${response.status}, body: ${errorBody}`,\n );\n }\n\n if (!response.body) {\n throw new StagehandResponseBodyError();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { value, done } = await reader.read();\n\n if (done && !buffer) {\n throw new StagehandServerError(\n \"Stream ended without completion signal\",\n );\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n\n try {\n const eventData = JSON.parse(line.slice(6));\n\n if (eventData.type === \"system\") {\n if (eventData.data.status === \"error\") {\n const { error: errorMsg } = eventData.data;\n // Throw plain Error to match local SDK behavior (useApi: false)\n throw new Error(errorMsg);\n }\n if (eventData.data.status === \"finished\") {\n this.lastFinishedEventData = eventData.data;\n return eventData.data.result as T;\n }\n } else if (eventData.type === \"log\") {\n const msg = eventData.data.message;\n // Skip server-side internal logs that don't apply to API mode\n if (msg?.message === \"Connecting to local browser\") {\n continue;\n }\n this.logger(eventData.data.message);\n }\n } catch (e) {\n // Let Error instances pass through (server errors thrown above)\n // Only wrap SyntaxError from JSON.parse as parse errors\n if (e instanceof Error && !(e instanceof SyntaxError)) {\n throw e;\n }\n\n const errorMessage = e instanceof Error ? e.message : String(e);\n this.logger({\n category: \"api\",\n message: `Failed to parse SSE event: ${errorMessage}`,\n level: 0,\n });\n throw new StagehandResponseParseError(\n `Failed to parse server response: ${errorMessage}`,\n );\n }\n }\n\n if (done) {\n // Process any remaining data in buffer before exiting\n if (buffer.trim() && buffer.startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(buffer.slice(6));\n if (\n eventData.type === \"system\" &&\n eventData.data.status === \"finished\"\n ) {\n return eventData.data.result as T;\n }\n } catch {\n this.logger({\n category: \"api\",\n message: `Incomplete data in final buffer: ${buffer.substring(0, 100)}`,\n level: 0,\n });\n }\n }\n throw new StagehandServerError(\n \"Stream ended without completion signal\",\n );\n }\n }\n }\n\n private async request(path: string, options: RequestInit): Promise<Response> {\n const defaultHeaders: Record<string, string> = {\n \"x-bb-api-key\": this.apiKey,\n \"x-bb-project-id\": this.projectId,\n \"x-bb-session-id\": this.sessionId,\n // we want real-time logs, so we stream the response\n \"x-stream-response\": \"true\",\n \"x-model-api-key\": this.modelApiKey,\n \"x-language\": \"typescript\",\n \"x-sdk-version\": STAGEHAND_VERSION,\n };\n if (options.method === \"POST\" && options.body) {\n defaultHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n const response = await this.fetchWithCookies(\n `${process.env.STAGEHAND_API_URL ?? \"https://api.stagehand.browserbase.com/v1\"}${path}`,\n {\n ...options,\n headers: {\n ...defaultHeaders,\n ...options.headers,\n },\n },\n );\n\n return response;\n }\n}\n", "import {\n ExperimentalNotConfiguredError,\n StagehandInvalidArgumentError,\n} from \"../../types/public/sdkErrors.js\";\nimport type {\n AgentConfig,\n AgentExecuteOptionsBase,\n} from \"../../types/public/index.js\";\n\nexport interface AgentValidationOptions {\n /** Whether experimental mode is enabled */\n isExperimental: boolean;\n /** Agent config options (integrations, tools, stream, cua, etc.) */\n agentConfig?: Partial<AgentConfig>;\n /** Execute options (callbacks, signal, messages, etc.) */\n executeOptions?:\n | (Partial<AgentExecuteOptionsBase> & { callbacks?: unknown })\n | null;\n /** Whether this is streaming mode (can be derived from agentConfig.stream) */\n isStreaming?: boolean;\n}\n\n/**\n * Validates agent configuration and experimental feature usage.\n *\n * This utility consolidates all validation checks for both CUA and non-CUA agent paths:\n * - Invalid argument errors for CUA (streaming, abort signal, message continuation, excludeTools, output schema are not supported)\n * - Experimental feature checks for integrations and tools (both CUA and non-CUA)\n * - Experimental feature checks for hybrid mode (requires experimental: true)\n * - Experimental feature checks for non-CUA only (callbacks, signal, messages, streaming, excludeTools, output schema)\n *\n * Throws StagehandInvalidArgumentError for invalid/unsupported configurations.\n * Throws ExperimentalNotConfiguredError if experimental features are used without experimental mode.\n */\nexport function validateExperimentalFeatures(\n options: AgentValidationOptions,\n): void {\n const { isExperimental, agentConfig, executeOptions, isStreaming } = options;\n\n // Check if CUA mode is enabled (via mode: \"cua\" or deprecated cua: true)\n const isCuaMode =\n agentConfig?.mode !== undefined\n ? agentConfig.mode === \"cua\"\n : agentConfig?.cua === true;\n\n // CUA-specific validation: certain features are not available at all\n if (isCuaMode) {\n const unsupportedFeatures: string[] = [];\n\n if (agentConfig?.stream) {\n unsupportedFeatures.push(\"streaming\");\n }\n if (executeOptions?.signal) {\n unsupportedFeatures.push(\"abort signal\");\n }\n if (executeOptions?.messages) {\n unsupportedFeatures.push(\"message continuation\");\n }\n if (\n executeOptions?.excludeTools &&\n executeOptions.excludeTools.length > 0\n ) {\n unsupportedFeatures.push(\"excludeTools\");\n }\n if (executeOptions?.output) {\n unsupportedFeatures.push(\"output schema\");\n }\n\n if (unsupportedFeatures.length > 0) {\n throw new StagehandInvalidArgumentError(\n `${unsupportedFeatures.join(\", \")} ${unsupportedFeatures.length === 1 ? \"is\" : \"are\"} not supported with CUA (Computer Use Agent) mode.`,\n );\n }\n }\n\n // Skip experimental checks if already in experimental mode\n if (isExperimental) return;\n\n const features: string[] = [];\n\n // Check agent config features (check array length to avoid false positives for empty arrays)\n const hasIntegrations =\n agentConfig?.integrations && agentConfig.integrations.length > 0;\n const hasTools =\n agentConfig?.tools && Object.keys(agentConfig.tools).length > 0;\n if (hasIntegrations || hasTools) {\n features.push(\"MCP integrations and custom tools\");\n }\n\n // Check streaming mode (either explicit or derived from config) - only for non-CUA\n if (!isCuaMode && (isStreaming || agentConfig?.stream)) {\n features.push(\"streaming\");\n }\n\n // Check execute options features - only for non-CUA\n if (executeOptions && !isCuaMode) {\n if (executeOptions.callbacks) {\n features.push(\"callbacks\");\n }\n if (executeOptions.signal) {\n features.push(\"abort signal\");\n }\n if (executeOptions.messages) {\n features.push(\"message continuation\");\n }\n if (executeOptions.excludeTools && executeOptions.excludeTools.length > 0) {\n features.push(\"excludeTools\");\n }\n if (executeOptions.output) {\n features.push(\"output schema\");\n }\n }\n\n if (features.length > 0) {\n throw new ExperimentalNotConfiguredError(`Agent ${features.join(\", \")}`);\n }\n}\n", "/**\n * V3Evaluator mirrors Evaluator but operates on a V3 instance instead of Stagehand.\n * It uses the V3 page/screenshot APIs and constructs an LLM client to run\n * structured evaluations (YES/NO with reasoning) on screenshots and/or text.\n */\n\nimport { z } from \"zod\";\nimport type { AvailableModel, ClientOptions } from \"./v3/types/public/model.js\";\nimport type {\n EvaluateOptions,\n BatchAskOptions,\n EvaluationResult,\n} from \"./v3/types/private/evaluator.js\";\nimport { LLMParsedResponse } from \"./inference.js\";\nimport { LLMResponse, LLMClient } from \"./v3/llm/LLMClient.js\";\nimport { LogLine } from \"./v3/types/public/logs.js\";\nimport { V3 } from \"./v3/v3.js\";\nimport { LLMProvider } from \"./v3/llm/LLMProvider.js\";\nimport { StagehandInvalidArgumentError } from \"./v3/types/public/sdkErrors.js\";\n\nconst EvaluationSchema = z.object({\n evaluation: z.enum([\"YES\", \"NO\"]),\n reasoning: z.string(),\n});\n\nconst BatchEvaluationSchema = z.array(EvaluationSchema);\n\nexport class V3Evaluator {\n private v3: V3;\n private modelName: AvailableModel;\n private modelClientOptions: ClientOptions | { apiKey: string };\n private silentLogger: (message: LogLine) => void = () => {};\n\n constructor(\n v3: V3,\n modelName?: AvailableModel,\n modelClientOptions?: ClientOptions,\n ) {\n this.v3 = v3;\n this.modelName = modelName || (\"google/gemini-2.5-flash\" as AvailableModel);\n this.modelClientOptions = modelClientOptions || {\n apiKey:\n process.env.GEMINI_API_KEY ||\n process.env.GOOGLE_GENERATIVE_AI_API_KEY ||\n \"\",\n };\n }\n\n private getClient(): LLMClient {\n // Prefer a dedicated provider so we can override model per-evaluation\n const provider = new LLMProvider(this.v3.logger);\n return provider.getClient(this.modelName, this.modelClientOptions);\n }\n\n async ask(options: EvaluateOptions): Promise<EvaluationResult> {\n const {\n question,\n answer,\n screenshot = true,\n systemPrompt,\n screenshotDelayMs = 250,\n agentReasoning,\n } = options;\n if (!question)\n throw new StagehandInvalidArgumentError(\n \"Question cannot be an empty string\",\n );\n if (!answer && !screenshot)\n throw new StagehandInvalidArgumentError(\n \"Either answer (text) or screenshot must be provided\",\n );\n\n if (Array.isArray(screenshot)) {\n return this._evaluateWithMultipleScreenshots({\n question,\n screenshots: screenshot,\n systemPrompt,\n agentReasoning,\n });\n }\n\n const defaultSystemPrompt = `You are an expert evaluator that confidently returns YES or NO based on if the original goal was achieved. You have access to ${screenshot ? \"a screenshot\" : \"the agents reasoning and actions throughout the task\"} that you can use to evaluate the tasks completion. Provide detailed reasoning for your answer.\\n Today's date is ${new Date().toLocaleDateString()}`;\n\n await new Promise((r) => setTimeout(r, screenshotDelayMs));\n let imageBuffer: Buffer | undefined;\n if (screenshot) {\n const page = await this.v3.context.awaitActivePage();\n imageBuffer = await page.screenshot({ fullPage: false });\n }\n\n const llmClient = this.getClient();\n\n const response = await llmClient.createChatCompletion<\n LLMParsedResponse<LLMResponse>\n >({\n logger: this.silentLogger,\n options: {\n messages: [\n { role: \"system\", content: systemPrompt || defaultSystemPrompt },\n {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: agentReasoning\n ? `Question: ${question}\\n\\nAgent's reasoning and actions taken:\\n${agentReasoning}`\n : question,\n },\n ...(screenshot && imageBuffer\n ? [\n {\n type: \"image_url\" as const,\n image_url: {\n url: `data:image/jpeg;base64,${imageBuffer.toString(\"base64\")}`,\n },\n },\n ]\n : []),\n ...(answer\n ? [{ type: \"text\" as const, text: `the answer is ${answer}` }]\n : []),\n ],\n },\n ],\n response_model: { name: \"EvaluationResult\", schema: EvaluationSchema },\n },\n });\n\n try {\n const result = response.data as unknown as z.infer<\n typeof EvaluationSchema\n >;\n return { evaluation: result.evaluation, reasoning: result.reasoning };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return {\n evaluation: \"INVALID\",\n reasoning: `Failed to get structured response: ${errorMessage}`,\n } as const;\n }\n }\n\n async batchAsk(options: BatchAskOptions): Promise<EvaluationResult[]> {\n const {\n questions,\n screenshot = true,\n systemPrompt = \"You are an expert evaluator that returns YES or NO with a concise reasoning.\",\n screenshotDelayMs = 250,\n } = options;\n if (!questions?.length)\n throw new StagehandInvalidArgumentError(\n \"Questions array cannot be empty\",\n );\n\n await new Promise((r) => setTimeout(r, screenshotDelayMs));\n let imageBuffer: Buffer | undefined;\n if (screenshot) {\n const page = await this.v3.context.awaitActivePage();\n imageBuffer = await page.screenshot({ fullPage: false });\n }\n\n const llmClient = this.getClient();\n\n const formatted = questions\n .map(\n (item, i) =>\n `${i + 1}. ${item.question}${item.answer ? `\\n Answer: ${item.answer}` : \"\"}`,\n )\n .join(\"\\n\\n\");\n\n const response = await llmClient.createChatCompletion<\n LLMParsedResponse<LLMResponse>\n >({\n logger: this.silentLogger,\n options: {\n messages: [\n {\n role: \"system\",\n content: `${systemPrompt}\\n\\nYou will be given multiple questions${screenshot ? \" with a screenshot\" : \"\"}. ${questions.some((q) => q.answer) ? \"Some questions include answers to evaluate.\" : \"\"} Answer each question by returning an object in the specified JSON format. Return a single JSON array containing one object for each question in the order they were asked.`,\n },\n {\n role: \"user\",\n content: [\n { type: \"text\", text: formatted },\n ...(screenshot && imageBuffer\n ? [\n {\n type: \"image_url\" as const,\n image_url: {\n url: `data:image/jpeg;base64,${imageBuffer.toString(\"base64\")}`,\n },\n },\n ]\n : []),\n ],\n },\n ],\n response_model: {\n name: \"BatchEvaluationResult\",\n schema: BatchEvaluationSchema,\n },\n },\n });\n\n try {\n const results = response.data as unknown as z.infer<\n typeof BatchEvaluationSchema\n >;\n return results.map((r) => ({\n evaluation: r.evaluation,\n reasoning: r.reasoning,\n }));\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return questions.map(() => ({\n evaluation: \"INVALID\" as const,\n reasoning: `Failed to get structured response: ${errorMessage}`,\n }));\n }\n }\n\n private async _evaluateWithMultipleScreenshots(options: {\n question: string;\n screenshots: Buffer[];\n systemPrompt?: string;\n agentReasoning?: string;\n }): Promise<EvaluationResult> {\n const {\n question,\n screenshots,\n agentReasoning,\n systemPrompt = `You are an expert evaluator that confidently returns YES or NO given a question and multiple screenshots showing the progression of a task.\n ${agentReasoning ? \"You also have access to the agent's detailed reasoning and thought process throughout the task.\" : \"\"}\n Analyze ALL screenshots to understand the complete journey. Look for evidence of task completion across all screenshots, not just the last one.\n Success criteria may appear at different points in the sequence (confirmation messages, intermediate states, etc).\n ${agentReasoning ? \"The agent's reasoning provides crucial context about what actions were attempted, what was observed, and the decision-making process. Use this alongside the visual evidence to make a comprehensive evaluation.\" : \"\"}\n Today's date is ${new Date().toLocaleDateString()}`,\n } = options;\n\n if (!question)\n throw new StagehandInvalidArgumentError(\n \"Question cannot be an empty string\",\n );\n if (!screenshots || screenshots.length === 0)\n throw new StagehandInvalidArgumentError(\n \"At least one screenshot must be provided\",\n );\n\n const llmClient = this.getClient();\n\n const imageContents = screenshots.map((s) => ({\n type: \"image_url\" as const,\n image_url: { url: `data:image/jpeg;base64,${s.toString(\"base64\")}` },\n }));\n\n const response = await llmClient.createChatCompletion<\n LLMParsedResponse<LLMResponse>\n >({\n logger: this.silentLogger,\n options: {\n messages: [\n { role: \"system\", content: systemPrompt },\n {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: agentReasoning\n ? `Question: ${question}\\n\\nAgent's reasoning and actions throughout the task:\\n${agentReasoning}\\n\\nI'm providing ${screenshots.length} screenshots showing the progression of the task. Please analyze both the agent's reasoning and all screenshots to determine if the task was completed successfully.`\n : `${question}\\n\\nI'm providing ${screenshots.length} screenshots showing the progression of the task. Please analyze all of them to determine if the task was completed successfully.`,\n },\n ...imageContents,\n ],\n },\n ],\n response_model: { name: \"EvaluationResult\", schema: EvaluationSchema },\n },\n });\n\n try {\n const result = response.data as unknown as z.infer<\n typeof EvaluationSchema\n >;\n return { evaluation: result.evaluation, reasoning: result.reasoning };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return {\n evaluation: \"INVALID\",\n reasoning: `Failed to get structured response: ${errorMessage}`,\n } as const;\n }\n }\n}\n", "import { AgentCache } from \"./AgentCache.js\";\nimport { CacheStorage } from \"./CacheStorage.js\";\nimport type { V3 } from \"../v3.js\";\nimport type { AgentCacheTransferPayload } from \"../types/private/index.js\";\nimport type { ActHandler } from \"../handlers/actHandler.js\";\nimport type { V3Context } from \"../understudy/context.js\";\nimport type { AvailableModel, V3Options } from \"../types/public/index.js\";\nimport type { ModelConfiguration } from \"../types/public/model.js\";\nimport type { LLMClient } from \"../llm/LLMClient.js\";\n\nexport interface ServerAgentCacheHandle {\n complete(): AgentCacheTransferPayload | null;\n discard(): void;\n}\n\n// TODO (refactor-caching): this reflective access is a known temporary escape hatch.\n// Once the caching internals are reworked, replace it with proper V3 helpers so\n// we stop poking private fields from the outside.\nfunction getInternalField<T>(instance: V3, key: string): T {\n return (instance as unknown as Record<string, unknown>)[key] as T;\n}\n\nfunction setInternalField(instance: V3, key: string, value: unknown): void {\n (instance as unknown as Record<string, unknown>)[key] = value;\n}\n\nfunction createMemoryAgentCache(stagehand: V3): AgentCache {\n const resolveLlmClient = getInternalField<\n (model?: ModelConfiguration) => LLMClient\n >(stagehand, \"resolveLlmClient\");\n\n return new AgentCache({\n storage: CacheStorage.createMemory(stagehand.logger),\n logger: stagehand.logger,\n getActHandler: () =>\n getInternalField<ActHandler | null>(stagehand, \"actHandler\"),\n getContext: () => getInternalField<V3Context | null>(stagehand, \"ctx\"),\n getDefaultLlmClient: () => resolveLlmClient.call(stagehand),\n getBaseModelName: () =>\n getInternalField<AvailableModel>(stagehand, \"modelName\"),\n getSystemPrompt: () =>\n getInternalField<V3Options>(stagehand, \"opts\").systemPrompt,\n domSettleTimeoutMs: getInternalField<number | undefined>(\n stagehand,\n \"domSettleTimeoutMs\",\n ),\n act: stagehand.act.bind(stagehand),\n bufferLatestEntry: true,\n });\n}\n\nexport function __internalCreateInMemoryAgentCacheHandle(\n stagehand: V3,\n): ServerAgentCacheHandle {\n const originalCache = getInternalField<AgentCache>(stagehand, \"agentCache\");\n const memoryCache = createMemoryAgentCache(stagehand);\n\n setInternalField(stagehand, \"agentCache\", memoryCache);\n let restored = false;\n const restore = () => {\n if (!restored) {\n setInternalField(stagehand, \"agentCache\", originalCache);\n restored = true;\n }\n };\n\n return {\n complete: () => {\n const entry = memoryCache.consumeBufferedEntry();\n restore();\n return entry;\n },\n discard: () => {\n restore();\n },\n };\n}\n", "/**\n * Shutdown supervisor process.\n *\n * This process watches a stdin lifeline. When the parent dies, stdin closes\n * and the supervisor performs best-effort cleanup:\n * - LOCAL: kill Chrome + remove temp profile\n * - STAGEHAND_API: request session release\n */\n\nimport Browserbase from \"@browserbasehq/sdk\";\nimport type { ShutdownSupervisorConfig } from \"../types/private/shutdown.js\";\nimport { cleanupLocalBrowser } from \"./cleanupLocal.js\";\n\nconst SIGKILL_POLL_MS = 250;\nconst SIGKILL_TIMEOUT_MS = 7_000;\nconst PID_POLL_INTERVAL_MS = 500;\n\n// `cleanupPromise` guarantees we execute cleanup at most once.\nlet config: ShutdownSupervisorConfig | null = null;\nlet cleanupPromise: Promise<void> | null = null;\nlet started = false;\n\nconst exit = (code = 0): void => {\n try {\n process.exit(code);\n } catch {\n // ignore\n }\n};\n\n// Best-effort two-phase kill: SIGTERM first, then SIGKILL after timeout.\n// Treat only ESRCH as \"already gone\"; other errors should not imply dead.\nconst politeKill = async (pid: number): Promise<void> => {\n const isAlive = (): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n // ESRCH = \"No such process\" (PID is already gone).\n return err.code !== \"ESRCH\";\n }\n };\n\n if (!isAlive()) return;\n try {\n process.kill(pid, \"SIGTERM\");\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n // ESRCH = process already exited; no further action needed.\n if (err.code === \"ESRCH\") return;\n }\n\n const deadline = Date.now() + SIGKILL_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, SIGKILL_POLL_MS));\n if (!isAlive()) return;\n }\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // best-effort\n }\n};\n\nlet pidPollTimer: NodeJS.Timeout | null = null;\n\n// Local-only fallback: if Chrome dies while parent still lives, run cleanup and exit.\nconst startPidPolling = (pid: number): void => {\n if (pidPollTimer) return;\n pidPollTimer = setInterval(() => {\n try {\n process.kill(pid, 0);\n } catch {\n if (pidPollTimer) {\n clearInterval(pidPollTimer);\n pidPollTimer = null;\n }\n void runCleanup().finally(() => exit(0));\n }\n }, PID_POLL_INTERVAL_MS);\n};\n\nconst cleanupLocal = async (\n cfg: Extract<ShutdownSupervisorConfig, { kind: \"LOCAL\" }>,\n) => {\n await cleanupLocalBrowser({\n killChrome: cfg.pid ? () => politeKill(cfg.pid) : undefined,\n userDataDir: cfg.userDataDir,\n createdTempProfile: cfg.createdTempProfile,\n preserveUserDataDir: cfg.preserveUserDataDir,\n });\n};\n\nconst cleanupBrowserbase = async (\n cfg: Extract<ShutdownSupervisorConfig, { kind: \"STAGEHAND_API\" }>,\n) => {\n if (!cfg.apiKey || !cfg.projectId || !cfg.sessionId) return;\n try {\n const bb = new Browserbase({ apiKey: cfg.apiKey });\n await bb.sessions.update(cfg.sessionId, {\n status: \"REQUEST_RELEASE\",\n projectId: cfg.projectId,\n });\n } catch {\n // best-effort cleanup\n }\n};\n\n// Idempotent cleanup entrypoint used by all supervisor shutdown paths.\nconst runCleanup = (): Promise<void> => {\n if (!cleanupPromise) {\n cleanupPromise = (async () => {\n const cfg = config;\n if (!cfg) return;\n if (cfg.kind === \"LOCAL\") {\n await cleanupLocal(cfg);\n return;\n }\n if (cfg.kind === \"STAGEHAND_API\") {\n await cleanupBrowserbase(cfg);\n }\n })();\n }\n return cleanupPromise;\n};\n\nconst applyConfig = (nextConfig: ShutdownSupervisorConfig): void => {\n config = nextConfig;\n if (config.kind === \"LOCAL\" && config.pid) {\n startPidPolling(config.pid);\n }\n};\n\nconst onLifelineClosed = () => {\n void runCleanup().finally(() => exit(0));\n};\n\nconst parseConfigFromArgv = (\n argv: readonly string[] = process.argv.slice(2),\n): ShutdownSupervisorConfig | null => {\n const prefix = \"--supervisor-config=\";\n const raw = argv.find((arg) => arg.startsWith(prefix))?.slice(prefix.length);\n if (!argv.includes(\"--supervisor\") || !raw) return null;\n try {\n return JSON.parse(raw) as ShutdownSupervisorConfig;\n } catch {\n return null;\n }\n};\n\nexport const runShutdownSupervisor = (\n initialConfig: ShutdownSupervisorConfig,\n): void => {\n if (started) return;\n started = true;\n applyConfig(initialConfig);\n\n // Stdin is the lifeline; losing it means parent is gone.\n try {\n process.stdin.resume();\n process.stdin.on(\"end\", onLifelineClosed);\n process.stdin.on(\"close\", onLifelineClosed);\n process.stdin.on(\"error\", onLifelineClosed);\n } catch {\n // ignore\n }\n};\n\nexport const maybeRunShutdownSupervisorFromArgv = (\n argv: readonly string[] = process.argv.slice(2),\n): boolean => {\n const parsed = parseConfigFromArgv(argv);\n if (!parsed) return false;\n runShutdownSupervisor(parsed);\n return true;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["zodToJsonSchema", "path", "import_zod", "z3", "line", "import_zod", "V3FunctionName", "path", "path", "fs", "import_fs", "import_path", "fs", "path", "resolved", "parentSession", "path", "buildXPathFromSteps", "IFRAME_STEP_RE", "path", "import_node_async_hooks", "import_pino", "pino", "fs", "uuidv7", "import_ai", "import_ai", "AISdkClient", "response", "tool", "fs", "import_fs", "css", "token", "rects", "color", "rootTokens", "import_fs", "init_page", "fs", "AISdkClient", "import_fs", "import_path", "import_uuid", "pino", "path", "import_crypto", "act", "path", "path", "fs", "import_zod", "import_fs", "import_path", "path", "fs", "SupportedUnderstudyAction", "ownerSession", "focusSelector", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "jsonSchemaToZod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "import_ai", "import_zod", "tool", "import_ai", "import_ai", "import_zod", "result", "import_uuid", "Anthropic", "tool", "uuidv7", "path", "import_uuid", "OpenAI", "tool", "uuidv7", "import_genai", "import_genai", "tool", "import_uuid", "uuidv7", "import_openai", "OpenAI", "path", "act", "import_sdk", "Browserbase", "WebSocket", "import_ai", "import_uuid", "llmRequestId", "uuidv7", "promptPreview", "result", "tool", "import_sdk", "Anthropic", "tool", "import_openai", "OpenAI", "tool", "import_genai", "tool", "import_openai", "OpenAI", "tool", "import_openai", "OpenAI", "formattedMessage", "tool", "import_openai", "import_ai", "import_node_fs", "fs", "import_node_fs", "require", "config", "fs", "tool", "import_ws", "WebSocket", "sessionId", "targetId", "init_page", "session", "makeFetchCookie", "path", "_init", "uuidv7", "vp", "config", "process", "logCtx", "path", "os", "fs", "sessionId", "agentConfigSignature", "handler", "resolvedOptions", "cacheContext", "llmClient", "import_zod", "import_ai", "import_sdk", "Browserbase"]
|
|
7
|
+
}
|