diff --git a/dotnet/src/Generated/SessionEvents.cs b/dotnet/src/Generated/SessionEvents.cs
index fc807bb9c..bc0a86848 100644
--- a/dotnet/src/Generated/SessionEvents.cs
+++ b/dotnet/src/Generated/SessionEvents.cs
@@ -63,6 +63,7 @@ namespace GitHub.Copilot.SDK;
[JsonDerivedType(typeof(SessionCompactionStartEvent), "session.compaction_start")]
[JsonDerivedType(typeof(SessionContextChangedEvent), "session.context_changed")]
[JsonDerivedType(typeof(SessionCustomAgentsUpdatedEvent), "session.custom_agents_updated")]
+[JsonDerivedType(typeof(SessionCustomNotificationEvent), "session.custom_notification")]
[JsonDerivedType(typeof(SessionErrorEvent), "session.error")]
[JsonDerivedType(typeof(SessionExtensionsLoadedEvent), "session.extensions_loaded")]
[JsonDerivedType(typeof(SessionHandoffEvent), "session.handoff")]
@@ -951,6 +952,19 @@ public partial class McpOauthCompletedEvent : SessionEvent
public required McpOauthCompletedData Data { get; set; }
}
+/// Opaque custom notification data. Consumers may branch on source and name, but payload semantics are source-defined.
+/// Represents the session.custom_notification event.
+public partial class SessionCustomNotificationEvent : SessionEvent
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "session.custom_notification";
+
+ /// The session.custom_notification event payload.
+ [JsonPropertyName("data")]
+ public required SessionCustomNotificationData Data { get; set; }
+}
+
/// External tool invocation request for client-side tool execution.
/// Represents the external_tool.requested event.
public partial class ExternalToolRequestedEvent : SessionEvent
@@ -1295,7 +1309,7 @@ public partial class SessionErrorData
[JsonPropertyName("eligibleForAutoSwitch")]
public bool? EligibleForAutoSwitch { get; set; }
- /// Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`).
+ /// Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`). For `errorType: "quota"`, this is the CAPI quota error code (e.g., `"quota_exceeded"`, `"session_quota_exceeded"`, `"billing_not_configured"`).
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("errorCode")]
public string? ErrorCode { get; set; }
@@ -2760,6 +2774,36 @@ public partial class McpOauthCompletedData
public required string RequestId { get; set; }
}
+/// Opaque custom notification data. Consumers may branch on source and name, but payload semantics are source-defined.
+public partial class SessionCustomNotificationData
+{
+ /// Source-defined custom notification name.
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Safe for generated string properties: JSON Schema minLength/maxLength map to string length validation, not reflection over trimmed Count members")]
+ [MinLength(1)]
+ [JsonPropertyName("name")]
+ public required string Name { get; set; }
+
+ /// Source-defined JSON payload for the custom notification.
+ [JsonPropertyName("payload")]
+ public required object Payload { get; set; }
+
+ /// Namespace for the custom notification producer.
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Safe for generated string properties: JSON Schema minLength/maxLength map to string length validation, not reflection over trimmed Count members")]
+ [MinLength(1)]
+ [JsonPropertyName("source")]
+ public required string Source { get; set; }
+
+ /// Optional source-defined string identifiers describing the payload subject.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("subject")]
+ public IDictionary? Subject { get; set; }
+
+ /// Optional source-defined payload schema version.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("version")]
+ public long? Version { get; set; }
+}
+
/// External tool invocation request for client-side tool execution.
public partial class ExternalToolRequestedData
{
@@ -6876,6 +6920,8 @@ public override void Write(Utf8JsonWriter writer, ExtensionsLoadedExtensionStatu
[JsonSerializable(typeof(SessionContextChangedEvent))]
[JsonSerializable(typeof(SessionCustomAgentsUpdatedData))]
[JsonSerializable(typeof(SessionCustomAgentsUpdatedEvent))]
+[JsonSerializable(typeof(SessionCustomNotificationData))]
+[JsonSerializable(typeof(SessionCustomNotificationEvent))]
[JsonSerializable(typeof(SessionErrorData))]
[JsonSerializable(typeof(SessionErrorEvent))]
[JsonSerializable(typeof(SessionEvent))]
diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go
index 91481b733..f114e2382 100644
--- a/go/rpc/zrpc.go
+++ b/go/rpc/zrpc.go
@@ -2645,12 +2645,8 @@ type ServerAccountApi serverApi
// GetQuota calls account.getQuota.
//
// RPC method: account.getQuota.
-func (a *ServerAccountApi) GetQuota(ctx context.Context, params ...*AccountGetQuotaRequest) (*AccountGetQuotaResult, error) {
- var requestParams *AccountGetQuotaRequest
- if len(params) > 0 {
- requestParams = params[0]
- }
- raw, err := a.client.Request("account.getQuota", requestParams)
+func (a *ServerAccountApi) GetQuota(ctx context.Context, params *AccountGetQuotaRequest) (*AccountGetQuotaResult, error) {
+ raw, err := a.client.Request("account.getQuota", params)
if err != nil {
return nil, err
}
@@ -2779,12 +2775,8 @@ type ServerModelsApi serverApi
// List calls models.list.
//
// RPC method: models.list.
-func (a *ServerModelsApi) List(ctx context.Context, params ...*ModelsListRequest) (*ModelList, error) {
- var requestParams *ModelsListRequest
- if len(params) > 0 {
- requestParams = params[0]
- }
- raw, err := a.client.Request("models.list", requestParams)
+func (a *ServerModelsApi) List(ctx context.Context, params *ModelsListRequest) (*ModelList, error) {
+ raw, err := a.client.Request("models.list", params)
if err != nil {
return nil, err
}
diff --git a/go/rpc/zsession_encoding.go b/go/rpc/zsession_encoding.go
index 15ca55139..3e89f210a 100644
--- a/go/rpc/zsession_encoding.go
+++ b/go/rpc/zsession_encoding.go
@@ -269,6 +269,12 @@ func (e *SessionEvent) UnmarshalJSON(data []byte) error {
return err
}
e.Data = &d
+ case SessionEventTypeSessionCustomNotification:
+ var d SessionCustomNotificationData
+ if err := json.Unmarshal(raw.Data, &d); err != nil {
+ return err
+ }
+ e.Data = &d
case SessionEventTypeSessionError:
var d SessionErrorData
if err := json.Unmarshal(raw.Data, &d); err != nil {
@@ -1979,3 +1985,65 @@ func (r *ElicitationCompletedData) UnmarshalJSON(data []byte) error {
r.RequestID = raw.RequestID
return nil
}
+
+func (r CustomNotificationPayload) MarshalJSON() ([]byte, error) {
+ if r.AnyArray != nil {
+ return json.Marshal(r.AnyArray)
+ }
+ if r.AnyMap != nil {
+ return json.Marshal(r.AnyMap)
+ }
+ if r.Bool != nil {
+ return json.Marshal(r.Bool)
+ }
+ if r.Double != nil {
+ return json.Marshal(r.Double)
+ }
+ if r.String != nil {
+ return json.Marshal(r.String)
+ }
+ return []byte("null"), nil
+}
+
+func (r *CustomNotificationPayload) UnmarshalJSON(data []byte) error {
+ if string(data) == "null" {
+ *r = CustomNotificationPayload{}
+ return nil
+ }
+ {
+ var value []any
+ if err := json.Unmarshal(data, &value); err == nil {
+ *r = CustomNotificationPayload{AnyArray: value}
+ return nil
+ }
+ }
+ {
+ var value map[string]any
+ if err := json.Unmarshal(data, &value); err == nil {
+ *r = CustomNotificationPayload{AnyMap: value}
+ return nil
+ }
+ }
+ {
+ var value bool
+ if err := json.Unmarshal(data, &value); err == nil {
+ *r = CustomNotificationPayload{Bool: &value}
+ return nil
+ }
+ }
+ {
+ var value float64
+ if err := json.Unmarshal(data, &value); err == nil {
+ *r = CustomNotificationPayload{Double: &value}
+ return nil
+ }
+ }
+ {
+ var value string
+ if err := json.Unmarshal(data, &value); err == nil {
+ *r = CustomNotificationPayload{String: &value}
+ return nil
+ }
+ }
+ return errors.New("data did not match any union variant for CustomNotificationPayload")
+}
diff --git a/go/rpc/zsession_events.go b/go/rpc/zsession_events.go
index 9d2589d95..f9a38fdbc 100644
--- a/go/rpc/zsession_events.go
+++ b/go/rpc/zsession_events.go
@@ -92,6 +92,7 @@ const (
SessionEventTypeSessionCompactionStart SessionEventType = "session.compaction_start"
SessionEventTypeSessionContextChanged SessionEventType = "session.context_changed"
SessionEventTypeSessionCustomAgentsUpdated SessionEventType = "session.custom_agents_updated"
+ SessionEventTypeSessionCustomNotification SessionEventType = "session.custom_notification"
SessionEventTypeSessionError SessionEventType = "session.error"
SessionEventTypeSessionExtensionsLoaded SessionEventType = "session.extensions_loaded"
SessionEventTypeSessionHandoff SessionEventType = "session.handoff"
@@ -397,7 +398,7 @@ func (*PendingMessagesModifiedData) Type() SessionEventType {
type SessionErrorData struct {
// Only set on `errorType: "rate_limit"`. When `true`, the runtime will follow this error with an `auto_mode_switch.requested` event (or silently switch if `continueOnAutoMode` is enabled). UI clients can use this flag to suppress duplicate rendering of the rate-limit error when they show their own auto-mode-switch prompt.
EligibleForAutoSwitch *bool `json:"eligibleForAutoSwitch,omitempty"`
- // Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`).
+ // Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`). For `errorType: "quota"`, this is the CAPI quota error code (e.g., `"quota_exceeded"`, `"session_quota_exceeded"`, `"billing_not_configured"`).
ErrorCode *string `json:"errorCode,omitempty"`
// Category of error (e.g., "authentication", "authorization", "quota", "rate_limit", "context_limit", "query")
ErrorType string `json:"errorType"`
@@ -614,6 +615,25 @@ type McpOauthRequiredData struct {
func (*McpOauthRequiredData) sessionEventData() {}
func (*McpOauthRequiredData) Type() SessionEventType { return SessionEventTypeMcpOauthRequired }
+// Opaque custom notification data. Consumers may branch on source and name, but payload semantics are source-defined.
+type SessionCustomNotificationData struct {
+ // Source-defined custom notification name
+ Name string `json:"name"`
+ // Source-defined JSON payload for the custom notification
+ Payload CustomNotificationPayload `json:"payload"`
+ // Namespace for the custom notification producer
+ Source string `json:"source"`
+ // Optional source-defined string identifiers describing the payload subject
+ Subject map[string]string `json:"subject,omitempty"`
+ // Optional source-defined payload schema version
+ Version *int64 `json:"version,omitempty"`
+}
+
+func (*SessionCustomNotificationData) sessionEventData() {}
+func (*SessionCustomNotificationData) Type() SessionEventType {
+ return SessionEventTypeSessionCustomNotification
+}
+
// Payload indicating the session is idle with no background agents in flight
type SessionIdleData struct {
// True when the preceding agentic loop was cancelled via abort signal
@@ -1536,6 +1556,15 @@ type CustomAgentsUpdatedAgent struct {
UserInvocable bool `json:"userInvocable"`
}
+// Source-defined JSON payload for the custom notification
+type CustomNotificationPayload struct {
+ AnyArray []any
+ AnyMap map[string]any
+ Bool *bool
+ Double *float64
+ String *string
+}
+
type ElicitationCompletedContent interface {
elicitationCompletedContent()
}
diff --git a/go/zsession_events.go b/go/zsession_events.go
index 828095122..f871aa483 100644
--- a/go/zsession_events.go
+++ b/go/zsession_events.go
@@ -40,6 +40,7 @@ type (
CompactionCompleteCompactionTokensUsedCopilotUsage = rpc.CompactionCompleteCompactionTokensUsedCopilotUsage
CompactionCompleteCompactionTokensUsedCopilotUsageTokenDetail = rpc.CompactionCompleteCompactionTokensUsedCopilotUsageTokenDetail
CustomAgentsUpdatedAgent = rpc.CustomAgentsUpdatedAgent
+ CustomNotificationPayload = rpc.CustomNotificationPayload
ElicitationCompletedAction = rpc.ElicitationCompletedAction
ElicitationCompletedBooleanContent = rpc.ElicitationCompletedBooleanContent
ElicitationCompletedContent = rpc.ElicitationCompletedContent
@@ -139,6 +140,7 @@ type (
SessionCompactionStartData = rpc.SessionCompactionStartData
SessionContextChangedData = rpc.SessionContextChangedData
SessionCustomAgentsUpdatedData = rpc.SessionCustomAgentsUpdatedData
+ SessionCustomNotificationData = rpc.SessionCustomNotificationData
SessionErrorData = rpc.SessionErrorData
SessionEvent = rpc.SessionEvent
SessionEventData = rpc.SessionEventData
@@ -372,6 +374,7 @@ const (
SessionEventTypeSessionCompactionStart = rpc.SessionEventTypeSessionCompactionStart
SessionEventTypeSessionContextChanged = rpc.SessionEventTypeSessionContextChanged
SessionEventTypeSessionCustomAgentsUpdated = rpc.SessionEventTypeSessionCustomAgentsUpdated
+ SessionEventTypeSessionCustomNotification = rpc.SessionEventTypeSessionCustomNotification
SessionEventTypeSessionError = rpc.SessionEventTypeSessionError
SessionEventTypeSessionExtensionsLoaded = rpc.SessionEventTypeSessionExtensionsLoaded
SessionEventTypeSessionHandoff = rpc.SessionEventTypeSessionHandoff
diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json
index 4a45d8f02..4822407aa 100644
--- a/nodejs/package-lock.json
+++ b/nodejs/package-lock.json
@@ -9,7 +9,7 @@
"version": "0.1.8",
"license": "MIT",
"dependencies": {
- "@github/copilot": "^1.0.48-1",
+ "@github/copilot": "^1.0.48",
"vscode-jsonrpc": "^8.2.1",
"zod": "^4.3.6"
},
@@ -663,26 +663,26 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.48-1.tgz",
- "integrity": "sha512-8Y+Lf26h5Qq6ADXQ7wUAEvMil8BXKHDv9omlKXrFCmmAUzk+a36Y+LpvdSUBPxDyf4h/A8gUq6qJ63649a5sWg==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.48.tgz",
+ "integrity": "sha512-U5SzyTEq376UU9A4Sd3TEKz+Y2nRUd90cLO4Hc1otaB8yFSy9Ur2UVGcI2/wCoodL3a39k6WbdgNzFxr0gWFRQ==",
"license": "SEE LICENSE IN LICENSE.md",
"bin": {
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.48-1",
- "@github/copilot-darwin-x64": "1.0.48-1",
- "@github/copilot-linux-arm64": "1.0.48-1",
- "@github/copilot-linux-x64": "1.0.48-1",
- "@github/copilot-win32-arm64": "1.0.48-1",
- "@github/copilot-win32-x64": "1.0.48-1"
+ "@github/copilot-darwin-arm64": "1.0.48",
+ "@github/copilot-darwin-x64": "1.0.48",
+ "@github/copilot-linux-arm64": "1.0.48",
+ "@github/copilot-linux-x64": "1.0.48",
+ "@github/copilot-win32-arm64": "1.0.48",
+ "@github/copilot-win32-x64": "1.0.48"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.48-1.tgz",
- "integrity": "sha512-ZaacHYawrFD22LgfIBpVUqlfj6d6IogVPnyQVXjAWDvZ3JLXWCzX7OpTGJ/BWgU5HJwUkmr0ZyVqBTrfTrdCZQ==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.48.tgz",
+ "integrity": "sha512-82MLoMQwPVVFM8EYssihFxSEPUYtZADE8rMzQ3jG9HgRg2qjQSfnHQS1mKe64dlXswZUK/onw6/8kjnW5I4pPg==",
"cpu": [
"arm64"
],
@@ -696,9 +696,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.48-1.tgz",
- "integrity": "sha512-cHpz8onmXlABNm8jBUON0fUm/7Koe853zHK349qq8mhZkdlNN3zCn0zkZQuzrJZfJbxrjFOV863N0+F3zGBU1w==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.48.tgz",
+ "integrity": "sha512-1VQ5r5F0h8GwboXmZTcutqcJT+iCpPXAF27QqodmpKEvW9aYfG8g9X2kFJOzDZoX+SA3Uaka9qXdYKF2xT6Uog==",
"cpu": [
"x64"
],
@@ -712,9 +712,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.48-1.tgz",
- "integrity": "sha512-UADRnVHBWWza4Py0EUp7XO2712aoFemlpvsKwhnNIe0/o1ttwVeqdOHHeUuH/BUBY/Xx8QG+YB17bNztraiP8Q==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.48.tgz",
+ "integrity": "sha512-PmsGnb0DZlI+Bf53l9HM1PAHHkUcMyB4y8v/7tnC/jDOV5dGF124n0HnDNfJLOLiJGiQGodthIif6QtPaAxpeA==",
"cpu": [
"arm64"
],
@@ -728,9 +728,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.48-1.tgz",
- "integrity": "sha512-FnOTLPwWht7l2UnXxhpVwT+tSPTC9UqBzjhAoC5y68qJ1bQYXE8TG6cm1qsCo3pfwSAyxEhO7leyuslEO2mIYA==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.48.tgz",
+ "integrity": "sha512-b2cc4euSlke9fYHXXsS2EL9UYbctN0h4lZvtAcKUDY+RCnpYAQOVBZK+c1R9dQrtsT6Z/yUv7PuFPSs8qdtc2Q==",
"cpu": [
"x64"
],
@@ -744,9 +744,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.48-1.tgz",
- "integrity": "sha512-FIenlc2v04D7yCgm516piivbMfwpQqQ1gsZG4g2en8WxLQFjVfm2Szlk1NYwzo9K2gBmNc5+zpdTZH6kb7Hsng==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.48.tgz",
+ "integrity": "sha512-VEEOwddtpJ3DTbXGhnK6K8im4ofl9m08q1m/K++sNvWV8wkkOSOQBTiPdyUsuU/TXAoFhb8tZMIJv+6NnMBtMw==",
"cpu": [
"arm64"
],
@@ -760,9 +760,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.48-1.tgz",
- "integrity": "sha512-d47QHwB89rNInhNpZGhh97njorWOmUXdrMExlM/lb5zcuBnH/QmIQHUeL9CJv970Ujs7gPHtwZcPhvZVuKd16A==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.48.tgz",
+ "integrity": "sha512-93BzvXLPHTyy1gWBXQY/IWIHor4IAwZuuo7/obG80/Qa6U0WeaN9slz/FBJvrsgVNrrRfEID5Xm3At+S6Kj67Q==",
"cpu": [
"x64"
],
diff --git a/nodejs/package.json b/nodejs/package.json
index 51b07aeaf..ff90fbad7 100644
--- a/nodejs/package.json
+++ b/nodejs/package.json
@@ -56,7 +56,7 @@
"author": "GitHub",
"license": "MIT",
"dependencies": {
- "@github/copilot": "^1.0.48-1",
+ "@github/copilot": "^1.0.48",
"vscode-jsonrpc": "^8.2.1",
"zod": "^4.3.6"
},
diff --git a/nodejs/samples/package-lock.json b/nodejs/samples/package-lock.json
index 2eff63e9c..4c968bfdd 100644
--- a/nodejs/samples/package-lock.json
+++ b/nodejs/samples/package-lock.json
@@ -18,7 +18,7 @@
"version": "0.1.8",
"license": "MIT",
"dependencies": {
- "@github/copilot": "^1.0.48-1",
+ "@github/copilot": "^1.0.48",
"vscode-jsonrpc": "^8.2.1",
"zod": "^4.3.6"
},
diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts
index 7d702af0c..b6cded9c2 100644
--- a/nodejs/src/generated/rpc.ts
+++ b/nodejs/src/generated/rpc.ts
@@ -2812,7 +2812,7 @@ export function createServerRpc(connection: MessageConnection) {
/**
* Calls `models.list`.
*/
- list: async (params?: ModelsListRequest): Promise =>
+ list: async (params: ModelsListRequest): Promise =>
connection.sendRequest("models.list", params),
},
tools: {
@@ -2826,7 +2826,7 @@ export function createServerRpc(connection: MessageConnection) {
/**
* Calls `account.getQuota`.
*/
- getQuota: async (params?: AccountGetQuotaRequest): Promise =>
+ getQuota: async (params: AccountGetQuotaRequest): Promise =>
connection.sendRequest("account.getQuota", params),
},
mcp: {
diff --git a/nodejs/src/generated/session-events.ts b/nodejs/src/generated/session-events.ts
index 4218d78c2..e90f9e7a3 100644
--- a/nodejs/src/generated/session-events.ts
+++ b/nodejs/src/generated/session-events.ts
@@ -66,6 +66,7 @@ export type SessionEvent =
| SamplingCompletedEvent
| McpOauthRequiredEvent
| McpOauthCompletedEvent
+ | CustomNotificationEvent
| ExternalToolRequestedEvent
| ExternalToolCompletedEvent
| CommandQueuedEvent
@@ -256,6 +257,18 @@ export type ElicitationRequestedMode = "form" | "url";
*/
export type ElicitationCompletedAction = "accept" | "decline" | "cancel";
export type ElicitationCompletedContent = string | number | boolean | string[];
+/**
+ * Source-defined JSON payload for the custom notification
+ */
+export type CustomNotificationPayload =
+ | string
+ | number
+ | boolean
+ | null
+ | unknown[]
+ | {
+ [k: string]: unknown;
+ };
/**
* Connection status: connected, failed, needs-auth, pending, disabled, or not_configured
*/
@@ -517,7 +530,7 @@ export interface ErrorData {
*/
eligibleForAutoSwitch?: boolean;
/**
- * Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`).
+ * Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`). For `errorType: "quota"`, this is the CAPI quota error code (e.g., `"quota_exceeded"`, `"session_quota_exceeded"`, `"billing_not_configured"`).
*/
errorCode?: string;
/**
@@ -4622,6 +4635,52 @@ export interface McpOauthCompletedData {
*/
requestId: string;
}
+export interface CustomNotificationEvent {
+ /**
+ * Sub-agent instance identifier. Absent for events from the root/main agent and session-level events.
+ */
+ agentId?: string;
+ data: CustomNotificationData;
+ ephemeral: true;
+ /**
+ * Unique event identifier (UUID v4), generated when the event is emitted
+ */
+ id: string;
+ /**
+ * ID of the chronologically preceding event in the session, forming a linked chain. Null for the first event.
+ */
+ parentId: string | null;
+ /**
+ * ISO 8601 timestamp when the event was created
+ */
+ timestamp: string;
+ type: "session.custom_notification";
+}
+/**
+ * Opaque custom notification data. Consumers may branch on source and name, but payload semantics are source-defined.
+ */
+export interface CustomNotificationData {
+ /**
+ * Source-defined custom notification name
+ */
+ name: string;
+ payload: CustomNotificationPayload;
+ /**
+ * Namespace for the custom notification producer
+ */
+ source: string;
+ subject?: CustomNotificationSubject;
+ /**
+ * Optional source-defined payload schema version
+ */
+ version?: number;
+}
+/**
+ * Optional source-defined string identifiers describing the payload subject
+ */
+export interface CustomNotificationSubject {
+ [k: string]: string;
+}
export interface ExternalToolRequestedEvent {
/**
* Sub-agent instance identifier. Absent for events from the root/main agent and session-level events.
diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py
index eb1a837a2..ee5583ab6 100644
--- a/python/copilot/generated/rpc.py
+++ b/python/copilot/generated/rpc.py
@@ -7094,9 +7094,9 @@ class ServerModelsApi:
def __init__(self, client: "JsonRpcClient"):
self._client = client
- async def list(self, params: ModelsListRequest | None = None, *, timeout: float | None = None) -> ModelList:
+ async def list(self, params: ModelsListRequest, *, timeout: float | None = None) -> ModelList:
"Calls models.list."
- params_dict = {k: v for k, v in params.to_dict().items() if v is not None} if params is not None else {}
+ params_dict = {k: v for k, v in params.to_dict().items() if v is not None}
return ModelList.from_dict(_patch_model_capabilities(await self._client.request("models.list", params_dict, **_timeout_kwargs(timeout))))
@@ -7114,9 +7114,9 @@ class ServerAccountApi:
def __init__(self, client: "JsonRpcClient"):
self._client = client
- async def get_quota(self, params: AccountGetQuotaRequest | None = None, *, timeout: float | None = None) -> AccountGetQuotaResult:
+ async def get_quota(self, params: AccountGetQuotaRequest, *, timeout: float | None = None) -> AccountGetQuotaResult:
"Calls account.getQuota."
- params_dict = {k: v for k, v in params.to_dict().items() if v is not None} if params is not None else {}
+ params_dict = {k: v for k, v in params.to_dict().items() if v is not None}
return AccountGetQuotaResult.from_dict(await self._client.request("account.getQuota", params_dict, **_timeout_kwargs(timeout)))
diff --git a/python/copilot/generated/session_events.py b/python/copilot/generated/session_events.py
index 947793bda..11142d608 100644
--- a/python/copilot/generated/session_events.py
+++ b/python/copilot/generated/session_events.py
@@ -166,6 +166,7 @@ class SessionEventType(Enum):
SAMPLING_COMPLETED = "sampling.completed"
MCP_OAUTH_REQUIRED = "mcp.oauth_required"
MCP_OAUTH_COMPLETED = "mcp.oauth_completed"
+ SESSION_CUSTOM_NOTIFICATION = "session.custom_notification"
EXTERNAL_TOOL_REQUESTED = "external_tool.requested"
EXTERNAL_TOOL_COMPLETED = "external_tool.completed"
COMMAND_QUEUED = "command.queued"
@@ -2566,6 +2567,43 @@ def to_dict(self) -> dict:
return result
+@dataclass
+class SessionCustomNotificationData:
+ "Opaque custom notification data. Consumers may branch on source and name, but payload semantics are source-defined."
+ name: str
+ payload: Any
+ source: str
+ subject: dict[str, str] | None = None
+ version: int | None = None
+
+ @staticmethod
+ def from_dict(obj: Any) -> "SessionCustomNotificationData":
+ assert isinstance(obj, dict)
+ name = from_str(obj.get("name"))
+ payload = obj.get("payload")
+ source = from_str(obj.get("source"))
+ subject = from_union([from_none, lambda x: from_dict(from_str, x)], obj.get("subject"))
+ version = from_union([from_none, from_int], obj.get("version"))
+ return SessionCustomNotificationData(
+ name=name,
+ payload=payload,
+ source=source,
+ subject=subject,
+ version=version,
+ )
+
+ def to_dict(self) -> dict:
+ result: dict = {}
+ result["name"] = from_str(self.name)
+ result["payload"] = self.payload
+ result["source"] = from_str(self.source)
+ if self.subject is not None:
+ result["subject"] = from_union([from_none, lambda x: from_dict(from_str, x)], self.subject)
+ if self.version is not None:
+ result["version"] = from_union([from_none, to_int], self.version)
+ return result
+
+
@dataclass
class SessionErrorData:
"Error details for timeline display including message and optional diagnostic information"
@@ -4976,7 +5014,7 @@ class WorkspaceFileChangedOperation(Enum):
UPDATE = "update"
-SessionEventData = SessionStartData | SessionResumeData | SessionRemoteSteerableChangedData | SessionErrorData | SessionIdleData | SessionTitleChangedData | SessionScheduleCreatedData | SessionScheduleCancelledData | SessionInfoData | SessionWarningData | SessionModelChangeData | SessionModeChangedData | SessionPlanChangedData | SessionWorkspaceFileChangedData | SessionHandoffData | SessionTruncationData | SessionSnapshotRewindData | SessionShutdownData | SessionContextChangedData | SessionUsageInfoData | SessionCompactionStartData | SessionCompactionCompleteData | SessionTaskCompleteData | UserMessageData | PendingMessagesModifiedData | AssistantTurnStartData | AssistantIntentData | AssistantReasoningData | AssistantReasoningDeltaData | AssistantStreamingDeltaData | AssistantMessageData | AssistantMessageStartData | AssistantMessageDeltaData | AssistantTurnEndData | AssistantUsageData | ModelCallFailureData | AbortData | ToolUserRequestedData | ToolExecutionStartData | ToolExecutionPartialResultData | ToolExecutionProgressData | ToolExecutionCompleteData | SkillInvokedData | SubagentStartedData | SubagentCompletedData | SubagentFailedData | SubagentSelectedData | SubagentDeselectedData | HookStartData | HookEndData | SystemMessageData | SystemNotificationData | PermissionRequestedData | PermissionCompletedData | UserInputRequestedData | UserInputCompletedData | ElicitationRequestedData | ElicitationCompletedData | SamplingRequestedData | SamplingCompletedData | McpOauthRequiredData | McpOauthCompletedData | ExternalToolRequestedData | ExternalToolCompletedData | CommandQueuedData | CommandExecuteData | CommandCompletedData | AutoModeSwitchRequestedData | AutoModeSwitchCompletedData | CommandsChangedData | CapabilitiesChangedData | ExitPlanModeRequestedData | ExitPlanModeCompletedData | SessionToolsUpdatedData | SessionBackgroundTasksChangedData | SessionSkillsLoadedData | SessionCustomAgentsUpdatedData | SessionMcpServersLoadedData | SessionMcpServerStatusChangedData | SessionExtensionsLoadedData | RawSessionEventData | Data
+SessionEventData = SessionStartData | SessionResumeData | SessionRemoteSteerableChangedData | SessionErrorData | SessionIdleData | SessionTitleChangedData | SessionScheduleCreatedData | SessionScheduleCancelledData | SessionInfoData | SessionWarningData | SessionModelChangeData | SessionModeChangedData | SessionPlanChangedData | SessionWorkspaceFileChangedData | SessionHandoffData | SessionTruncationData | SessionSnapshotRewindData | SessionShutdownData | SessionContextChangedData | SessionUsageInfoData | SessionCompactionStartData | SessionCompactionCompleteData | SessionTaskCompleteData | UserMessageData | PendingMessagesModifiedData | AssistantTurnStartData | AssistantIntentData | AssistantReasoningData | AssistantReasoningDeltaData | AssistantStreamingDeltaData | AssistantMessageData | AssistantMessageStartData | AssistantMessageDeltaData | AssistantTurnEndData | AssistantUsageData | ModelCallFailureData | AbortData | ToolUserRequestedData | ToolExecutionStartData | ToolExecutionPartialResultData | ToolExecutionProgressData | ToolExecutionCompleteData | SkillInvokedData | SubagentStartedData | SubagentCompletedData | SubagentFailedData | SubagentSelectedData | SubagentDeselectedData | HookStartData | HookEndData | SystemMessageData | SystemNotificationData | PermissionRequestedData | PermissionCompletedData | UserInputRequestedData | UserInputCompletedData | ElicitationRequestedData | ElicitationCompletedData | SamplingRequestedData | SamplingCompletedData | McpOauthRequiredData | McpOauthCompletedData | SessionCustomNotificationData | ExternalToolRequestedData | ExternalToolCompletedData | CommandQueuedData | CommandExecuteData | CommandCompletedData | AutoModeSwitchRequestedData | AutoModeSwitchCompletedData | CommandsChangedData | CapabilitiesChangedData | ExitPlanModeRequestedData | ExitPlanModeCompletedData | SessionToolsUpdatedData | SessionBackgroundTasksChangedData | SessionSkillsLoadedData | SessionCustomAgentsUpdatedData | SessionMcpServersLoadedData | SessionMcpServerStatusChangedData | SessionExtensionsLoadedData | RawSessionEventData | Data
@dataclass
@@ -5064,6 +5102,7 @@ def from_dict(obj: Any) -> "SessionEvent":
case SessionEventType.SAMPLING_COMPLETED: data = SamplingCompletedData.from_dict(data_obj)
case SessionEventType.MCP_OAUTH_REQUIRED: data = McpOauthRequiredData.from_dict(data_obj)
case SessionEventType.MCP_OAUTH_COMPLETED: data = McpOauthCompletedData.from_dict(data_obj)
+ case SessionEventType.SESSION_CUSTOM_NOTIFICATION: data = SessionCustomNotificationData.from_dict(data_obj)
case SessionEventType.EXTERNAL_TOOL_REQUESTED: data = ExternalToolRequestedData.from_dict(data_obj)
case SessionEventType.EXTERNAL_TOOL_COMPLETED: data = ExternalToolCompletedData.from_dict(data_obj)
case SessionEventType.COMMAND_QUEUED: data = CommandQueuedData.from_dict(data_obj)
diff --git a/python/e2e/test_multi_client_e2e.py b/python/e2e/test_multi_client_e2e.py
index 922ca3279..17b663865 100644
--- a/python/e2e/test_multi_client_e2e.py
+++ b/python/e2e/test_multi_client_e2e.py
@@ -215,7 +215,8 @@ def magic_number(params: SeedParams, invocation: ToolInvocation) -> str:
# Send a prompt that triggers the custom tool
await session1.send("Use the magic_number tool with seed 'hello' and tell me the result")
- response = await get_final_assistant_message(session1)
+ # Use a longer timeout: first multi-client TCP test on Windows CI needs extra time
+ response = await get_final_assistant_message(session1, timeout=30.0)
assert "MAGIC_hello_42" in (response.data.content or "")
# Both clients should have seen the external_tool.requested event
diff --git a/python/e2e/test_rpc_e2e.py b/python/e2e/test_rpc_e2e.py
index c5e9a7b79..50dfecc3b 100644
--- a/python/e2e/test_rpc_e2e.py
+++ b/python/e2e/test_rpc_e2e.py
@@ -4,7 +4,7 @@
from copilot import CopilotClient
from copilot.client import SubprocessConfig
-from copilot.generated.rpc import PingRequest
+from copilot.generated.rpc import ModelsListRequest, PingRequest
from copilot.session import PermissionHandler
from .testharness import CLI_PATH, E2ETestContext
@@ -42,7 +42,7 @@ async def test_should_call_rpc_models_list(self):
await client.stop()
return
- result = await client.rpc.models.list()
+ result = await client.rpc.models.list(ModelsListRequest())
assert result.models is not None
assert isinstance(result.models, list)
diff --git a/python/e2e/test_rpc_server_e2e.py b/python/e2e/test_rpc_server_e2e.py
index ef2e5501d..67efbe733 100644
--- a/python/e2e/test_rpc_server_e2e.py
+++ b/python/e2e/test_rpc_server_e2e.py
@@ -17,6 +17,7 @@
from copilot.generated.rpc import (
AccountGetQuotaRequest,
MCPDiscoverRequest,
+ ModelsListRequest,
PingRequest,
SkillsConfigSetDisabledSkillsRequest,
SkillsDiscoverRequest,
@@ -96,7 +97,7 @@ async def test_should_call_rpc_models_list_with_typed_result(self, authed_ctx: E
client = _make_authed_client(authed_ctx, token)
try:
await client.start()
- result = await client.rpc.models.list()
+ result = await client.rpc.models.list(ModelsListRequest())
assert result.models is not None
assert any(model.id == "claude-sonnet-4.5" for model in result.models)
assert all((model.name or "").strip() for model in result.models)
diff --git a/python/test_rpc_timeout.py b/python/test_rpc_timeout.py
index b6f07caed..17254b08e 100644
--- a/python/test_rpc_timeout.py
+++ b/python/test_rpc_timeout.py
@@ -8,6 +8,7 @@
FleetApi,
FleetStartRequest,
ModeApi,
+ ModelsListRequest,
ModeSetRequest,
PlanApi,
ServerModelsApi,
@@ -117,7 +118,7 @@ async def test_timeout_on_server_no_params_method(self):
client.request = AsyncMock(return_value={"models": []})
api = ServerModelsApi(client)
- await api.list(timeout=45.0)
+ await api.list(ModelsListRequest(), timeout=45.0)
_, kwargs = client.request.call_args
assert kwargs["timeout"] == 45.0
@@ -128,7 +129,7 @@ async def test_default_timeout_on_server_no_params_method(self):
client.request = AsyncMock(return_value={"models": []})
api = ServerModelsApi(client)
- await api.list()
+ await api.list(ModelsListRequest())
_, kwargs = client.request.call_args
assert "timeout" not in kwargs
diff --git a/rust/src/generated/session_events.rs b/rust/src/generated/session_events.rs
index feca17f89..9142dfd40 100644
--- a/rust/src/generated/session_events.rs
+++ b/rust/src/generated/session_events.rs
@@ -133,6 +133,8 @@ pub enum SessionEventType {
McpOauthRequired,
#[serde(rename = "mcp.oauth_completed")]
McpOauthCompleted,
+ #[serde(rename = "session.custom_notification")]
+ SessionCustomNotification,
#[serde(rename = "external_tool.requested")]
ExternalToolRequested,
#[serde(rename = "external_tool.completed")]
@@ -305,6 +307,8 @@ pub enum SessionEventData {
McpOauthRequired(McpOauthRequiredData),
#[serde(rename = "mcp.oauth_completed")]
McpOauthCompleted(McpOauthCompletedData),
+ #[serde(rename = "session.custom_notification")]
+ SessionCustomNotification(SessionCustomNotificationData),
#[serde(rename = "external_tool.requested")]
ExternalToolRequested(ExternalToolRequestedData),
#[serde(rename = "external_tool.completed")]
@@ -479,7 +483,7 @@ pub struct SessionErrorData {
/// Only set on `errorType: "rate_limit"`. When `true`, the runtime will follow this error with an `auto_mode_switch.requested` event (or silently switch if `continueOnAutoMode` is enabled). UI clients can use this flag to suppress duplicate rendering of the rate-limit error when they show their own auto-mode-switch prompt.
#[serde(skip_serializing_if = "Option::is_none")]
pub eligible_for_auto_switch: Option,
- /// Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`).
+ /// Fine-grained error code from the upstream provider, when available. For `errorType: "rate_limit"`, this is one of the `RateLimitErrorCode` values (e.g., `"user_weekly_rate_limited"`, `"user_global_rate_limited"`, `"rate_limited"`, `"user_model_rate_limited"`, `"integration_rate_limited"`). For `errorType: "quota"`, this is the CAPI quota error code (e.g., `"quota_exceeded"`, `"session_quota_exceeded"`, `"billing_not_configured"`).
#[serde(skip_serializing_if = "Option::is_none")]
pub error_code: Option,
/// Category of error (e.g., "authentication", "authorization", "quota", "rate_limit", "context_limit", "query")
@@ -2516,6 +2520,24 @@ pub struct McpOauthCompletedData {
pub request_id: RequestId,
}
+/// Opaque custom notification data. Consumers may branch on source and name, but payload semantics are source-defined.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct SessionCustomNotificationData {
+ /// Source-defined custom notification name
+ pub name: String,
+ /// Source-defined JSON payload for the custom notification
+ pub payload: serde_json::Value,
+ /// Namespace for the custom notification producer
+ pub source: String,
+ /// Optional source-defined string identifiers describing the payload subject
+ #[serde(default)]
+ pub subject: HashMap,
+ /// Optional source-defined payload schema version
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub version: Option,
+}
+
/// External tool invocation request for client-side tool execution
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
diff --git a/scripts/codegen/rust.ts b/scripts/codegen/rust.ts
index 1a5847033..1fa156219 100644
--- a/scripts/codegen/rust.ts
+++ b/scripts/codegen/rust.ts
@@ -1276,7 +1276,15 @@ function generateApiTypesCode(apiSchema: ApiSchema): string {
schema.description,
);
} else if (getUnionVariants(schema)) {
- tryEmitRustUnion(schema, name, "", ctx);
+ // Unwrap nullable anyOf wrappers (e.g. anyOf: [{ not: {} }, { type: "object" }])
+ // before falling through to struct generation, since tryEmitRustUnion
+ // silently drops these.
+ const nullableInner = getNullableInner(schema);
+ if (nullableInner && isObjectSchema(nullableInner)) {
+ emitRustStruct(name, nullableInner, ctx, nullableInner.description ?? schema.description);
+ } else {
+ tryEmitRustUnion(schema, name, "", ctx);
+ }
}
}
diff --git a/test/harness/package-lock.json b/test/harness/package-lock.json
index e72caae70..60d645230 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.48-1",
+ "@github/copilot": "^1.0.48",
"@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.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.48-1.tgz",
- "integrity": "sha512-8Y+Lf26h5Qq6ADXQ7wUAEvMil8BXKHDv9omlKXrFCmmAUzk+a36Y+LpvdSUBPxDyf4h/A8gUq6qJ63649a5sWg==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.48.tgz",
+ "integrity": "sha512-U5SzyTEq376UU9A4Sd3TEKz+Y2nRUd90cLO4Hc1otaB8yFSy9Ur2UVGcI2/wCoodL3a39k6WbdgNzFxr0gWFRQ==",
"dev": true,
"license": "SEE LICENSE IN LICENSE.md",
"bin": {
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.48-1",
- "@github/copilot-darwin-x64": "1.0.48-1",
- "@github/copilot-linux-arm64": "1.0.48-1",
- "@github/copilot-linux-x64": "1.0.48-1",
- "@github/copilot-win32-arm64": "1.0.48-1",
- "@github/copilot-win32-x64": "1.0.48-1"
+ "@github/copilot-darwin-arm64": "1.0.48",
+ "@github/copilot-darwin-x64": "1.0.48",
+ "@github/copilot-linux-arm64": "1.0.48",
+ "@github/copilot-linux-x64": "1.0.48",
+ "@github/copilot-win32-arm64": "1.0.48",
+ "@github/copilot-win32-x64": "1.0.48"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.48-1.tgz",
- "integrity": "sha512-ZaacHYawrFD22LgfIBpVUqlfj6d6IogVPnyQVXjAWDvZ3JLXWCzX7OpTGJ/BWgU5HJwUkmr0ZyVqBTrfTrdCZQ==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.48.tgz",
+ "integrity": "sha512-82MLoMQwPVVFM8EYssihFxSEPUYtZADE8rMzQ3jG9HgRg2qjQSfnHQS1mKe64dlXswZUK/onw6/8kjnW5I4pPg==",
"cpu": [
"arm64"
],
@@ -499,9 +499,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.48-1.tgz",
- "integrity": "sha512-cHpz8onmXlABNm8jBUON0fUm/7Koe853zHK349qq8mhZkdlNN3zCn0zkZQuzrJZfJbxrjFOV863N0+F3zGBU1w==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.48.tgz",
+ "integrity": "sha512-1VQ5r5F0h8GwboXmZTcutqcJT+iCpPXAF27QqodmpKEvW9aYfG8g9X2kFJOzDZoX+SA3Uaka9qXdYKF2xT6Uog==",
"cpu": [
"x64"
],
@@ -516,9 +516,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.48-1.tgz",
- "integrity": "sha512-UADRnVHBWWza4Py0EUp7XO2712aoFemlpvsKwhnNIe0/o1ttwVeqdOHHeUuH/BUBY/Xx8QG+YB17bNztraiP8Q==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.48.tgz",
+ "integrity": "sha512-PmsGnb0DZlI+Bf53l9HM1PAHHkUcMyB4y8v/7tnC/jDOV5dGF124n0HnDNfJLOLiJGiQGodthIif6QtPaAxpeA==",
"cpu": [
"arm64"
],
@@ -533,9 +533,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.48-1.tgz",
- "integrity": "sha512-FnOTLPwWht7l2UnXxhpVwT+tSPTC9UqBzjhAoC5y68qJ1bQYXE8TG6cm1qsCo3pfwSAyxEhO7leyuslEO2mIYA==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.48.tgz",
+ "integrity": "sha512-b2cc4euSlke9fYHXXsS2EL9UYbctN0h4lZvtAcKUDY+RCnpYAQOVBZK+c1R9dQrtsT6Z/yUv7PuFPSs8qdtc2Q==",
"cpu": [
"x64"
],
@@ -550,9 +550,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.48-1.tgz",
- "integrity": "sha512-FIenlc2v04D7yCgm516piivbMfwpQqQ1gsZG4g2en8WxLQFjVfm2Szlk1NYwzo9K2gBmNc5+zpdTZH6kb7Hsng==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.48.tgz",
+ "integrity": "sha512-VEEOwddtpJ3DTbXGhnK6K8im4ofl9m08q1m/K++sNvWV8wkkOSOQBTiPdyUsuU/TXAoFhb8tZMIJv+6NnMBtMw==",
"cpu": [
"arm64"
],
@@ -567,9 +567,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.48-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.48-1.tgz",
- "integrity": "sha512-d47QHwB89rNInhNpZGhh97njorWOmUXdrMExlM/lb5zcuBnH/QmIQHUeL9CJv970Ujs7gPHtwZcPhvZVuKd16A==",
+ "version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.48.tgz",
+ "integrity": "sha512-93BzvXLPHTyy1gWBXQY/IWIHor4IAwZuuo7/obG80/Qa6U0WeaN9slz/FBJvrsgVNrrRfEID5Xm3At+S6Kj67Q==",
"cpu": [
"x64"
],
diff --git a/test/harness/package.json b/test/harness/package.json
index 0bc06f4ec..40da68d76 100644
--- a/test/harness/package.json
+++ b/test/harness/package.json
@@ -11,7 +11,7 @@
"test": "vitest run"
},
"devDependencies": {
- "@github/copilot": "^1.0.48-1",
+ "@github/copilot": "^1.0.48",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",