diff --git a/.changeset/calm-tools-confirm.md b/.changeset/calm-tools-confirm.md
new file mode 100644
index 000000000..8d5f13202
--- /dev/null
+++ b/.changeset/calm-tools-confirm.md
@@ -0,0 +1,8 @@
+---
+"@browserbasehq/stagehand-extension": patch
+"@browserbasehq/stagehand-go": patch
+"@browserbasehq/stagehand": patch
+"@browserbasehq/stagehand-python": patch
+---
+
+expose the WebMCP `consequentialHint` annotation as `consequential` across all SDKs
diff --git a/packages/docs/v4/basics/webmcp.mdx b/packages/docs/v4/basics/webmcp.mdx
index 018e486cf..8b80889e4 100644
--- a/packages/docs/v4/basics/webmcp.mdx
+++ b/packages/docs/v4/basics/webmcp.mdx
@@ -89,7 +89,7 @@ const tools = await page.tools({ timeout: 3000 });
for (const tool of tools) {
console.log(tool.name, tool.description);
console.log(tool.inputSchema); // JSON Schema for invoke() input
- console.log(tool.annotations); // { readOnly?, untrustedContent?, autosubmit? }
+ console.log(tool.annotations); // { readOnly?, untrustedContent?, consequential?, autosubmit? }
console.log(tool.frameId); // the frame that registered the tool
}
```
@@ -103,7 +103,7 @@ tools = await page.tools(timeout=3000)
for tool in tools:
print(tool.name, tool.description)
print(tool.input_schema) # JSON Schema for invoke() input
- print(tool.annotations) # read_only / untrusted_content / autosubmit
+ print(tool.annotations) # read_only / untrusted_content / consequential / autosubmit
print(tool.frame_id) # the frame that registered the tool
```
@@ -121,7 +121,7 @@ for _, tool := range tools {
descriptor := tool.Descriptor()
fmt.Println(descriptor.Name, descriptor.Description)
fmt.Println(descriptor.InputSchema) // JSON Schema for Invoke input
- fmt.Println(descriptor.Annotations) // ReadOnly / UntrustedContent / Autosubmit
+ fmt.Println(descriptor.Annotations) // tool safety hints
fmt.Println(descriptor.FrameID) // the frame that registered the tool
}
```
@@ -134,13 +134,27 @@ The listing timeout defaults to 1000 ms. Tools declared in iframes are included,
| Annotation | Meaning |
|---|---|
-| `readOnly` | The tool does not mutate state, so it is safe to call speculatively |
-| `untrustedContent` | The output contains page-controlled text; do not feed it to a model as if it were trusted |
-| `autosubmit` | Invoking the tool submits something on the user's behalf |
+| `readOnly` | The tool does not change application or system state |
+| `untrustedContent` | The output may contain untrusted data, such as user-generated content |
+| `consequential` | The tool may perform a significant or non-reversible action |
+| `autosubmit` | The declarative tool submits a form when invoked |
-Annotations are hints from the page, not guarantees enforced by the browser. Treat `untrustedContent` output as data, never as instructions.
+WebMCP calls the site-facing annotation `consequentialHint`. Chrome DevTools Protocol and Stagehand
+expose it as `consequential`.
+
+Annotations come from the page. They are hints, not browser-enforced guarantees. Treat
+`untrustedContent` output as data, never as instructions.
+
+Stagehand does not ask for confirmation before it invokes a WebMCP tool. When `consequential` is
+`true`, confirm the action and its inputs with the user before calling `invoke()`. If you expose
+WebMCP tools to a model, enforce this check before the adapter calls `invoke()`.
+
+A missing or `false` value does not prove that a tool is safe. The site may have omitted or
+misclassified the annotation.
+
+
## Invoking tools
Invoking is two steps: `invoke()` hands the call to the browser and returns immediately with a handle, then `result()` waits for the terminal response. Splitting them means a long-running tool does not block you, and you can cancel while it is in flight.
diff --git a/packages/docs/v4/reference/webmcp.mdx b/packages/docs/v4/reference/webmcp.mdx
index b68857930..5dc86749d 100644
--- a/packages/docs/v4/reference/webmcp.mdx
+++ b/packages/docs/v4/reference/webmcp.mdx
@@ -20,7 +20,7 @@ icon: "plug"
| `name` | `string` | Tool name used for invocation. |
| `description` | `string` | Human-readable tool description. |
| `inputSchema` | `Record \| undefined` | Optional JSON input schema. |
-| `annotations` | `WebMCPAnnotation \| undefined` | Optional `readOnly`, `untrustedContent`, and `autosubmit` flags. |
+| `annotations` | `WebMCPAnnotation \| undefined` | Optional `readOnly`, `untrustedContent`, `consequential`, and `autosubmit` flags. |
| `frameId` | `string` | Frame that published the tool. |
| `backendNodeId` | `number \| undefined` | Optional non-negative backend node identifier. |
@@ -33,6 +33,9 @@ invoke(options?: WebMCPInvokeOptions): Promise
`options.input` is a JSON-compatible object and defaults to `{}`. The helper supplies its own page,
frame, and tool name.
+`invoke()` does not ask the user for confirmation. If `annotations.consequential` is `true`, confirm
+the action and input with the user before invoking the tool.
+
## WebMCPInvocation
### Properties
@@ -84,7 +87,7 @@ Requests cancellation from Chrome. It does not synthesize or overwrite a termina
| `name` | `str` | Tool name used for invocation. |
| `description` | `str` | Human-readable tool description. |
| `input_schema` | `dict[str, JsonValue] \| None` | Optional JSON input schema. |
-| `annotations` | `WebMCPAnnotation \| None` | Optional `read_only`, `untrusted_content`, and `autosubmit` flags. |
+| `annotations` | `WebMCPAnnotation \| None` | Optional `read_only`, `untrusted_content`, `consequential`, and `autosubmit` flags. |
| `frame_id` | `str` | Frame that published the tool. |
| `backend_node_id` | `int \| None` | Optional non-negative backend node identifier. |
@@ -99,6 +102,9 @@ async def invoke(
`input` defaults to an empty dictionary. The helper supplies its own page, frame, and tool name.
+`invoke()` does not ask the user for confirmation. If `annotations.consequential` is `True`, confirm
+the action and input with the user before invoking the tool.
+
## WebMCPInvocation
### Properties
@@ -151,8 +157,8 @@ func (t *WebMCPTool) Descriptor() WebMCPToolDescriptor
```
The returned descriptor contains `Name`, `Description`, `InputSchema`, `Annotations`, `FrameID`,
-and optional `BackendNodeID`. `Annotations` may contain `ReadOnly`, `UntrustedContent`, and
-`Autosubmit` pointers.
+and optional `BackendNodeID`. `Annotations` may contain `ReadOnly`, `UntrustedContent`,
+`Consequential`, and `Autosubmit` pointers.
### Invoke()
@@ -166,6 +172,9 @@ func (t *WebMCPTool) Invoke(
`WebMCPInput` is a `map[string]any`; `nil` is sent as an empty JSON object. Values must be JSON
encodable. The helper supplies its own page, frame, and tool name.
+`Invoke()` does not ask the user for confirmation. If `Annotations.Consequential` points to `true`,
+confirm the action and input with the user before invoking the tool.
+
## WebMCPInvocation
### Descriptor()
diff --git a/packages/extension/tests/page-webmcp-tools.test.ts b/packages/extension/tests/page-webmcp-tools.test.ts
index 704ed2c0e..31fa64b50 100644
--- a/packages/extension/tests/page-webmcp-tools.test.ts
+++ b/packages/extension/tests/page-webmcp-tools.test.ts
@@ -106,6 +106,7 @@ describe("Page WebMCP tool discovery", () => {
annotations: {
readOnly: true,
untrustedContent: true,
+ consequential: true,
autosubmit: false,
},
frameId: "frame-1",
@@ -139,6 +140,7 @@ describe("Page WebMCP tool discovery", () => {
annotations: {
readOnly: true,
untrustedContent: true,
+ consequential: true,
autosubmit: false,
},
frameId: "frame-1",
diff --git a/packages/extension/understudy/page.ts b/packages/extension/understudy/page.ts
index b01f1b3a3..93c54fe01 100644
--- a/packages/extension/understudy/page.ts
+++ b/packages/extension/understudy/page.ts
@@ -149,6 +149,7 @@ function webMCPAnnotation(annotation: Protocol.WebMCP.Annotation): WebMCPAnnotat
...(annotation.untrustedContent === undefined
? {}
: { untrustedContent: annotation.untrustedContent }),
+ ...(annotation.consequential === undefined ? {} : { consequential: annotation.consequential }),
...(annotation.autosubmit === undefined ? {} : { autosubmit: annotation.autosubmit }),
};
}
diff --git a/packages/protocol/schemas.ts b/packages/protocol/schemas.ts
index 1681349fa..38898e6e3 100644
--- a/packages/protocol/schemas.ts
+++ b/packages/protocol/schemas.ts
@@ -1472,6 +1472,7 @@ export const WebMCPAnnotationSchema = z
.strictObject({
readOnly: z.boolean().optional(),
untrustedContent: z.boolean().optional(),
+ consequential: z.boolean().optional(),
autosubmit: z.boolean().optional(),
})
.meta({ id: "WebMCPAnnotation" });
diff --git a/packages/protocol/stagehand.v4.json b/packages/protocol/stagehand.v4.json
index 44459cd8f..9fdd9264c 100644
--- a/packages/protocol/stagehand.v4.json
+++ b/packages/protocol/stagehand.v4.json
@@ -4073,6 +4073,9 @@
"untrusted_content": {
"type": "boolean"
},
+ "consequential": {
+ "type": "boolean"
+ },
"autosubmit": {
"type": "boolean"
}
diff --git a/packages/protocol/tests/protocol/webmcp.test.ts b/packages/protocol/tests/protocol/webmcp.test.ts
index c22d97ce4..144708e5c 100644
--- a/packages/protocol/tests/protocol/webmcp.test.ts
+++ b/packages/protocol/tests/protocol/webmcp.test.ts
@@ -25,6 +25,7 @@ describe("WebMCP protocol data", () => {
annotations: {
readOnly: true,
untrustedContent: true,
+ consequential: true,
autosubmit: false,
},
frameId: "frame-1",
@@ -42,6 +43,7 @@ describe("WebMCP protocol data", () => {
annotations: {
readOnly: true,
untrustedContent: true,
+ consequential: true,
autosubmit: false,
},
frameId: "frame-1",
@@ -60,6 +62,24 @@ describe("WebMCP protocol data", () => {
).toThrow();
});
+ it("preserves false and omitted consequential annotations", () => {
+ expect(
+ WebMCPToolDescriptorSchema.parse({
+ name: "preview",
+ description: "Preview an action",
+ annotations: { consequential: false },
+ frameId: "frame-1",
+ }).annotations,
+ ).toStrictEqual({ consequential: false });
+ expect(
+ WebMCPToolDescriptorSchema.parse({
+ name: "search",
+ description: "Search",
+ frameId: "frame-1",
+ }).annotations,
+ ).toBeUndefined();
+ });
+
it("requires JSON-compatible input schemas", () => {
expect(() =>
WebMCPToolDescriptorSchema.parse({
diff --git a/packages/protocol/tests/protocol/wire-casing.test.ts b/packages/protocol/tests/protocol/wire-casing.test.ts
index 0efedefd0..920aa6fea 100644
--- a/packages/protocol/tests/protocol/wire-casing.test.ts
+++ b/packages/protocol/tests/protocol/wire-casing.test.ts
@@ -130,6 +130,7 @@ describe("JSON-RPC wire casing", () => {
type: "object",
properties: { searchQuery: { type: "string" } },
},
+ annotations: { consequential: true },
frameId: "frame-1",
},
],
@@ -143,6 +144,7 @@ describe("JSON-RPC wire casing", () => {
type: "object",
properties: { searchQuery: { type: "string" } },
},
+ annotations: { consequential: true },
frame_id: "frame-1",
},
],
diff --git a/packages/sdk-go/internal/extensionassets/stagehand-extension.zip b/packages/sdk-go/internal/extensionassets/stagehand-extension.zip
index 71b059db7..15b5945a5 100644
Binary files a/packages/sdk-go/internal/extensionassets/stagehand-extension.zip and b/packages/sdk-go/internal/extensionassets/stagehand-extension.zip differ
diff --git a/packages/sdk-go/models.gen.go b/packages/sdk-go/models.gen.go
index 29512fa11..2c8fa1c92 100644
--- a/packages/sdk-go/models.gen.go
+++ b/packages/sdk-go/models.gen.go
@@ -2076,6 +2076,9 @@ type WebMCPAnnotation struct {
// Autosubmit corresponds to the JSON schema field "autosubmit".
Autosubmit *bool `json:"autosubmit,omitempty,omitzero"`
+ // Consequential corresponds to the JSON schema field "consequential".
+ Consequential *bool `json:"consequential,omitempty,omitzero"`
+
// ReadOnly corresponds to the JSON schema field "read_only".
ReadOnly *bool `json:"read_only,omitempty,omitzero"`
diff --git a/packages/sdk-go/webmcp_test.go b/packages/sdk-go/webmcp_test.go
index 52b980784..ea5f940db 100644
--- a/packages/sdk-go/webmcp_test.go
+++ b/packages/sdk-go/webmcp_test.go
@@ -12,6 +12,7 @@ func TestPageWrapsCallableWebMCPToolsWithOwnedIdentity(t *testing.T) {
t.Parallel()
readOnly := true
+ consequential := true
rpc := &recordingProtocolClient{responses: map[string]any{
"page.webmcp_tools": PageWebMCPToolsResult{Tools: []WebMCPToolDescriptor{{
Name: "search",
@@ -19,7 +20,10 @@ func TestPageWrapsCallableWebMCPToolsWithOwnedIdentity(t *testing.T) {
InputSchema: WebMCPToolDescriptorInputSchema{
"searchQuery": json.RawMessage(`{"type":"string"}`),
},
- Annotations: &WebMCPAnnotation{ReadOnly: &readOnly},
+ Annotations: &WebMCPAnnotation{
+ ReadOnly: &readOnly,
+ Consequential: &consequential,
+ },
FrameID: "frame-1",
BackendNodeID: intPointer(42),
}}},
@@ -57,6 +61,10 @@ func TestPageWrapsCallableWebMCPToolsWithOwnedIdentity(t *testing.T) {
*descriptor.BackendNodeID != 42 {
t.Fatalf("tool descriptor = %#v", descriptor)
}
+ if descriptor.Annotations == nil || descriptor.Annotations.Consequential == nil ||
+ !*descriptor.Annotations.Consequential {
+ t.Fatalf("tool consequential annotation = %#v", descriptor.Annotations)
+ }
invocation, err := tool.Invoke(context.Background(), WebMCPInput{
"searchQuery": "Stagehand",
diff --git a/packages/sdk-python/src/stagehand/_generated/input_types.py b/packages/sdk-python/src/stagehand/_generated/input_types.py
index c15b4918c..42c48077d 100644
--- a/packages/sdk-python/src/stagehand/_generated/input_types.py
+++ b/packages/sdk-python/src/stagehand/_generated/input_types.py
@@ -1155,6 +1155,7 @@ class StagehandObserveParams(TypedDict):
class WebMCPAnnotation(TypedDict):
read_only: NotRequired[bool]
untrusted_content: NotRequired[bool]
+ consequential: NotRequired[bool]
autosubmit: NotRequired[bool]
diff --git a/packages/sdk-python/src/stagehand/_generated/models.py b/packages/sdk-python/src/stagehand/_generated/models.py
index 53d954258..ebccd3997 100644
--- a/packages/sdk-python/src/stagehand/_generated/models.py
+++ b/packages/sdk-python/src/stagehand/_generated/models.py
@@ -2327,6 +2327,7 @@ class WebMCPAnnotation(WireModel):
)
read_only: Optional[StrictBool] = None
untrusted_content: Optional[StrictBool] = None
+ consequential: Optional[StrictBool] = None
autosubmit: Optional[StrictBool] = None
diff --git a/packages/sdk-python/tests/test_page.py b/packages/sdk-python/tests/test_page.py
index f4f97a05b..451205f07 100644
--- a/packages/sdk-python/tests/test_page.py
+++ b/packages/sdk-python/tests/test_page.py
@@ -778,7 +778,7 @@ async def test_page_wraps_callable_webmcp_tools_and_invocations_with_owned_ident
"type": "object",
"properties": {"searchQuery": {"type": "string"}},
},
- "annotations": {"read_only": True},
+ "annotations": {"read_only": True, "consequential": True},
"frame_id": "frame-1",
"backend_node_id": 42,
}
@@ -808,6 +808,7 @@ async def test_page_wraps_callable_webmcp_tools_and_invocations_with_owned_ident
}
assert tool.annotations is not None
assert tool.annotations.read_only is True
+ assert tool.annotations.consequential is True
assert tool.frame_id == "frame-1"
assert tool.backend_node_id == 42
diff --git a/packages/sdk-ts/tests/objectWrapper.test.ts b/packages/sdk-ts/tests/objectWrapper.test.ts
index dd875a0e2..5927a1fbd 100644
--- a/packages/sdk-ts/tests/objectWrapper.test.ts
+++ b/packages/sdk-ts/tests/objectWrapper.test.ts
@@ -1215,7 +1215,7 @@ describe("Stagehand TS object wrapper", () => {
type: "object",
properties: { searchQuery: { type: "string" } },
},
- annotations: { readOnly: true },
+ annotations: { readOnly: true, consequential: true },
frameId: "frame-1",
backendNodeId: 42,
},
@@ -1254,7 +1254,7 @@ describe("Stagehand TS object wrapper", () => {
type: "object",
properties: { searchQuery: { type: "string" } },
},
- annotations: { readOnly: true },
+ annotations: { readOnly: true, consequential: true },
frameId: "frame-1",
backendNodeId: 42,
});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 20be5da91..e6308bd14 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -311,8 +311,8 @@ catalogs:
specifier: ^10.0.2
version: 10.0.2
devtools-protocol:
- specifier: ^0.0.1657692
- version: 0.0.1657692
+ specifier: ^0.0.1694333
+ version: 0.0.1694333
dotenv:
specifier: ^17.4.2
version: 17.4.2
@@ -730,7 +730,7 @@ importers:
version: 7.0.16(zod@4.4.3)
devtools-protocol:
specifier: 'catalog:'
- version: 0.0.1657692
+ version: 0.0.1694333
zod:
specifier: 'catalog:'
version: 4.4.3
@@ -1622,12 +1622,12 @@ packages:
resolution: {integrity: sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==}
engines: {node: '>=20.0.0'}
- '@aws-sdk/client-cloudfront@3.1129.0':
- resolution: {integrity: sha512-kWS+CU2M7UAs0otRKXpuR9gyaGimZAhM/yJAjpYdNk6gu92gES9f0UtHb6aUSOvdRJc7e5mMQmo1krjPTYNORw==}
+ '@aws-sdk/client-cloudfront@3.1135.0':
+ resolution: {integrity: sha512-bMhOq7n4l4wRkLFoqrlRhso/WEuhJAs84Uj/vVKhTZQhAqbGuLoD6u0p8nnvTxqAHv2TrYk+g5HjSROGWFoxPw==}
engines: {node: '>=20.0.0'}
- '@aws-sdk/client-s3@3.1129.0':
- resolution: {integrity: sha512-TwbRTrAGwtFFUQ/jozsj9Jyjy+UjIsfSKaNs/tQfggIWFbk1Mim+IWjZ//IOz97Wc5Q/z/6G4cb5znYUXHKxHg==}
+ '@aws-sdk/client-s3@3.1135.0':
+ resolution: {integrity: sha512-/1CVA0M+TaEOzgM02DUST1NzQTjbY8OumDKPETjzo4owypkZZMxu1ADecFbzeG73hje/XLNAJfGepQ3a40CGnw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/core@3.977.7':
@@ -1670,8 +1670,8 @@ packages:
resolution: {integrity: sha512-eUtswnXu0+Ii9ieRK+0L7aPFV3Z/dnW2VntJzjBP9xs8s+8p5nBNuymIXtXwZ+5r5+XJP3e32nMkuZ/r0HozEA==}
engines: {node: '>=20.0.0'}
- '@aws-sdk/credential-provider-node@3.972.71':
- resolution: {integrity: sha512-HIg7Q2osBzajQwL+1Vkyh2E7Gim3eTNb9RHIsOxDGjW0eZg4oEKtRs5sioCnc73ilhaOm4gX2lHVF8J7+nt2rg==}
+ '@aws-sdk/credential-provider-node@3.972.79':
+ resolution: {integrity: sha512-RIw5dof1EHkWubrZzPC941CDtnFG1iAXsxbFgLkhdYZXHc4icU13c/uxSMI0J5eUx9bxa7LjfpdjfClBB1QsDA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-node@3.972.83':
@@ -1880,22 +1880,6 @@ packages:
'@browserbasehq/sdk@2.16.0':
resolution: {integrity: sha512-mPAuLRU9jWR7o0KJi9+gQnOBDUSIkoKbbFv4HjrA+80qWVcFacrNPlZmf4mguQnfZ0oP2t5c3ws6yuFyAX9vpA==}
- '@browserbasehq/stagehand@3.6.0':
- resolution: {integrity: sha512-wQ3Mv5b2xy64SntWNUbvgd7liWPbQRvGa8KEb1LorwheTkpUZFkt3BpZE8ovMY/lIleV9DfYjbvqghbeOOla4w==}
- engines: {node: ^20.19.0 || >=22.12.0}
- peerDependencies:
- patchright-core: ^1.55.2
- playwright-core: ^1.55.1
- puppeteer-core: ^24.43.0
- zod: ^3.25.76 || ^4.2.0
- peerDependenciesMeta:
- patchright-core:
- optional: true
- playwright-core:
- optional: true
- puppeteer-core:
- optional: true
-
'@browserbasehq/stagehand@3.7.1':
resolution: {integrity: sha512-vAuYSZWIhh3d76BxwppNVE3dB0ztEBLBi85G6TWulZNiebdWptNoANOMuprOB/cw5dE+80b/ZZQo4G33Pc9i6w==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -3670,8 +3654,8 @@ packages:
resolution: {integrity: sha512-NAiCSC78fzbNIEWoheoF74Ob5ZorLijCHpMY26Fqvqg/+9LuyIqMfHDg2p8Yk1rqOyowtiL3y7WX0AW+teL6zw==}
engines: {node: '>=18.0.0'}
- '@smithy/core@3.33.3':
- resolution: {integrity: sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg==}
+ '@smithy/core@3.34.1':
+ resolution: {integrity: sha512-dLcOUxz8YCv1RZUMKq6GbyUf95pLbrqh34bPvpCZ1+CByFF31BEAFewZjsGCnVsZTKdThNENfGyAgk2TJqVwSw==}
engines: {node: '>=18.0.0'}
'@smithy/credential-provider-imds@4.5.0':
@@ -3929,8 +3913,8 @@ packages:
'@types/node@20.19.43':
resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==}
- '@types/node@22.20.2':
- resolution: {integrity: sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw==}
+ '@types/node@22.20.3':
+ resolution: {integrity: sha512-DZmzkmwHzXrLPAXPyKNDzlIwMMUZCVacoD25ywdy5YTKGbOx/2ld+Q38Im2zJ0vBuZP5Prd3VZutKZyXwkOS8A==}
'@types/node@24.13.2':
resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==}
@@ -4459,11 +4443,6 @@ packages:
peerDependencies:
zod: ^3.25.34 || ^4.0
- browse@0.9.5:
- resolution: {integrity: sha512-5icxS7urivYaSaAfFxj+vSWU2zNPol8aBIU3S+3m1ervovG3qnQ0nfHEG9BhV2YXdAAACo5jT+sA0xYkugwFjA==}
- engines: {node: ^20.19.0 || >=22.12.0}
- hasBin: true
-
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
@@ -4977,8 +4956,8 @@ packages:
devtools-protocol@0.0.1642743:
resolution: {integrity: sha512-vTCGze95hGFayPNUXv2H/3cNt/Kqv3J7XqS519j7U8HYhmtD6+eVEPHp6nRHD64dDXJ022TU4reAYhjYyuxm8Q==}
- devtools-protocol@0.0.1657692:
- resolution: {integrity: sha512-fcyY7qijcIOtJ/0fdCf4L7LMaqOgF0JeH1EqNjGYDS/b9HJB32fe3KepCdOQDy4eXaUdQehUivmz64wCVXlxAA==}
+ devtools-protocol@0.0.1694333:
+ resolution: {integrity: sha512-3HN0ovN1czdWwtC6vJ2/1jqh5VKlt7yozBXzqOGHeO1Nu6Q/NbfaRGGHCR1SKQf936FYZh2NBZlvG/7PbRGYTw==}
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
@@ -8239,8 +8218,8 @@ packages:
spdx-expression-parse@3.0.1:
resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
- spdx-license-ids@3.0.23:
- resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==}
+ spdx-license-ids@3.0.24:
+ resolution: {integrity: sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ==}
split2@4.2.0:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
@@ -9576,7 +9555,7 @@ snapshots:
dependencies:
'@aws-sdk/core': 3.978.0
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9585,7 +9564,7 @@ snapshots:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.977.7
- '@aws-sdk/credential-provider-node': 3.972.71
+ '@aws-sdk/credential-provider-node': 3.972.79
'@aws-sdk/eventstream-handler-node': 3.972.32
'@aws-sdk/middleware-eventstream': 3.972.27
'@aws-sdk/middleware-websocket': 3.972.50
@@ -9597,18 +9576,18 @@ snapshots:
'@smithy/types': 4.17.0
tslib: 2.8.1
- '@aws-sdk/client-cloudfront@3.1129.0':
+ '@aws-sdk/client-cloudfront@3.1135.0':
dependencies:
'@aws-sdk/core': 3.978.0
'@aws-sdk/credential-provider-node': 3.972.83
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/fetch-http-handler': 5.8.0
'@smithy/node-http-handler': 4.12.1
'@smithy/types': 4.18.0
tslib: 2.8.1
- '@aws-sdk/client-s3@3.1129.0':
+ '@aws-sdk/client-s3@3.1135.0':
dependencies:
'@aws-sdk/checksums': 3.1001.0
'@aws-sdk/core': 3.978.0
@@ -9616,7 +9595,7 @@ snapshots:
'@aws-sdk/middleware-sdk-s3': 3.972.76
'@aws-sdk/signature-v4-multi-region': 3.996.46
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/fetch-http-handler': 5.8.0
'@smithy/node-http-handler': 4.12.1
'@smithy/types': 4.18.0
@@ -9638,7 +9617,7 @@ snapshots:
'@aws-sdk/types': 3.974.5
'@aws-sdk/xml-builder': 3.972.40
'@aws/lambda-invoke-store': 0.3.0
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/signature-v4': 5.7.0
'@smithy/types': 4.18.0
bowser: 2.14.1
@@ -9656,7 +9635,7 @@ snapshots:
dependencies:
'@aws-sdk/core': 3.978.0
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9674,7 +9653,7 @@ snapshots:
dependencies:
'@aws-sdk/core': 3.978.0
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/fetch-http-handler': 5.8.0
'@smithy/node-http-handler': 4.12.1
'@smithy/types': 4.18.0
@@ -9707,7 +9686,7 @@ snapshots:
'@aws-sdk/credential-provider-web-identity': 3.972.77
'@aws-sdk/nested-clients': 3.997.45
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/credential-provider-imds': 4.5.0
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9726,11 +9705,11 @@ snapshots:
'@aws-sdk/core': 3.978.0
'@aws-sdk/nested-clients': 3.997.45
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
- '@aws-sdk/credential-provider-node@3.972.71':
+ '@aws-sdk/credential-provider-node@3.972.79':
dependencies:
'@aws-sdk/credential-provider-env': 3.972.68
'@aws-sdk/credential-provider-http': 3.972.70
@@ -9753,7 +9732,7 @@ snapshots:
'@aws-sdk/credential-provider-sso': 3.973.15
'@aws-sdk/credential-provider-web-identity': 3.972.77
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/credential-provider-imds': 4.5.0
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9770,7 +9749,7 @@ snapshots:
dependencies:
'@aws-sdk/core': 3.978.0
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9790,7 +9769,7 @@ snapshots:
'@aws-sdk/nested-clients': 3.997.45
'@aws-sdk/token-providers': 3.1129.0
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9808,7 +9787,7 @@ snapshots:
'@aws-sdk/core': 3.978.0
'@aws-sdk/nested-clients': 3.997.45
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9831,7 +9810,7 @@ snapshots:
'@aws-sdk/core': 3.978.0
'@aws-sdk/signature-v4-multi-region': 3.996.46
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -9861,7 +9840,7 @@ snapshots:
'@aws-sdk/core': 3.978.0
'@aws-sdk/signature-v4-multi-region': 3.996.46
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/fetch-http-handler': 5.8.0
'@smithy/node-http-handler': 4.12.1
'@smithy/types': 4.18.0
@@ -9904,7 +9883,7 @@ snapshots:
'@aws-sdk/core': 3.978.0
'@aws-sdk/nested-clients': 3.997.45
'@aws-sdk/types': 3.974.5
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -10030,47 +10009,6 @@ snapshots:
transitivePeerDependencies:
- encoding
- '@browserbasehq/stagehand@3.6.0(playwright-core@1.56.1)(zod@4.4.3)':
- dependencies:
- '@ai-sdk/provider': 2.0.3
- '@anthropic-ai/sdk': 0.39.0
- '@browserbasehq/sdk': 2.16.0
- '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(bufferutil@4.1.0)
- '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3)
- ai: 5.0.220(zod@4.4.3)
- devtools-protocol: 0.0.1642743
- fetch-cookie: 3.2.0
- openai: 4.104.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.4.3)
- pino: 9.14.0
- pino-pretty: 13.1.3
- uuid: 11.1.1
- ws: 8.21.0(bufferutil@4.1.0)
- zod: 4.4.3
- zod-to-json-schema: 3.25.2(zod@4.4.3)
- optionalDependencies:
- '@ai-sdk/amazon-bedrock': 3.0.111(zod@4.4.3)
- '@ai-sdk/anthropic': 2.0.91(zod@4.4.3)
- '@ai-sdk/azure': 2.0.120(zod@4.4.3)
- '@ai-sdk/cerebras': 1.0.51(zod@4.4.3)
- '@ai-sdk/deepseek': 1.0.48(zod@4.4.3)
- '@ai-sdk/google': 2.0.85(zod@4.4.3)
- '@ai-sdk/google-vertex': 3.0.158(zod@4.4.3)
- '@ai-sdk/groq': 2.0.45(zod@4.4.3)
- '@ai-sdk/mistral': 2.0.40(zod@4.4.3)
- '@ai-sdk/openai': 2.0.115(zod@4.4.3)
- '@ai-sdk/perplexity': 2.0.36(zod@4.4.3)
- '@ai-sdk/togetherai': 1.0.49(zod@4.4.3)
- '@ai-sdk/xai': 2.0.82(zod@4.4.3)
- bufferutil: 4.1.0
- chrome-launcher: 1.2.1
- ollama-ai-provider-v2: 1.5.5(zod@4.4.3)
- playwright-core: 1.56.1
- transitivePeerDependencies:
- - '@cfworker/json-schema'
- - encoding
- - supports-color
- - utf-8-validate
-
'@browserbasehq/stagehand@3.7.1(playwright-core@1.56.1)(zod@4.4.3)':
dependencies:
'@ai-sdk/provider': 2.0.3
@@ -10803,7 +10741,7 @@ snapshots:
'@inquirer/figures': 1.0.15
'@inquirer/type': 2.0.0
'@types/mute-stream': 0.0.4
- '@types/node': 22.20.2
+ '@types/node': 22.20.3
'@types/wrap-ansi': 3.0.0
ansi-escapes: 4.3.2
cli-width: 4.1.0
@@ -12167,7 +12105,7 @@ snapshots:
'@smithy/types': 4.17.0
tslib: 2.8.1
- '@smithy/core@3.33.3':
+ '@smithy/core@3.34.1':
dependencies:
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -12192,7 +12130,7 @@ snapshots:
'@smithy/fetch-http-handler@5.8.0':
dependencies:
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -12208,7 +12146,7 @@ snapshots:
'@smithy/node-http-handler@4.12.1':
dependencies:
- '@smithy/core': 3.33.3
+ '@smithy/core': 3.34.1
'@smithy/types': 4.18.0
tslib: 2.8.1
@@ -12517,7 +12455,7 @@ snapshots:
dependencies:
undici-types: 6.21.0
- '@types/node@22.20.2':
+ '@types/node@22.20.3':
dependencies:
undici-types: 6.21.0
@@ -13175,36 +13113,6 @@ snapshots:
- supports-color
optional: true
- browse@0.9.5(bufferutil@4.1.0)(playwright-core@1.56.1):
- dependencies:
- '@browserbasehq/sdk': 2.16.0
- '@browserbasehq/stagehand': 3.6.0(playwright-core@1.56.1)(zod@4.4.3)
- '@oclif/core': 4.13.0
- '@vercel/detect-agent': 1.2.3
- archiver: 7.0.1
- deepmerge: 4.3.1
- dotenv: 16.6.1
- fastest-levenshtein: 1.0.16
- http-status-codes: 2.3.0
- ignore: 7.0.5
- node-html-markdown: 1.3.0
- semver: 7.8.5
- tsx: 4.23.1
- ws: 8.21.0(bufferutil@4.1.0)
- zod: 4.4.3
- transitivePeerDependencies:
- - '@cfworker/json-schema'
- - bare-abort-controller
- - bare-buffer
- - bufferutil
- - encoding
- - patchright-core
- - playwright-core
- - puppeteer-core
- - react-native-b4a
- - supports-color
- - utf-8-validate
-
buffer-crc32@0.2.13: {}
buffer-crc32@1.0.0: {}
@@ -13681,7 +13589,7 @@ snapshots:
devtools-protocol@0.0.1642743: {}
- devtools-protocol@0.0.1657692: {}
+ devtools-protocol@0.0.1694333: {}
didyoumean@1.2.2: {}
@@ -16370,8 +16278,8 @@ snapshots:
oclif@4.24.0(@types/node@20.19.43):
dependencies:
- '@aws-sdk/client-cloudfront': 3.1129.0
- '@aws-sdk/client-s3': 3.1129.0
+ '@aws-sdk/client-cloudfront': 3.1135.0
+ '@aws-sdk/client-s3': 3.1135.0
'@inquirer/confirm': 3.2.0
'@inquirer/input': 2.3.0
'@inquirer/select': 2.5.0
@@ -17790,16 +17698,16 @@ snapshots:
spdx-correct@3.2.0:
dependencies:
spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.23
+ spdx-license-ids: 3.0.24
spdx-exceptions@2.5.0: {}
spdx-expression-parse@3.0.1:
dependencies:
spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.23
+ spdx-license-ids: 3.0.24
- spdx-license-ids@3.0.23: {}
+ spdx-license-ids@3.0.24: {}
split2@4.2.0: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 9585404dc..71603d213 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -32,7 +32,7 @@ catalog:
vite: 8.1.3
vitest: 4.1.9
zod: 4.4.3
- devtools-protocol: ^0.0.1657692
+ devtools-protocol: ^0.0.1694333
ai: ^7.0.16
"@openai/codex-sdk": 0.147.0
"@anthropic-ai/claude-agent-sdk": 0.3.224