@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>;
|
|
@@ -9,7 +9,6 @@ exports.disableAnimations = disableAnimations;
|
|
|
9
9
|
exports.hideCaret = hideCaret;
|
|
10
10
|
exports.applyMaskOverlays = applyMaskOverlays;
|
|
11
11
|
exports.runScreenshotCleanups = runScreenshotCleanups;
|
|
12
|
-
exports.withScreenshotTimeout = withScreenshotTimeout;
|
|
13
12
|
const sdkErrors_js_1 = require("../types/public/sdkErrors.js");
|
|
14
13
|
const screenshotScripts_generated_js_1 = require("../dom/build/screenshotScripts.generated.js");
|
|
15
14
|
function collectFramesForScreenshot(page) {
|
|
@@ -343,21 +342,4 @@ async function runScreenshotCleanups(cleanups) {
|
|
|
343
342
|
}
|
|
344
343
|
}
|
|
345
344
|
}
|
|
346
|
-
async function withScreenshotTimeout(timeoutMs, task) {
|
|
347
|
-
if (!timeoutMs || timeoutMs <= 0)
|
|
348
|
-
return task();
|
|
349
|
-
let timer = null;
|
|
350
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
351
|
-
timer = setTimeout(() => {
|
|
352
|
-
reject(new Error(`screenshot: timeout of ${timeoutMs}ms exceeded`));
|
|
353
|
-
}, timeoutMs);
|
|
354
|
-
});
|
|
355
|
-
try {
|
|
356
|
-
return await Promise.race([task(), timeoutPromise]);
|
|
357
|
-
}
|
|
358
|
-
finally {
|
|
359
|
-
if (timer)
|
|
360
|
-
clearTimeout(timer);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
345
|
//# 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/cjs/lib/v3/v3.js
CHANGED
|
@@ -107,6 +107,7 @@ const timeoutGuard_js_1 = require("./handlers/handlerUtils/timeoutGuard.js");
|
|
|
107
107
|
const sdkErrors_js_1 = require("./types/public/sdkErrors.js");
|
|
108
108
|
const DEFAULT_MODEL_NAME = "openai/gpt-4.1-mini";
|
|
109
109
|
const DEFAULT_VIEWPORT = { width: 1288, height: 711 };
|
|
110
|
+
const DEFAULT_AGENT_TOOL_TIMEOUT_MS = 45000;
|
|
110
111
|
function resolveModelConfiguration(model) {
|
|
111
112
|
if (!model) {
|
|
112
113
|
return { modelName: DEFAULT_MODEL_NAME };
|
|
@@ -591,6 +592,13 @@ let V3 = (() => {
|
|
|
591
592
|
}
|
|
592
593
|
}
|
|
593
594
|
const lbo = this.opts.localBrowserLaunchOptions ?? {};
|
|
595
|
+
if (lbo.cdpHeaders && !lbo.cdpUrl) {
|
|
596
|
+
this.logger({
|
|
597
|
+
category: "init",
|
|
598
|
+
message: "`cdpHeaders` was provided but `cdpUrl` is not set — cdpHeaders will be ignored. Set `cdpUrl` to connect to an existing browser via CDP.",
|
|
599
|
+
level: 2,
|
|
600
|
+
});
|
|
601
|
+
}
|
|
594
602
|
// If a CDP URL is provided, attach instead of launching.
|
|
595
603
|
if (lbo.cdpUrl) {
|
|
596
604
|
this.logger({
|
|
@@ -600,6 +608,7 @@ let V3 = (() => {
|
|
|
600
608
|
});
|
|
601
609
|
this.ctx = await context_js_1.V3Context.create(lbo.cdpUrl, {
|
|
602
610
|
env: "LOCAL",
|
|
611
|
+
cdpHeaders: lbo.cdpHeaders,
|
|
603
612
|
});
|
|
604
613
|
const logCtx = flowLogger_js_1.SessionFileLogger.getContext();
|
|
605
614
|
this.ctx.conn.cdpLogger = (info) => flowLogger_js_1.SessionFileLogger.logCdpCallEvent(info, logCtx);
|
|
@@ -728,9 +737,6 @@ let V3 = (() => {
|
|
|
728
737
|
}
|
|
729
738
|
if (this.opts.env === "BROWSERBASE") {
|
|
730
739
|
const { apiKey, projectId } = this.requireBrowserbaseCreds();
|
|
731
|
-
if (!apiKey || !projectId) {
|
|
732
|
-
throw new index_js_1.MissingEnvironmentVariableError("BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID", "Browserbase environment");
|
|
733
|
-
}
|
|
734
740
|
this.logger({
|
|
735
741
|
category: "init",
|
|
736
742
|
message: "Starting browserbase session",
|
|
@@ -749,18 +755,20 @@ let V3 = (() => {
|
|
|
749
755
|
logger: this.logger,
|
|
750
756
|
serverCache: this.opts.serverCache,
|
|
751
757
|
});
|
|
758
|
+
const { projectId: overrideProjectId, browserSettings, userMetadata, ...restSessionParams } = effectiveSessionParams;
|
|
759
|
+
const resolvedProjectId = overrideProjectId ?? projectId;
|
|
752
760
|
const createSessionPayload = {
|
|
753
|
-
projectId:
|
|
754
|
-
...
|
|
761
|
+
...(resolvedProjectId ? { projectId: resolvedProjectId } : {}),
|
|
762
|
+
...restSessionParams,
|
|
755
763
|
browserSettings: {
|
|
756
|
-
...(
|
|
757
|
-
viewport:
|
|
764
|
+
...(browserSettings ?? {}),
|
|
765
|
+
viewport: browserSettings?.viewport ?? {
|
|
758
766
|
width: 1288,
|
|
759
767
|
height: 711,
|
|
760
768
|
},
|
|
761
769
|
},
|
|
762
770
|
userMetadata: {
|
|
763
|
-
...(
|
|
771
|
+
...(userMetadata ?? {}),
|
|
764
772
|
stagehand: "true",
|
|
765
773
|
},
|
|
766
774
|
};
|
|
@@ -908,10 +916,7 @@ let V3 = (() => {
|
|
|
908
916
|
});
|
|
909
917
|
}
|
|
910
918
|
else {
|
|
911
|
-
const
|
|
912
|
-
? options.timeout
|
|
913
|
-
: undefined;
|
|
914
|
-
const ensureTimeRemaining = (0, timeoutGuard_js_1.createTimeoutGuard)(effectiveTimeoutMs, (ms) => new sdkErrors_js_1.ActTimeoutError(ms));
|
|
919
|
+
const ensureTimeRemaining = (0, timeoutGuard_js_1.createTimeoutGuard)(options?.timeout, (ms) => new sdkErrors_js_1.ActTimeoutError(ms));
|
|
915
920
|
actResult = await this.actHandler.takeDeterministicAction({ ...input, selector }, v3Page, this.domSettleTimeoutMs, this.resolveLlmClient(options?.model), ensureTimeRemaining, options?.variables);
|
|
916
921
|
}
|
|
917
922
|
// history: record ObserveResult-based act call
|
|
@@ -1190,17 +1195,13 @@ let V3 = (() => {
|
|
|
1190
1195
|
if (!projectId)
|
|
1191
1196
|
projectId =
|
|
1192
1197
|
process_1.default.env.BROWSERBASE_PROJECT_ID ?? process_1.default.env.BB_PROJECT_ID;
|
|
1193
|
-
if (!apiKey
|
|
1194
|
-
|
|
1195
|
-
if (!apiKey)
|
|
1196
|
-
missing.push("BROWSERBASE_API_KEY");
|
|
1197
|
-
if (!projectId)
|
|
1198
|
-
missing.push("BROWSERBASE_PROJECT_ID");
|
|
1199
|
-
throw new index_js_1.MissingEnvironmentVariableError(missing.join(", "), "Browserbase");
|
|
1198
|
+
if (!apiKey) {
|
|
1199
|
+
throw new index_js_1.MissingEnvironmentVariableError("BROWSERBASE_API_KEY", "Browserbase");
|
|
1200
1200
|
}
|
|
1201
1201
|
// Cache resolved values back into opts for consistency
|
|
1202
1202
|
this.opts.apiKey = apiKey;
|
|
1203
|
-
|
|
1203
|
+
if (projectId)
|
|
1204
|
+
this.opts.projectId = projectId;
|
|
1204
1205
|
// Informational log
|
|
1205
1206
|
this.logger({
|
|
1206
1207
|
category: "init",
|
|
@@ -1344,8 +1345,14 @@ let V3 = (() => {
|
|
|
1344
1345
|
const resolvedExecutionModel = options?.executionModel ?? options?.model;
|
|
1345
1346
|
const handler = new v3AgentHandler_js_1.V3AgentHandler(this, this.logger, agentLlmClient, resolvedExecutionModel, options?.systemPrompt, tools, options?.mode);
|
|
1346
1347
|
const resolvedOptions = typeof instructionOrOptions === "string"
|
|
1347
|
-
? {
|
|
1348
|
-
|
|
1348
|
+
? {
|
|
1349
|
+
instruction: instructionOrOptions,
|
|
1350
|
+
toolTimeout: DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1351
|
+
}
|
|
1352
|
+
: {
|
|
1353
|
+
...instructionOrOptions,
|
|
1354
|
+
toolTimeout: instructionOrOptions.toolTimeout ?? DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1355
|
+
};
|
|
1349
1356
|
const callbacksWithSafety = resolvedOptions.callbacks;
|
|
1350
1357
|
if (callbacksWithSafety?.onSafetyConfirmation) {
|
|
1351
1358
|
throw new index_js_1.StagehandInvalidArgumentError('onSafetyConfirmation callback is only supported when using mode: "cua" agents.');
|
|
@@ -1448,8 +1455,15 @@ let V3 = (() => {
|
|
|
1448
1455
|
`You are a helpful assistant that can use a web browser.\nDo not ask follow up questions, the user will trust your judgement.`,
|
|
1449
1456
|
}, tools);
|
|
1450
1457
|
const resolvedOptions = typeof instructionOrOptions === "string"
|
|
1451
|
-
? {
|
|
1452
|
-
|
|
1458
|
+
? {
|
|
1459
|
+
instruction: instructionOrOptions,
|
|
1460
|
+
toolTimeout: DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1461
|
+
}
|
|
1462
|
+
: {
|
|
1463
|
+
...instructionOrOptions,
|
|
1464
|
+
toolTimeout: instructionOrOptions.toolTimeout ??
|
|
1465
|
+
DEFAULT_AGENT_TOOL_TIMEOUT_MS,
|
|
1466
|
+
};
|
|
1453
1467
|
if (resolvedOptions.page) {
|
|
1454
1468
|
const normalizedPage = await this.normalizeToV3Page(resolvedOptions.page);
|
|
1455
1469
|
this.ctx.setActivePage(normalizedPage);
|