@browserbasehq/orca 3.1.0-patch.4 → 3.2.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/lib/inference.js +1 -4
- package/dist/cjs/lib/inference.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/tools/act.d.ts +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.js +20 -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 +60 -22
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
- 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/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 +16 -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 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.js +60 -37
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/tools/index.js +5 -5
- package/dist/cjs/lib/v3/agent/tools/index.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/handleDoneToolCall.js +4 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.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/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/observeHandler.js +1 -2
- package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +11 -16
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.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.js +0 -5
- package/dist/cjs/lib/v3/llm/LLMProvider.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/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 +12 -1
- 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 +3 -0
- package/dist/cjs/lib/v3/types/public/api.js +1 -0
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +4 -2
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +1 -0
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +5 -1
- package/dist/cjs/lib/v3/understudy/cdp.js +54 -7
- 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 +142 -60
- 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 +56 -3
- 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.js +38 -24
- package/dist/cjs/lib/v3/v3.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/context-addInitScript.spec.js +104 -11
- package/dist/cjs/tests/integration/context-addInitScript.spec.js.map +1 -1
- 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/timeouts.spec.js +168 -0
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- 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/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/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/esm/lib/inference.js +1 -4
- package/dist/esm/lib/inference.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/tools/act.d.ts +1 -1
- package/dist/esm/lib/v3/agent/tools/act.js +20 -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 +60 -22
- package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
- 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/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 +16 -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 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js +60 -37
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +5 -0
- package/dist/esm/lib/v3/agent/tools/index.js +5 -5
- package/dist/esm/lib/v3/agent/tools/index.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/handleDoneToolCall.js +4 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.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/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/observeHandler.js +1 -2
- package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +11 -16
- package/dist/esm/lib/v3/handlers/v3AgentHandler.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.js +0 -5
- package/dist/esm/lib/v3/llm/LLMProvider.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/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 +12 -1
- 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 +3 -0
- package/dist/esm/lib/v3/types/public/api.js +1 -0
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +4 -2
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +1 -0
- package/dist/esm/lib/v3/understudy/cdp.d.ts +5 -1
- package/dist/esm/lib/v3/understudy/cdp.js +55 -8
- 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 +142 -60
- 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 +58 -5
- 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.js +38 -24
- package/dist/esm/lib/v3/v3.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/context-addInitScript.spec.js +104 -11
- package/dist/esm/tests/integration/context-addInitScript.spec.js.map +1 -1
- 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/timeouts.spec.js +168 -0
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- 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/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/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/package.json +4 -2
|
@@ -13,4 +13,3 @@ export declare function disableAnimations(frames: Frame[]): Promise<ScreenshotCl
|
|
|
13
13
|
export declare function hideCaret(frames: Frame[]): Promise<ScreenshotCleanup>;
|
|
14
14
|
export declare function applyMaskOverlays(locators: Locator[], color: string): Promise<ScreenshotCleanup>;
|
|
15
15
|
export declare function runScreenshotCleanups(cleanups: ScreenshotCleanup[]): Promise<void>;
|
|
16
|
-
export declare function withScreenshotTimeout<T>(timeoutMs: number | undefined, task: () => Promise<T>): Promise<T>;
|
|
@@ -331,21 +331,4 @@ export async function runScreenshotCleanups(cleanups) {
|
|
|
331
331
|
}
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
|
-
export async function withScreenshotTimeout(timeoutMs, task) {
|
|
335
|
-
if (!timeoutMs || timeoutMs <= 0)
|
|
336
|
-
return task();
|
|
337
|
-
let timer = null;
|
|
338
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
339
|
-
timer = setTimeout(() => {
|
|
340
|
-
reject(new Error(`screenshot: timeout of ${timeoutMs}ms exceeded`));
|
|
341
|
-
}, timeoutMs);
|
|
342
|
-
});
|
|
343
|
-
try {
|
|
344
|
-
return await Promise.race([task(), timeoutPromise]);
|
|
345
|
-
}
|
|
346
|
-
finally {
|
|
347
|
-
if (timer)
|
|
348
|
-
clearTimeout(timer);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
334
|
//# sourceMappingURL=screenshotUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshotUtils.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/screenshotUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport type { Frame } from \"./frame.js\";\nimport type { Locator } from \"./locator.js\";\nimport type { Page } from \"./page.js\";\nimport type {\n ScreenshotClip,\n ScreenshotScaleOption,\n} from \"../types/public/screenshotTypes.js\";\nimport { StagehandInvalidArgumentError } from \"../types/public/sdkErrors.js\";\nimport { screenshotScriptSources } from \"../dom/build/screenshotScripts.generated.js\";\n\nexport type ScreenshotCleanup = () => Promise<void> | void;\n\nexport function collectFramesForScreenshot(page: Page): Frame[] {\n const seen = new Map<string, Frame>();\n const main = page.mainFrame();\n seen.set(main.frameId, main);\n for (const frame of page.frames()) {\n seen.set(frame.frameId, frame);\n }\n return Array.from(seen.values());\n}\n\nexport function normalizeScreenshotClip(clip: ScreenshotClip): ScreenshotClip {\n const x = Number(clip.x);\n const y = Number(clip.y);\n const width = Number(clip.width);\n const height = Number(clip.height);\n\n for (const [key, value] of Object.entries({ x, y, width, height })) {\n if (!Number.isFinite(value)) {\n throw new StagehandInvalidArgumentError(\n `screenshot: clip.${key} must be a finite number`,\n );\n }\n }\n\n if (width <= 0 || height <= 0) {\n throw new StagehandInvalidArgumentError(\n \"screenshot: clip width/height must be positive\",\n );\n }\n\n return { x, y, width, height };\n}\n\nexport async function computeScreenshotScale(\n page: Page,\n mode: ScreenshotScaleOption,\n): Promise<number | undefined> {\n if (mode !== \"css\") return undefined;\n try {\n const frame = page.mainFrame();\n const dpr = await frame\n .evaluate(() => {\n const ratio = Number(window.devicePixelRatio || 1);\n return Number.isFinite(ratio) && ratio > 0 ? ratio : 1;\n })\n .catch(() => 1);\n const safeRatio = Number.isFinite(dpr) && dpr > 0 ? dpr : 1;\n return Math.min(2, Math.max(0.1, 1 / safeRatio));\n } catch {\n return 1;\n }\n}\n\nexport async function setTransparentBackground(\n session: CDPSessionLike,\n): Promise<ScreenshotCleanup> {\n await session\n .send(\"Emulation.setDefaultBackgroundColorOverride\", {\n color: { r: 0, g: 0, b: 0, a: 0 },\n })\n .catch(() => {});\n\n return async () => {\n await session\n .send(\"Emulation.setDefaultBackgroundColorOverride\", {})\n .catch(() => {});\n };\n}\n\nexport async function applyStyleToFrames(\n frames: Frame[],\n css: string,\n label: string,\n): Promise<ScreenshotCleanup> {\n const trimmed = css.trim();\n if (!trimmed) return async () => {};\n const token = `__v3_style_${label}_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2)}`;\n\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate(\n ({ css, token }) => {\n try {\n const doc = document;\n if (!doc) return;\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-stagehand-style\", token);\n style.textContent = css;\n const parent = doc.head || doc.documentElement || doc.body;\n parent?.appendChild(style);\n } catch {\n // ignore\n }\n },\n { css: trimmed, token },\n )\n .catch(() => {}),\n ),\n );\n\n return async () => {\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate((token) => {\n try {\n const doc = document;\n if (!doc) return;\n const nodes = doc.querySelectorAll(\n `[data-stagehand-style=\"${token}\"]`,\n );\n nodes.forEach((node) => node.remove());\n } catch {\n // ignore\n }\n }, token)\n .catch(() => {}),\n ),\n );\n };\n}\n\nexport async function disableAnimations(\n frames: Frame[],\n): Promise<ScreenshotCleanup> {\n const css = `\n*,\n*::before,\n*::after {\n animation-delay: 0s !important;\n animation-duration: 0s !important;\n animation-iteration-count: 1 !important;\n animation-play-state: paused !important;\n transition-property: none !important;\n transition-duration: 0s !important;\n transition-delay: 0s !important;\n}`;\n\n const cleanup = await applyStyleToFrames(frames, css, \"animations\");\n\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate(() => {\n try {\n const animations =\n typeof document.getAnimations === \"function\"\n ? document.getAnimations()\n : [];\n for (const animation of animations) {\n try {\n const details = animation.effect?.getComputedTiming?.();\n if (details && details.iterations !== Infinity) {\n animation.finish?.();\n } else {\n animation.cancel?.();\n }\n } catch {\n animation.cancel?.();\n }\n }\n } catch {\n // ignore\n }\n })\n .catch(() => {}),\n ),\n );\n\n return cleanup;\n}\n\nexport async function hideCaret(frames: Frame[]): Promise<ScreenshotCleanup> {\n const css = `\ninput,\ntextarea,\n[contenteditable],\n[contenteditable=\"\"],\n[contenteditable=\"true\"],\n[contenteditable=\"plaintext-only\"],\n*:focus {\n caret-color: transparent !important;\n}`;\n\n return applyStyleToFrames(frames, css, \"caret\");\n}\n\nexport async function applyMaskOverlays(\n locators: Locator[],\n color: string,\n): Promise<ScreenshotCleanup> {\n type MaskRectSpec = ScreenshotClip & { rootToken?: string | null };\n const rectsByFrame = new Map<\n Frame,\n { rects: MaskRectSpec[]; rootTokens: Set<string> }\n >();\n\n const token = `__v3_mask_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n for (const locator of locators) {\n try {\n const info = await resolveMaskRects(locator, token);\n if (!info) continue;\n const entry = rectsByFrame.get(info.frame) ?? {\n rects: [],\n rootTokens: new Set<string>(),\n };\n entry.rects.push(...info.rects);\n for (const rect of info.rects) {\n if (rect.rootToken) entry.rootTokens.add(rect.rootToken);\n }\n rectsByFrame.set(info.frame, entry);\n } catch {\n // ignore individual locator failures\n }\n }\n\n if (rectsByFrame.size === 0) {\n return async () => {};\n }\n\n await Promise.all(\n Array.from(rectsByFrame.entries()).map(([frame, { rects }]) =>\n frame\n .evaluate(\n ({ rects, color, token }) => {\n try {\n const doc = document;\n if (!doc) return;\n for (const rect of rects) {\n const defaultRoot = doc.documentElement || doc.body;\n if (!defaultRoot) return;\n const root = rect.rootToken\n ? doc.querySelector(\n `[data-stagehand-mask-root=\"${rect.rootToken}\"]`,\n ) || defaultRoot\n : defaultRoot;\n if (!root) continue;\n if (rect.rootToken) {\n try {\n const style = window.getComputedStyle(root as Element);\n if (style && style.position === \"static\") {\n const rootEl = root as HTMLElement;\n if (\n !rootEl.hasAttribute(\"data-stagehand-mask-root-pos\")\n ) {\n rootEl.setAttribute(\n \"data-stagehand-mask-root-pos\",\n rootEl.style.position || \"\",\n );\n }\n rootEl.style.position = \"relative\";\n }\n } catch {\n // ignore\n }\n }\n const el = doc.createElement(\"div\");\n el.setAttribute(\"data-stagehand-mask\", token);\n el.style.position = \"absolute\";\n el.style.left = `${rect.x}px`;\n el.style.top = `${rect.y}px`;\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n el.style.backgroundColor = color;\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"2147483647\";\n el.style.opacity = \"1\";\n el.style.mixBlendMode = \"normal\";\n (root as Element).appendChild(el);\n }\n } catch {\n // ignore\n }\n },\n { rects, color, token },\n )\n .catch(() => {}),\n ),\n );\n\n return async () => {\n await Promise.all(\n Array.from(rectsByFrame.entries()).map(([frame, { rootTokens }]) =>\n frame\n .evaluate(\n ({ token, rootTokens }) => {\n try {\n const doc = document;\n if (!doc) return;\n const nodes = doc.querySelectorAll(\n `[data-stagehand-mask=\"${token}\"]`,\n );\n nodes.forEach((node) => node.remove());\n for (const rootToken of rootTokens) {\n const root = doc.querySelector(\n `[data-stagehand-mask-root=\"${rootToken}\"]`,\n ) as HTMLElement | null;\n if (!root) continue;\n const prev = root.getAttribute(\n \"data-stagehand-mask-root-pos\",\n );\n if (prev !== null) {\n root.style.position = prev;\n root.removeAttribute(\"data-stagehand-mask-root-pos\");\n }\n root.removeAttribute(\"data-stagehand-mask-root\");\n }\n } catch {\n // ignore\n }\n },\n { token, rootTokens: Array.from(rootTokens) },\n )\n .catch(() => {}),\n ),\n );\n };\n}\n\nasync function resolveMaskRects(\n locator: Locator,\n maskToken: string,\n): Promise<{\n frame: Frame;\n rects: Array<ScreenshotClip & { rootToken?: string | null }>;\n} | null> {\n const frame = locator.getFrame();\n const session = frame.session;\n try {\n const resolved: Array<{\n objectId: Protocol.Runtime.RemoteObjectId;\n nodeId: Protocol.DOM.NodeId | null;\n }> = await locator.resolveNodesForMask();\n const rects: Array<ScreenshotClip & { rootToken?: string | null }> = [];\n\n for (const { objectId } of resolved) {\n try {\n const rect = await resolveMaskRectForObject(\n session,\n objectId,\n maskToken,\n );\n if (rect) rects.push(rect);\n } catch {\n // ignore individual element failures\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n if (!rects.length) return null;\n\n return { frame, rects };\n } catch {\n return null;\n }\n}\n\nasync function resolveMaskRectForObject(\n session: CDPSessionLike,\n objectId: Protocol.Runtime.RemoteObjectId,\n maskToken: string,\n): Promise<(ScreenshotClip & { rootToken?: string | null }) | null> {\n const result = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: screenshotScriptSources.resolveMaskRect,\n arguments: [{ value: maskToken }],\n returnByValue: true,\n },\n );\n\n if (result.exceptionDetails) {\n return null;\n }\n\n const rect = result.result.value as\n | (ScreenshotClip & { rootToken?: string | null })\n | null;\n if (!rect) return null;\n\n const { x, y, width, height } = rect;\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return null;\n }\n\n return {\n x,\n y,\n width,\n height,\n rootToken:\n rect.rootToken && typeof rect.rootToken === \"string\"\n ? rect.rootToken\n : undefined,\n };\n}\n\nexport async function runScreenshotCleanups(\n cleanups: ScreenshotCleanup[],\n): Promise<void> {\n for (let i = cleanups.length - 1; i >= 0; i -= 1) {\n const fn = cleanups[i];\n if (!fn) continue;\n try {\n const result = fn();\n if (result && typeof (result as Promise<void>).then === \"function\") {\n await result;\n }\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\nexport async function withScreenshotTimeout<T>(\n timeoutMs: number | undefined,\n task: () => Promise<T>,\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) return task();\n\n let timer: NodeJS.Timeout | null = null;\n const timeoutPromise = new Promise<T>((_, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`screenshot: timeout of ${timeoutMs}ms exceeded`));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([task(), timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"screenshotUtils.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/screenshotUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport type { Frame } from \"./frame.js\";\nimport type { Locator } from \"./locator.js\";\nimport type { Page } from \"./page.js\";\nimport type {\n ScreenshotClip,\n ScreenshotScaleOption,\n} from \"../types/public/screenshotTypes.js\";\nimport { StagehandInvalidArgumentError } from \"../types/public/sdkErrors.js\";\nimport { screenshotScriptSources } from \"../dom/build/screenshotScripts.generated.js\";\n\nexport type ScreenshotCleanup = () => Promise<void> | void;\n\nexport function collectFramesForScreenshot(page: Page): Frame[] {\n const seen = new Map<string, Frame>();\n const main = page.mainFrame();\n seen.set(main.frameId, main);\n for (const frame of page.frames()) {\n seen.set(frame.frameId, frame);\n }\n return Array.from(seen.values());\n}\n\nexport function normalizeScreenshotClip(clip: ScreenshotClip): ScreenshotClip {\n const x = Number(clip.x);\n const y = Number(clip.y);\n const width = Number(clip.width);\n const height = Number(clip.height);\n\n for (const [key, value] of Object.entries({ x, y, width, height })) {\n if (!Number.isFinite(value)) {\n throw new StagehandInvalidArgumentError(\n `screenshot: clip.${key} must be a finite number`,\n );\n }\n }\n\n if (width <= 0 || height <= 0) {\n throw new StagehandInvalidArgumentError(\n \"screenshot: clip width/height must be positive\",\n );\n }\n\n return { x, y, width, height };\n}\n\nexport async function computeScreenshotScale(\n page: Page,\n mode: ScreenshotScaleOption,\n): Promise<number | undefined> {\n if (mode !== \"css\") return undefined;\n try {\n const frame = page.mainFrame();\n const dpr = await frame\n .evaluate(() => {\n const ratio = Number(window.devicePixelRatio || 1);\n return Number.isFinite(ratio) && ratio > 0 ? ratio : 1;\n })\n .catch(() => 1);\n const safeRatio = Number.isFinite(dpr) && dpr > 0 ? dpr : 1;\n return Math.min(2, Math.max(0.1, 1 / safeRatio));\n } catch {\n return 1;\n }\n}\n\nexport async function setTransparentBackground(\n session: CDPSessionLike,\n): Promise<ScreenshotCleanup> {\n await session\n .send(\"Emulation.setDefaultBackgroundColorOverride\", {\n color: { r: 0, g: 0, b: 0, a: 0 },\n })\n .catch(() => {});\n\n return async () => {\n await session\n .send(\"Emulation.setDefaultBackgroundColorOverride\", {})\n .catch(() => {});\n };\n}\n\nexport async function applyStyleToFrames(\n frames: Frame[],\n css: string,\n label: string,\n): Promise<ScreenshotCleanup> {\n const trimmed = css.trim();\n if (!trimmed) return async () => {};\n const token = `__v3_style_${label}_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2)}`;\n\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate(\n ({ css, token }) => {\n try {\n const doc = document;\n if (!doc) return;\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-stagehand-style\", token);\n style.textContent = css;\n const parent = doc.head || doc.documentElement || doc.body;\n parent?.appendChild(style);\n } catch {\n // ignore\n }\n },\n { css: trimmed, token },\n )\n .catch(() => {}),\n ),\n );\n\n return async () => {\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate((token) => {\n try {\n const doc = document;\n if (!doc) return;\n const nodes = doc.querySelectorAll(\n `[data-stagehand-style=\"${token}\"]`,\n );\n nodes.forEach((node) => node.remove());\n } catch {\n // ignore\n }\n }, token)\n .catch(() => {}),\n ),\n );\n };\n}\n\nexport async function disableAnimations(\n frames: Frame[],\n): Promise<ScreenshotCleanup> {\n const css = `\n*,\n*::before,\n*::after {\n animation-delay: 0s !important;\n animation-duration: 0s !important;\n animation-iteration-count: 1 !important;\n animation-play-state: paused !important;\n transition-property: none !important;\n transition-duration: 0s !important;\n transition-delay: 0s !important;\n}`;\n\n const cleanup = await applyStyleToFrames(frames, css, \"animations\");\n\n await Promise.all(\n frames.map((frame) =>\n frame\n .evaluate(() => {\n try {\n const animations =\n typeof document.getAnimations === \"function\"\n ? document.getAnimations()\n : [];\n for (const animation of animations) {\n try {\n const details = animation.effect?.getComputedTiming?.();\n if (details && details.iterations !== Infinity) {\n animation.finish?.();\n } else {\n animation.cancel?.();\n }\n } catch {\n animation.cancel?.();\n }\n }\n } catch {\n // ignore\n }\n })\n .catch(() => {}),\n ),\n );\n\n return cleanup;\n}\n\nexport async function hideCaret(frames: Frame[]): Promise<ScreenshotCleanup> {\n const css = `\ninput,\ntextarea,\n[contenteditable],\n[contenteditable=\"\"],\n[contenteditable=\"true\"],\n[contenteditable=\"plaintext-only\"],\n*:focus {\n caret-color: transparent !important;\n}`;\n\n return applyStyleToFrames(frames, css, \"caret\");\n}\n\nexport async function applyMaskOverlays(\n locators: Locator[],\n color: string,\n): Promise<ScreenshotCleanup> {\n type MaskRectSpec = ScreenshotClip & { rootToken?: string | null };\n const rectsByFrame = new Map<\n Frame,\n { rects: MaskRectSpec[]; rootTokens: Set<string> }\n >();\n\n const token = `__v3_mask_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n for (const locator of locators) {\n try {\n const info = await resolveMaskRects(locator, token);\n if (!info) continue;\n const entry = rectsByFrame.get(info.frame) ?? {\n rects: [],\n rootTokens: new Set<string>(),\n };\n entry.rects.push(...info.rects);\n for (const rect of info.rects) {\n if (rect.rootToken) entry.rootTokens.add(rect.rootToken);\n }\n rectsByFrame.set(info.frame, entry);\n } catch {\n // ignore individual locator failures\n }\n }\n\n if (rectsByFrame.size === 0) {\n return async () => {};\n }\n\n await Promise.all(\n Array.from(rectsByFrame.entries()).map(([frame, { rects }]) =>\n frame\n .evaluate(\n ({ rects, color, token }) => {\n try {\n const doc = document;\n if (!doc) return;\n for (const rect of rects) {\n const defaultRoot = doc.documentElement || doc.body;\n if (!defaultRoot) return;\n const root = rect.rootToken\n ? doc.querySelector(\n `[data-stagehand-mask-root=\"${rect.rootToken}\"]`,\n ) || defaultRoot\n : defaultRoot;\n if (!root) continue;\n if (rect.rootToken) {\n try {\n const style = window.getComputedStyle(root as Element);\n if (style && style.position === \"static\") {\n const rootEl = root as HTMLElement;\n if (\n !rootEl.hasAttribute(\"data-stagehand-mask-root-pos\")\n ) {\n rootEl.setAttribute(\n \"data-stagehand-mask-root-pos\",\n rootEl.style.position || \"\",\n );\n }\n rootEl.style.position = \"relative\";\n }\n } catch {\n // ignore\n }\n }\n const el = doc.createElement(\"div\");\n el.setAttribute(\"data-stagehand-mask\", token);\n el.style.position = \"absolute\";\n el.style.left = `${rect.x}px`;\n el.style.top = `${rect.y}px`;\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n el.style.backgroundColor = color;\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"2147483647\";\n el.style.opacity = \"1\";\n el.style.mixBlendMode = \"normal\";\n (root as Element).appendChild(el);\n }\n } catch {\n // ignore\n }\n },\n { rects, color, token },\n )\n .catch(() => {}),\n ),\n );\n\n return async () => {\n await Promise.all(\n Array.from(rectsByFrame.entries()).map(([frame, { rootTokens }]) =>\n frame\n .evaluate(\n ({ token, rootTokens }) => {\n try {\n const doc = document;\n if (!doc) return;\n const nodes = doc.querySelectorAll(\n `[data-stagehand-mask=\"${token}\"]`,\n );\n nodes.forEach((node) => node.remove());\n for (const rootToken of rootTokens) {\n const root = doc.querySelector(\n `[data-stagehand-mask-root=\"${rootToken}\"]`,\n ) as HTMLElement | null;\n if (!root) continue;\n const prev = root.getAttribute(\n \"data-stagehand-mask-root-pos\",\n );\n if (prev !== null) {\n root.style.position = prev;\n root.removeAttribute(\"data-stagehand-mask-root-pos\");\n }\n root.removeAttribute(\"data-stagehand-mask-root\");\n }\n } catch {\n // ignore\n }\n },\n { token, rootTokens: Array.from(rootTokens) },\n )\n .catch(() => {}),\n ),\n );\n };\n}\n\nasync function resolveMaskRects(\n locator: Locator,\n maskToken: string,\n): Promise<{\n frame: Frame;\n rects: Array<ScreenshotClip & { rootToken?: string | null }>;\n} | null> {\n const frame = locator.getFrame();\n const session = frame.session;\n try {\n const resolved: Array<{\n objectId: Protocol.Runtime.RemoteObjectId;\n nodeId: Protocol.DOM.NodeId | null;\n }> = await locator.resolveNodesForMask();\n const rects: Array<ScreenshotClip & { rootToken?: string | null }> = [];\n\n for (const { objectId } of resolved) {\n try {\n const rect = await resolveMaskRectForObject(\n session,\n objectId,\n maskToken,\n );\n if (rect) rects.push(rect);\n } catch {\n // ignore individual element failures\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n if (!rects.length) return null;\n\n return { frame, rects };\n } catch {\n return null;\n }\n}\n\nasync function resolveMaskRectForObject(\n session: CDPSessionLike,\n objectId: Protocol.Runtime.RemoteObjectId,\n maskToken: string,\n): Promise<(ScreenshotClip & { rootToken?: string | null }) | null> {\n const result = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: screenshotScriptSources.resolveMaskRect,\n arguments: [{ value: maskToken }],\n returnByValue: true,\n },\n );\n\n if (result.exceptionDetails) {\n return null;\n }\n\n const rect = result.result.value as\n | (ScreenshotClip & { rootToken?: string | null })\n | null;\n if (!rect) return null;\n\n const { x, y, width, height } = rect;\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return null;\n }\n\n return {\n x,\n y,\n width,\n height,\n rootToken:\n rect.rootToken && typeof rect.rootToken === \"string\"\n ? rect.rootToken\n : undefined,\n };\n}\n\nexport async function runScreenshotCleanups(\n cleanups: ScreenshotCleanup[],\n): Promise<void> {\n for (let i = cleanups.length - 1; i >= 0; i -= 1) {\n const fn = cleanups[i];\n if (!fn) continue;\n try {\n const result = fn();\n if (result && typeof (result as Promise<void>).then === \"function\") {\n await result;\n }\n } catch {\n // ignore cleanup errors\n }\n }\n}\n"]}
|
package/dist/esm/lib/v3/v3.js
CHANGED
|
@@ -68,6 +68,7 @@ import { createTimeoutGuard } from "./handlers/handlerUtils/timeoutGuard.js";
|
|
|
68
68
|
import { ActTimeoutError } from "./types/public/sdkErrors.js";
|
|
69
69
|
const DEFAULT_MODEL_NAME = "openai/gpt-4.1-mini";
|
|
70
70
|
const DEFAULT_VIEWPORT = { width: 1288, height: 711 };
|
|
71
|
+
const DEFAULT_AGENT_TOOL_TIMEOUT_MS = 45000;
|
|
71
72
|
function resolveModelConfiguration(model) {
|
|
72
73
|
if (!model) {
|
|
73
74
|
return { modelName: DEFAULT_MODEL_NAME };
|
|
@@ -552,6 +553,13 @@ let V3 = (() => {
|
|
|
552
553
|
}
|
|
553
554
|
}
|
|
554
555
|
const lbo = this.opts.localBrowserLaunchOptions ?? {};
|
|
556
|
+
if (lbo.cdpHeaders && !lbo.cdpUrl) {
|
|
557
|
+
this.logger({
|
|
558
|
+
category: "init",
|
|
559
|
+
message: "`cdpHeaders` was provided but `cdpUrl` is not set — cdpHeaders will be ignored. Set `cdpUrl` to connect to an existing browser via CDP.",
|
|
560
|
+
level: 2,
|
|
561
|
+
});
|
|
562
|
+
}
|
|
555
563
|
// If a CDP URL is provided, attach instead of launching.
|
|
556
564
|
if (lbo.cdpUrl) {
|
|
557
565
|
this.logger({
|
|
@@ -561,6 +569,7 @@ let V3 = (() => {
|
|
|
561
569
|
});
|
|
562
570
|
this.ctx = await V3Context.create(lbo.cdpUrl, {
|
|
563
571
|
env: "LOCAL",
|
|
572
|
+
cdpHeaders: lbo.cdpHeaders,
|
|
564
573
|
});
|
|
565
574
|
const logCtx = SessionFileLogger.getContext();
|
|
566
575
|
this.ctx.conn.cdpLogger = (info) => SessionFileLogger.logCdpCallEvent(info, logCtx);
|
|
@@ -689,9 +698,6 @@ let V3 = (() => {
|
|
|
689
698
|
}
|
|
690
699
|
if (this.opts.env === "BROWSERBASE") {
|
|
691
700
|
const { apiKey, projectId } = this.requireBrowserbaseCreds();
|
|
692
|
-
if (!apiKey || !projectId) {
|
|
693
|
-
throw new MissingEnvironmentVariableError("BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID", "Browserbase environment");
|
|
694
|
-
}
|
|
695
701
|
this.logger({
|
|
696
702
|
category: "init",
|
|
697
703
|
message: "Starting browserbase session",
|
|
@@ -710,18 +716,20 @@ let V3 = (() => {
|
|
|
710
716
|
logger: this.logger,
|
|
711
717
|
serverCache: this.opts.serverCache,
|
|
712
718
|
});
|
|
719
|
+
const { projectId: overrideProjectId, browserSettings, userMetadata, ...restSessionParams } = effectiveSessionParams;
|
|
720
|
+
const resolvedProjectId = overrideProjectId ?? projectId;
|
|
713
721
|
const createSessionPayload = {
|
|
714
|
-
projectId:
|
|
715
|
-
...
|
|
722
|
+
...(resolvedProjectId ? { projectId: resolvedProjectId } : {}),
|
|
723
|
+
...restSessionParams,
|
|
716
724
|
browserSettings: {
|
|
717
|
-
...(
|
|
718
|
-
viewport:
|
|
725
|
+
...(browserSettings ?? {}),
|
|
726
|
+
viewport: browserSettings?.viewport ?? {
|
|
719
727
|
width: 1288,
|
|
720
728
|
height: 711,
|
|
721
729
|
},
|
|
722
730
|
},
|
|
723
731
|
userMetadata: {
|
|
724
|
-
...(
|
|
732
|
+
...(userMetadata ?? {}),
|
|
725
733
|
stagehand: "true",
|
|
726
734
|
},
|
|
727
735
|
};
|
|
@@ -869,10 +877,7 @@ let V3 = (() => {
|
|
|
869
877
|
});
|
|
870
878
|
}
|
|
871
879
|
else {
|
|
872
|
-
const
|
|
873
|
-
? options.timeout
|
|
874
|
-
: undefined;
|
|
875
|
-
const ensureTimeRemaining = createTimeoutGuard(effectiveTimeoutMs, (ms) => new ActTimeoutError(ms));
|
|
880
|
+
const ensureTimeRemaining = createTimeoutGuard(options?.timeout, (ms) => new ActTimeoutError(ms));
|
|
876
881
|
actResult = await this.actHandler.takeDeterministicAction({ ...input, selector }, v3Page, this.domSettleTimeoutMs, this.resolveLlmClient(options?.model), ensureTimeRemaining, options?.variables);
|
|
877
882
|
}
|
|
878
883
|
// history: record ObserveResult-based act call
|
|
@@ -1151,17 +1156,13 @@ let V3 = (() => {
|
|
|
1151
1156
|
if (!projectId)
|
|
1152
1157
|
projectId =
|
|
1153
1158
|
process.env.BROWSERBASE_PROJECT_ID ?? process.env.BB_PROJECT_ID;
|
|
1154
|
-
if (!apiKey
|
|
1155
|
-
|
|
1156
|
-
if (!apiKey)
|
|
1157
|
-
missing.push("BROWSERBASE_API_KEY");
|
|
1158
|
-
if (!projectId)
|
|
1159
|
-
missing.push("BROWSERBASE_PROJECT_ID");
|
|
1160
|
-
throw new MissingEnvironmentVariableError(missing.join(", "), "Browserbase");
|
|
1159
|
+
if (!apiKey) {
|
|
1160
|
+
throw new MissingEnvironmentVariableError("BROWSERBASE_API_KEY", "Browserbase");
|
|
1161
1161
|
}
|
|
1162
1162
|
// Cache resolved values back into opts for consistency
|
|
1163
1163
|
this.opts.apiKey = apiKey;
|
|
1164
|
-
|
|
1164
|
+
if (projectId)
|
|
1165
|
+
this.opts.projectId = projectId;
|
|
1165
1166
|
// Informational log
|
|
1166
1167
|
this.logger({
|
|
1167
1168
|
category: "init",
|
|
@@ -1305,8 +1306,14 @@ let V3 = (() => {
|
|
|
1305
1306
|
const resolvedExecutionModel = options?.executionModel ?? options?.model;
|
|
1306
1307
|
const handler = new V3AgentHandler(this, this.logger, agentLlmClient, resolvedExecutionModel, options?.systemPrompt, tools, options?.mode);
|
|
1307
1308
|
const resolvedOptions = typeof instructionOrOptions === "string"
|
|
1308
|
-
? {
|
|
1309
|
-
|
|
1309
|
+
? {
|
|
1310
|
+
instruction: instructionOrOptions,
|
|
1311
|
+
toolTimeout: DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1312
|
+
}
|
|
1313
|
+
: {
|
|
1314
|
+
...instructionOrOptions,
|
|
1315
|
+
toolTimeout: instructionOrOptions.toolTimeout ?? DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1316
|
+
};
|
|
1310
1317
|
const callbacksWithSafety = resolvedOptions.callbacks;
|
|
1311
1318
|
if (callbacksWithSafety?.onSafetyConfirmation) {
|
|
1312
1319
|
throw new StagehandInvalidArgumentError('onSafetyConfirmation callback is only supported when using mode: "cua" agents.');
|
|
@@ -1409,8 +1416,15 @@ let V3 = (() => {
|
|
|
1409
1416
|
`You are a helpful assistant that can use a web browser.\nDo not ask follow up questions, the user will trust your judgement.`,
|
|
1410
1417
|
}, tools);
|
|
1411
1418
|
const resolvedOptions = typeof instructionOrOptions === "string"
|
|
1412
|
-
? {
|
|
1413
|
-
|
|
1419
|
+
? {
|
|
1420
|
+
instruction: instructionOrOptions,
|
|
1421
|
+
toolTimeout: DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1422
|
+
}
|
|
1423
|
+
: {
|
|
1424
|
+
...instructionOrOptions,
|
|
1425
|
+
toolTimeout: instructionOrOptions.toolTimeout ??
|
|
1426
|
+
DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1427
|
+
};
|
|
1414
1428
|
if (resolvedOptions.page) {
|
|
1415
1429
|
const normalizedPage = await this.normalizeToV3Page(resolvedOptions.page);
|
|
1416
1430
|
this.ctx.setActivePage(normalizedPage);
|