diff --git a/.changeset/calm-tools-confirm.md b/.changeset/calm-tools-confirm.md new file mode 100644 index 0000000000..8d5f132027 --- /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 018e486cf6..8b80889e4e 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 b688579304..5dc86749d1 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 ca56f479a8..837b3e3ac8 100644 --- a/packages/extension/tests/page-webmcp-tools.test.ts +++ b/packages/extension/tests/page-webmcp-tools.test.ts @@ -68,6 +68,7 @@ describe("Page WebMCP tool discovery", () => { annotations: { readOnly: true, untrustedContent: true, + consequential: true, autosubmit: false, }, frameId: "frame-1", @@ -101,6 +102,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 6ec5cb30a0..9a85708b92 100644 --- a/packages/extension/understudy/page.ts +++ b/packages/extension/understudy/page.ts @@ -127,6 +127,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 87e0be02af..7315fcf76c 100644 --- a/packages/protocol/schemas.ts +++ b/packages/protocol/schemas.ts @@ -1468,6 +1468,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 c91ab6cc08..4cc9cc5d70 100644 --- a/packages/protocol/stagehand.v4.json +++ b/packages/protocol/stagehand.v4.json @@ -4060,6 +4060,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 c22d97ce4d..144708e5ca 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 0efedefd0c..920aa6fea2 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/models.gen.go b/packages/sdk-go/models.gen.go index b9b564a1d0..26fe19c9d5 100644 --- a/packages/sdk-go/models.gen.go +++ b/packages/sdk-go/models.gen.go @@ -2030,6 +2030,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 52b9807841..ea5f940db0 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 a271ac6fe1..174f49445b 100644 --- a/packages/sdk-python/src/stagehand/_generated/input_types.py +++ b/packages/sdk-python/src/stagehand/_generated/input_types.py @@ -1152,6 +1152,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 f9ecf9cda2..9cc81ac862 100644 --- a/packages/sdk-python/src/stagehand/_generated/models.py +++ b/packages/sdk-python/src/stagehand/_generated/models.py @@ -2281,6 +2281,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 8abf82dbe7..1275499201 100644 --- a/packages/sdk-python/tests/test_page.py +++ b/packages/sdk-python/tests/test_page.py @@ -580,7 +580,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, } @@ -610,6 +610,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 a399251cce..ec71e35eca 100644 --- a/packages/sdk-ts/tests/objectWrapper.test.ts +++ b/packages/sdk-ts/tests/objectWrapper.test.ts @@ -1042,7 +1042,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, }, @@ -1081,7 +1081,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 2b2c80ba37..956742a70d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -296,8 +296,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 @@ -440,7 +440,7 @@ importers: version: 3.1.1 mint: specifier: 'catalog:' - version: 4.2.788(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@25.9.4)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(typescript@5.9.3) + version: 4.2.788(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@24.13.2)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(supports-color@8.1.1)(typescript@5.9.3) packages/evals: dependencies: @@ -488,7 +488,7 @@ importers: version: link:../integrations/pi-sdk '@modelcontextprotocol/sdk': specifier: 'catalog:' - version: 1.29.0(zod@4.4.3) + version: 1.29.0(supports-color@8.1.1)(zod@4.4.3) '@opentelemetry/api': specifier: 'catalog:' version: 1.9.1 @@ -603,7 +603,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 @@ -725,7 +725,7 @@ importers: version: link:../../sdk-ts '@modelcontextprotocol/sdk': specifier: 'catalog:' - version: 1.29.0(zod@4.4.3) + version: 1.29.0(supports-color@8.1.1)(zod@4.4.3) zod: specifier: 'catalog:' version: 4.4.3 @@ -825,7 +825,7 @@ importers: version: link:../core '@modelcontextprotocol/sdk': specifier: 'catalog:' - version: 1.29.0(zod@4.4.3) + version: 1.29.0(supports-color@8.1.1)(zod@4.4.3) ai: specifier: ^7.0.38 version: 7.0.77(zod@4.4.3) @@ -956,7 +956,7 @@ importers: version: 0.84.2(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(bufferutil@4.1.0)(ws@8.21.0(bufferutil@4.1.0))(zod@4.4.3) '@modelcontextprotocol/sdk': specifier: 'catalog:' - version: 1.29.0(zod@4.4.3) + version: 1.29.0(supports-color@8.1.1)(zod@4.4.3) typebox: specifier: 'catalog:' version: 1.3.7 @@ -4498,8 +4498,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==} @@ -8657,7 +8657,7 @@ snapshots: '@anthropic-ai/claude-agent-sdk@0.3.224(@anthropic-ai/sdk@0.93.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(zod@4.4.3)': dependencies: '@anthropic-ai/sdk': 0.93.0(zod@4.4.3) - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.4.3) zod: 4.4.3 optionalDependencies: '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.224 @@ -9107,7 +9107,7 @@ snapshots: '@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) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.4.3) ai: 5.0.220(zod@4.4.3) devtools-protocol: 0.0.1642743 fetch-cookie: 3.2.0 @@ -9148,7 +9148,7 @@ snapshots: '@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) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.4.3) ai: 5.0.220(zod@4.4.3) devtools-protocol: 0.0.1642743 fetch-cookie: 3.2.0 @@ -9549,7 +9549,7 @@ snapshots: protobufjs: 7.6.5 ws: 8.21.0(bufferutil@4.1.0) optionalDependencies: - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.4.3) transitivePeerDependencies: - bufferutil - supports-color @@ -9732,51 +9732,51 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@25.9.4)': + '@inquirer/checkbox@4.3.2(@types/node@24.13.2)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/type': 3.0.10(@types/node@24.13.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/confirm@5.1.21(@types/node@25.9.4)': + '@inquirer/confirm@5.1.21(@types/node@24.13.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/core@10.3.2(@types/node@25.9.4)': + '@inquirer/core@10.3.2(@types/node@24.13.2)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/type': 3.0.10(@types/node@24.13.2) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/editor@4.2.23(@types/node@25.9.4)': + '@inquirer/editor@4.2.23(@types/node@24.13.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/external-editor': 1.0.3(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/external-editor': 1.0.3(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/expand@4.0.23(@types/node@25.9.4)': + '@inquirer/expand@4.0.23(@types/node@24.13.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 '@inquirer/external-editor@1.0.3(@types/node@24.13.2)': dependencies: @@ -9785,82 +9785,75 @@ snapshots: optionalDependencies: '@types/node': 24.13.2 - '@inquirer/external-editor@1.0.3(@types/node@25.9.4)': - dependencies: - chardet: 2.2.0 - iconv-lite: 0.7.3 - optionalDependencies: - '@types/node': 25.9.4 - '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@25.9.4)': + '@inquirer/input@4.3.1(@types/node@24.13.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/number@3.0.23(@types/node@25.9.4)': + '@inquirer/number@3.0.23(@types/node@24.13.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/password@4.0.23(@types/node@25.9.4)': + '@inquirer/password@4.0.23(@types/node@24.13.2)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/prompts@7.9.0(@types/node@25.9.4)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.9.4) - '@inquirer/confirm': 5.1.21(@types/node@25.9.4) - '@inquirer/editor': 4.2.23(@types/node@25.9.4) - '@inquirer/expand': 4.0.23(@types/node@25.9.4) - '@inquirer/input': 4.3.1(@types/node@25.9.4) - '@inquirer/number': 3.0.23(@types/node@25.9.4) - '@inquirer/password': 4.0.23(@types/node@25.9.4) - '@inquirer/rawlist': 4.1.11(@types/node@25.9.4) - '@inquirer/search': 3.2.2(@types/node@25.9.4) - '@inquirer/select': 4.4.2(@types/node@25.9.4) + '@inquirer/prompts@7.9.0(@types/node@24.13.2)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.13.2) + '@inquirer/confirm': 5.1.21(@types/node@24.13.2) + '@inquirer/editor': 4.2.23(@types/node@24.13.2) + '@inquirer/expand': 4.0.23(@types/node@24.13.2) + '@inquirer/input': 4.3.1(@types/node@24.13.2) + '@inquirer/number': 3.0.23(@types/node@24.13.2) + '@inquirer/password': 4.0.23(@types/node@24.13.2) + '@inquirer/rawlist': 4.1.11(@types/node@24.13.2) + '@inquirer/search': 3.2.2(@types/node@24.13.2) + '@inquirer/select': 4.4.2(@types/node@24.13.2) optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/rawlist@4.1.11(@types/node@25.9.4)': + '@inquirer/rawlist@4.1.11(@types/node@24.13.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/search@3.2.2(@types/node@25.9.4)': + '@inquirer/search@3.2.2(@types/node@24.13.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/type': 3.0.10(@types/node@24.13.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/select@4.4.2(@types/node@25.9.4)': + '@inquirer/select@4.4.2(@types/node@24.13.2)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.9.4) + '@inquirer/core': 10.3.2(@types/node@24.13.2) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.9.4) + '@inquirer/type': 3.0.10(@types/node@24.13.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 - '@inquirer/type@3.0.10(@types/node@25.9.4)': + '@inquirer/type@3.0.10(@types/node@24.13.2)': optionalDependencies: - '@types/node': 25.9.4 + '@types/node': 24.13.2 '@isaacs/cliui@8.0.2': dependencies: @@ -9988,7 +9981,7 @@ snapshots: '@isaacs/ttlcache': 2.1.5 '@lukeed/uuid': 2.0.1 '@mastra/schema-compat': 1.3.5(zod@4.4.3) - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.4.3) '@sindresorhus/slugify': 2.2.1 '@standard-schema/spec': 1.1.0 ajv: 8.20.0 @@ -10026,7 +10019,7 @@ snapshots: dependencies: '@mastra/core': 1.57.0(ai@7.0.77(zod@4.4.3))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(zod@4.4.3) '@modelcontextprotocol/ext-apps': 1.7.5(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(react-dom@18.3.1(react@19.2.3))(react@19.2.3)(zod@4.4.3) - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.4.3) exit-hook: 5.1.0 fast-deep-equal: 3.1.3 transitivePeerDependencies: @@ -10080,9 +10073,9 @@ snapshots: '@types/react': 19.2.17 react: 19.2.3 - '@mintlify/cli@4.0.1391(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@25.9.4)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(typescript@5.9.3)': + '@mintlify/cli@4.0.1391(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@24.13.2)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@25.9.4) + '@inquirer/prompts': 7.9.0(@types/node@24.13.2) '@mintlify/common': 1.0.1080(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/link-rot': 3.0.1278(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/models': 0.0.347 @@ -10092,10 +10085,10 @@ snapshots: adm-zip: 0.6.0 chalk: 5.2.0 color: 4.2.3 - detect-port: 1.5.1 + detect-port: 1.5.1(supports-color@8.1.1) fs-extra: 11.2.0 ink: 6.3.0(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.3) - inquirer: 12.3.0(@types/node@25.9.4) + inquirer: 12.3.0(@types/node@24.13.2) js-yaml: 4.3.1 jsonc-parser: 3.3.1 mdast-util-mdx-jsx: 3.2.0 @@ -10390,14 +10383,14 @@ snapshots: '@modelcontextprotocol/ext-apps@1.7.5(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(react-dom@18.3.1(react@19.2.3))(react@19.2.3)(zod@4.4.3)': dependencies: - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.4.3) '@standard-schema/spec': 1.1.0 zod: 4.4.3 optionalDependencies: react: 19.2.3 react-dom: 18.3.1(react@19.2.3) - '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': + '@modelcontextprotocol/sdk@1.29.0(supports-color@8.1.1)(zod@4.4.3)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.31) ajv: 8.20.0 @@ -10408,7 +10401,7 @@ snapshots: eventsource: 3.0.7 eventsource-parser: 3.1.0 express: 5.2.1 - express-rate-limit: 8.6.0(express@5.2.1) + express-rate-limit: 8.6.0(express@5.2.1)(supports-color@8.1.1) hono: 4.12.31 jose: 6.2.4 json-schema-typed: 8.0.2 @@ -12194,7 +12187,7 @@ snapshots: detect-libc@2.1.2: {} - detect-port@1.5.1: + detect-port@1.5.1(supports-color@8.1.1): dependencies: address: 1.2.2 debug: 4.4.3(supports-color@8.1.1) @@ -12209,7 +12202,7 @@ snapshots: devtools-protocol@0.0.1642743: {} - devtools-protocol@0.0.1657692: {} + devtools-protocol@0.0.1694333: {} didyoumean@1.2.2: {} @@ -12631,7 +12624,7 @@ snapshots: expr-eval-fork@3.0.3: {} - express-rate-limit@8.6.0(express@5.2.1): + express-rate-limit@8.6.0(express@5.2.1)(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) express: 5.2.1 @@ -13468,12 +13461,12 @@ snapshots: inline-style-parser@0.2.7: {} - inquirer@12.3.0(@types/node@25.9.4): + inquirer@12.3.0(@types/node@24.13.2): dependencies: - '@inquirer/core': 10.3.2(@types/node@25.9.4) - '@inquirer/prompts': 7.9.0(@types/node@25.9.4) - '@inquirer/type': 3.0.10(@types/node@25.9.4) - '@types/node': 25.9.4 + '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/prompts': 7.9.0(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@types/node': 24.13.2 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -14491,9 +14484,9 @@ snapshots: dependencies: minipass: 7.1.3 - mint@4.2.788(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@25.9.4)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(typescript@5.9.3): + mint@4.2.788(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@24.13.2)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(supports-color@8.1.1)(typescript@5.9.3): dependencies: - '@mintlify/cli': 4.0.1391(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@25.9.4)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(typescript@5.9.3) + '@mintlify/cli': 4.0.1391(@base-ui/react@1.7.0(@types/react@19.2.17)(react-dom@18.3.1(react@19.2.3))(react@19.2.3))(@types/node@24.13.2)(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@18.3.1(react@19.2.3))(supports-color@8.1.1)(typescript@5.9.3) transitivePeerDependencies: - '@base-ui/react' - '@types/node' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e4e95b596e..e4f7f3a29d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -27,7 +27,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