Skip to content

Commit e471d2e

Browse files
authored
[STG-1798] feat: support Browserbase verified sessions (browserbase#1980)
## Summary - bump `@browserbasehq/sdk` to `^2.10.0` in `packages/core`, `packages/server-v3`, and `packages/server-v4` - add Browserbase `verified`, `os`, and custom captcha session settings to the Stagehand Browserbase session-create schema and generated OpenAPI specs - keep legacy `advancedStealth` behavior working by treating it as a compatibility alias for the new verified-mode checks in Stagehand internals ## Testing - `pnpm --filter @browserbasehq/stagehand build:esm` - `pnpm --filter @browserbasehq/stagehand test:core -- packages/core/dist/esm/tests/unit/browserbase-session-accessors.test.js packages/core/dist/esm/tests/unit/model-config-schema.test.js` - `pnpm --filter @browserbasehq/stagehand typecheck` - `pnpm --filter @browserbasehq/stagehand-server-v3 typecheck` - `pnpm --filter @browserbasehq/stagehand-server-v4 typecheck` - Browserbase-backed smoke test creating a real Stagehand session with `browserSettings.verified: true` Linear: https://linear.app/browserbase/issue/STG-1798/support-browserbase-verified-session-settings <!-- This is an auto-generated description by cubic. --> --- ## Summary by cubic Adds support for Browserbase Verified sessions with new session settings across Stagehand APIs and a fixed Google CUA viewport when Verified, addressing Linear STG-1798. Deprecates the `isAdvancedStealth` alias in favor of `v3.isVerified`, and fixes abort-signal handling to fail fast on already-aborted signals. - New Features - Add `verified`, `os`, `captchaImageSelector`, and `captchaInputSelector` to Browserbase browser settings and generated OpenAPI (v3 and v4). - Introduce `v3.isVerified`; keep `isAdvancedStealth` as a deprecated, backward-compatible alias. - Use a 1288x711 viewport for Google CUA when Verified; otherwise use the configured viewport. - Dependencies - Bump `@browserbasehq/sdk` to `^2.10.0` in `packages/core`, `packages/server-v3`, and `packages/server-v4`. <sup>Written for commit c2bde33. Summary will update on new commits. <a href="https://cubic.dev/pr/browserbase/stagehand/pull/1980">Review in cubic</a></sup> <!-- End of auto-generated description by cubic. -->
1 parent ead2d0e commit e471d2e

13 files changed

Lines changed: 134 additions & 23 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@browserbasehq/stagehand": minor
3+
---
4+
5+
Support Browserbase verified session settings and bump the Browserbase SDK.

packages/core/lib/v3/agent/utils/coordinateNormalization.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { V3 } from "../../v3.js";
22

3-
// Default viewport for advancedStealth mode
3+
// Default viewport for Browserbase managed fingerprinting mode
44
const STEALTH_VIEWPORT = { width: 1288, height: 711 };
55

66
export function isGoogleProvider(provider?: string): boolean {
@@ -30,10 +30,8 @@ export function processCoordinates(
3030
v3?: V3,
3131
): { x: number; y: number } {
3232
if (isGoogleProvider(provider) && v3) {
33-
// advancedStealth uses fixed viewport, otherwise use configured viewport
34-
const viewport = v3.isAdvancedStealth
35-
? STEALTH_VIEWPORT
36-
: v3.configuredViewport;
33+
// Browserbase managed fingerprinting uses a fixed viewport fallback.
34+
const viewport = v3.isVerified ? STEALTH_VIEWPORT : v3.configuredViewport;
3735
return normalizeGoogleCoordinates(x, y, viewport);
3836
}
3937
return { x, y };

packages/core/lib/v3/handlers/v3CuaAgentHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,9 +626,9 @@ export class V3CuaAgentHandler {
626626
private async updateClientViewport(): Promise<void> {
627627
try {
628628
// For Google CUA, use configured viewport for coordinate normalization
629-
// advancedStealth uses fixed 1288x711, otherwise use configured viewport
629+
// Browserbase managed fingerprinting uses a fixed 1288x711 fallback.
630630
if (this.agentClient instanceof GoogleCUAClient) {
631-
const dims = this.v3.isAdvancedStealth
631+
const dims = this.v3.isVerified
632632
? { width: 1288, height: 711 }
633633
: this.v3.configuredViewport;
634634
this.agentClient.setViewport(dims.width, dims.height);

packages/core/lib/v3/types/public/api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,12 +503,16 @@ export const BrowserbaseBrowserSettingsSchema = z
503503
.object({
504504
advancedStealth: z.boolean().optional(),
505505
blockAds: z.boolean().optional(),
506+
captchaImageSelector: z.string().optional(),
507+
captchaInputSelector: z.string().optional(),
506508
context: BrowserbaseContextSchema.optional(),
507509
extensionId: z.string().optional(),
508510
fingerprint: BrowserbaseFingerprintSchema.optional(),
509511
logSession: z.boolean().optional(),
512+
os: z.enum(["windows", "mac", "linux", "mobile", "tablet"]).optional(),
510513
recordSession: z.boolean().optional(),
511514
solveCaptchas: z.boolean().optional(),
515+
verified: z.boolean().optional(),
512516
viewport: BrowserbaseViewportSchema.optional(),
513517
})
514518
.meta({ id: "BrowserbaseBrowserSettings" });

packages/core/lib/v3/v3.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,15 +198,26 @@ export class V3 {
198198
}
199199

200200
/**
201-
* Returns true if advancedStealth is enabled in Browserbase settings.
201+
* Returns true if Browserbase Verified mode is enabled in settings.
202+
* Legacy `advancedStealth` is treated as equivalent for backwards compatibility.
202203
*/
203-
public get isAdvancedStealth(): boolean {
204+
public get isVerified(): boolean {
205+
const browserSettings =
206+
this.opts.browserbaseSessionCreateParams?.browserSettings;
204207
return (
205-
this.opts.browserbaseSessionCreateParams?.browserSettings
206-
?.advancedStealth === true
208+
browserSettings?.verified === true ||
209+
browserSettings?.advancedStealth === true
207210
);
208211
}
209212

213+
/**
214+
* Backwards-compatible alias for Browserbase managed fingerprinting mode.
215+
* @deprecated Use `isVerified` instead. This alias will be removed in a future version.
216+
*/
217+
public get isAdvancedStealth(): boolean {
218+
return this.isVerified;
219+
}
220+
210221
/**
211222
* Returns the configured viewport dimensions from launch options.
212223
* Falls back to default 1288x711 if not configured.

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
"dependencies": {
7070
"@ai-sdk/provider": "^2.0.0",
7171
"@anthropic-ai/sdk": "0.39.0",
72-
"@browserbasehq/sdk": "^2.7.0",
72+
"@browserbasehq/sdk": "^2.10.0",
7373
"@google/genai": "^1.22.0",
7474
"@langchain/openai": "^0.4.4",
7575
"@modelcontextprotocol/sdk": "^1.17.2",

packages/core/tests/unit/browserbase-session-accessors.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,27 @@ describe("browserbase accessors", () => {
113113
await v3.close().catch(() => {});
114114
}
115115
});
116+
117+
it("treats verified Browserbase sessions as managed fingerprinting mode", async () => {
118+
const v3 = new V3({
119+
env: "BROWSERBASE",
120+
disableAPI: true,
121+
verbose: 0,
122+
browserbaseSessionCreateParams: {
123+
browserSettings: {
124+
verified: true,
125+
},
126+
},
127+
});
128+
129+
try {
130+
await v3.init();
131+
expect(v3.isVerified).toBe(true);
132+
expect(v3.isAdvancedStealth).toBe(true);
133+
} finally {
134+
await v3.close().catch(() => {});
135+
}
136+
});
116137
});
117138

118139
describe("local accessors", () => {

packages/core/tests/unit/model-config-schema.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,20 @@ describe("SessionStartRequestSchema", () => {
121121

122122
expect(result.success).toBe(true);
123123
});
124+
125+
it("accepts verified Browserbase session settings", () => {
126+
const result = Api.SessionStartRequestSchema.safeParse({
127+
modelName: "openai/gpt-5.4-mini",
128+
browserbaseSessionCreateParams: {
129+
browserSettings: {
130+
verified: true,
131+
os: "mac",
132+
captchaImageSelector: "#captcha-image",
133+
captchaInputSelector: "#captcha-input",
134+
},
135+
},
136+
});
137+
138+
expect(result.success).toBe(true);
139+
});
124140
});

packages/server-v3/openapi.v3.yaml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,10 @@ components:
565565
type: boolean
566566
blockAds:
567567
type: boolean
568+
captchaImageSelector:
569+
type: string
570+
captchaInputSelector:
571+
type: string
568572
context:
569573
$ref: "#/components/schemas/BrowserbaseContext"
570574
extensionId:
@@ -573,10 +577,20 @@ components:
573577
$ref: "#/components/schemas/BrowserbaseFingerprint"
574578
logSession:
575579
type: boolean
580+
os:
581+
type: string
582+
enum:
583+
- windows
584+
- mac
585+
- linux
586+
- mobile
587+
- tablet
576588
recordSession:
577589
type: boolean
578590
solveCaptchas:
579591
type: boolean
592+
verified:
593+
type: boolean
580594
viewport:
581595
$ref: "#/components/schemas/BrowserbaseViewport"
582596
BrowserbaseProxyGeolocation:
@@ -1545,6 +1559,10 @@ components:
15451559
type: boolean
15461560
blockAds:
15471561
type: boolean
1562+
captchaImageSelector:
1563+
type: string
1564+
captchaInputSelector:
1565+
type: string
15481566
context:
15491567
$ref: "#/components/schemas/BrowserbaseContextOutput"
15501568
extensionId:
@@ -1553,10 +1571,20 @@ components:
15531571
$ref: "#/components/schemas/BrowserbaseFingerprintOutput"
15541572
logSession:
15551573
type: boolean
1574+
os:
1575+
type: string
1576+
enum:
1577+
- windows
1578+
- mac
1579+
- linux
1580+
- mobile
1581+
- tablet
15561582
recordSession:
15571583
type: boolean
15581584
solveCaptchas:
15591585
type: boolean
1586+
verified:
1587+
type: boolean
15601588
viewport:
15611589
$ref: "#/components/schemas/BrowserbaseViewportOutput"
15621590
additionalProperties: false

packages/server-v3/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"gen:openapi": "tsx scripts/gen-openapi.ts"
2323
},
2424
"dependencies": {
25-
"@browserbasehq/sdk": "^2.7.0",
25+
"@browserbasehq/sdk": "^2.10.0",
2626
"@browserbasehq/stagehand": "workspace:*",
2727
"@fastify/cors": "^11.0.1",
2828
"@fastify/swagger": "^9.6.1",

0 commit comments

Comments
 (0)