,
+ /// Whether the message was successfully delivered or steered
+ pub sent: bool,
+}
+
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionSkillsListParams {
@@ -3108,6 +3169,18 @@ pub enum PermissionDecisionApproveForLocationApprovalCustomToolKind {
CustomTool,
}
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionDecisionApproveForLocationApprovalExtensionManagementKind {
+ #[serde(rename = "extension-management")]
+ ExtensionManagement,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionDecisionApproveForLocationApprovalExtensionPermissionAccessKind {
+ #[serde(rename = "extension-permission-access")]
+ ExtensionPermissionAccess,
+}
+
/// The approval to persist for this location
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
@@ -3119,6 +3192,10 @@ pub enum PermissionDecisionApproveForLocationApproval {
McpSampling(PermissionDecisionApproveForLocationApprovalMcpSampling),
Memory(PermissionDecisionApproveForLocationApprovalMemory),
CustomTool(PermissionDecisionApproveForLocationApprovalCustomTool),
+ ExtensionManagement(PermissionDecisionApproveForLocationApprovalExtensionManagement),
+ ExtensionPermissionAccess(
+ PermissionDecisionApproveForLocationApprovalExtensionPermissionAccess,
+ ),
}
/// Approved and persisted for this project location
@@ -3170,6 +3247,18 @@ pub enum PermissionDecisionApproveForSessionApprovalCustomToolKind {
CustomTool,
}
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionDecisionApproveForSessionApprovalExtensionManagementKind {
+ #[serde(rename = "extension-management")]
+ ExtensionManagement,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionDecisionApproveForSessionApprovalExtensionPermissionAccessKind {
+ #[serde(rename = "extension-permission-access")]
+ ExtensionPermissionAccess,
+}
+
/// The approval to add as a session-scoped rule
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
@@ -3181,6 +3270,8 @@ pub enum PermissionDecisionApproveForSessionApproval {
McpSampling(PermissionDecisionApproveForSessionApprovalMcpSampling),
Memory(PermissionDecisionApproveForSessionApprovalMemory),
CustomTool(PermissionDecisionApproveForSessionApprovalCustomTool),
+ ExtensionManagement(PermissionDecisionApproveForSessionApprovalExtensionManagement),
+ ExtensionPermissionAccess(PermissionDecisionApproveForSessionApprovalExtensionPermissionAccess),
}
/// Approved and remembered for the rest of the session
@@ -3460,19 +3551,6 @@ pub enum WorkspacesGetWorkspaceResultWorkspaceHostType {
Unknown,
}
-#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
-pub enum WorkspacesGetWorkspaceResultWorkspaceSessionSyncLevel {
- #[serde(rename = "local")]
- Local,
- #[serde(rename = "user")]
- User,
- #[serde(rename = "repo_and_user")]
- RepoAndUser,
- /// Unknown variant for forward compatibility.
- #[serde(other)]
- Unknown,
-}
-
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum SessionWorkspacesGetWorkspaceResultWorkspaceHostType {
#[serde(rename = "github")]
@@ -3483,16 +3561,3 @@ pub enum SessionWorkspacesGetWorkspaceResultWorkspaceHostType {
#[serde(other)]
Unknown,
}
-
-#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
-pub enum SessionWorkspacesGetWorkspaceResultWorkspaceSessionSyncLevel {
- #[serde(rename = "local")]
- Local,
- #[serde(rename = "user")]
- User,
- #[serde(rename = "repo_and_user")]
- RepoAndUser,
- /// Unknown variant for forward compatibility.
- #[serde(other)]
- Unknown,
-}
diff --git a/rust/src/generated/rpc.rs b/rust/src/generated/rpc.rs
index eed4aea2a..ec958708c 100644
--- a/rust/src/generated/rpc.rs
+++ b/rust/src/generated/rpc.rs
@@ -1476,6 +1476,29 @@ impl<'a> SessionRpcTasks<'a> {
.await?;
Ok(serde_json::from_value(_value)?)
}
+
+ /// Wire method: `session.tasks.sendMessage`.
+ ///
+ ///
+ ///
+ /// **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 send_message(
+ &self,
+ params: TasksSendMessageRequest,
+ ) -> 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_TASKS_SENDMESSAGE, Some(wire_params))
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
}
/// `session.tools.*` RPCs.
diff --git a/rust/src/generated/session_events.rs b/rust/src/generated/session_events.rs
index fdcf7a6b4..d27ac5a62 100644
--- a/rust/src/generated/session_events.rs
+++ b/rust/src/generated/session_events.rs
@@ -410,6 +410,9 @@ pub struct SessionStartData {
pub context: Option,
/// Version string of the Copilot application
pub copilot_version: String,
+ /// When set, identifies a parent session whose context this session continues — e.g., a detached headless rem-agent run launched on the parent's interactive shutdown. Telemetry from this session is reported under the parent's session_id.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub detached_from_spawning_parent_session_id: Option,
/// Identifier of the software producing the events (e.g., "copilot-agent")
pub producer: String,
/// Reasoning effort level used for model calls, if applicable (e.g. "low", "medium", "high", "xhigh")
@@ -1786,6 +1789,37 @@ pub struct PermissionRequestHook {
pub tool_name: String,
}
+/// Extension management permission request
+#[derive(Debug, Clone, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct PermissionRequestExtensionManagement {
+ /// Name of the extension being managed
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub extension_name: Option,
+ /// Permission kind discriminator
+ pub kind: PermissionRequestExtensionManagementKind,
+ /// The extension management operation (scaffold, reload)
+ pub operation: String,
+ /// Tool call ID that triggered this permission request
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub tool_call_id: Option,
+}
+
+/// Extension permission access request
+#[derive(Debug, Clone, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct PermissionRequestExtensionPermissionAccess {
+ /// Capabilities the extension is requesting
+ pub capabilities: Vec,
+ /// Name of the extension requesting permission access
+ pub extension_name: String,
+ /// Permission kind discriminator
+ pub kind: PermissionRequestExtensionPermissionAccessKind,
+ /// Tool call ID that triggered this permission request
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub tool_call_id: Option,
+}
+
/// Shell command permission prompt
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -1960,6 +1994,37 @@ pub struct PermissionPromptRequestHook {
pub tool_name: String,
}
+/// Extension management permission prompt
+#[derive(Debug, Clone, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct PermissionPromptRequestExtensionManagement {
+ /// Name of the extension being managed
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub extension_name: Option,
+ /// Prompt kind discriminator
+ pub kind: PermissionPromptRequestExtensionManagementKind,
+ /// The extension management operation (scaffold, reload)
+ pub operation: String,
+ /// Tool call ID that triggered this permission request
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub tool_call_id: Option,
+}
+
+/// Extension permission access prompt
+#[derive(Debug, Clone, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct PermissionPromptRequestExtensionPermissionAccess {
+ /// Capabilities the extension is requesting
+ pub capabilities: Vec,
+ /// Name of the extension requesting permission access
+ pub extension_name: String,
+ /// Prompt kind discriminator
+ pub kind: PermissionPromptRequestExtensionPermissionAccessKind,
+ /// Tool call ID that triggered this permission request
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub tool_call_id: Option,
+}
+
/// Permission request notification requiring client approval with request details
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -2766,6 +2831,20 @@ pub enum PermissionRequestHookKind {
Hook,
}
+/// Permission kind discriminator
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionRequestExtensionManagementKind {
+ #[serde(rename = "extension-management")]
+ ExtensionManagement,
+}
+
+/// Permission kind discriminator
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionRequestExtensionPermissionAccessKind {
+ #[serde(rename = "extension-permission-access")]
+ ExtensionPermissionAccess,
+}
+
/// Details of the permission being requested
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
@@ -2778,6 +2857,8 @@ pub enum PermissionRequest {
Memory(PermissionRequestMemory),
CustomTool(PermissionRequestCustomTool),
Hook(PermissionRequestHook),
+ ExtensionManagement(PermissionRequestExtensionManagement),
+ ExtensionPermissionAccess(PermissionRequestExtensionPermissionAccess),
}
/// Prompt kind discriminator
@@ -2881,6 +2962,20 @@ pub enum PermissionPromptRequestHookKind {
Hook,
}
+/// Prompt kind discriminator
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionPromptRequestExtensionManagementKind {
+ #[serde(rename = "extension-management")]
+ ExtensionManagement,
+}
+
+/// Prompt kind discriminator
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum PermissionPromptRequestExtensionPermissionAccessKind {
+ #[serde(rename = "extension-permission-access")]
+ ExtensionPermissionAccess,
+}
+
/// Derived user-facing permission prompt details for UI consumers
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
@@ -2894,6 +2989,8 @@ pub enum PermissionPromptRequest {
CustomTool(PermissionPromptRequestCustomTool),
Path(PermissionPromptRequestPath),
Hook(PermissionPromptRequestHook),
+ ExtensionManagement(PermissionPromptRequestExtensionManagement),
+ ExtensionPermissionAccess(PermissionPromptRequestExtensionPermissionAccess),
}
/// The permission request was approved
diff --git a/test/harness/package-lock.json b/test/harness/package-lock.json
index d5f77fef7..69a491670 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.44-2",
+ "@github/copilot": "^1.0.44-3",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",
@@ -464,27 +464,27 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.44-2",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.44-2.tgz",
- "integrity": "sha512-MUIR4w+oXjbg1jwUS8B86eMd/bV2gVKZ61a/aEUE4gUrFFpGXO0tNk9OkfLSH5cmlhJY6lzMzb+kKQWoeAbbNQ==",
+ "version": "1.0.44-3",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.44-3.tgz",
+ "integrity": "sha512-hTsNxnmtKDK3ymh+c6LrsXWc9TbbubUHSxPuAKc4CX0d1c9iI1R4ybzS5Ihe+GxlozHIyFANd58gAg3QH3uCkA==",
"dev": true,
"license": "SEE LICENSE IN LICENSE.md",
"bin": {
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.44-2",
- "@github/copilot-darwin-x64": "1.0.44-2",
- "@github/copilot-linux-arm64": "1.0.44-2",
- "@github/copilot-linux-x64": "1.0.44-2",
- "@github/copilot-win32-arm64": "1.0.44-2",
- "@github/copilot-win32-x64": "1.0.44-2"
+ "@github/copilot-darwin-arm64": "1.0.44-3",
+ "@github/copilot-darwin-x64": "1.0.44-3",
+ "@github/copilot-linux-arm64": "1.0.44-3",
+ "@github/copilot-linux-x64": "1.0.44-3",
+ "@github/copilot-win32-arm64": "1.0.44-3",
+ "@github/copilot-win32-x64": "1.0.44-3"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.44-2",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.44-2.tgz",
- "integrity": "sha512-6o/pvew0FZJG+8saG1K/L1pUIvpz4AWkZitiqH36tDfXdXKx/PUQ+zaFg/KPeHNnxtal5OdE/7iyrJwIqm2gPg==",
+ "version": "1.0.44-3",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.44-3.tgz",
+ "integrity": "sha512-59IXG1lGCf0Ni4TjNL6bqBul6G2FPFX2vh6pMnoRVtHvRrtFILIBMNRMNQFrYZo3eXYBqYXwVHu4R8zfELpK6A==",
"cpu": [
"arm64"
],
@@ -499,9 +499,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.44-2",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.44-2.tgz",
- "integrity": "sha512-OMNoLNFYUynB4wiplSh4gtD5zVlvfWMKc0jKQ0oItJLGO8GRL9X0ZB2ONB+7JpVvPidz0Yy4+jU0zWNXEjMM5g==",
+ "version": "1.0.44-3",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.44-3.tgz",
+ "integrity": "sha512-I+aR9rBNzwn3OOd5oIDIpnUCkCtj3mL183Ml1LLUcJ3utxwxKVInckW/Jg36jSD2PhkbNX8gzq0l3dv0td6QYQ==",
"cpu": [
"x64"
],
@@ -516,9 +516,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.44-2",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.44-2.tgz",
- "integrity": "sha512-5WGRADU08hqBTWmQ6JVOYMximzsXGuOdFF4GFRQqfsCR8k4RE8fdPWQJa92BpqMgGWwEVPemq0wB3D4hDM5eWw==",
+ "version": "1.0.44-3",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.44-3.tgz",
+ "integrity": "sha512-Agz4tMiM0hy9zIPPxKF0SSjMZSYuLYoGMe5KbvNEwTrAApLSrSW6k8yhlOTVCiRHEBsfh69We3LCOmc8hX8jVg==",
"cpu": [
"arm64"
],
@@ -533,9 +533,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.44-2",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.44-2.tgz",
- "integrity": "sha512-4ZnA2QxEwgrdCePdS5OjuksEGFpJrXgofuELANCpDSHwR3eTV7PynVyqhG6Et7ktN2KzHk7zf8kvtiWVCOxvFg==",
+ "version": "1.0.44-3",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.44-3.tgz",
+ "integrity": "sha512-Ev5/uZKqSOr6l2tcy9Xqx354tuxo8qE42Cnnd6JynGrvVc1NpzF1Kt5eCzzjxdZiRtPo6AdDXS16oAN8CVxCrg==",
"cpu": [
"x64"
],
@@ -550,9 +550,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.44-2",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.44-2.tgz",
- "integrity": "sha512-klgSdBZblz9O8BRnTh9uk9uO/INQwVeTBagXuJO7MrZ7JCfBVJyFUYky2tKIjFxlwefyhrRZuniqYeOI9fQc+A==",
+ "version": "1.0.44-3",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.44-3.tgz",
+ "integrity": "sha512-bV2JeRRNYTiTfqmCVeXdPpgYe8KY58diJFZdhYSQnQDowjKvRn59K0RBEYDGK8//AjN+NfaGPGikMq3CQm61cA==",
"cpu": [
"arm64"
],
@@ -567,9 +567,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.44-2",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.44-2.tgz",
- "integrity": "sha512-ziq3abdbMCqtAqdiEWWf6cn0whlWss7rC9VMsO/Vx2gjSEVCeJkmIiRiQO45WikheyXyxEmCTAvOwZLQvs+I9g==",
+ "version": "1.0.44-3",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.44-3.tgz",
+ "integrity": "sha512-qR6q16UDC6bIO8cde62z0wwVweH351RzN1KZgMjBqQYUBJw521K8VK7p64XK0tQWoTG8uyCuqqu5djQq/4Ek+g==",
"cpu": [
"x64"
],
diff --git a/test/harness/package.json b/test/harness/package.json
index f4e117606..72e06265e 100644
--- a/test/harness/package.json
+++ b/test/harness/package.json
@@ -11,7 +11,7 @@
"test": "vitest run"
},
"devDependencies": {
- "@github/copilot": "^1.0.44-2",
+ "@github/copilot": "^1.0.44-3",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",
From 38c561c99cc00befb1b9f9a9cb1d1b6b19fb91ae Mon Sep 17 00:00:00 2001
From: Dmytro Struk <13853051+dmytrostruk@users.noreply.github.com>
Date: Fri, 8 May 2026 18:59:18 -0700
Subject: [PATCH 2/2] Align ModelBilling.multiplier optional across SDK public
surfaces
The regenerated wire types now treat `ModelBilling.multiplier` as optional,
matching the upstream schema relaxation. Update the hand-coded public surface
mirrors so each language's stable API can represent an absent multiplier
instead of silently coercing to zero (Go/.NET) or raising at decode time
(Python).
- nodejs/src/types.ts: `multiplier?: number`
- go/types.go: `*float64` with `omitempty`
- dotnet/src/Types.cs: `double?`
- python/copilot/client.py: `float | None = None`; from_dict no longer
raises on absence; to_dict skips serializing None
---
dotnet/src/Types.cs | 2 +-
go/types.go | 2 +-
nodejs/src/types.ts | 2 +-
python/copilot/client.py | 7 ++++---
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/dotnet/src/Types.cs b/dotnet/src/Types.cs
index 18b956f07..bd3ba1b78 100644
--- a/dotnet/src/Types.cs
+++ b/dotnet/src/Types.cs
@@ -2867,7 +2867,7 @@ public class ModelBilling
/// Billing cost multiplier relative to the base model rate.
///
[JsonPropertyName("multiplier")]
- public double Multiplier { get; set; }
+ public double? Multiplier { get; set; }
}
///
diff --git a/go/types.go b/go/types.go
index 19b67dfd6..ee973a069 100644
--- a/go/types.go
+++ b/go/types.go
@@ -1031,7 +1031,7 @@ type ModelPolicy struct {
// ModelBilling contains model billing information
type ModelBilling struct {
- Multiplier float64 `json:"multiplier"`
+ Multiplier *float64 `json:"multiplier,omitempty"`
}
// ModelInfo contains information about an available model
diff --git a/nodejs/src/types.ts b/nodejs/src/types.ts
index 8be0cca8c..7b9348df0 100644
--- a/nodejs/src/types.ts
+++ b/nodejs/src/types.ts
@@ -1842,7 +1842,7 @@ export interface ModelPolicy {
* Model billing information
*/
export interface ModelBilling {
- multiplier: number;
+ multiplier?: number;
}
/**
diff --git a/python/copilot/client.py b/python/copilot/client.py
index 4de7289bd..848af4b92 100644
--- a/python/copilot/client.py
+++ b/python/copilot/client.py
@@ -540,19 +540,20 @@ def to_dict(self) -> dict:
class ModelBilling:
"""Model billing information"""
- multiplier: float
+ multiplier: float | None = None
@staticmethod
def from_dict(obj: Any) -> ModelBilling:
assert isinstance(obj, dict)
multiplier = obj.get("multiplier")
if multiplier is None:
- raise ValueError("Missing required field 'multiplier' in ModelBilling")
+ return ModelBilling()
return ModelBilling(multiplier=float(multiplier))
def to_dict(self) -> dict:
result: dict = {}
- result["multiplier"] = self.multiplier
+ if self.multiplier is not None:
+ result["multiplier"] = self.multiplier
return result