@browserbasehq/orca 3.1.0-patch.4 → 3.2.0-middleware.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/lib/inference.d.ts +3 -1
- package/dist/cjs/lib/inference.js +4 -7
- package/dist/cjs/lib/inference.js.map +1 -1
- package/dist/cjs/lib/prompt.d.ts +1 -1
- package/dist/cjs/lib/prompt.js +24 -18
- package/dist/cjs/lib/prompt.js.map +1 -1
- package/dist/cjs/lib/utils.d.ts +1 -0
- package/dist/cjs/lib/utils.js +4 -0
- package/dist/cjs/lib/utils.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentClient.d.ts +8 -0
- package/dist/cjs/lib/v3/agent/AgentClient.js +13 -0
- package/dist/cjs/lib/v3/agent/AgentClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +0 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +6 -7
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +6 -7
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +1 -0
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +10 -6
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +107 -18
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +4 -2
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +11 -12
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.js +11 -4
- package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +8 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js +49 -22
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
- package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js +70 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
- package/dist/cjs/lib/v3/agent/tools/click.js +23 -31
- package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/clickAndHold.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js +22 -30
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -2
- package/dist/cjs/lib/v3/agent/tools/extract.js +7 -3
- package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +30 -30
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +7 -2
- package/dist/cjs/lib/v3/agent/tools/fillform.js +56 -45
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +19 -3
- package/dist/cjs/lib/v3/agent/tools/index.js +63 -11
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +8 -0
- package/dist/cjs/lib/v3/agent/tools/screenshot.js +32 -15
- package/dist/cjs/lib/v3/agent/tools/screenshot.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/scroll.js +12 -0
- package/dist/cjs/lib/v3/agent/tools/scroll.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/type.js +23 -31
- package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/wait.js +6 -0
- package/dist/cjs/lib/v3/agent/tools/wait.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
- package/dist/cjs/lib/v3/agent/utils/captchaSolver.js +175 -0
- package/dist/cjs/lib/v3/agent/utils/captchaSolver.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/variables.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/utils/variables.js +9 -0
- package/dist/cjs/lib/v3/agent/utils/variables.js.map +1 -1
- package/dist/cjs/lib/v3/api.d.ts +2 -2
- package/dist/cjs/lib/v3/api.js +1 -1
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/cache/ActCache.d.ts +0 -1
- package/dist/cjs/lib/v3/cache/ActCache.js +2 -18
- package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.js +30 -0
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.d.ts +44 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.js +217 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.d.ts +26 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.js +135 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/FlowLogger.d.ts +99 -0
- package/dist/cjs/lib/v3/flowlogger/FlowLogger.js +591 -0
- package/dist/cjs/lib/v3/flowlogger/FlowLogger.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.d.ts +6 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.js +395 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.js.map +1 -0
- package/dist/cjs/lib/v3/handlers/actHandler.js +1 -2
- package/dist/cjs/lib/v3/handlers/actHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/extractHandler.js +2 -2
- package/dist/cjs/lib/v3/handlers/extractHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +43 -57
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/observeHandler.js +3 -3
- package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -5
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +130 -91
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +134 -14
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +2 -1
- package/dist/cjs/lib/v3/launch/browserbase.d.ts +1 -1
- package/dist/cjs/lib/v3/launch/browserbase.js +4 -9
- package/dist/cjs/lib/v3/launch/browserbase.js.map +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
- package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -11
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +24 -28
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/runtimePaths.js +2 -1
- package/dist/cjs/lib/v3/runtimePaths.js.map +1 -1
- package/dist/cjs/lib/v3/shutdown/supervisor.js +2 -2
- package/dist/cjs/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/cjs/lib/v3/timeoutConfig.d.ts +1 -1
- package/dist/cjs/lib/v3/timeoutConfig.js +5 -0
- package/dist/cjs/lib/v3/timeoutConfig.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/cache.d.ts +0 -1
- package/dist/cjs/lib/v3/types/private/cache.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/handlers.d.ts +1 -0
- package/dist/cjs/lib/v3/types/private/handlers.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/shutdown.d.ts +1 -1
- package/dist/cjs/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +28 -3
- package/dist/cjs/lib/v3/types/public/agent.js +0 -1
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +27 -7
- package/dist/cjs/lib/v3/types/public/api.js +42 -14
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/methods.d.ts +1 -0
- package/dist/cjs/lib/v3/types/public/methods.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +14 -3
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +8 -0
- package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/variables.d.ts +7 -0
- package/dist/cjs/lib/v3/types/public/variables.js +22 -0
- package/dist/cjs/lib/v3/types/public/variables.js.map +1 -0
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +8 -13
- package/dist/cjs/lib/v3/understudy/cdp.js +180 -20
- package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/context.d.ts +1 -0
- package/dist/cjs/lib/v3/understudy/context.js +148 -62
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/frame.js +23 -6
- package/dist/cjs/lib/v3/understudy/frame.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.d.ts +13 -0
- package/dist/cjs/lib/v3/understudy/page.js +85 -22
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +0 -1
- package/dist/cjs/lib/v3/understudy/screenshotUtils.js +0 -18
- package/dist/cjs/lib/v3/understudy/screenshotUtils.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +26 -3
- package/dist/cjs/lib/v3/v3.js +250 -180
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js +56 -0
- package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
- package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js +6 -6
- package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
- package/dist/cjs/tests/integration/cdp-session-detached.spec.js +1 -1
- package/dist/cjs/tests/integration/cdp-session-detached.spec.js.map +1 -1
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/cjs/tests/integration/context-addInitScript.spec.js +104 -11
- package/dist/cjs/tests/integration/context-addInitScript.spec.js.map +1 -1
- package/dist/cjs/tests/integration/flowLogger.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/flowLogger.spec.js +714 -0
- package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -0
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js +219 -0
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.js +85 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.js.map +1 -0
- package/dist/cjs/tests/integration/page-screenshot.spec.js +1 -1
- package/dist/cjs/tests/integration/page-screenshot.spec.js.map +1 -1
- package/dist/cjs/tests/integration/testUtils.d.ts +33 -0
- package/dist/cjs/tests/integration/testUtils.js +144 -0
- package/dist/cjs/tests/integration/testUtils.js.map +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js +278 -0
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +285 -0
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -0
- package/dist/cjs/tests/unit/agent-execution-model.test.js +25 -3
- package/dist/cjs/tests/unit/agent-execution-model.test.js.map +1 -1
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js +23 -0
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
- package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js +153 -0
- package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.js +86 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.js +37 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.js.map +1 -0
- package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +20 -0
- package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
- package/dist/cjs/tests/unit/captcha-solver.test.d.ts +1 -0
- package/dist/cjs/tests/unit/captcha-solver.test.js +154 -0
- package/dist/cjs/tests/unit/captcha-solver.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js +95 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js +43 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js +250 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js.map +1 -0
- package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
- package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
- package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
- package/dist/cjs/tests/unit/model-deprecation.test.js +5 -8
- package/dist/cjs/tests/unit/model-deprecation.test.js.map +1 -1
- package/dist/cjs/tests/unit/openai-cua-client.test.d.ts +1 -0
- package/dist/cjs/tests/unit/openai-cua-client.test.js +71 -0
- package/dist/cjs/tests/unit/openai-cua-client.test.js.map +1 -0
- package/dist/cjs/tests/unit/page-extra-http-headers.test.d.ts +1 -0
- package/dist/cjs/tests/unit/page-extra-http-headers.test.js +92 -0
- package/dist/cjs/tests/unit/page-extra-http-headers.test.js.map +1 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.js +19 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +13 -1
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/cjs/tests/unit/timeout-handlers.test.js +50 -0
- package/dist/cjs/tests/unit/timeout-handlers.test.js.map +1 -1
- package/dist/esm/lib/inference.d.ts +3 -1
- package/dist/esm/lib/inference.js +4 -7
- package/dist/esm/lib/inference.js.map +1 -1
- package/dist/esm/lib/prompt.d.ts +1 -1
- package/dist/esm/lib/prompt.js +24 -18
- package/dist/esm/lib/prompt.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +1 -0
- package/dist/esm/lib/utils.js +3 -0
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentClient.d.ts +8 -0
- package/dist/esm/lib/v3/agent/AgentClient.js +13 -0
- package/dist/esm/lib/v3/agent/AgentClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +0 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +6 -7
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +6 -7
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +1 -0
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +10 -6
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +107 -18
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +4 -2
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +11 -12
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -1
- package/dist/esm/lib/v3/agent/tools/act.js +11 -4
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.d.ts +8 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.js +49 -22
- package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
- package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js +66 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/click.js +23 -31
- package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/clickAndHold.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +22 -30
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/extract.js +7 -3
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js +30 -30
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +7 -2
- package/dist/esm/lib/v3/agent/tools/fillform.js +56 -45
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +19 -3
- package/dist/esm/lib/v3/agent/tools/index.js +63 -11
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.d.ts +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/screenshot.d.ts +8 -0
- package/dist/esm/lib/v3/agent/tools/screenshot.js +32 -15
- package/dist/esm/lib/v3/agent/tools/screenshot.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/scroll.js +12 -0
- package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/type.js +23 -31
- package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/wait.js +6 -0
- package/dist/esm/lib/v3/agent/tools/wait.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
- package/dist/esm/lib/v3/agent/utils/captchaSolver.js +171 -0
- package/dist/esm/lib/v3/agent/utils/captchaSolver.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/variables.d.ts +5 -0
- package/dist/esm/lib/v3/agent/utils/variables.js +8 -0
- package/dist/esm/lib/v3/agent/utils/variables.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +2 -2
- package/dist/esm/lib/v3/api.js +1 -1
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/cache/ActCache.d.ts +0 -1
- package/dist/esm/lib/v3/cache/ActCache.js +2 -18
- package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/esm/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
- package/dist/esm/lib/v3/flowlogger/EventEmitter.js +26 -0
- package/dist/esm/lib/v3/flowlogger/EventEmitter.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.d.ts +44 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.js +206 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.d.ts +26 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.js +127 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/FlowLogger.d.ts +99 -0
- package/dist/esm/lib/v3/flowlogger/FlowLogger.js +583 -0
- package/dist/esm/lib/v3/flowlogger/FlowLogger.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/prettify.d.ts +6 -0
- package/dist/esm/lib/v3/flowlogger/prettify.js +389 -0
- package/dist/esm/lib/v3/flowlogger/prettify.js.map +1 -0
- package/dist/esm/lib/v3/handlers/actHandler.js +1 -2
- package/dist/esm/lib/v3/handlers/actHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/extractHandler.js +2 -2
- package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +43 -57
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/observeHandler.js +3 -3
- package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -5
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +131 -92
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +134 -14
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +2 -1
- package/dist/esm/lib/v3/launch/browserbase.d.ts +1 -1
- package/dist/esm/lib/v3/launch/browserbase.js +4 -9
- package/dist/esm/lib/v3/launch/browserbase.js.map +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
- package/dist/esm/lib/v3/llm/LLMProvider.js +15 -12
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/esm/lib/v3/llm/aisdk.js +24 -28
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/runtimePaths.js +2 -1
- package/dist/esm/lib/v3/runtimePaths.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisor.js +2 -2
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/esm/lib/v3/timeoutConfig.d.ts +1 -1
- package/dist/esm/lib/v3/timeoutConfig.js +5 -0
- package/dist/esm/lib/v3/timeoutConfig.js.map +1 -1
- package/dist/esm/lib/v3/types/private/cache.d.ts +0 -1
- package/dist/esm/lib/v3/types/private/cache.js.map +1 -1
- package/dist/esm/lib/v3/types/private/handlers.d.ts +1 -0
- package/dist/esm/lib/v3/types/private/handlers.js.map +1 -1
- package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -1
- package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +28 -3
- package/dist/esm/lib/v3/types/public/agent.js +0 -1
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +27 -7
- package/dist/esm/lib/v3/types/public/api.js +37 -12
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/methods.d.ts +1 -0
- package/dist/esm/lib/v3/types/public/methods.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +14 -3
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +8 -0
- package/dist/esm/lib/v3/types/public/options.js.map +1 -1
- package/dist/esm/lib/v3/types/public/variables.d.ts +7 -0
- package/dist/esm/lib/v3/types/public/variables.js +19 -0
- package/dist/esm/lib/v3/types/public/variables.js.map +1 -0
- package/dist/esm/lib/v3/understudy/cdp.d.ts +8 -13
- package/dist/esm/lib/v3/understudy/cdp.js +181 -21
- package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/esm/lib/v3/understudy/context.d.ts +1 -0
- package/dist/esm/lib/v3/understudy/context.js +148 -62
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/frame.js +23 -6
- package/dist/esm/lib/v3/understudy/frame.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.d.ts +13 -0
- package/dist/esm/lib/v3/understudy/page.js +87 -24
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/understudy/screenshotUtils.d.ts +0 -1
- package/dist/esm/lib/v3/understudy/screenshotUtils.js +0 -17
- package/dist/esm/lib/v3/understudy/screenshotUtils.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +26 -3
- package/dist/esm/lib/v3/v3.js +250 -181
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/integration/agent-captcha-autosolve.spec.d.ts +1 -0
- package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js +54 -0
- package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
- package/dist/esm/tests/integration/agent-hybrid-mode.spec.js +6 -6
- package/dist/esm/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
- package/dist/esm/tests/integration/cdp-session-detached.spec.js +1 -1
- package/dist/esm/tests/integration/cdp-session-detached.spec.js.map +1 -1
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/esm/tests/integration/context-addInitScript.spec.js +104 -11
- package/dist/esm/tests/integration/context-addInitScript.spec.js.map +1 -1
- package/dist/esm/tests/integration/flowLogger.spec.d.ts +1 -0
- package/dist/esm/tests/integration/flowLogger.spec.js +712 -0
- package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -0
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js +217 -0
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.js +83 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.js.map +1 -0
- package/dist/esm/tests/integration/page-screenshot.spec.js +1 -1
- package/dist/esm/tests/integration/page-screenshot.spec.js.map +1 -1
- package/dist/esm/tests/integration/testUtils.d.ts +33 -0
- package/dist/esm/tests/integration/testUtils.js +138 -0
- package/dist/esm/tests/integration/testUtils.js.map +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js +278 -0
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
- package/dist/esm/tests/unit/agent-captcha-hooks.test.js +283 -0
- package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -0
- package/dist/esm/tests/unit/agent-execution-model.test.js +25 -3
- package/dist/esm/tests/unit/agent-execution-model.test.js.map +1 -1
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.js +21 -0
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
- package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js +118 -0
- package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.js +84 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/api-variables-schema.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-variables-schema.test.js +35 -0
- package/dist/esm/tests/unit/api-variables-schema.test.js.map +1 -0
- package/dist/esm/tests/unit/browserbase-session-accessors.test.js +20 -0
- package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
- package/dist/esm/tests/unit/captcha-solver.test.d.ts +1 -0
- package/dist/esm/tests/unit/captcha-solver.test.js +152 -0
- package/dist/esm/tests/unit/captcha-solver.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js +93 -0
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js +41 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js +248 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js.map +1 -0
- package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
- package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
- package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
- package/dist/esm/tests/unit/model-deprecation.test.js +5 -8
- package/dist/esm/tests/unit/model-deprecation.test.js.map +1 -1
- package/dist/esm/tests/unit/openai-cua-client.test.d.ts +1 -0
- package/dist/esm/tests/unit/openai-cua-client.test.js +69 -0
- package/dist/esm/tests/unit/openai-cua-client.test.js.map +1 -0
- package/dist/esm/tests/unit/page-extra-http-headers.test.d.ts +1 -0
- package/dist/esm/tests/unit/page-extra-http-headers.test.js +90 -0
- package/dist/esm/tests/unit/page-extra-http-headers.test.js.map +1 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.js +17 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +13 -1
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/esm/tests/unit/timeout-handlers.test.js +50 -0
- package/dist/esm/tests/unit/timeout-handlers.test.js.map +1 -1
- package/package.json +6 -4
- package/dist/cjs/lib/v3/agent/tools/search.js.map +0 -1
- package/dist/cjs/lib/v3/flowLogger.d.ts +0 -139
- package/dist/cjs/lib/v3/flowLogger.js +0 -881
- package/dist/cjs/lib/v3/flowLogger.js.map +0 -1
- package/dist/cjs/tests/unit/rerender-missing-shadows.test.js +0 -209
- package/dist/cjs/tests/unit/rerender-missing-shadows.test.js.map +0 -1
- package/dist/esm/lib/v3/agent/tools/search.js.map +0 -1
- package/dist/esm/lib/v3/flowLogger.d.ts +0 -139
- package/dist/esm/lib/v3/flowLogger.js +0 -868
- package/dist/esm/lib/v3/flowLogger.js.map +0 -1
- package/dist/esm/tests/unit/rerender-missing-shadows.test.js +0 -207
- package/dist/esm/tests/unit/rerender-missing-shadows.test.js.map +0 -1
- /package/dist/cjs/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
- /package/dist/cjs/tests/{unit/rerender-missing-shadows.test.d.ts → integration/agent-captcha-autosolve.spec.d.ts} +0 -0
- /package/dist/{esm/tests/unit/rerender-missing-shadows.test.d.ts → cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts} +0 -0
- /package/dist/esm/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { AISdkClient } from "../../lib/v3/llm/aisdk.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a mock LanguageModelV2 that records doGenerate calls and returns
|
|
5
|
+
* a valid JSON response so generateObject / generateText succeed.
|
|
6
|
+
*/
|
|
7
|
+
function createCapturingModel(modelId) {
|
|
8
|
+
const calls = [];
|
|
9
|
+
const model = {
|
|
10
|
+
provider: "mock",
|
|
11
|
+
modelId,
|
|
12
|
+
specificationVersion: "v2",
|
|
13
|
+
supportedUrls: {},
|
|
14
|
+
doGenerate: vi.fn(async (options) => {
|
|
15
|
+
calls.push(options);
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: "text", text: '{"value":"ok"}' }],
|
|
18
|
+
finishReason: "stop",
|
|
19
|
+
usage: {
|
|
20
|
+
inputTokens: 1,
|
|
21
|
+
outputTokens: 1,
|
|
22
|
+
totalTokens: 2,
|
|
23
|
+
reasoningTokens: 0,
|
|
24
|
+
cachedInputTokens: 0,
|
|
25
|
+
},
|
|
26
|
+
warnings: [],
|
|
27
|
+
};
|
|
28
|
+
}),
|
|
29
|
+
doStream: vi.fn(),
|
|
30
|
+
};
|
|
31
|
+
return { model, calls };
|
|
32
|
+
}
|
|
33
|
+
async function callWithSchema(client) {
|
|
34
|
+
const { z } = await import("zod");
|
|
35
|
+
await client.createChatCompletion({
|
|
36
|
+
options: {
|
|
37
|
+
messages: [{ role: "user", content: "test" }],
|
|
38
|
+
response_model: {
|
|
39
|
+
name: "Test",
|
|
40
|
+
schema: z.object({ value: z.string() }),
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
logger: () => { },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
describe("AISdkClient reasoning effort resolution", () => {
|
|
47
|
+
it("defaults to 'none' for GPT-5.x sub-models", async () => {
|
|
48
|
+
const { model, calls } = createCapturingModel("gpt-5.1-nano");
|
|
49
|
+
const client = new AISdkClient({ model });
|
|
50
|
+
await callWithSchema(client);
|
|
51
|
+
expect(calls[0].providerOptions).toEqual({
|
|
52
|
+
openai: {
|
|
53
|
+
textVerbosity: "low",
|
|
54
|
+
reasoningEffort: "none",
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it("does not set providerOptions for base gpt-5", async () => {
|
|
59
|
+
const { model, calls } = createCapturingModel("gpt-5");
|
|
60
|
+
const client = new AISdkClient({ model });
|
|
61
|
+
await callWithSchema(client);
|
|
62
|
+
expect(calls[0].providerOptions).toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
it("does not set providerOptions for codex models (gpt-5.x variant)", async () => {
|
|
65
|
+
const { model, calls } = createCapturingModel("codex-gpt-5.1");
|
|
66
|
+
const client = new AISdkClient({ model });
|
|
67
|
+
await callWithSchema(client);
|
|
68
|
+
expect(calls[0].providerOptions).toBeUndefined();
|
|
69
|
+
});
|
|
70
|
+
it("does not set providerOptions for non-GPT-5 models by default", async () => {
|
|
71
|
+
const { model, calls } = createCapturingModel("openai/gpt-4o");
|
|
72
|
+
const client = new AISdkClient({ model });
|
|
73
|
+
await callWithSchema(client);
|
|
74
|
+
expect(calls[0].providerOptions).toBeUndefined();
|
|
75
|
+
});
|
|
76
|
+
it("user override applies to GPT-5.x sub-models", async () => {
|
|
77
|
+
const { model, calls } = createCapturingModel("gpt-5.1-nano");
|
|
78
|
+
const client = new AISdkClient({
|
|
79
|
+
model,
|
|
80
|
+
clientOptions: { reasoningEffort: "medium" },
|
|
81
|
+
});
|
|
82
|
+
await callWithSchema(client);
|
|
83
|
+
expect(calls[0].providerOptions).toEqual({
|
|
84
|
+
openai: {
|
|
85
|
+
textVerbosity: "low",
|
|
86
|
+
reasoningEffort: "medium",
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it("user override applies to non-GPT-5 models", async () => {
|
|
91
|
+
const { model, calls } = createCapturingModel("openai/o4-mini");
|
|
92
|
+
const client = new AISdkClient({
|
|
93
|
+
model,
|
|
94
|
+
clientOptions: { reasoningEffort: "high" },
|
|
95
|
+
});
|
|
96
|
+
await callWithSchema(client);
|
|
97
|
+
expect(calls[0].providerOptions).toEqual({
|
|
98
|
+
openai: {
|
|
99
|
+
reasoningEffort: "high",
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it("user override applies to base gpt-5", async () => {
|
|
104
|
+
const { model, calls } = createCapturingModel("gpt-5");
|
|
105
|
+
const client = new AISdkClient({
|
|
106
|
+
model,
|
|
107
|
+
clientOptions: { reasoningEffort: "low" },
|
|
108
|
+
});
|
|
109
|
+
await callWithSchema(client);
|
|
110
|
+
expect(calls[0].providerOptions).toEqual({
|
|
111
|
+
openai: {
|
|
112
|
+
textVerbosity: "low",
|
|
113
|
+
reasoningEffort: "low",
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=aisdk-reasoning-effort.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aisdk-reasoning-effort.test.js","sourceRoot":"","sources":["../../../../tests/unit/aisdk-reasoning-effort.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n} from \"@ai-sdk/provider\";\nimport { AISdkClient } from \"../../lib/v3/llm/aisdk.js\";\n\n/**\n * Creates a mock LanguageModelV2 that records doGenerate calls and returns\n * a valid JSON response so generateObject / generateText succeed.\n */\nfunction createCapturingModel(modelId: string) {\n const calls: LanguageModelV2CallOptions[] = [];\n\n const model: LanguageModelV2 = {\n provider: \"mock\",\n modelId,\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: vi.fn(async (options: LanguageModelV2CallOptions) => {\n calls.push(options);\n return {\n content: [{ type: \"text\" as const, text: '{\"value\":\"ok\"}' }],\n finishReason: \"stop\" as const,\n usage: {\n inputTokens: 1,\n outputTokens: 1,\n totalTokens: 2,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n },\n warnings: [],\n };\n }),\n doStream: vi.fn(),\n } as unknown as LanguageModelV2;\n\n return { model, calls };\n}\n\nasync function callWithSchema(client: AISdkClient) {\n const { z } = await import(\"zod\");\n await client.createChatCompletion({\n options: {\n messages: [{ role: \"user\", content: \"test\" }],\n response_model: {\n name: \"Test\",\n schema: z.object({ value: z.string() }),\n },\n },\n logger: () => {},\n });\n}\n\ndescribe(\"AISdkClient reasoning effort resolution\", () => {\n it(\"defaults to 'none' for GPT-5.x sub-models\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5.1-nano\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"none\",\n },\n });\n });\n\n it(\"does not set providerOptions for base gpt-5\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"does not set providerOptions for codex models (gpt-5.x variant)\", async () => {\n const { model, calls } = createCapturingModel(\"codex-gpt-5.1\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"does not set providerOptions for non-GPT-5 models by default\", async () => {\n const { model, calls } = createCapturingModel(\"openai/gpt-4o\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"user override applies to GPT-5.x sub-models\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5.1-nano\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"medium\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"medium\",\n },\n });\n });\n\n it(\"user override applies to non-GPT-5 models\", async () => {\n const { model, calls } = createCapturingModel(\"openai/o4-mini\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"high\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n reasoningEffort: \"high\",\n },\n });\n });\n\n it(\"user override applies to base gpt-5\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"low\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"low\",\n },\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { StagehandAPIClient } from "../../lib/v3/api.js";
|
|
3
|
+
describe("StagehandAPIClient variable serialization", () => {
|
|
4
|
+
it("preserves rich variables when sending the act request", async () => {
|
|
5
|
+
const client = new StagehandAPIClient({
|
|
6
|
+
apiKey: "bb-test",
|
|
7
|
+
logger: vi.fn(),
|
|
8
|
+
});
|
|
9
|
+
const executeMock = vi.fn().mockResolvedValue({
|
|
10
|
+
success: true,
|
|
11
|
+
message: "ok",
|
|
12
|
+
actionDescription: "typed",
|
|
13
|
+
actions: [],
|
|
14
|
+
});
|
|
15
|
+
client.execute = executeMock;
|
|
16
|
+
await client.act({
|
|
17
|
+
input: "type %username% into the email field",
|
|
18
|
+
options: {
|
|
19
|
+
variables: {
|
|
20
|
+
username: {
|
|
21
|
+
value: "john@example.com",
|
|
22
|
+
description: "The login email",
|
|
23
|
+
},
|
|
24
|
+
password: "secret",
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
expect(executeMock).toHaveBeenCalledWith({
|
|
29
|
+
method: "act",
|
|
30
|
+
args: {
|
|
31
|
+
input: "type %username% into the email field",
|
|
32
|
+
options: {
|
|
33
|
+
variables: {
|
|
34
|
+
username: {
|
|
35
|
+
value: "john@example.com",
|
|
36
|
+
description: "The login email",
|
|
37
|
+
},
|
|
38
|
+
password: "secret",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
frameId: undefined,
|
|
42
|
+
},
|
|
43
|
+
serverCache: undefined,
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it("preserves rich variables when sending the observe request", async () => {
|
|
47
|
+
const client = new StagehandAPIClient({
|
|
48
|
+
apiKey: "bb-test",
|
|
49
|
+
logger: vi.fn(),
|
|
50
|
+
});
|
|
51
|
+
const executeMock = vi.fn().mockResolvedValue([]);
|
|
52
|
+
client.execute = executeMock;
|
|
53
|
+
await client.observe({
|
|
54
|
+
instruction: "find the field where %username% should be entered",
|
|
55
|
+
options: {
|
|
56
|
+
variables: {
|
|
57
|
+
username: {
|
|
58
|
+
value: "john@example.com",
|
|
59
|
+
description: "The login email",
|
|
60
|
+
},
|
|
61
|
+
password: "secret",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
expect(executeMock).toHaveBeenCalledWith({
|
|
66
|
+
method: "observe",
|
|
67
|
+
args: {
|
|
68
|
+
instruction: "find the field where %username% should be entered",
|
|
69
|
+
options: {
|
|
70
|
+
variables: {
|
|
71
|
+
username: {
|
|
72
|
+
value: "john@example.com",
|
|
73
|
+
description: "The login email",
|
|
74
|
+
},
|
|
75
|
+
password: "secret",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
frameId: undefined,
|
|
79
|
+
},
|
|
80
|
+
serverCache: undefined,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=api-client-observe-variables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client-observe-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/api-client-observe-variables.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,OAAO;YAC1B,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QAGD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,GAAG,CAAC;YACf,KAAK,EAAE,sCAAsC;YAC7C,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE;gBACJ,KAAK,EAAE,sCAAsC;gBAC7C,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAGhD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE;gBACJ,WAAW,EAAE,mDAAmD;gBAChE,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { StagehandAPIClient } from \"../../lib/v3/api.js\";\n\ndescribe(\"StagehandAPIClient variable serialization\", () => {\n it(\"preserves rich variables when sending the act request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue({\n success: true,\n message: \"ok\",\n actionDescription: \"typed\",\n actions: [],\n });\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.act({\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"act\",\n args: {\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n\n it(\"preserves rich variables when sending the observe request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue([]);\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.observe({\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"observe\",\n args: {\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { Api } from "../../lib/v3/types/public/index.js";
|
|
3
|
+
describe("API variable schemas", () => {
|
|
4
|
+
it("accepts rich variables for act requests", () => {
|
|
5
|
+
const result = Api.ActRequestSchema.safeParse({
|
|
6
|
+
input: "type %username% into the email field",
|
|
7
|
+
options: {
|
|
8
|
+
variables: {
|
|
9
|
+
username: {
|
|
10
|
+
value: "john@example.com",
|
|
11
|
+
description: "The login email",
|
|
12
|
+
},
|
|
13
|
+
rememberMe: true,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
expect(result.success).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("accepts rich variables for observe requests", () => {
|
|
20
|
+
const result = Api.ObserveRequestSchema.safeParse({
|
|
21
|
+
instruction: "find the field where %username% should be entered",
|
|
22
|
+
options: {
|
|
23
|
+
variables: {
|
|
24
|
+
username: {
|
|
25
|
+
value: "john@example.com",
|
|
26
|
+
description: "The login email",
|
|
27
|
+
},
|
|
28
|
+
rememberMe: true,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
expect(result.success).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=api-variables-schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-variables-schema.test.js","sourceRoot":"","sources":["../../../../tests/unit/api-variables-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAEzD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAC5C,KAAK,EAAE,sCAAsC;YAC7C,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,UAAU,EAAE,IAAI;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC;YAChD,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,UAAU,EAAE,IAAI;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { Api } from \"../../lib/v3/types/public/index.js\";\n\ndescribe(\"API variable schemas\", () => {\n it(\"accepts rich variables for act requests\", () => {\n const result = Api.ActRequestSchema.safeParse({\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n rememberMe: true,\n },\n },\n });\n\n expect(result.success).toBe(true);\n });\n\n it(\"accepts rich variables for observe requests\", () => {\n const result = Api.ObserveRequestSchema.safeParse({\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n rememberMe: true,\n },\n },\n });\n\n expect(result.success).toBe(true);\n });\n});\n"]}
|
|
@@ -60,6 +60,7 @@ describe("browserbase accessors", () => {
|
|
|
60
60
|
await v3.init();
|
|
61
61
|
expect(v3.browserbaseSessionURL).toBe(MOCK_SESSION_URL);
|
|
62
62
|
expect(v3.browserbaseDebugURL).toBe(MOCK_DEBUG_URL);
|
|
63
|
+
expect(v3.isCaptchaAutoSolveEnabled).toBe(true);
|
|
63
64
|
}
|
|
64
65
|
finally {
|
|
65
66
|
await v3.close().catch(() => { });
|
|
@@ -76,6 +77,25 @@ describe("browserbase accessors", () => {
|
|
|
76
77
|
expect(v3.browserbaseSessionURL).toBeUndefined();
|
|
77
78
|
expect(v3.browserbaseDebugURL).toBeUndefined();
|
|
78
79
|
});
|
|
80
|
+
it("disables captcha solving when solveCaptchas is explicitly false", async () => {
|
|
81
|
+
const v3 = new V3({
|
|
82
|
+
env: "BROWSERBASE",
|
|
83
|
+
disableAPI: true,
|
|
84
|
+
verbose: 0,
|
|
85
|
+
browserbaseSessionCreateParams: {
|
|
86
|
+
browserSettings: {
|
|
87
|
+
solveCaptchas: false,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
try {
|
|
92
|
+
await v3.init();
|
|
93
|
+
expect(v3.isCaptchaAutoSolveEnabled).toBe(false);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
await v3.close().catch(() => { });
|
|
97
|
+
}
|
|
98
|
+
});
|
|
79
99
|
});
|
|
80
100
|
describe("local accessors", () => {
|
|
81
101
|
it("stay empty for LOCAL environments", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserbase-session-accessors.test.js","sourceRoot":"","sources":["../../../../tests/unit/browserbase-session-accessors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,eAAe,GAAG,aAAa,CAAC;AACtC,MAAM,gBAAgB,GAAG,wCAAwC,eAAe,EAAE,CAAC;AACnF,MAAM,cAAc,GAAG,iCAAiC,eAAe,EAAE,CAAC;AAE1E,EAAE,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC9C,MAAM,cAAc;QAClB,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,kBAAkB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;KAC9B;IAED,MAAM,aAAa;QACjB,MAAM,CAAC,KAAK,CAAC,MAAM;YACjB,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAE5B,KAAK;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,KAAK,CAAC,KAAK;YACT,OAAO;QACT,CAAC;KACF;IAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,wBAAwB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3C,EAAE,EAAE,wBAAwB;QAC5B,SAAS,EAAE,eAAe;QAC1B,EAAE,EAAE;YACF,QAAQ,EAAE;gBACR,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;aAC5D;SACF;KACF,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACpC,EAAE,EAAE,gBAAgB;QACpB,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,EAAE;KACxC,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,cAAc,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAC1C,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;YAChB,GAAG,EAAE,aAAa;YAClB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAEhB,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"browserbase-session-accessors.test.js","sourceRoot":"","sources":["../../../../tests/unit/browserbase-session-accessors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,eAAe,GAAG,aAAa,CAAC;AACtC,MAAM,gBAAgB,GAAG,wCAAwC,eAAe,EAAE,CAAC;AACnF,MAAM,cAAc,GAAG,iCAAiC,eAAe,EAAE,CAAC;AAE1E,EAAE,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC9C,MAAM,cAAc;QAClB,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,kBAAkB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;KAC9B;IAED,MAAM,aAAa;QACjB,MAAM,CAAC,KAAK,CAAC,MAAM;YACjB,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAE5B,KAAK;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,KAAK,CAAC,KAAK;YACT,OAAO;QACT,CAAC;KACF;IAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,wBAAwB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3C,EAAE,EAAE,wBAAwB;QAC5B,SAAS,EAAE,eAAe;QAC1B,EAAE,EAAE;YACF,QAAQ,EAAE;gBACR,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;aAC5D;SACF;KACF,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACpC,EAAE,EAAE,gBAAgB;QACpB,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,EAAE;KACxC,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,cAAc,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAC1C,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;YAChB,GAAG,EAAE,aAAa;YAClB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAEhB,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;YAChB,GAAG,EAAE,aAAa;YAClB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QAEjB,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,aAAa,EAAE,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,aAAa,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;YAChB,GAAG,EAAE,aAAa;YAClB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC;YACV,8BAA8B,EAAE;gBAC9B,eAAe,EAAE;oBACf,aAAa,EAAE,KAAK;iBACrB;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;YAChB,GAAG,EAAE,OAAO;YACZ,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC;YACV,yBAAyB,EAAE;gBACzB,MAAM,EAAE,6BAA6B;aACtC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,aAAa,EAAE,CAAC;QACjD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi, beforeEach, afterEach } from \"vitest\";\nimport { V3 } from \"../../lib/v3/v3.js\";\n\nconst MOCK_SESSION_ID = \"session-123\";\nconst MOCK_SESSION_URL = `https://www.browserbase.com/sessions/${MOCK_SESSION_ID}`;\nconst MOCK_DEBUG_URL = `https://debug.browserbase.com/${MOCK_SESSION_ID}`;\n\nvi.mock(\"../../lib/v3/understudy/context\", () => {\n class MockConnection {\n onTransportClosed = vi.fn();\n offTransportClosed = vi.fn();\n send = vi.fn(async () => {});\n }\n\n class MockV3Context {\n static async create(): Promise<MockV3Context> {\n return new MockV3Context();\n }\n\n conn = new MockConnection();\n\n pages(): never[] {\n return [];\n }\n\n async close(): Promise<void> {\n // noop\n }\n }\n\n return { V3Context: MockV3Context };\n});\n\nvi.mock(\"../../lib/v3/launch/browserbase\", () => ({\n createBrowserbaseSession: vi.fn(async () => ({\n ws: \"wss://mock-browserbase\",\n sessionId: MOCK_SESSION_ID,\n bb: {\n sessions: {\n debug: vi.fn(async () => ({ debuggerUrl: MOCK_DEBUG_URL })),\n },\n },\n })),\n}));\n\nvi.mock(\"../../lib/v3/launch/local\", () => ({\n launchLocalChrome: vi.fn(async () => ({\n ws: \"ws://local-cdp\",\n chrome: { kill: vi.fn(async () => {}) },\n })),\n}));\n\ndescribe(\"browserbase accessors\", () => {\n beforeEach(() => {\n process.env.BROWSERBASE_API_KEY = \"fake-key\";\n process.env.BROWSERBASE_PROJECT_ID = \"fake-project\";\n });\n\n afterEach(() => {\n delete process.env.BROWSERBASE_API_KEY;\n delete process.env.BROWSERBASE_PROJECT_ID;\n vi.clearAllMocks();\n });\n\n it(\"exposes Browserbase session and debug URLs after init\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n });\n\n try {\n await v3.init();\n\n expect(v3.browserbaseSessionURL).toBe(MOCK_SESSION_URL);\n expect(v3.browserbaseDebugURL).toBe(MOCK_DEBUG_URL);\n expect(v3.isCaptchaAutoSolveEnabled).toBe(true);\n } finally {\n await v3.close().catch(() => {});\n }\n });\n\n it(\"clears stored URLs after close\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n });\n\n await v3.init();\n await v3.close();\n\n expect(v3.browserbaseSessionURL).toBeUndefined();\n expect(v3.browserbaseDebugURL).toBeUndefined();\n });\n\n it(\"disables captcha solving when solveCaptchas is explicitly false\", async () => {\n const v3 = new V3({\n env: \"BROWSERBASE\",\n disableAPI: true,\n verbose: 0,\n browserbaseSessionCreateParams: {\n browserSettings: {\n solveCaptchas: false,\n },\n },\n });\n\n try {\n await v3.init();\n expect(v3.isCaptchaAutoSolveEnabled).toBe(false);\n } finally {\n await v3.close().catch(() => {});\n }\n });\n});\n\ndescribe(\"local accessors\", () => {\n it(\"stay empty for LOCAL environments\", async () => {\n const v3 = new V3({\n env: \"LOCAL\",\n disableAPI: true,\n verbose: 0,\n localBrowserLaunchOptions: {\n cdpUrl: \"ws://local-existing-session\",\n },\n });\n\n try {\n await v3.init();\n expect(v3.browserbaseSessionURL).toBeUndefined();\n expect(v3.browserbaseDebugURL).toBeUndefined();\n } finally {\n await v3.close().catch(() => {});\n }\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { CaptchaSolver } from "../../lib/v3/agent/utils/captchaSolver.js";
|
|
3
|
+
const SOLVING_STARTED = "browserbase-solving-started";
|
|
4
|
+
const SOLVING_FINISHED = "browserbase-solving-finished";
|
|
5
|
+
const SOLVING_ERRORED = "browserbase-solving-errored";
|
|
6
|
+
class MockPage {
|
|
7
|
+
listeners = new Set();
|
|
8
|
+
onCalls = 0;
|
|
9
|
+
offCalls = 0;
|
|
10
|
+
on(event, listener) {
|
|
11
|
+
if (event !== "console")
|
|
12
|
+
return;
|
|
13
|
+
this.onCalls++;
|
|
14
|
+
this.listeners.add(listener);
|
|
15
|
+
}
|
|
16
|
+
off(event, listener) {
|
|
17
|
+
if (event !== "console")
|
|
18
|
+
return;
|
|
19
|
+
this.offCalls++;
|
|
20
|
+
this.listeners.delete(listener);
|
|
21
|
+
}
|
|
22
|
+
emitConsole(text) {
|
|
23
|
+
const message = { text: () => text };
|
|
24
|
+
for (const listener of this.listeners) {
|
|
25
|
+
listener(message);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
listenerCount() {
|
|
29
|
+
return this.listeners.size;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
describe("CaptchaSolver", () => {
|
|
33
|
+
it("resolves all concurrent waiters when a solve finishes", async () => {
|
|
34
|
+
const page = new MockPage();
|
|
35
|
+
const solver = new CaptchaSolver();
|
|
36
|
+
solver.init(async () => page);
|
|
37
|
+
await solver.ensureAttached();
|
|
38
|
+
page.emitConsole(SOLVING_STARTED);
|
|
39
|
+
const firstWait = solver.waitIfSolving();
|
|
40
|
+
const secondWait = solver.waitIfSolving();
|
|
41
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
42
|
+
const sharedWaitPromise = solver.waitPromise;
|
|
43
|
+
expect(sharedWaitPromise).not.toBeNull();
|
|
44
|
+
expect(solver.waitPromise).toBe(sharedWaitPromise);
|
|
45
|
+
let firstResolved = false;
|
|
46
|
+
let secondResolved = false;
|
|
47
|
+
void firstWait.then(() => {
|
|
48
|
+
firstResolved = true;
|
|
49
|
+
});
|
|
50
|
+
void secondWait.then(() => {
|
|
51
|
+
secondResolved = true;
|
|
52
|
+
});
|
|
53
|
+
await Promise.resolve();
|
|
54
|
+
expect(firstResolved).toBe(false);
|
|
55
|
+
expect(secondResolved).toBe(false);
|
|
56
|
+
page.emitConsole(SOLVING_FINISHED);
|
|
57
|
+
await Promise.all([firstWait, secondWait]);
|
|
58
|
+
expect(firstResolved).toBe(true);
|
|
59
|
+
expect(secondResolved).toBe(true);
|
|
60
|
+
expect(solver.consumeSolveResult()).toEqual({
|
|
61
|
+
solved: true,
|
|
62
|
+
errored: false,
|
|
63
|
+
});
|
|
64
|
+
expect(solver.consumeSolveResult()).toEqual({
|
|
65
|
+
solved: false,
|
|
66
|
+
errored: false,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it("re-attaches to a new page and settles stale waiters when the active page changes", async () => {
|
|
70
|
+
const firstPage = new MockPage();
|
|
71
|
+
const secondPage = new MockPage();
|
|
72
|
+
let activePage = firstPage;
|
|
73
|
+
const solver = new CaptchaSolver();
|
|
74
|
+
solver.init(async () => activePage);
|
|
75
|
+
await solver.ensureAttached();
|
|
76
|
+
firstPage.emitConsole(SOLVING_STARTED);
|
|
77
|
+
const pendingWait = solver.waitIfSolving();
|
|
78
|
+
let settled = false;
|
|
79
|
+
void pendingWait.then(() => {
|
|
80
|
+
settled = true;
|
|
81
|
+
});
|
|
82
|
+
activePage = secondPage;
|
|
83
|
+
await solver.waitIfSolving();
|
|
84
|
+
await pendingWait;
|
|
85
|
+
expect(settled).toBe(true);
|
|
86
|
+
expect(firstPage.offCalls).toBe(1);
|
|
87
|
+
expect(firstPage.listenerCount()).toBe(0);
|
|
88
|
+
expect(secondPage.onCalls).toBe(1);
|
|
89
|
+
expect(secondPage.listenerCount()).toBe(1);
|
|
90
|
+
expect(solver.isSolving()).toBe(false);
|
|
91
|
+
});
|
|
92
|
+
it("surfaces solver errors exactly once per consume", async () => {
|
|
93
|
+
const page = new MockPage();
|
|
94
|
+
const solver = new CaptchaSolver();
|
|
95
|
+
solver.init(async () => page);
|
|
96
|
+
await solver.ensureAttached();
|
|
97
|
+
page.emitConsole(SOLVING_STARTED);
|
|
98
|
+
const wait = solver.waitIfSolving();
|
|
99
|
+
page.emitConsole(SOLVING_ERRORED);
|
|
100
|
+
await wait;
|
|
101
|
+
expect(solver.consumeSolveResult()).toEqual({
|
|
102
|
+
solved: false,
|
|
103
|
+
errored: true,
|
|
104
|
+
});
|
|
105
|
+
expect(solver.consumeSolveResult()).toEqual({
|
|
106
|
+
solved: false,
|
|
107
|
+
errored: false,
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it("disposes cleanly while a solve is in progress", async () => {
|
|
111
|
+
const page = new MockPage();
|
|
112
|
+
const solver = new CaptchaSolver();
|
|
113
|
+
solver.init(async () => page);
|
|
114
|
+
await solver.ensureAttached();
|
|
115
|
+
page.emitConsole(SOLVING_STARTED);
|
|
116
|
+
const wait = solver.waitIfSolving();
|
|
117
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
118
|
+
let settled = false;
|
|
119
|
+
void wait.then(() => {
|
|
120
|
+
settled = true;
|
|
121
|
+
});
|
|
122
|
+
solver.dispose();
|
|
123
|
+
await wait;
|
|
124
|
+
expect(settled).toBe(true);
|
|
125
|
+
expect(solver.isSolving()).toBe(false);
|
|
126
|
+
expect(page.listenerCount()).toBe(0);
|
|
127
|
+
expect(solver.consumeSolveResult()).toEqual({
|
|
128
|
+
solved: false,
|
|
129
|
+
errored: false,
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
it("marks errored when detached mid-solve due to page change", async () => {
|
|
133
|
+
const firstPage = new MockPage();
|
|
134
|
+
const secondPage = new MockPage();
|
|
135
|
+
let activePage = firstPage;
|
|
136
|
+
const solver = new CaptchaSolver();
|
|
137
|
+
solver.init(async () => activePage);
|
|
138
|
+
await solver.ensureAttached();
|
|
139
|
+
firstPage.emitConsole(SOLVING_STARTED);
|
|
140
|
+
const wait = solver.waitIfSolving();
|
|
141
|
+
// Switch to a new page while the solve is in progress
|
|
142
|
+
activePage = secondPage;
|
|
143
|
+
await solver.waitIfSolving();
|
|
144
|
+
await wait;
|
|
145
|
+
// The interrupted solve should be reported as errored
|
|
146
|
+
expect(solver.consumeSolveResult()).toEqual({
|
|
147
|
+
solved: false,
|
|
148
|
+
errored: true,
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=captcha-solver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captcha-solver.test.js","sourceRoot":"","sources":["../../../../tests/unit/captcha-solver.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { CaptchaSolver } from \"../../lib/v3/agent/utils/captchaSolver.js\";\n\nconst SOLVING_STARTED = \"browserbase-solving-started\";\nconst SOLVING_FINISHED = \"browserbase-solving-finished\";\nconst SOLVING_ERRORED = \"browserbase-solving-errored\";\n\ntype ConsoleListener = (message: { text: () => string }) => void;\n\nclass MockPage {\n private listeners = new Set<ConsoleListener>();\n public onCalls = 0;\n public offCalls = 0;\n\n on(event: string, listener: ConsoleListener): void {\n if (event !== \"console\") return;\n this.onCalls++;\n this.listeners.add(listener);\n }\n\n off(event: string, listener: ConsoleListener): void {\n if (event !== \"console\") return;\n this.offCalls++;\n this.listeners.delete(listener);\n }\n\n emitConsole(text: string): void {\n const message = { text: () => text };\n for (const listener of this.listeners) {\n listener(message);\n }\n }\n\n listenerCount(): number {\n return this.listeners.size;\n }\n}\n\ndescribe(\"CaptchaSolver\", () => {\n it(\"resolves all concurrent waiters when a solve finishes\", async () => {\n const page = new MockPage();\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n await solver.ensureAttached();\n page.emitConsole(SOLVING_STARTED);\n\n const firstWait = solver.waitIfSolving();\n const secondWait = solver.waitIfSolving();\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n const sharedWaitPromise = (\n solver as unknown as { waitPromise: Promise<void> | null }\n ).waitPromise;\n\n expect(sharedWaitPromise).not.toBeNull();\n expect(\n (solver as unknown as { waitPromise: Promise<void> | null }).waitPromise,\n ).toBe(sharedWaitPromise);\n\n let firstResolved = false;\n let secondResolved = false;\n void firstWait.then(() => {\n firstResolved = true;\n });\n void secondWait.then(() => {\n secondResolved = true;\n });\n\n await Promise.resolve();\n expect(firstResolved).toBe(false);\n expect(secondResolved).toBe(false);\n\n page.emitConsole(SOLVING_FINISHED);\n await Promise.all([firstWait, secondWait]);\n\n expect(firstResolved).toBe(true);\n expect(secondResolved).toBe(true);\n expect(solver.consumeSolveResult()).toEqual({\n solved: true,\n errored: false,\n });\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: false,\n });\n });\n\n it(\"re-attaches to a new page and settles stale waiters when the active page changes\", async () => {\n const firstPage = new MockPage();\n const secondPage = new MockPage();\n let activePage = firstPage;\n\n const solver = new CaptchaSolver();\n solver.init(async () => activePage as never);\n\n await solver.ensureAttached();\n firstPage.emitConsole(SOLVING_STARTED);\n\n const pendingWait = solver.waitIfSolving();\n let settled = false;\n void pendingWait.then(() => {\n settled = true;\n });\n\n activePage = secondPage;\n await solver.waitIfSolving();\n await pendingWait;\n\n expect(settled).toBe(true);\n expect(firstPage.offCalls).toBe(1);\n expect(firstPage.listenerCount()).toBe(0);\n expect(secondPage.onCalls).toBe(1);\n expect(secondPage.listenerCount()).toBe(1);\n expect(solver.isSolving()).toBe(false);\n });\n\n it(\"surfaces solver errors exactly once per consume\", async () => {\n const page = new MockPage();\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n await solver.ensureAttached();\n page.emitConsole(SOLVING_STARTED);\n\n const wait = solver.waitIfSolving();\n page.emitConsole(SOLVING_ERRORED);\n await wait;\n\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: true,\n });\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: false,\n });\n });\n\n it(\"disposes cleanly while a solve is in progress\", async () => {\n const page = new MockPage();\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n await solver.ensureAttached();\n page.emitConsole(SOLVING_STARTED);\n\n const wait = solver.waitIfSolving();\n await new Promise((resolve) => setTimeout(resolve, 0));\n let settled = false;\n void wait.then(() => {\n settled = true;\n });\n\n solver.dispose();\n await wait;\n\n expect(settled).toBe(true);\n expect(solver.isSolving()).toBe(false);\n expect(page.listenerCount()).toBe(0);\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: false,\n });\n });\n\n it(\"marks errored when detached mid-solve due to page change\", async () => {\n const firstPage = new MockPage();\n const secondPage = new MockPage();\n let activePage = firstPage;\n\n const solver = new CaptchaSolver();\n solver.init(async () => activePage as never);\n\n await solver.ensureAttached();\n firstPage.emitConsole(SOLVING_STARTED);\n\n const wait = solver.waitIfSolving();\n\n // Switch to a new page while the solve is in progress\n activePage = secondPage;\n await solver.waitIfSolving();\n await wait;\n\n // The interrupted solve should be reported as errored\n expect(solver.consumeSolveResult()).toEqual({\n solved: false,\n errored: true,\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { describe, it, expect } from "vitest";
|
|
3
|
+
import { CdpConnection } from "../../lib/v3/understudy/cdp.js";
|
|
4
|
+
import { InMemoryEventSink } from "../../lib/v3/flowlogger/EventSink.js";
|
|
5
|
+
import { EventEmitterWithWildcardSupport } from "../../lib/v3/flowlogger/EventEmitter.js";
|
|
6
|
+
import { EventStore } from "../../lib/v3/flowlogger/EventStore.js";
|
|
7
|
+
import { FlowEvent, FlowLogger } from "../../lib/v3/flowlogger/FlowLogger.js";
|
|
8
|
+
function attachEventStoreToBus(store, bus) {
|
|
9
|
+
const onFlowEvent = (event) => {
|
|
10
|
+
if (event instanceof FlowEvent) {
|
|
11
|
+
void store.emit(event);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
bus.on("*", onFlowEvent);
|
|
15
|
+
return () => {
|
|
16
|
+
bus.off("*", onFlowEvent);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
class FakeSocket extends EventEmitter {
|
|
20
|
+
sentPayloads = [];
|
|
21
|
+
readyState = 1;
|
|
22
|
+
send(payload) {
|
|
23
|
+
this.sentPayloads.push(payload);
|
|
24
|
+
}
|
|
25
|
+
close() {
|
|
26
|
+
this.readyState = 3;
|
|
27
|
+
this.emit("close", 1000, "");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function createConnection(socket) {
|
|
31
|
+
// The production constructor is private; tests instantiate it directly so
|
|
32
|
+
// they can drive raw websocket messages without a real browser.
|
|
33
|
+
const ConnectionCtor = CdpConnection;
|
|
34
|
+
return new ConnectionCtor(socket);
|
|
35
|
+
}
|
|
36
|
+
function requireEvent(events, predicate, description) {
|
|
37
|
+
const match = events.find(predicate);
|
|
38
|
+
expect(match, `missing ${description}`).toBeDefined();
|
|
39
|
+
return match;
|
|
40
|
+
}
|
|
41
|
+
describe("flow logger cdp context", () => {
|
|
42
|
+
it("preserves the active parent chain when a session event handler issues a nested CDP call", async () => {
|
|
43
|
+
const sessionId = "session-test";
|
|
44
|
+
const socket = new FakeSocket();
|
|
45
|
+
const eventBus = new EventEmitterWithWildcardSupport();
|
|
46
|
+
const sink = new InMemoryEventSink();
|
|
47
|
+
const eventStore = new EventStore(sessionId, undefined, sink);
|
|
48
|
+
const detachBus = attachEventStoreToBus(eventStore, eventBus);
|
|
49
|
+
const conn = createConnection(socket);
|
|
50
|
+
conn.flowLoggerContext = FlowLogger.init(sessionId, eventBus);
|
|
51
|
+
// Seed the target/session mapping the same way a real attach flow would
|
|
52
|
+
// before any session-scoped messages are dispatched.
|
|
53
|
+
conn.onMessage(JSON.stringify({
|
|
54
|
+
method: "Target.attachedToTarget",
|
|
55
|
+
params: {
|
|
56
|
+
sessionId: "target-session",
|
|
57
|
+
targetInfo: { targetId: "target-1" },
|
|
58
|
+
},
|
|
59
|
+
}));
|
|
60
|
+
const session = conn.getSession("target-session");
|
|
61
|
+
expect(session).toBeDefined();
|
|
62
|
+
session.on("Runtime.consoleAPICalled", () => {
|
|
63
|
+
// This nested send used to lose its parent chain because the callback ran
|
|
64
|
+
// after the original ALS scope had already unwound.
|
|
65
|
+
void session.send("Runtime.evaluate", {
|
|
66
|
+
expression: "2 + 2",
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
await FlowLogger.runWithLogging({
|
|
70
|
+
context: conn.flowLoggerContext,
|
|
71
|
+
eventType: "SyntheticParentEvent",
|
|
72
|
+
}, async () => {
|
|
73
|
+
void session.send("Page.navigate", {
|
|
74
|
+
url: "https://example.com",
|
|
75
|
+
});
|
|
76
|
+
}, []);
|
|
77
|
+
conn.onMessage(JSON.stringify({
|
|
78
|
+
method: "Runtime.consoleAPICalled",
|
|
79
|
+
sessionId: "target-session",
|
|
80
|
+
params: { type: "log" },
|
|
81
|
+
}));
|
|
82
|
+
// The nested Runtime.evaluate call should still attach under the synthetic
|
|
83
|
+
// parent event even though it was triggered by a later session callback.
|
|
84
|
+
const events = await eventStore.query({});
|
|
85
|
+
const parentEvent = requireEvent(events, (event) => event.eventType === "SyntheticParentEvent", "SyntheticParentEvent");
|
|
86
|
+
const nestedCallEvent = requireEvent(events, (event) => event.eventType === "CdpCallEvent" &&
|
|
87
|
+
String(event.data.method) === "Runtime.evaluate", "nested Runtime.evaluate CdpCallEvent");
|
|
88
|
+
expect(nestedCallEvent.eventParentIds).toEqual([parentEvent.eventId]);
|
|
89
|
+
detachBus();
|
|
90
|
+
await eventStore.destroy();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=flowlogger-capturing-cdp.test.js.map
|