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