@browserbasehq/orca 3.1.0-patch.0 → 3.1.0-patch.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/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 +2 -2
- package/dist/esm/lib/v3/api.d.ts +16 -1
- package/dist/esm/lib/v3/api.js +41 -5
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +22 -20
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +5 -2
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +8 -0
- package/dist/esm/lib/v3/types/public/api.js +5 -3
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/index.d.ts +1 -0
- package/dist/esm/lib/v3/types/public/index.js.map +1 -1
- package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js +12 -6
- package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/esm/tests/api-multiregion.test.js +73 -0
- package/dist/esm/tests/api-multiregion.test.js.map +7 -0
- package/dist/esm/tests/public-api/public-error-types.test.js +2 -1
- package/dist/esm/tests/public-api/public-error-types.test.js.map +2 -2
- package/dist/esm/tests/understudy-command-exception.test.js +55 -0
- package/dist/esm/tests/understudy-command-exception.test.js.map +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parent-side helper for spawning the shutdown supervisor process.
|
|
3
|
+
*
|
|
4
|
+
* The supervisor runs out-of-process and watches a lifeline pipe. If the parent
|
|
5
|
+
* dies, the supervisor performs best-effort cleanup (Chrome kill or Browserbase
|
|
6
|
+
* session release) when keepAlive is false.
|
|
7
|
+
*/
|
|
8
|
+
import type { ShutdownSupervisorConfig, ShutdownSupervisorHandle } from "../types/private/shutdown.js";
|
|
9
|
+
/**
|
|
10
|
+
* Start a supervisor process for crash cleanup. Returns a handle that can
|
|
11
|
+
* stop the supervisor during a normal shutdown.
|
|
12
|
+
*/
|
|
13
|
+
export declare function startShutdownSupervisor(config: ShutdownSupervisorConfig, opts?: {
|
|
14
|
+
onError?: (error: Error, context: string) => void;
|
|
15
|
+
}): ShutdownSupervisorHandle | null;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_v3_config = require("./v3.config.js");
|
|
4
|
+
var import_sdkErrors = require("../types/public/sdkErrors.js");
|
|
5
|
+
import_test.test.describe("Stagehand agent abort signal", () => {
|
|
6
|
+
let v3;
|
|
7
|
+
import_test.test.beforeEach(async () => {
|
|
8
|
+
v3 = new import_v3.V3({
|
|
9
|
+
...import_v3_config.v3TestConfig,
|
|
10
|
+
experimental: true
|
|
11
|
+
});
|
|
12
|
+
await v3.init();
|
|
13
|
+
});
|
|
14
|
+
import_test.test.afterEach(async () => {
|
|
15
|
+
await v3?.close?.().catch(() => {
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
(0, import_test.test)("non-streaming: abort signal stops execution and throws AgentAbortError", async () => {
|
|
19
|
+
import_test.test.setTimeout(6e4);
|
|
20
|
+
const agent = v3.agent({
|
|
21
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
22
|
+
});
|
|
23
|
+
const page = v3.context.pages()[0];
|
|
24
|
+
await page.goto("https://example.com");
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
setTimeout(() => controller.abort(), 500);
|
|
27
|
+
await (0, import_test.expect)(
|
|
28
|
+
agent.execute({
|
|
29
|
+
instruction: "Describe every visual element on this page in extreme detail. Describe at least 100 different elements.",
|
|
30
|
+
maxSteps: 50,
|
|
31
|
+
signal: controller.signal
|
|
32
|
+
})
|
|
33
|
+
).rejects.toThrow(import_sdkErrors.AgentAbortError);
|
|
34
|
+
});
|
|
35
|
+
(0, import_test.test)("streaming: abort signal stops stream and rejects result with AgentAbortError", async () => {
|
|
36
|
+
import_test.test.setTimeout(6e4);
|
|
37
|
+
const agent = v3.agent({
|
|
38
|
+
stream: true,
|
|
39
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
40
|
+
});
|
|
41
|
+
const page = v3.context.pages()[0];
|
|
42
|
+
await page.goto("https://example.com");
|
|
43
|
+
const controller = new AbortController();
|
|
44
|
+
setTimeout(() => controller.abort(), 500);
|
|
45
|
+
const streamResult = await agent.execute({
|
|
46
|
+
instruction: "Describe every visual element on this page in extreme detail. Describe at least 100 different elements.",
|
|
47
|
+
maxSteps: 50,
|
|
48
|
+
signal: controller.signal
|
|
49
|
+
});
|
|
50
|
+
const consumeStream = async () => {
|
|
51
|
+
for await (const _ of streamResult.textStream) {
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const [, resultError] = await Promise.allSettled([
|
|
55
|
+
consumeStream(),
|
|
56
|
+
streamResult.result
|
|
57
|
+
]);
|
|
58
|
+
(0, import_test.expect)(resultError.status).toBe("rejected");
|
|
59
|
+
(0, import_test.expect)(resultError.reason).toBeInstanceOf(
|
|
60
|
+
import_sdkErrors.AgentAbortError
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
(0, import_test.test)("non-streaming: already aborted signal throws AgentAbortError immediately", async () => {
|
|
64
|
+
import_test.test.setTimeout(2e4);
|
|
65
|
+
const agent = v3.agent({
|
|
66
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
67
|
+
});
|
|
68
|
+
const page = v3.context.pages()[0];
|
|
69
|
+
await page.goto("https://example.com");
|
|
70
|
+
const controller = new AbortController();
|
|
71
|
+
controller.abort();
|
|
72
|
+
await (0, import_test.expect)(
|
|
73
|
+
agent.execute({
|
|
74
|
+
instruction: "This should not run.",
|
|
75
|
+
maxSteps: 3,
|
|
76
|
+
signal: controller.signal
|
|
77
|
+
})
|
|
78
|
+
).rejects.toThrow(import_sdkErrors.AgentAbortError);
|
|
79
|
+
});
|
|
80
|
+
(0, import_test.test)("non-streaming: execution completes normally without abort signal", async () => {
|
|
81
|
+
import_test.test.setTimeout(6e4);
|
|
82
|
+
const agent = v3.agent({
|
|
83
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
84
|
+
});
|
|
85
|
+
const page = v3.context.pages()[0];
|
|
86
|
+
await page.goto("https://example.com");
|
|
87
|
+
const result = await agent.execute({
|
|
88
|
+
instruction: "Describe this page briefly.",
|
|
89
|
+
maxSteps: 3
|
|
90
|
+
});
|
|
91
|
+
(0, import_test.expect)(result.success).toBe(true);
|
|
92
|
+
(0, import_test.expect)(result.completed).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
(0, import_test.test)("streaming: execution completes normally without abort signal", async () => {
|
|
95
|
+
import_test.test.setTimeout(6e4);
|
|
96
|
+
const agent = v3.agent({
|
|
97
|
+
stream: true,
|
|
98
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
99
|
+
});
|
|
100
|
+
const page = v3.context.pages()[0];
|
|
101
|
+
await page.goto("https://example.com");
|
|
102
|
+
const streamResult = await agent.execute({
|
|
103
|
+
instruction: "Describe this page briefly.",
|
|
104
|
+
maxSteps: 3
|
|
105
|
+
});
|
|
106
|
+
for await (const _ of streamResult.textStream) {
|
|
107
|
+
}
|
|
108
|
+
const result = await streamResult.result;
|
|
109
|
+
(0, import_test.expect)(result.success).toBe(true);
|
|
110
|
+
(0, import_test.expect)(result.completed).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=agent-abort-signal.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/agent-abort-signal.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\nimport { AgentAbortError } from \"../types/public/sdkErrors.js\";\n\ntest.describe(\"Stagehand agent abort signal\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3({\n ...v3TestConfig,\n experimental: true,\n });\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test(\"non-streaming: abort signal stops execution and throws AgentAbortError\", async () => {\n test.setTimeout(60000);\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n const controller = new AbortController();\n\n // Abort after 500ms - should be enough for the LLM to start but not finish\n setTimeout(() => controller.abort(), 500);\n\n await expect(\n agent.execute({\n instruction:\n \"Describe every visual element on this page in extreme detail. Describe at least 100 different elements.\",\n maxSteps: 50,\n signal: controller.signal,\n }),\n ).rejects.toThrow(AgentAbortError);\n });\n\n test(\"streaming: abort signal stops stream and rejects result with AgentAbortError\", async () => {\n test.setTimeout(60000);\n\n const agent = v3.agent({\n stream: true,\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n const controller = new AbortController();\n\n // Abort after 500ms\n setTimeout(() => controller.abort(), 500);\n\n const streamResult = await agent.execute({\n instruction:\n \"Describe every visual element on this page in extreme detail. Describe at least 100 different elements.\",\n maxSteps: 50,\n signal: controller.signal,\n });\n\n // Handle both stream consumption and result promise together\n // The result promise will reject with AgentAbortError when aborted\n const consumeStream = async () => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _ of streamResult.textStream) {\n // Just consume chunks until stream ends\n }\n };\n\n // Both should complete - stream ends and result rejects\n const [, resultError] = await Promise.allSettled([\n consumeStream(),\n streamResult.result,\n ]);\n\n // The result should have rejected with AgentAbortError\n expect(resultError.status).toBe(\"rejected\");\n expect((resultError as PromiseRejectedResult).reason).toBeInstanceOf(\n AgentAbortError,\n );\n });\n\n test(\"non-streaming: already aborted signal throws AgentAbortError immediately\", async () => {\n test.setTimeout(20000);\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n // Create an already aborted controller\n const controller = new AbortController();\n controller.abort();\n\n await expect(\n agent.execute({\n instruction: \"This should not run.\",\n maxSteps: 3,\n signal: controller.signal,\n }),\n ).rejects.toThrow(AgentAbortError);\n });\n\n test(\"non-streaming: execution completes normally without abort signal\", async () => {\n test.setTimeout(60000);\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n // No signal provided - should complete normally\n const result = await agent.execute({\n instruction: \"Describe this page briefly.\",\n maxSteps: 3,\n });\n\n expect(result.success).toBe(true);\n expect(result.completed).toBe(true);\n });\n\n test(\"streaming: execution completes normally without abort signal\", async () => {\n test.setTimeout(60000);\n\n const agent = v3.agent({\n stream: true,\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n // No signal provided - should complete normally\n const streamResult = await agent.execute({\n instruction: \"Describe this page briefly.\",\n maxSteps: 3,\n });\n\n // Consume the stream first\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _ of streamResult.textStream) {\n // Just consume\n }\n\n // Now get the final result\n const result = await streamResult.result;\n\n expect(result.success).toBe(true);\n expect(result.completed).toBe(true);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __copyProps = (to, from, except, desc) => {
|
|
8
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
9
|
+
for (let key of __getOwnPropNames(from))
|
|
10
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
11
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
12
|
+
}
|
|
13
|
+
return to;
|
|
14
|
+
};
|
|
15
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
16
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
17
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
18
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
19
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
+
mod
|
|
22
|
+
));
|
|
23
|
+
var import_test = require("@playwright/test");
|
|
24
|
+
var import_promises = __toESM(require("fs/promises"), 1);
|
|
25
|
+
var import_path = __toESM(require("path"), 1);
|
|
26
|
+
var import_v3 = require("../v3.js");
|
|
27
|
+
var import_v3_config = require("./v3.config.js");
|
|
28
|
+
import_test.test.describe("Agent cache self-heal (e2e)", () => {
|
|
29
|
+
let v3;
|
|
30
|
+
let cacheDir;
|
|
31
|
+
import_test.test.beforeEach(async ({}, testInfo) => {
|
|
32
|
+
await import_promises.default.mkdir(testInfo.outputDir, { recursive: true });
|
|
33
|
+
cacheDir = await import_promises.default.mkdtemp(import_path.default.join(testInfo.outputDir, "agent-cache-"));
|
|
34
|
+
v3 = new import_v3.V3({
|
|
35
|
+
...import_v3_config.v3TestConfig,
|
|
36
|
+
cacheDir,
|
|
37
|
+
selfHeal: true
|
|
38
|
+
});
|
|
39
|
+
await v3.init();
|
|
40
|
+
});
|
|
41
|
+
import_test.test.afterEach(async () => {
|
|
42
|
+
await v3?.close?.().catch(() => {
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
(0, import_test.test)("replays heal corrupted selectors", async () => {
|
|
46
|
+
import_test.test.setTimeout(12e4);
|
|
47
|
+
const agent = v3.agent({
|
|
48
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
49
|
+
});
|
|
50
|
+
const page = v3.context.pages()[0];
|
|
51
|
+
const url = "https://browserbase.github.io/stagehand-eval-sites/sites/shadow-dom/";
|
|
52
|
+
const instruction = "click the button";
|
|
53
|
+
await page.goto(url, { waitUntil: "networkidle" });
|
|
54
|
+
const firstResult = await agent.execute({ instruction, maxSteps: 20 });
|
|
55
|
+
(0, import_test.expect)(firstResult.success).toBe(true);
|
|
56
|
+
const cachePath = await locateAgentCacheFile(cacheDir);
|
|
57
|
+
const originalEntry = await readCacheEntry(cachePath);
|
|
58
|
+
const originalActionStep = findFirstActionStep(originalEntry);
|
|
59
|
+
(0, import_test.expect)(originalActionStep).toBeDefined();
|
|
60
|
+
const originalSelector = originalActionStep?.actions?.[0]?.selector;
|
|
61
|
+
(0, import_test.expect)(typeof originalSelector).toBe("string");
|
|
62
|
+
if (originalActionStep?.actions?.[0]) {
|
|
63
|
+
originalActionStep.actions[0].selector = "xpath=/yeee";
|
|
64
|
+
}
|
|
65
|
+
await import_promises.default.writeFile(
|
|
66
|
+
cachePath,
|
|
67
|
+
JSON.stringify(originalEntry, null, 2),
|
|
68
|
+
"utf8"
|
|
69
|
+
);
|
|
70
|
+
await page.goto(url, { waitUntil: "networkidle" });
|
|
71
|
+
const replayResult = await agent.execute({ instruction, maxSteps: 20 });
|
|
72
|
+
(0, import_test.expect)(replayResult.success).toBe(true);
|
|
73
|
+
const healedEntry = await readCacheEntry(cachePath);
|
|
74
|
+
const healedActionStep = findFirstActionStep(healedEntry);
|
|
75
|
+
(0, import_test.expect)(healedActionStep?.actions?.[0]?.selector).toBe(originalSelector);
|
|
76
|
+
(0, import_test.expect)(healedActionStep?.actions?.[0]?.selector).not.toBe("xpath=/yeee");
|
|
77
|
+
(0, import_test.expect)(healedEntry.timestamp).not.toBe(originalEntry.timestamp);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
async function locateAgentCacheFile(cacheDir) {
|
|
81
|
+
const deadline = Date.now() + 1e4;
|
|
82
|
+
while (Date.now() < deadline) {
|
|
83
|
+
const entries = await import_promises.default.readdir(cacheDir);
|
|
84
|
+
const agentFiles = entries.filter((file) => file.startsWith("agent-"));
|
|
85
|
+
if (agentFiles.length > 0) {
|
|
86
|
+
return import_path.default.join(cacheDir, agentFiles[0]);
|
|
87
|
+
}
|
|
88
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
89
|
+
}
|
|
90
|
+
throw new Error("Timed out waiting for agent cache entry to be written");
|
|
91
|
+
}
|
|
92
|
+
async function readCacheEntry(cachePath) {
|
|
93
|
+
const raw = await import_promises.default.readFile(cachePath, "utf8");
|
|
94
|
+
return JSON.parse(raw);
|
|
95
|
+
}
|
|
96
|
+
function findFirstActionStep(entry) {
|
|
97
|
+
return entry.steps.find((step) => {
|
|
98
|
+
const actions = step.actions;
|
|
99
|
+
return Array.isArray(actions) && actions.length > 0;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=agent-cache-self-heal.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/agent-cache-self-heal.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\nimport type {\n AgentReplayActStep,\n AgentReplayFillFormStep,\n CachedAgentEntry,\n} from \"../types/private/cache.js\";\n\ntest.describe(\"Agent cache self-heal (e2e)\", () => {\n let v3: V3;\n let cacheDir: string;\n\n // eslint-disable-next-line no-empty-pattern\n test.beforeEach(async ({}, testInfo) => {\n await fs.mkdir(testInfo.outputDir, { recursive: true });\n cacheDir = await fs.mkdtemp(path.join(testInfo.outputDir, \"agent-cache-\"));\n v3 = new V3({\n ...v3TestConfig,\n cacheDir,\n selfHeal: true,\n });\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test(\"replays heal corrupted selectors\", async () => {\n test.setTimeout(120_000);\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n const page = v3.context.pages()[0];\n const url =\n \"https://browserbase.github.io/stagehand-eval-sites/sites/shadow-dom/\";\n const instruction = \"click the button\";\n\n await page.goto(url, { waitUntil: \"networkidle\" });\n const firstResult = await agent.execute({ instruction, maxSteps: 20 });\n expect(firstResult.success).toBe(true);\n\n const cachePath = await locateAgentCacheFile(cacheDir);\n const originalEntry = await readCacheEntry(cachePath);\n const originalActionStep = findFirstActionStep(originalEntry);\n expect(originalActionStep).toBeDefined();\n const originalSelector = originalActionStep?.actions?.[0]?.selector;\n expect(typeof originalSelector).toBe(\"string\");\n\n // Corrupt the cached selector so the replay needs to self-heal.\n if (originalActionStep?.actions?.[0]) {\n originalActionStep.actions[0].selector = \"xpath=/yeee\";\n }\n await fs.writeFile(\n cachePath,\n JSON.stringify(originalEntry, null, 2),\n \"utf8\",\n );\n\n // Second run should replay from cache, self-heal, and update the file.\n await page.goto(url, { waitUntil: \"networkidle\" });\n const replayResult = await agent.execute({ instruction, maxSteps: 20 });\n expect(replayResult.success).toBe(true);\n\n const healedEntry = await readCacheEntry(cachePath);\n const healedActionStep = findFirstActionStep(healedEntry);\n expect(healedActionStep?.actions?.[0]?.selector).toBe(originalSelector);\n expect(healedActionStep?.actions?.[0]?.selector).not.toBe(\"xpath=/yeee\");\n expect(healedEntry.timestamp).not.toBe(originalEntry.timestamp);\n });\n});\n\nasync function locateAgentCacheFile(cacheDir: string): Promise<string> {\n const deadline = Date.now() + 10_000;\n while (Date.now() < deadline) {\n const entries = await fs.readdir(cacheDir);\n const agentFiles = entries.filter((file) => file.startsWith(\"agent-\"));\n if (agentFiles.length > 0) {\n return path.join(cacheDir, agentFiles[0]!);\n }\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n throw new Error(\"Timed out waiting for agent cache entry to be written\");\n}\n\nasync function readCacheEntry(cachePath: string): Promise<CachedAgentEntry> {\n const raw = await fs.readFile(cachePath, \"utf8\");\n return JSON.parse(raw) as CachedAgentEntry;\n}\n\ntype StepWithActions = AgentReplayActStep | AgentReplayFillFormStep;\n\nfunction findFirstActionStep(\n entry: CachedAgentEntry,\n): StepWithActions | undefined {\n return entry.steps.find((step) => {\n const actions = (step as StepWithActions).actions;\n return Array.isArray(actions) && actions.length > 0;\n }) as StepWithActions | undefined;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs", "path"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_v3_config = require("./v3.config.js");
|
|
4
|
+
var import_sdkErrors = require("../types/public/sdkErrors.js");
|
|
5
|
+
import_test.test.describe("Stagehand agent callbacks behavior", () => {
|
|
6
|
+
let v3;
|
|
7
|
+
import_test.test.beforeEach(async () => {
|
|
8
|
+
v3 = new import_v3.V3({
|
|
9
|
+
...import_v3_config.v3TestConfig,
|
|
10
|
+
experimental: true
|
|
11
|
+
// Required for callbacks and streaming
|
|
12
|
+
});
|
|
13
|
+
await v3.init();
|
|
14
|
+
});
|
|
15
|
+
import_test.test.afterEach(async () => {
|
|
16
|
+
await v3?.close?.().catch(() => {
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
import_test.test.describe("Non-streaming callbacks (stream: false)", () => {
|
|
20
|
+
(0, import_test.test)("onStepFinish callback is called for each step", async () => {
|
|
21
|
+
import_test.test.setTimeout(6e4);
|
|
22
|
+
const stepFinishEvents = [];
|
|
23
|
+
const agent = v3.agent({
|
|
24
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
25
|
+
});
|
|
26
|
+
const page = v3.context.pages()[0];
|
|
27
|
+
await page.goto("https://example.com");
|
|
28
|
+
await agent.execute({
|
|
29
|
+
instruction: "What is the title of this page? Mark the task as complete after answering.",
|
|
30
|
+
maxSteps: 5,
|
|
31
|
+
callbacks: {
|
|
32
|
+
onStepFinish: async (event) => {
|
|
33
|
+
stepFinishEvents.push(event);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
(0, import_test.expect)(stepFinishEvents.length).toBeGreaterThan(0);
|
|
38
|
+
for (const event of stepFinishEvents) {
|
|
39
|
+
(0, import_test.expect)(event).toHaveProperty("finishReason");
|
|
40
|
+
(0, import_test.expect)(event).toHaveProperty("text");
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
(0, import_test.test)("prepareStep callback is called before each step", async () => {
|
|
44
|
+
import_test.test.setTimeout(6e4);
|
|
45
|
+
let prepareStepCallCount = 0;
|
|
46
|
+
const agent = v3.agent({
|
|
47
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
48
|
+
});
|
|
49
|
+
const page = v3.context.pages()[0];
|
|
50
|
+
await page.goto("https://example.com");
|
|
51
|
+
await agent.execute({
|
|
52
|
+
instruction: "Simply describe the page briefly.",
|
|
53
|
+
maxSteps: 3,
|
|
54
|
+
callbacks: {
|
|
55
|
+
prepareStep: async (stepContext) => {
|
|
56
|
+
prepareStepCallCount++;
|
|
57
|
+
return stepContext;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
(0, import_test.expect)(prepareStepCallCount).toBeGreaterThan(0);
|
|
62
|
+
});
|
|
63
|
+
(0, import_test.test)("callbacks receive tool call information", async () => {
|
|
64
|
+
import_test.test.setTimeout(6e4);
|
|
65
|
+
const toolCalls = [];
|
|
66
|
+
const agent = v3.agent({
|
|
67
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
68
|
+
});
|
|
69
|
+
const page = v3.context.pages()[0];
|
|
70
|
+
await page.goto("https://example.com");
|
|
71
|
+
await agent.execute({
|
|
72
|
+
instruction: "Take a screenshot and describe what you see briefly. Then mark the task as complete.",
|
|
73
|
+
maxSteps: 3,
|
|
74
|
+
callbacks: {
|
|
75
|
+
onStepFinish: async (event) => {
|
|
76
|
+
if (event.toolCalls) {
|
|
77
|
+
for (const tc of event.toolCalls) {
|
|
78
|
+
toolCalls.push({
|
|
79
|
+
toolName: tc.toolName,
|
|
80
|
+
input: tc.input
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
(0, import_test.expect)(toolCalls.length).toBeGreaterThan(0);
|
|
88
|
+
(0, import_test.expect)(
|
|
89
|
+
toolCalls.some(
|
|
90
|
+
(tc) => tc.toolName === "screenshot" || tc.toolName === "ariaTree"
|
|
91
|
+
)
|
|
92
|
+
).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
import_test.test.describe("Streaming callbacks (stream: true)", () => {
|
|
96
|
+
(0, import_test.test)("onStepFinish callback is called for each step in stream mode", async () => {
|
|
97
|
+
import_test.test.setTimeout(6e4);
|
|
98
|
+
const stepFinishEvents = [];
|
|
99
|
+
const agent = v3.agent({
|
|
100
|
+
stream: true,
|
|
101
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
102
|
+
});
|
|
103
|
+
const page = v3.context.pages()[0];
|
|
104
|
+
await page.goto("https://example.com");
|
|
105
|
+
const streamResult = await agent.execute({
|
|
106
|
+
instruction: "What is this page? Describe it briefly.",
|
|
107
|
+
maxSteps: 5,
|
|
108
|
+
callbacks: {
|
|
109
|
+
onStepFinish: async (event) => {
|
|
110
|
+
stepFinishEvents.push(event);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
for await (const _ of streamResult.textStream) {
|
|
115
|
+
}
|
|
116
|
+
await streamResult.result;
|
|
117
|
+
(0, import_test.expect)(stepFinishEvents.length).toBeGreaterThan(0);
|
|
118
|
+
});
|
|
119
|
+
(0, import_test.test)("onChunk callback is called for each chunk", async () => {
|
|
120
|
+
import_test.test.setTimeout(6e4);
|
|
121
|
+
let chunkCount = 0;
|
|
122
|
+
const agent = v3.agent({
|
|
123
|
+
stream: true,
|
|
124
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
125
|
+
});
|
|
126
|
+
const page = v3.context.pages()[0];
|
|
127
|
+
await page.goto("https://example.com");
|
|
128
|
+
const streamResult = await agent.execute({
|
|
129
|
+
instruction: "Say hello briefly and describe the page.",
|
|
130
|
+
maxSteps: 3,
|
|
131
|
+
callbacks: {
|
|
132
|
+
onChunk: async () => {
|
|
133
|
+
chunkCount++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
for await (const _ of streamResult.textStream) {
|
|
138
|
+
}
|
|
139
|
+
await streamResult.result;
|
|
140
|
+
(0, import_test.expect)(chunkCount).toBeGreaterThan(0);
|
|
141
|
+
});
|
|
142
|
+
(0, import_test.test)("onFinish callback is called when stream completes", async () => {
|
|
143
|
+
import_test.test.setTimeout(6e4);
|
|
144
|
+
let finishCalled = false;
|
|
145
|
+
let finishEvent = null;
|
|
146
|
+
const agent = v3.agent({
|
|
147
|
+
stream: true,
|
|
148
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
149
|
+
});
|
|
150
|
+
const page = v3.context.pages()[0];
|
|
151
|
+
await page.goto("https://example.com");
|
|
152
|
+
const streamResult = await agent.execute({
|
|
153
|
+
instruction: "Simply describe the page briefly.",
|
|
154
|
+
maxSteps: 3,
|
|
155
|
+
callbacks: {
|
|
156
|
+
onFinish: (event) => {
|
|
157
|
+
finishCalled = true;
|
|
158
|
+
finishEvent = event;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
for await (const _ of streamResult.textStream) {
|
|
163
|
+
}
|
|
164
|
+
await streamResult.result;
|
|
165
|
+
(0, import_test.expect)(finishCalled).toBe(true);
|
|
166
|
+
(0, import_test.expect)(finishEvent).not.toBeNull();
|
|
167
|
+
});
|
|
168
|
+
(0, import_test.test)("prepareStep callback works in stream mode", async () => {
|
|
169
|
+
import_test.test.setTimeout(6e4);
|
|
170
|
+
let prepareStepCallCount = 0;
|
|
171
|
+
const agent = v3.agent({
|
|
172
|
+
stream: true,
|
|
173
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
174
|
+
});
|
|
175
|
+
const page = v3.context.pages()[0];
|
|
176
|
+
await page.goto("https://example.com");
|
|
177
|
+
const streamResult = await agent.execute({
|
|
178
|
+
instruction: "Simply describe the page briefly.",
|
|
179
|
+
maxSteps: 3,
|
|
180
|
+
callbacks: {
|
|
181
|
+
prepareStep: async (stepContext) => {
|
|
182
|
+
prepareStepCallCount++;
|
|
183
|
+
return stepContext;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
for await (const _ of streamResult.textStream) {
|
|
188
|
+
}
|
|
189
|
+
await streamResult.result;
|
|
190
|
+
(0, import_test.expect)(prepareStepCallCount).toBeGreaterThan(0);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
import_test.test.describe("Streaming-only callbacks runtime validation", () => {
|
|
194
|
+
(0, import_test.test)("throws StreamingCallbacksInNonStreamingModeError when onChunk is used", async () => {
|
|
195
|
+
const agent = v3.agent({
|
|
196
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
197
|
+
});
|
|
198
|
+
const page = v3.context.pages()[0];
|
|
199
|
+
await page.goto("https://example.com");
|
|
200
|
+
try {
|
|
201
|
+
await agent.execute({
|
|
202
|
+
instruction: "test",
|
|
203
|
+
callbacks: {
|
|
204
|
+
onChunk: () => {
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
throw new Error("Expected error to be thrown");
|
|
209
|
+
} catch (error) {
|
|
210
|
+
(0, import_test.expect)(error).toBeInstanceOf(import_sdkErrors.StreamingCallbacksInNonStreamingModeError);
|
|
211
|
+
(0, import_test.expect)(
|
|
212
|
+
error.invalidCallbacks
|
|
213
|
+
).toEqual(["onChunk"]);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
(0, import_test.test)("throws StreamingCallbacksInNonStreamingModeError when onFinish is used", async () => {
|
|
217
|
+
const agent = v3.agent({
|
|
218
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
219
|
+
});
|
|
220
|
+
const page = v3.context.pages()[0];
|
|
221
|
+
await page.goto("https://example.com");
|
|
222
|
+
try {
|
|
223
|
+
await agent.execute({
|
|
224
|
+
instruction: "test",
|
|
225
|
+
callbacks: {
|
|
226
|
+
onFinish: () => {
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
throw new Error("Expected error to be thrown");
|
|
231
|
+
} catch (error) {
|
|
232
|
+
(0, import_test.expect)(error).toBeInstanceOf(import_sdkErrors.StreamingCallbacksInNonStreamingModeError);
|
|
233
|
+
(0, import_test.expect)(
|
|
234
|
+
error.invalidCallbacks
|
|
235
|
+
).toEqual(["onFinish"]);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
(0, import_test.test)("throws StreamingCallbacksInNonStreamingModeError when onError is used", async () => {
|
|
239
|
+
const agent = v3.agent({
|
|
240
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
241
|
+
});
|
|
242
|
+
const page = v3.context.pages()[0];
|
|
243
|
+
await page.goto("https://example.com");
|
|
244
|
+
try {
|
|
245
|
+
await agent.execute({
|
|
246
|
+
instruction: "test",
|
|
247
|
+
callbacks: {
|
|
248
|
+
onError: () => {
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
throw new Error("Expected error to be thrown");
|
|
253
|
+
} catch (error) {
|
|
254
|
+
(0, import_test.expect)(error).toBeInstanceOf(import_sdkErrors.StreamingCallbacksInNonStreamingModeError);
|
|
255
|
+
(0, import_test.expect)(
|
|
256
|
+
error.invalidCallbacks
|
|
257
|
+
).toEqual(["onError"]);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
(0, import_test.test)("throws StreamingCallbacksInNonStreamingModeError when onAbort is used", async () => {
|
|
261
|
+
const agent = v3.agent({
|
|
262
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
263
|
+
});
|
|
264
|
+
const page = v3.context.pages()[0];
|
|
265
|
+
await page.goto("https://example.com");
|
|
266
|
+
try {
|
|
267
|
+
await agent.execute({
|
|
268
|
+
instruction: "test",
|
|
269
|
+
callbacks: {
|
|
270
|
+
onAbort: () => {
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
throw new Error("Expected error to be thrown");
|
|
275
|
+
} catch (error) {
|
|
276
|
+
(0, import_test.expect)(error).toBeInstanceOf(import_sdkErrors.StreamingCallbacksInNonStreamingModeError);
|
|
277
|
+
(0, import_test.expect)(
|
|
278
|
+
error.invalidCallbacks
|
|
279
|
+
).toEqual(["onAbort"]);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
(0, import_test.test)("error includes all invalid callbacks when multiple are used", async () => {
|
|
283
|
+
const agent = v3.agent({
|
|
284
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
285
|
+
});
|
|
286
|
+
const page = v3.context.pages()[0];
|
|
287
|
+
await page.goto("https://example.com");
|
|
288
|
+
try {
|
|
289
|
+
await agent.execute({
|
|
290
|
+
instruction: "test",
|
|
291
|
+
callbacks: {
|
|
292
|
+
onChunk: () => {
|
|
293
|
+
},
|
|
294
|
+
onFinish: () => {
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
throw new Error("Expected error to be thrown");
|
|
299
|
+
} catch (error) {
|
|
300
|
+
(0, import_test.expect)(error).toBeInstanceOf(import_sdkErrors.StreamingCallbacksInNonStreamingModeError);
|
|
301
|
+
(0, import_test.expect)(
|
|
302
|
+
error.invalidCallbacks
|
|
303
|
+
).toEqual(["onChunk", "onFinish"]);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
import_test.test.describe("Combined callbacks", () => {
|
|
308
|
+
(0, import_test.test)("multiple callbacks can be used together", async () => {
|
|
309
|
+
import_test.test.setTimeout(6e4);
|
|
310
|
+
let prepareStepCount = 0;
|
|
311
|
+
let stepFinishCount = 0;
|
|
312
|
+
const agent = v3.agent({
|
|
313
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
314
|
+
});
|
|
315
|
+
const page = v3.context.pages()[0];
|
|
316
|
+
await page.goto("https://example.com");
|
|
317
|
+
await agent.execute({
|
|
318
|
+
instruction: "Simply describe the page briefly.",
|
|
319
|
+
maxSteps: 3,
|
|
320
|
+
callbacks: {
|
|
321
|
+
prepareStep: async (stepContext) => {
|
|
322
|
+
prepareStepCount++;
|
|
323
|
+
return stepContext;
|
|
324
|
+
},
|
|
325
|
+
onStepFinish: async () => {
|
|
326
|
+
stepFinishCount++;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
(0, import_test.expect)(prepareStepCount).toBeGreaterThan(0);
|
|
331
|
+
(0, import_test.expect)(stepFinishCount).toBeGreaterThan(0);
|
|
332
|
+
});
|
|
333
|
+
(0, import_test.test)("streaming with multiple callbacks", async () => {
|
|
334
|
+
import_test.test.setTimeout(6e4);
|
|
335
|
+
let prepareStepCount = 0;
|
|
336
|
+
let stepFinishCount = 0;
|
|
337
|
+
let chunkCount = 0;
|
|
338
|
+
let finishCalled = false;
|
|
339
|
+
const agent = v3.agent({
|
|
340
|
+
stream: true,
|
|
341
|
+
model: "anthropic/claude-haiku-4-5-20251001"
|
|
342
|
+
});
|
|
343
|
+
const page = v3.context.pages()[0];
|
|
344
|
+
await page.goto("https://example.com");
|
|
345
|
+
const streamResult = await agent.execute({
|
|
346
|
+
instruction: "Say hello briefly and describe the page.",
|
|
347
|
+
maxSteps: 3,
|
|
348
|
+
callbacks: {
|
|
349
|
+
prepareStep: async (stepContext) => {
|
|
350
|
+
prepareStepCount++;
|
|
351
|
+
return stepContext;
|
|
352
|
+
},
|
|
353
|
+
onStepFinish: async () => {
|
|
354
|
+
stepFinishCount++;
|
|
355
|
+
},
|
|
356
|
+
onChunk: async () => {
|
|
357
|
+
chunkCount++;
|
|
358
|
+
},
|
|
359
|
+
onFinish: () => {
|
|
360
|
+
finishCalled = true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
for await (const _ of streamResult.textStream) {
|
|
365
|
+
}
|
|
366
|
+
await streamResult.result;
|
|
367
|
+
(0, import_test.expect)(prepareStepCount).toBeGreaterThan(0);
|
|
368
|
+
(0, import_test.expect)(stepFinishCount).toBeGreaterThan(0);
|
|
369
|
+
(0, import_test.expect)(chunkCount).toBeGreaterThan(0);
|
|
370
|
+
(0, import_test.expect)(finishCalled).toBe(true);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
//# sourceMappingURL=agent-callbacks.spec.js.map
|