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