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",