@@ -11199,7 +11616,7 @@ pub enum CopilotApiTokenAuthInfoType {
CopilotApiToken,
}
-/// Server transport type: stdio, http, sse, or memory
+/// Server transport type: stdio, http, sse (deprecated), or memory
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum DiscoveredMcpServerType {
/// Server communicates over stdio with a local child process.
@@ -11208,7 +11625,7 @@ pub enum DiscoveredMcpServerType {
/// Server communicates over streamable HTTP.
#[serde(rename = "http")]
Http,
- /// Server communicates over Server-Sent Events.
+ /// Server communicates over Server-Sent Events (deprecated).
#[serde(rename = "sse")]
Sse,
/// Server is backed by an in-memory runtime implementation.
@@ -11552,6 +11969,200 @@ pub enum SessionLogLevel {
Unknown,
}
+/// Allowed values for the `McpAppsHostContextDetailsAvailableDisplayMode` enumeration.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsHostContextDetailsAvailableDisplayMode {
+ /// Rendered inline within the host conversation surface
+ #[serde(rename = "inline")]
+ Inline,
+ /// Rendered as a fullscreen overlay
+ #[serde(rename = "fullscreen")]
+ Fullscreen,
+ /// Rendered as a picture-in-picture floating panel
+ #[serde(rename = "pip")]
+ Pip,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Current display mode (SEP-1865)
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsHostContextDetailsDisplayMode {
+ /// Rendered inline within the host conversation surface
+ #[serde(rename = "inline")]
+ Inline,
+ /// Rendered as a fullscreen overlay
+ #[serde(rename = "fullscreen")]
+ Fullscreen,
+ /// Rendered as a picture-in-picture floating panel
+ #[serde(rename = "pip")]
+ Pip,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Platform type for responsive design
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsHostContextDetailsPlatform {
+ /// Host runs in a web browser
+ #[serde(rename = "web")]
+ Web,
+ /// Host runs as a desktop application
+ #[serde(rename = "desktop")]
+ Desktop,
+ /// Host runs on a mobile device
+ #[serde(rename = "mobile")]
+ Mobile,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// UI theme preference per SEP-1865
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsHostContextDetailsTheme {
+ /// Light UI theme
+ #[serde(rename = "light")]
+ Light,
+ /// Dark UI theme
+ #[serde(rename = "dark")]
+ Dark,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Allowed values for the `McpAppsSetHostContextDetailsAvailableDisplayMode` enumeration.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsSetHostContextDetailsAvailableDisplayMode {
+ /// Rendered inline within the host conversation surface
+ #[serde(rename = "inline")]
+ Inline,
+ /// Rendered as a fullscreen overlay
+ #[serde(rename = "fullscreen")]
+ Fullscreen,
+ /// Rendered as a picture-in-picture floating panel
+ #[serde(rename = "pip")]
+ Pip,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Current display mode (SEP-1865)
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsSetHostContextDetailsDisplayMode {
+ /// Rendered inline within the host conversation surface
+ #[serde(rename = "inline")]
+ Inline,
+ /// Rendered as a fullscreen overlay
+ #[serde(rename = "fullscreen")]
+ Fullscreen,
+ /// Rendered as a picture-in-picture floating panel
+ #[serde(rename = "pip")]
+ Pip,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Platform type for responsive design
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsSetHostContextDetailsPlatform {
+ /// Host runs in a web browser
+ #[serde(rename = "web")]
+ Web,
+ /// Host runs as a desktop application
+ #[serde(rename = "desktop")]
+ Desktop,
+ /// Host runs on a mobile device
+ #[serde(rename = "mobile")]
+ Mobile,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// UI theme preference per SEP-1865
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpAppsSetHostContextDetailsTheme {
+ /// Light UI theme
+ #[serde(rename = "light")]
+ Light,
+ /// Dark UI theme
+ #[serde(rename = "dark")]
+ Dark,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
/// Outcome of the sampling inference. 'success' produced a response; 'failure' encountered an error (including agent-side rejection by content filter or criteria); 'cancelled' the caller cancelled this execution via cancelSamplingExecution.
///
///
diff --git a/rust/src/generated/rpc.rs b/rust/src/generated/rpc.rs
index f8d2ecb30..20dc48e80 100644
--- a/rust/src/generated/rpc.rs
+++ b/rust/src/generated/rpc.rs
@@ -2444,6 +2444,13 @@ pub struct SessionRpcMcp<'a> {
}
impl<'a> SessionRpcMcp<'a> {
+ /// `session.mcp.apps.*` sub-namespace.
+ pub fn apps(&self) -> SessionRpcMcpApps<'a> {
+ SessionRpcMcpApps {
+ session: self.session,
+ }
+ }
+
/// `session.mcp.oauth.*` sub-namespace.
pub fn oauth(&self) -> SessionRpcMcpOauth<'a> {
SessionRpcMcpOauth {
@@ -2677,6 +2684,209 @@ impl<'a> SessionRpcMcp<'a> {
}
}
+/// `session.mcp.apps.*` RPCs.
+#[derive(Clone, Copy)]
+pub struct SessionRpcMcpApps<'a> {
+ pub(crate) session: &'a Session,
+}
+
+impl<'a> SessionRpcMcpApps<'a> {
+ /// Fetch an MCP resource (typically a `ui://` MCP App bundle, per SEP-1865) from a connected server. Requires the `mcp-apps` session capability.
+ ///
+ /// Wire method: `session.mcp.apps.readResource`.
+ ///
+ /// # Parameters
+ ///
+ /// * `params` - MCP server and resource URI to fetch.
+ ///
+ /// # Returns
+ ///
+ /// Resource contents returned by the MCP server.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn read_resource(
+ &self,
+ params: McpAppsReadResourceRequest,
+ ) -> Result
{
+ let mut wire_params = serde_json::to_value(params)?;
+ wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string());
+ let _value = self
+ .session
+ .client()
+ .call(
+ rpc_methods::SESSION_MCP_APPS_READRESOURCE,
+ Some(wire_params),
+ )
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+
+ /// List tools that an MCP App view is allowed to call (SEP-1865 visibility filter). Returns tools whose `_meta.ui.visibility` is unset (default `["model","app"]`) or includes `"app"`.
+ ///
+ /// Wire method: `session.mcp.apps.listTools`.
+ ///
+ /// # Parameters
+ ///
+ /// * `params` - MCP server to list app-callable tools for.
+ ///
+ /// # Returns
+ ///
+ /// App-callable tools from the named MCP server.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn list_tools(
+ &self,
+ params: McpAppsListToolsRequest,
+ ) -> Result {
+ let mut wire_params = serde_json::to_value(params)?;
+ wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string());
+ let _value = self
+ .session
+ .client()
+ .call(rpc_methods::SESSION_MCP_APPS_LISTTOOLS, Some(wire_params))
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+
+ /// Call an MCP tool from an MCP App view (SEP-1865). Enforces the visibility check that prevents an app iframe from invoking model-only tools. Returns the standard MCP `CallToolResult`.
+ ///
+ /// Wire method: `session.mcp.apps.callTool`.
+ ///
+ /// # Parameters
+ ///
+ /// * `params` - MCP server, tool name, and arguments to invoke from an MCP App view.
+ ///
+ /// # Returns
+ ///
+ /// Standard MCP CallToolResult
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn call_tool(
+ &self,
+ params: McpAppsCallToolRequest,
+ ) -> Result {
+ let mut wire_params = serde_json::to_value(params)?;
+ wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string());
+ let _value = self
+ .session
+ .client()
+ .call(rpc_methods::SESSION_MCP_APPS_CALLTOOL, Some(wire_params))
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+
+ /// Replace the host context returned to MCP App guests on `ui/initialize`. Hosts use this to advertise theme, locale, or other metadata to the guest UI.
+ ///
+ /// Wire method: `session.mcp.apps.setHostContext`.
+ ///
+ /// # Parameters
+ ///
+ /// * `params` - Host context to advertise to MCP App guests.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn set_host_context(
+ &self,
+ params: McpAppsSetHostContextRequest,
+ ) -> Result<(), Error> {
+ let mut wire_params = serde_json::to_value(params)?;
+ wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string());
+ let _value = self
+ .session
+ .client()
+ .call(
+ rpc_methods::SESSION_MCP_APPS_SETHOSTCONTEXT,
+ Some(wire_params),
+ )
+ .await?;
+ Ok(())
+ }
+
+ /// Read the current host context advertised to MCP App guests.
+ ///
+ /// Wire method: `session.mcp.apps.getHostContext`.
+ ///
+ /// # Returns
+ ///
+ /// Current host context advertised to MCP App guests.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn get_host_context(&self) -> Result {
+ let wire_params = serde_json::json!({ "sessionId": self.session.id() });
+ let _value = self
+ .session
+ .client()
+ .call(
+ rpc_methods::SESSION_MCP_APPS_GETHOSTCONTEXT,
+ Some(wire_params),
+ )
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+
+ /// Diagnose MCP Apps wiring for a specific MCP server. Reports the session capability, feature-flag state, advertised extension, and how many tools have `_meta.ui` populated.
+ ///
+ /// Wire method: `session.mcp.apps.diagnose`.
+ ///
+ /// # Parameters
+ ///
+ /// * `params` - MCP server to diagnose MCP Apps wiring for.
+ ///
+ /// # Returns
+ ///
+ /// Diagnostic snapshot of MCP Apps wiring for the named server.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn diagnose(
+ &self,
+ params: McpAppsDiagnoseRequest,
+ ) -> Result {
+ let mut wire_params = serde_json::to_value(params)?;
+ wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string());
+ let _value = self
+ .session
+ .client()
+ .call(rpc_methods::SESSION_MCP_APPS_DIAGNOSE, Some(wire_params))
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+}
+
/// `session.mcp.oauth.*` RPCs.
#[derive(Clone, Copy)]
pub struct SessionRpcMcpOauth<'a> {
diff --git a/rust/src/generated/session_events.rs b/rust/src/generated/session_events.rs
index 20a123cd1..5e78c6932 100644
--- a/rust/src/generated/session_events.rs
+++ b/rust/src/generated/session_events.rs
@@ -171,6 +171,8 @@ pub enum SessionEventType {
SessionMcpServerStatusChanged,
#[serde(rename = "session.extensions_loaded")]
SessionExtensionsLoaded,
+ #[serde(rename = "mcp_app.tool_call_complete")]
+ McpAppToolCallComplete,
/// Unknown event type for forward compatibility.
#[default]
#[serde(other)]
@@ -345,6 +347,8 @@ pub enum SessionEventData {
SessionMcpServerStatusChanged(SessionMcpServerStatusChangedData),
#[serde(rename = "session.extensions_loaded")]
SessionExtensionsLoaded(SessionExtensionsLoadedData),
+ #[serde(rename = "mcp_app.tool_call_complete")]
+ McpAppToolCallComplete(McpAppToolCallCompleteData),
}
/// A session event with typed data payload.
@@ -499,6 +503,9 @@ pub struct SessionErrorData {
/// GitHub request tracing ID (x-github-request-id header) for correlating with server-side logs
#[serde(skip_serializing_if = "Option::is_none")]
pub provider_call_id: Option,
+ /// Copilot service request ID (x-copilot-service-request-id header) for CAPI log correlation
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub service_request_id: Option,
/// Error stack trace, when available
#[serde(skip_serializing_if = "Option::is_none")]
pub stack: Option,
@@ -589,6 +596,9 @@ pub struct SessionModelChangeData {
/// Reason the change happened, when not user-initiated. Currently `"rate_limit_auto_switch"` for changes triggered by the auto-mode-switch rate-limit recovery path. UI clients can use this to render contextual copy.
#[serde(skip_serializing_if = "Option::is_none")]
pub cause: Option,
+ /// Context tier after the model change; null explicitly clears a previously selected tier
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub context_tier: Option,
/// Newly selected model identifier
pub new_model: String,
/// Model that was previously selected, if any
@@ -1008,6 +1018,9 @@ pub struct SessionCompactionCompleteData {
/// GitHub request tracing ID (x-github-request-id header) for the compaction LLM call
#[serde(skip_serializing_if = "Option::is_none")]
pub request_id: Option,
+ /// Copilot service request ID (x-copilot-service-request-id header) for the compaction LLM call
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub service_request_id: Option,
/// Whether compaction completed successfully
pub success: bool,
/// LLM-generated summary of the compacted conversation history
@@ -1208,6 +1221,9 @@ pub struct AssistantMessageData {
/// GitHub request tracing ID (x-github-request-id header) for correlating with server-side logs
#[serde(skip_serializing_if = "Option::is_none")]
pub request_id: Option,
+ /// Copilot service request ID (x-copilot-service-request-id header) for CAPI log correlation
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub service_request_id: Option,
/// Tool invocations requested by the assistant in this message
#[serde(default)]
pub tool_requests: Vec,
@@ -1370,6 +1386,9 @@ pub struct AssistantUsageData {
/// Number of output tokens used for reasoning (e.g., chain-of-thought)
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_tokens: Option,
+ /// Copilot service request ID (x-copilot-service-request-id header) for CAPI log correlation
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub service_request_id: Option,
/// Time to first token in milliseconds. Only available for streaming requests
#[serde(skip_serializing_if = "Option::is_none")]
pub time_to_first_token_ms: Option,
@@ -1397,6 +1416,9 @@ pub struct ModelCallFailureData {
/// GitHub request tracing ID (x-github-request-id header) for server-side log correlation
#[serde(skip_serializing_if = "Option::is_none")]
pub provider_call_id: Option,
+ /// Copilot service request ID (x-copilot-service-request-id header) for CAPI log correlation
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub service_request_id: Option,
/// Where the failed model call originated
pub source: ModelCallFailureSource,
/// HTTP status code from the failed request
@@ -1613,6 +1635,102 @@ pub struct ToolExecutionCompleteContentResource {
pub r#type: ToolExecutionCompleteContentResourceType,
}
+/// Schema for the `ToolExecutionCompleteUIResourceMetaUICsp` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMetaUICsp {
+ #[serde(default)]
+ pub base_uri_domains: Vec,
+ #[serde(default)]
+ pub connect_domains: Vec,
+ #[serde(default)]
+ pub frame_domains: Vec,
+ #[serde(default)]
+ pub resource_domains: Vec,
+}
+
+/// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsCamera` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMetaUIPermissionsCamera {}
+
+/// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsClipboardWrite` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMetaUIPermissionsClipboardWrite {}
+
+/// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsGeolocation` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMetaUIPermissionsGeolocation {}
+
+/// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsMicrophone` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMetaUIPermissionsMicrophone {}
+
+/// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissions` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMetaUIPermissions {
+ /// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsCamera` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub camera: Option,
+ /// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsClipboardWrite` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub clipboard_write: Option,
+ /// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsGeolocation` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub geolocation: Option,
+ /// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissionsMicrophone` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub microphone: Option,
+}
+
+/// Schema for the `ToolExecutionCompleteUIResourceMetaUI` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMetaUI {
+ /// Schema for the `ToolExecutionCompleteUIResourceMetaUICsp` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub csp: Option,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub domain: Option,
+ /// Schema for the `ToolExecutionCompleteUIResourceMetaUIPermissions` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub permissions: Option,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub prefers_border: Option,
+}
+
+/// Resource-level UI metadata (CSP, permissions, visual preferences)
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResourceMeta {
+ /// Schema for the `ToolExecutionCompleteUIResourceMetaUI` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub ui: Option,
+}
+
+/// MCP Apps UI resource content for rendering in a sandboxed iframe
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteUIResource {
+ /// Resource-level UI metadata (CSP, permissions, visual preferences)
+ #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
+ pub meta: Option,
+ /// Base64-encoded HTML content
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub blob: Option,
+ /// MIME type of the content
+ pub mime_type: String,
+ /// HTML content as a string
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub text: Option,
+ /// The ui:// URI of the resource
+ pub uri: String,
+}
+
/// Tool execution result on success
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -1625,6 +1743,44 @@ pub struct ToolExecutionCompleteResult {
/// Full detailed tool result for UI/timeline display, preserving complete content such as diffs. Falls back to content when absent.
#[serde(skip_serializing_if = "Option::is_none")]
pub detailed_content: Option,
+ /// MCP Apps UI resource content for rendering in a sandboxed iframe
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub ui_resource: Option,
+}
+
+/// Schema for the `ToolExecutionCompleteToolDescriptionMetaUI` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteToolDescriptionMetaUI {
+ /// URI of the UI resource
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub resource_uri: Option,
+ /// Who can access this tool
+ #[serde(default)]
+ pub visibility: Vec,
+}
+
+/// MCP Apps metadata for UI resource association
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteToolDescriptionMeta {
+ /// Schema for the `ToolExecutionCompleteToolDescriptionMetaUI` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub ui: Option,
+}
+
+/// Tool definition metadata, present for MCP tools with MCP Apps support
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ToolExecutionCompleteToolDescription {
+ /// MCP Apps metadata for UI resource association
+ #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
+ pub meta: Option,
+ /// Tool description
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub description: Option,
+ /// Tool name
+ pub name: String,
}
/// Session event "tool.execution_complete". Tool execution completion results including success status, detailed output, and error information
@@ -1658,6 +1814,9 @@ pub struct ToolExecutionCompleteData {
pub success: bool,
/// Unique identifier for the completed tool call
pub tool_call_id: String,
+ /// Tool definition metadata, present for MCP tools with MCP Apps support
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub tool_description: Option,
/// Tool-specific telemetry data (e.g., CodeQL check counts, grep match counts)
#[serde(default)]
pub tool_telemetry: HashMap,
@@ -1688,6 +1847,12 @@ pub struct SkillInvokedData {
/// Version of the plugin this skill originated from, when applicable
#[serde(skip_serializing_if = "Option::is_none")]
pub plugin_version: Option,
+ /// Source identifier for where the skill was discovered. Known values include: project (workspace skill), inherited (parent-directory skill), personal-copilot (~/.copilot/skills), personal-agents (~/.agents/skills), personal-claude (~/.claude/skills), custom (configured directory), plugin (installed plugin), builtin (bundled runtime skill), and remote (org/enterprise skill)
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub source: Option,
+ /// What triggered the skill invocation: `user-invoked` (explicit user action, such as via a slash command or UI affordance), `agent-invoked` (agent requested the skill), or `context-load` (loaded as part of another context, such as preloading skills configured on a custom agent or subagent)
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub trigger: Option,
}
/// Session event "subagent.started". Sub-agent startup details including parent tool call and agent information
@@ -2763,6 +2928,9 @@ pub struct CapabilitiesChangedUI {
/// Whether elicitation is now supported
#[serde(skip_serializing_if = "Option::is_none")]
pub elicitation: Option,
+ /// Whether MCP Apps (SEP-1865) UI passthrough is now supported
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub mcp_apps: Option,
}
/// Session event "capabilities.changed". Session capability change notification
@@ -2894,11 +3062,20 @@ pub struct McpServersLoadedServer {
pub error: Option,
/// Server name (config key)
pub name: String,
+ /// Name of the plugin that supplied the effective MCP server config, only when source is plugin
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub plugin_name: Option,
+ /// Version of the plugin that supplied the effective MCP server config, only when source is plugin
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub plugin_version: Option,
/// Configuration source: user, workspace, plugin, or builtin
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option,
/// Connection status: connected, failed, needs-auth, pending, disabled, or not_configured
pub status: McpServerStatus,
+ /// Transport mechanism: stdio, http, sse (deprecated), or memory (in-process MCP server)
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub transport: Option,
}
/// Session event "session.mcp_servers_loaded".
@@ -2913,6 +3090,9 @@ pub struct SessionMcpServersLoadedData {
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionMcpServerStatusChangedData {
+ /// Error message if the server entered a failed state
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub error: Option,
/// Name of the MCP server whose status changed
pub server_name: String,
/// Connection status: connected, failed, needs-auth, pending, disabled, or not_configured
@@ -2941,6 +3121,61 @@ pub struct SessionExtensionsLoadedData {
pub extensions: Vec,
}
+/// Set when the underlying tools/call threw an error before returning a CallToolResult
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct McpAppToolCallCompleteError {
+ /// Human-readable error message
+ pub message: String,
+}
+
+/// Schema for the `McpAppToolCallCompleteToolMetaUI` type.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct McpAppToolCallCompleteToolMetaUI {
+ /// `ui://` URI declared by the tool's `_meta.ui.resourceUri`
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub resource_uri: Option,
+ /// Tool visibility per SEP-1865 (typically a subset of `["model","app"]`)
+ #[serde(default)]
+ pub visibility: Vec,
+}
+
+/// The tool's `_meta.ui` block at the time of the call, so consumers can decide whether to forward the result to the model without re-listing tools.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct McpAppToolCallCompleteToolMeta {
+ /// Schema for the `McpAppToolCallCompleteToolMetaUI` type.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub ui: Option,
+}
+
+/// Session event "mcp_app.tool_call_complete". MCP App view called a tool on a connected MCP server (SEP-1865)
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct McpAppToolCallCompleteData {
+ /// Arguments passed to the tool by the app view, if any
+ #[serde(default)]
+ pub arguments: HashMap,
+ /// Wall-clock duration of the underlying tools/call in milliseconds
+ pub duration_ms: f64,
+ /// Set when the underlying tools/call threw an error before returning a CallToolResult
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub error: Option,
+ /// Standard MCP CallToolResult returned by the server. Present whether or not the call set isError.
+ #[serde(default)]
+ pub result: HashMap,
+ /// Name of the MCP server hosting the tool
+ pub server_name: String,
+ /// True when the call completed without throwing AND the MCP CallToolResult did not set isError
+ pub success: bool,
+ /// The tool's `_meta.ui` block at the time of the call, so consumers can decide whether to forward the result to the model without re-listing tools.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub tool_meta: Option,
+ /// MCP tool name that was invoked
+ pub tool_name: String,
+}
+
/// Hosting platform type of the repository (github or ado)
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum WorkingDirectoryContextHostType {
@@ -2974,6 +3209,20 @@ pub enum ReasoningSummary {
Unknown,
}
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum SessionModelChangeDataContextTier {
+ /// Default context tier with standard context window size.
+ #[serde(rename = "default")]
+ Default,
+ /// Extended context tier with a larger context window.
+ #[serde(rename = "long_context")]
+ LongContext,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
/// The session mode the agent is operating in
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum SessionMode {
@@ -3231,6 +3480,39 @@ pub enum ToolExecutionCompleteContent {
Resource(ToolExecutionCompleteContentResource),
}
+/// Allowed values for the `ToolExecutionCompleteToolDescriptionMetaUIVisibility` enumeration.
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum ToolExecutionCompleteToolDescriptionMetaUIVisibility {
+ /// Tool is callable by the model (LLM tool surface)
+ #[serde(rename = "model")]
+ Model,
+ /// Tool is callable by the MCP App view (iframe) via session.mcp.apps.callTool
+ #[serde(rename = "app")]
+ App,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// What triggered the skill invocation: `user-invoked` (explicit user action, such as via a slash command or UI affordance), `agent-invoked` (agent requested the skill), or `context-load` (loaded as part of another context, such as preloading skills configured on a custom agent or subagent)
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum SkillInvokedTrigger {
+ /// Skill invocation requested explicitly by the user, such as via a slash command or UI affordance.
+ #[serde(rename = "user-invoked")]
+ UserInvoked,
+ /// Skill invocation requested by the agent.
+ #[serde(rename = "agent-invoked")]
+ AgentInvoked,
+ /// Skill content loaded as part of another context, such as a configured custom agent or subagent.
+ #[serde(rename = "context-load")]
+ ContextLoad,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
/// Message role: "system" for system prompts, "developer" for developer-injected instructions
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum SystemMessageRole {
@@ -3828,6 +4110,27 @@ pub enum McpServerStatus {
Unknown,
}
+/// Transport mechanism: stdio, http, sse (deprecated), or memory (in-process MCP server)
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum McpServerTransport {
+ /// Server communicates over stdio with a local child process.
+ #[serde(rename = "stdio")]
+ Stdio,
+ /// Server communicates over streamable HTTP.
+ #[serde(rename = "http")]
+ Http,
+ /// Server communicates over Server-Sent Events (deprecated).
+ #[serde(rename = "sse")]
+ Sse,
+ /// Server is backed by an in-memory runtime implementation.
+ #[serde(rename = "memory")]
+ Memory,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
/// Discovery source
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum ExtensionsLoadedExtensionSource {
diff --git a/scripts/codegen/rust.ts b/scripts/codegen/rust.ts
index db3c7792c..e23ff4385 100644
--- a/scripts/codegen/rust.ts
+++ b/scripts/codegen/rust.ts
@@ -195,6 +195,8 @@ function safeRustFieldName(name: string): string {
interface RustCodegenCtx {
/** Accumulated struct definitions. */
structs: string[];
+ /** Accumulated type alias definitions. */
+ typeAliases: string[];
/** Accumulated enum definitions. */
enums: string[];
/** Track generated type names to avoid duplicates. */
@@ -411,6 +413,7 @@ function makeCtx(
): RustCodegenCtx {
return {
structs: [],
+ typeAliases: [],
enums: [],
generatedNames: new Set(),
nonDefaultableTypes: new Set(options.nonDefaultableTypes ?? []),
@@ -456,6 +459,87 @@ function pushRustDoc(lines: string[], text: string | undefined, indent = ""): vo
}
}
+function isRustMapSchema(schema: JSONSchema7): boolean {
+ const hasProperties =
+ !!schema.properties && Object.keys(schema.properties).length > 0;
+ return (
+ (schema.type === "object" || schema.additionalProperties !== undefined) &&
+ !hasProperties &&
+ schema.additionalProperties !== undefined &&
+ schema.additionalProperties !== false
+ );
+}
+
+function rustMapValueType(
+ schema: JSONSchema7,
+ parentTypeName: string,
+ ctx: RustCodegenCtx,
+): string {
+ const additionalProperties = schema.additionalProperties;
+ if (
+ additionalProperties &&
+ typeof additionalProperties === "object" &&
+ Object.keys(additionalProperties as Record).length > 0
+ ) {
+ const valueSchema = additionalProperties as JSONSchema7;
+ if (valueSchema.type === "object" && valueSchema.properties) {
+ const valueName = (valueSchema.title as string) || `${parentTypeName}Value`;
+ emitRustStruct(valueName, valueSchema, ctx);
+ return valueName;
+ }
+ return resolveRustType(valueSchema, parentTypeName, "value", true, ctx);
+ }
+ return "serde_json::Value";
+}
+
+function rustMapType(
+ schema: JSONSchema7,
+ parentTypeName: string,
+ ctx: RustCodegenCtx,
+): string {
+ return `HashMap`;
+}
+
+function emitRustTypeAlias(
+ typeName: string,
+ schema: JSONSchema7,
+ aliasType: string,
+ ctx: RustCodegenCtx,
+ description?: string,
+): void {
+ if (ctx.generatedNames.has(typeName)) return;
+ ctx.generatedNames.add(typeName);
+
+ const lines: string[] = [];
+ pushRustDoc(lines, description || schema.description);
+ pushRustExperimentalDocs(
+ lines,
+ isSchemaExperimental(schema) || ctx.experimentalTypeNames.has(typeName),
+ );
+ if (isSchemaDeprecated(schema)) {
+ lines.push(...rustDeprecatedAttributes());
+ }
+ const aliasVis = isSchemaInternal(schema) ? "pub(crate)" : "pub";
+ lines.push(`${aliasVis} type ${typeName} = ${aliasType};`);
+ ctx.typeAliases.push(lines.join("\n"));
+}
+
+function emitRustMapAlias(
+ typeName: string,
+ schema: JSONSchema7,
+ ctx: RustCodegenCtx,
+ description?: string,
+): void {
+ if (ctx.generatedNames.has(typeName)) return;
+ emitRustTypeAlias(
+ typeName,
+ schema,
+ rustMapType(schema, typeName, ctx),
+ ctx,
+ description,
+ );
+}
+
function rustRpcResultDescription(
method: RpcMethod,
resultSchema: JSONSchema7 | undefined,
@@ -712,28 +796,8 @@ function resolveRustType(
emitRustStruct(structName, propSchema, ctx);
return wrapOption(structName, isRequired);
}
- if (propSchema.additionalProperties) {
- if (
- typeof propSchema.additionalProperties === "object" &&
- Object.keys(propSchema.additionalProperties as Record)
- .length > 0
- ) {
- const ap = propSchema.additionalProperties as JSONSchema7;
- if (ap.type === "object" && ap.properties) {
- const valueName = (ap.title as string) || `${nestedName}Value`;
- emitRustStruct(valueName, ap, ctx);
- return wrapOption(`HashMap`, isRequired);
- }
- const valueType = resolveRustType(
- ap,
- parentTypeName,
- `${jsonPropName}Value`,
- true,
- ctx,
- );
- return wrapOption(`HashMap`, isRequired);
- }
- return wrapOption("HashMap", isRequired);
+ if (isRustMapSchema(propSchema)) {
+ return wrapOption(rustMapType(propSchema, nestedName, ctx), isRequired);
}
return wrapOption("serde_json::Value", isRequired);
}
@@ -1153,6 +1217,12 @@ export function generateSessionEventsCode(schema: JSONSchema7): string {
out.push("");
}
+ // Supporting type aliases
+ for (const block of ctx.typeAliases) {
+ out.push(block);
+ out.push("");
+ }
+
// Supporting enums
for (const block of ctx.enums) {
out.push(block);
@@ -1393,6 +1463,8 @@ function generateApiTypesCode(
getEnumValueDescriptions(schema),
isSchemaExperimental(schema),
);
+ } else if (isRustMapSchema(schema)) {
+ emitRustMapAlias(name, schema, ctx, schema.description);
} else if (asGeneratedObjectSchema(schema, defCollections)) {
emitRustStruct(
name,
@@ -1453,6 +1525,8 @@ function generateApiTypesCode(
if (resolved) {
if (resolved.enum && Array.isArray(resolved.enum)) {
// Already generated from definitions
+ } else if (isRustMapSchema(resolved)) {
+ emitRustMapAlias(resultName, resolved, ctx, resolved.description);
} else if (isObjectSchema(resolved)) {
emitRustStruct(resultName, resolved, ctx, resolved.description);
}
@@ -1503,6 +1577,11 @@ function generateApiTypesCode(
out.push("");
}
+ for (const block of ctx.typeAliases) {
+ out.push(block);
+ out.push("");
+ }
+
for (const block of ctx.enums) {
out.push(block);
out.push("");
diff --git a/test/harness/package-lock.json b/test/harness/package-lock.json
index 3e29965e5..b3692694a 100644
--- a/test/harness/package-lock.json
+++ b/test/harness/package-lock.json
@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
- "@github/copilot": "^1.0.52-1",
+ "@github/copilot": "^1.0.52-4",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",
@@ -464,9 +464,9 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.52-1.tgz",
- "integrity": "sha512-oz6m/dOpTU+FaCWXqYZj5JkJmRT+/RYcrmtGal39V+gOxTA2Nc9wIeLH1SMwMoOXC9Q6DN6keiY0wqWcHirPVg==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.52-4.tgz",
+ "integrity": "sha512-XoVTkovJZgO2i4izgAvzElqKtTwEkenYJ6vpH1X7LCXrp0YWaiS9bhHDuSawhDE721C8CRXRfq8MZ8SKJWhnxw==",
"dev": true,
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
@@ -476,20 +476,20 @@
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.52-1",
- "@github/copilot-darwin-x64": "1.0.52-1",
- "@github/copilot-linux-arm64": "1.0.52-1",
- "@github/copilot-linux-x64": "1.0.52-1",
- "@github/copilot-linuxmusl-arm64": "1.0.52-1",
- "@github/copilot-linuxmusl-x64": "1.0.52-1",
- "@github/copilot-win32-arm64": "1.0.52-1",
- "@github/copilot-win32-x64": "1.0.52-1"
+ "@github/copilot-darwin-arm64": "1.0.52-4",
+ "@github/copilot-darwin-x64": "1.0.52-4",
+ "@github/copilot-linux-arm64": "1.0.52-4",
+ "@github/copilot-linux-x64": "1.0.52-4",
+ "@github/copilot-linuxmusl-arm64": "1.0.52-4",
+ "@github/copilot-linuxmusl-x64": "1.0.52-4",
+ "@github/copilot-win32-arm64": "1.0.52-4",
+ "@github/copilot-win32-x64": "1.0.52-4"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.52-1.tgz",
- "integrity": "sha512-DWXtC/yItZVtkSQhPyRMEkFwa2mcY2rg2cu/uwJ15L9ReiYvlKYEZQDe1TMqkT+U6+k9KjA2L2HQfXVm14/vTw==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.52-4.tgz",
+ "integrity": "sha512-SGu8mX69aZgbL1/EatAka/AJHOpfxdvh02euHmx0Q4VyvQS8dz++2gVprvaInaUO0i8sjsvniZyqBt1mfWJA/w==",
"cpu": [
"arm64"
],
@@ -504,9 +504,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.52-1.tgz",
- "integrity": "sha512-NFTJkzzlTALMfbj9CDJ7N09PRPTVFq1+71hk+zoNx1uT/pi954liV6tKSaNAihPIXTMQKfJXGwEdjtvACpc8Vg==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.52-4.tgz",
+ "integrity": "sha512-nO1qy+/V6PJzLCPoOCDqeNiC6yAV25lVI813rw+kfTTvIIhY4GoJWVg8FlL/pjul2DR0S0Zw4JBZyHzyECgQ3Q==",
"cpu": [
"x64"
],
@@ -521,9 +521,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.52-1.tgz",
- "integrity": "sha512-CZE29v+RPJClHgVE1rU+RpRWSG8lm48koRZ0taKVopqLRD6NWKjBOwFKYJojk08H8/K+BWr/paM5+R8hEZHxZw==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.52-4.tgz",
+ "integrity": "sha512-a+ukt+y9ZzxOft32i1AZZKTnCsvL9nwSRr2viURn0GPO74j6d4J29xGKBYAymmT1L431ToSWxrVo7wHi4TOxgw==",
"cpu": [
"arm64"
],
@@ -538,9 +538,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.52-1.tgz",
- "integrity": "sha512-tJhLQV70TJLq3hPXg7P6pHPfE4vaT2nENIXZsHu6fBkOcsSAxX1APSv6Bkyfsiod8EfFHkcG2+n7VXiVg8WqFw==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.52-4.tgz",
+ "integrity": "sha512-em34O2QVZWnqAdionbNhkshzmHxxGUed3tp3IU4OSkJr3yVpDRtbsiOYIx+GT+bVY2P1nyRTcAyrvVrle6uf5A==",
"cpu": [
"x64"
],
@@ -555,9 +555,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-arm64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.52-1.tgz",
- "integrity": "sha512-u24wHsUumldUEPWX/5z5IEuJvixiQEYF82N04P1g65dvOknq+89dpj+GND4Rh3Vr5u13drgj5AJqkJbWB8N+EQ==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.52-4.tgz",
+ "integrity": "sha512-0oofPJD8brQ1EEexvoFpfkv0qTFTwnJs6M6vIp6GWmSDuI0HGsQGhA2GO0yDPlv8g3sLGM2esSeRYkc/iMXliA==",
"cpu": [
"arm64"
],
@@ -572,9 +572,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-x64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.52-1.tgz",
- "integrity": "sha512-wM22FxcHL8NlnesKKQPPvtk4ojqefN7irU5tQcX+IunpD1izVQl7AOXhZyHoQ21zQnN0De8EapxOUc+WnvlxpA==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.52-4.tgz",
+ "integrity": "sha512-uoWj7Uxt8lth5/LpJgNK/oGuacnsZzZ25X2J4sGTNTMGR+xqCRavHoiUzwrs3w1mprnvO18b1TZKocSQNt/wlQ==",
"cpu": [
"x64"
],
@@ -589,9 +589,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.52-1.tgz",
- "integrity": "sha512-ecvfl9N7DPSwpiT2ZNUSXR1ZrSKwpkByOU6VcNphh4RptPZ0iNfyRNLhFCwSfFz+FvB6z2LZi+F7jSzQ3SaT3w==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.52-4.tgz",
+ "integrity": "sha512-aNTWW+HhYjA0ultZywv2c+NDiN47ZVf9RS3vQThYKBF2kxUS/gT482wU9A7hqJYgEsF39s/EAYrZOc2AF9eo3Q==",
"cpu": [
"arm64"
],
@@ -606,9 +606,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.52-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.52-1.tgz",
- "integrity": "sha512-a9Ct7krktP+/pfPdh/K57deYzzmL13e5Tb1pf5E152u4o/5xKzfgroNFUOzotFfFhs1jFhdzKCm3WHNLIvVEHA==",
+ "version": "1.0.52-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.52-4.tgz",
+ "integrity": "sha512-7hMKWcALIFuOlb5NJL6BXbCHrfrXS1ZOqcXg9IQji9yJu9IgsFHXno0tOmnOUUupikCNZLPQAZtMj0C18vabRw==",
"cpu": [
"x64"
],
diff --git a/test/harness/package.json b/test/harness/package.json
index dddf8fa5f..ecad54d89 100644
--- a/test/harness/package.json
+++ b/test/harness/package.json
@@ -11,7 +11,7 @@
"test": "vitest run"
},
"devDependencies": {
- "@github/copilot": "^1.0.52-1",
+ "@github/copilot": "^1.0.52-4",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",