diff --git a/dotnet/src/Generated/Rpc.cs b/dotnet/src/Generated/Rpc.cs
index bf73bdfaf..f0fc093ca 100644
--- a/dotnet/src/Generated/Rpc.cs
+++ b/dotnet/src/Generated/Rpc.cs
@@ -11660,6 +11660,10 @@ public sealed class UsageMetricsModelMetricUsage
[Experimental(Diagnostics.Experimental)]
public sealed class UsageMetricsModelMetric
{
+ /// Latest known prompt-cache expiration for this model. A timestamp in the past indicates that the observed cache has expired.
+ [JsonPropertyName("cacheExpiresAt")]
+ public DateTimeOffset? CacheExpiresAt { get; set; }
+
/// Request count and cost metrics for this model.
[JsonPropertyName("requests")]
public UsageMetricsModelMetricRequests Requests { get => field ??= new(); set; }
@@ -23935,8 +23939,10 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureBadRequestKind), TypeInfoPropertyName = "SessionEventsModelCallFailureBadRequestKind")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureData), TypeInfoPropertyName = "SessionEventsModelCallFailureData")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureEvent), TypeInfoPropertyName = "SessionEventsModelCallFailureEvent")]
+[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureKind), TypeInfoPropertyName = "SessionEventsModelCallFailureKind")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureRequestFingerprint), TypeInfoPropertyName = "SessionEventsModelCallFailureRequestFingerprint")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureSource), TypeInfoPropertyName = "SessionEventsModelCallFailureSource")]
+[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureTransport), TypeInfoPropertyName = "SessionEventsModelCallFailureTransport")]
[JsonSerializable(typeof(GitHub.Copilot.OmittedBinaryOmittedReason), TypeInfoPropertyName = "SessionEventsOmittedBinaryOmittedReason")]
[JsonSerializable(typeof(GitHub.Copilot.OmittedBinaryResult), TypeInfoPropertyName = "SessionEventsOmittedBinaryResult")]
[JsonSerializable(typeof(GitHub.Copilot.OmittedBinaryType), TypeInfoPropertyName = "SessionEventsOmittedBinaryType")]
diff --git a/dotnet/src/Generated/SessionEvents.cs b/dotnet/src/Generated/SessionEvents.cs
index 41b87d06f..d83d1b549 100644
--- a/dotnet/src/Generated/SessionEvents.cs
+++ b/dotnet/src/Generated/SessionEvents.cs
@@ -2231,6 +2231,12 @@ public sealed partial class SessionShutdownData
/// Durable session usage checkpoint for reconstructing aggregate accounting on resume.
public sealed partial class SessionUsageCheckpointData
{
+ /// Internal per-model prompt-cache state used to restore expiration tracking on resume.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonInclude]
+ [JsonPropertyName("modelCacheState")]
+ internal UsageCheckpointModelCacheState[]? ModelCacheState { get; set; }
+
/// Session-wide accumulated nano-AI units cost at checkpoint time.
[JsonPropertyName("totalNanoAiu")]
public required double TotalNanoAiu { get; set; }
@@ -2782,6 +2788,11 @@ public sealed partial class AssistantUsageData
[JsonPropertyName("apiEndpoint")]
public AssistantUsageApiEndpoint? ApiEndpoint { get; set; }
+ /// Updated prompt-cache expiration for this model call. Present only when the call establishes or refreshes known cache state.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("cacheExpiresAt")]
+ public DateTimeOffset? CacheExpiresAt { get; set; }
+
/// Number of tokens read from prompt cache.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("cacheReadTokens")]
@@ -2894,6 +2905,11 @@ public sealed partial class ModelCallFailureData
[JsonPropertyName("apiCallId")]
public string? ApiCallId { get; set; }
+ /// API endpoint used for this model call, matching CAPI supported_endpoints vocabulary.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("apiEndpoint")]
+ public AssistantUsageApiEndpoint? ApiEndpoint { get; set; }
+
/// For HTTP 400 failures only: whether the response carried a structured CAPI error envelope (structured_error, a deterministic validation failure) or no error body (bodyless, the transient gateway/proxy signature). Absent for non-400 failures.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("badRequestKind")]
@@ -2920,11 +2936,36 @@ public sealed partial class ModelCallFailureData
[JsonPropertyName("errorType")]
public string? ErrorType { get; set; }
+ /// Whether the failure originated from an API response or the request transport.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("failureKind")]
+ public ModelCallFailureKind? FailureKind { get; set; }
+
/// What initiated this API call (e.g., "sub-agent", "mcp-sampling"); absent for user-initiated calls.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("initiator")]
public string? Initiator { get; set; }
+ /// Whether the session selected Auto mode for the failed call.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("isAuto")]
+ public bool? IsAuto { get; set; }
+
+ /// Whether the failed call used a bring-your-own-key provider.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("isByok")]
+ public bool? IsByok { get; set; }
+
+ /// Effective maximum output-token limit for the failed call.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("maxOutputTokens")]
+ public long? MaxOutputTokens { get; set; }
+
+ /// Effective maximum prompt-token limit for the failed call.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("maxPromptTokens")]
+ public long? MaxPromptTokens { get; set; }
+
/// Model identifier used for the failed API call.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("model")]
@@ -2941,6 +2982,11 @@ public sealed partial class ModelCallFailureData
[JsonPropertyName("quotaSnapshots")]
internal IDictionary? QuotaSnapshots { get; set; }
+ /// Reasoning effort level used for the failed model call, if applicable.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("reasoningEffort")]
+ public string? ReasoningEffort { get; set; }
+
/// Content-free structural summary of the failing request. Contains only counts and shape flags (no prompt content), so it is safe for unrestricted telemetry. Populated only for client-error (4xx) failures.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("requestFingerprint")]
@@ -2959,6 +3005,11 @@ public sealed partial class ModelCallFailureData
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("statusCode")]
public int? StatusCode { get; set; }
+
+ /// Transport used for the failed model call (http or websocket).
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("transport")]
+ public ModelCallFailureTransport? Transport { get; set; }
}
/// Turn abort information including the reason for termination.
@@ -4461,6 +4512,24 @@ public sealed partial class ShutdownTokenDetail
public required long TokenCount { get; set; }
}
+/// Internal prompt-cache expiration state for one model.
+/// Nested data type for UsageCheckpointModelCacheState.
+internal sealed partial class UsageCheckpointModelCacheState
+{
+ /// Latest known prompt-cache expiration.
+ [JsonPropertyName("cacheExpiresAt")]
+ public required DateTimeOffset CacheExpiresAt { get; set; }
+
+ /// Retained cache lifetime in seconds, used to refresh expiration after a cache read.
+ [JsonInclude]
+ [JsonPropertyName("cacheTtlSeconds")]
+ internal required long CacheTtlSeconds { get; set; }
+
+ /// Model identifier associated with this cache state.
+ [JsonPropertyName("modelId")]
+ public required string ModelId { get; set; }
+}
+
/// Token usage detail for a single billing category.
/// Nested data type for CompactionCompleteCompactionTokensUsedCopilotUsageTokenDetail.
public sealed partial class CompactionCompleteCompactionTokensUsedCopilotUsageTokenDetail
@@ -9234,6 +9303,67 @@ public override void Write(Utf8JsonWriter writer, ModelCallFailureBadRequestKind
}
}
+/// Boundary that produced a model call failure.
+[JsonConverter(typeof(Converter))]
+[DebuggerDisplay("{Value,nq}")]
+public readonly struct ModelCallFailureKind : IEquatable
+{
+ private readonly string? _value;
+
+ /// Initializes a new instance of the struct.
+ /// The value to associate with this .
+ [JsonConstructor]
+ public ModelCallFailureKind(string value)
+ {
+ ArgumentException.ThrowIfNullOrWhiteSpace(value);
+ _value = value;
+ }
+
+ /// Gets the value associated with this .
+ public string Value => _value ?? string.Empty;
+
+ /// The provider returned an API error response.
+ public static ModelCallFailureKind Api { get; } = new("api");
+
+ /// The request transport failed before a usable API response completed.
+ public static ModelCallFailureKind Transport { get; } = new("transport");
+
+ /// Returns a value indicating whether two instances are equivalent.
+ public static bool operator ==(ModelCallFailureKind left, ModelCallFailureKind right) => left.Equals(right);
+
+ /// Returns a value indicating whether two instances are not equivalent.
+ public static bool operator !=(ModelCallFailureKind left, ModelCallFailureKind right) => !(left == right);
+
+ ///
+ public override bool Equals(object? obj) => obj is ModelCallFailureKind other && Equals(other);
+
+ ///
+ public bool Equals(ModelCallFailureKind other) => string.Equals(Value, other.Value, StringComparison.OrdinalIgnoreCase);
+
+ ///
+ public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(Value);
+
+ ///
+ public override string ToString() => Value;
+
+ /// Provides a for serializing instances.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public sealed class Converter : JsonConverter
+ {
+ ///
+ public override ModelCallFailureKind Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert));
+ }
+
+ ///
+ public override void Write(Utf8JsonWriter writer, ModelCallFailureKind value, JsonSerializerOptions options)
+ {
+ GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ModelCallFailureKind));
+ }
+ }
+}
+
/// Where the failed model call originated.
[JsonConverter(typeof(Converter))]
[DebuggerDisplay("{Value,nq}")]
@@ -9298,6 +9428,67 @@ public override void Write(Utf8JsonWriter writer, ModelCallFailureSource value,
}
}
+/// Transport used for a failed model call.
+[JsonConverter(typeof(Converter))]
+[DebuggerDisplay("{Value,nq}")]
+public readonly struct ModelCallFailureTransport : IEquatable
+{
+ private readonly string? _value;
+
+ /// Initializes a new instance of the struct.
+ /// The value to associate with this .
+ [JsonConstructor]
+ public ModelCallFailureTransport(string value)
+ {
+ ArgumentException.ThrowIfNullOrWhiteSpace(value);
+ _value = value;
+ }
+
+ /// Gets the value associated with this .
+ public string Value => _value ?? string.Empty;
+
+ /// HTTP transport, including SSE streams.
+ public static ModelCallFailureTransport Http { get; } = new("http");
+
+ /// WebSocket transport.
+ public static ModelCallFailureTransport Websocket { get; } = new("websocket");
+
+ /// Returns a value indicating whether two instances are equivalent.
+ public static bool operator ==(ModelCallFailureTransport left, ModelCallFailureTransport right) => left.Equals(right);
+
+ /// Returns a value indicating whether two instances are not equivalent.
+ public static bool operator !=(ModelCallFailureTransport left, ModelCallFailureTransport right) => !(left == right);
+
+ ///
+ public override bool Equals(object? obj) => obj is ModelCallFailureTransport other && Equals(other);
+
+ ///
+ public bool Equals(ModelCallFailureTransport other) => string.Equals(Value, other.Value, StringComparison.OrdinalIgnoreCase);
+
+ ///
+ public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(Value);
+
+ ///
+ public override string ToString() => Value;
+
+ /// Provides a for serializing instances.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public sealed class Converter : JsonConverter
+ {
+ ///
+ public override ModelCallFailureTransport Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert));
+ }
+
+ ///
+ public override void Write(Utf8JsonWriter writer, ModelCallFailureTransport value, JsonSerializerOptions options)
+ {
+ GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ModelCallFailureTransport));
+ }
+ }
+}
+
/// Finite reason code describing why the current turn was aborted.
[JsonConverter(typeof(Converter))]
[DebuggerDisplay("{Value,nq}")]
@@ -11717,6 +11908,7 @@ public override void Write(Utf8JsonWriter writer, ExtensionsLoadedExtensionStatu
[JsonSerializable(typeof(ToolExecutionStartToolDescriptionMetaUI))]
[JsonSerializable(typeof(ToolUserRequestedData))]
[JsonSerializable(typeof(ToolUserRequestedEvent))]
+[JsonSerializable(typeof(UsageCheckpointModelCacheState))]
[JsonSerializable(typeof(UserInputCompletedData))]
[JsonSerializable(typeof(UserInputCompletedEvent))]
[JsonSerializable(typeof(UserInputRequestedData))]
diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go
index 30ae6ff27..479db143d 100644
--- a/go/rpc/zrpc.go
+++ b/go/rpc/zrpc.go
@@ -10445,6 +10445,9 @@ type UsageMetricsCodeChanges struct {
// Experimental: UsageMetricsModelMetric is part of an experimental API and may change or be
// removed.
type UsageMetricsModelMetric struct {
+ // Latest known prompt-cache expiration for this model. A timestamp in the past indicates
+ // that the observed cache has expired.
+ CacheExpiresAt *time.Time `json:"cacheExpiresAt,omitempty"`
// Request count and cost metrics for this model
Requests UsageMetricsModelMetricRequests `json:"requests"`
// Token count details per type
@@ -11440,6 +11443,9 @@ const (
HookTypeSubagentStop HookType = "subagentStop"
// Runs after the user submits a prompt.
HookTypeUserPromptSubmitted HookType = "userPromptSubmitted"
+ // Runs after the runtime transforms the submitted prompt for the model, before it is added
+ // to session history.
+ HookTypeUserPromptTransformed HookType = "userPromptTransformed"
)
// Constant value. Always "github".
diff --git a/go/rpc/zsession_events.go b/go/rpc/zsession_events.go
index ec211132d..68fd713eb 100644
--- a/go/rpc/zsession_events.go
+++ b/go/rpc/zsession_events.go
@@ -501,6 +501,9 @@ func (*SessionCanvasRemovedData) Type() SessionEventType { return SessionEventTy
// Durable session usage checkpoint for reconstructing aggregate accounting on resume
type SessionUsageCheckpointData struct {
+ // Internal per-model prompt-cache state used to restore expiration tracking on resume
+ // Internal: ModelCacheState is part of the SDK's internal API surface and is not intended for external use.
+ ModelCacheState []UsageCheckpointModelCacheState `json:"modelCacheState,omitzero"`
// Session-wide accumulated nano-AI units cost at checkpoint time
TotalNanoAiu float64 `json:"totalNanoAiu"`
// Total number of premium API requests used at checkpoint time
@@ -689,6 +692,8 @@ func (*ExternalToolRequestedData) Type() SessionEventType {
type ModelCallFailureData struct {
// Completion ID from the model provider (e.g., chatcmpl-abc123)
APICallID *string `json:"apiCallId,omitempty"`
+ // API endpoint used for this model call, matching CAPI supported_endpoints vocabulary
+ APIEndpoint *AssistantUsageAPIEndpoint `json:"apiEndpoint,omitempty"`
// For HTTP 400 failures only: whether the response carried a structured CAPI error envelope (structured_error, a deterministic validation failure) or no error body (bodyless, the transient gateway/proxy signature). Absent for non-400 failures.
BadRequestKind *ModelCallFailureBadRequestKind `json:"badRequestKind,omitempty"`
// Duration of the failed API call in milliseconds
@@ -699,8 +704,18 @@ type ModelCallFailureData struct {
ErrorMessage *string `json:"errorMessage,omitempty"`
// For HTTP 400 failures only: the `type` from the CAPI error envelope (e.g. 'websocket_error'), a coarser companion to errorCode for envelopes that carry no code. Raw server-controlled string, emitted only through restricted telemetry. Absent for bodyless or non-400 failures.
ErrorType *string `json:"errorType,omitempty"`
+ // Whether the failure originated from an API response or the request transport
+ FailureKind *ModelCallFailureKind `json:"failureKind,omitempty"`
// What initiated this API call (e.g., "sub-agent", "mcp-sampling"); absent for user-initiated calls
Initiator *string `json:"initiator,omitempty"`
+ // Whether the session selected Auto mode for the failed call
+ IsAuto *bool `json:"isAuto,omitempty"`
+ // Whether the failed call used a bring-your-own-key provider
+ IsByok *bool `json:"isByok,omitempty"`
+ // Effective maximum output-token limit for the failed call
+ MaxOutputTokens *int64 `json:"maxOutputTokens,omitempty"`
+ // Effective maximum prompt-token limit for the failed call
+ MaxPromptTokens *int64 `json:"maxPromptTokens,omitempty"`
// Model identifier used for the failed API call
Model *string `json:"model,omitempty"`
// GitHub request tracing ID (x-github-request-id header) for server-side log correlation
@@ -708,6 +723,8 @@ type ModelCallFailureData struct {
// Per-quota usage snapshots parsed from the failed response's quota headers, keyed by quota identifier. Present when the error response carried quota headers (e.g. a 402 once the additional spend limit is reached) so the UI can refresh the quota display on failure.
// Internal: QuotaSnapshots is part of the SDK's internal API surface and is not intended for external use.
QuotaSnapshots map[string]AssistantUsageQuotaSnapshot `json:"quotaSnapshots,omitzero"`
+ // Reasoning effort level used for the failed model call, if applicable
+ ReasoningEffort *string `json:"reasoningEffort,omitempty"`
// Content-free structural summary of the failing request. Contains only counts and shape flags (no prompt content), so it is safe for unrestricted telemetry. Populated only for client-error (4xx) failures.
RequestFingerprint *ModelCallFailureRequestFingerprint `json:"requestFingerprint,omitempty"`
// Copilot service request ID (x-copilot-service-request-id header) for CAPI log correlation
@@ -716,6 +733,8 @@ type ModelCallFailureData struct {
Source ModelCallFailureSource `json:"source"`
// HTTP status code from the failed request
StatusCode *int32 `json:"statusCode,omitempty"`
+ // Transport used for the failed model call (http or websocket)
+ Transport *ModelCallFailureTransport `json:"transport,omitempty"`
}
func (*ModelCallFailureData) sessionEventData() {}
@@ -772,6 +791,8 @@ type AssistantUsageData struct {
APICallID *string `json:"apiCallId,omitempty"`
// API endpoint used for this model call, matching CAPI supported_endpoints vocabulary
APIEndpoint *AssistantUsageAPIEndpoint `json:"apiEndpoint,omitempty"`
+ // Updated prompt-cache expiration for this model call. Present only when the call establishes or refreshes known cache state.
+ CacheExpiresAt *time.Time `json:"cacheExpiresAt,omitempty"`
// Number of tokens read from prompt cache
CacheReadTokens *int64 `json:"cacheReadTokens,omitempty"`
// Number of tokens written to prompt cache
@@ -3670,6 +3691,18 @@ type ToolExecutionStartToolDescriptionMetaUI struct {
Visibility []ToolExecutionStartToolDescriptionMetaUIVisibility `json:"visibility,omitzero"`
}
+// Internal prompt-cache expiration state for one model
+// Internal: UsageCheckpointModelCacheState is an internal SDK API and is not part of the public surface.
+type UsageCheckpointModelCacheState struct {
+ // Latest known prompt-cache expiration
+ CacheExpiresAt time.Time `json:"cacheExpiresAt"`
+ // Retained cache lifetime in seconds, used to refresh expiration after a cache read
+ // Internal: CacheTtlSeconds is part of the SDK's internal API surface and is not intended for external use.
+ CacheTtlSeconds int64 `json:"cacheTtlSeconds"`
+ // Model identifier associated with this cache state
+ ModelID string `json:"modelId"`
+}
+
// Working directory and git context at session start
type WorkingDirectoryContext struct {
// Base commit of current git branch at session start time
@@ -3994,6 +4027,16 @@ const (
ModelCallFailureBadRequestKindStructuredError ModelCallFailureBadRequestKind = "structured_error"
)
+// Boundary that produced a model call failure
+type ModelCallFailureKind string
+
+const (
+ // The provider returned an API error response.
+ ModelCallFailureKindAPI ModelCallFailureKind = "api"
+ // The request transport failed before a usable API response completed.
+ ModelCallFailureKindTransport ModelCallFailureKind = "transport"
+)
+
// Where the failed model call originated
type ModelCallFailureSource string
@@ -4006,6 +4049,16 @@ const (
ModelCallFailureSourceTopLevel ModelCallFailureSource = "top_level"
)
+// Transport used for a failed model call
+type ModelCallFailureTransport string
+
+const (
+ // HTTP transport, including SSE streams.
+ ModelCallFailureTransportHTTP ModelCallFailureTransport = "http"
+ // WebSocket transport.
+ ModelCallFailureTransportWebsocket ModelCallFailureTransport = "websocket"
+)
+
// Binary result type discriminator. Use "image" for images and "resource" for other binary data.
type OmittedBinaryType string
diff --git a/go/zsession_events.go b/go/zsession_events.go
index b3dd66ef7..2708bff59 100644
--- a/go/zsession_events.go
+++ b/go/zsession_events.go
@@ -136,8 +136,10 @@ type (
MCPToolsListChangedData = rpc.MCPToolsListChangedData
ModelCallFailureBadRequestKind = rpc.ModelCallFailureBadRequestKind
ModelCallFailureData = rpc.ModelCallFailureData
+ ModelCallFailureKind = rpc.ModelCallFailureKind
ModelCallFailureRequestFingerprint = rpc.ModelCallFailureRequestFingerprint
ModelCallFailureSource = rpc.ModelCallFailureSource
+ ModelCallFailureTransport = rpc.ModelCallFailureTransport
OmittedBinaryOmittedReason = rpc.OmittedBinaryOmittedReason
OmittedBinaryResult = rpc.OmittedBinaryResult
OmittedBinaryType = rpc.OmittedBinaryType
@@ -459,9 +461,13 @@ const (
MCPServerTransportStdio = rpc.MCPServerTransportStdio
ModelCallFailureBadRequestKindBodyless = rpc.ModelCallFailureBadRequestKindBodyless
ModelCallFailureBadRequestKindStructuredError = rpc.ModelCallFailureBadRequestKindStructuredError
+ ModelCallFailureKindAPI = rpc.ModelCallFailureKindAPI
+ ModelCallFailureKindTransport = rpc.ModelCallFailureKindTransport
ModelCallFailureSourceMCPSampling = rpc.ModelCallFailureSourceMCPSampling
ModelCallFailureSourceSubagent = rpc.ModelCallFailureSourceSubagent
ModelCallFailureSourceTopLevel = rpc.ModelCallFailureSourceTopLevel
+ ModelCallFailureTransportHTTP = rpc.ModelCallFailureTransportHTTP
+ ModelCallFailureTransportWebsocket = rpc.ModelCallFailureTransportWebsocket
OmittedBinaryOmittedReasonAssetUnavailable = rpc.OmittedBinaryOmittedReasonAssetUnavailable
OmittedBinaryOmittedReasonTooLarge = rpc.OmittedBinaryOmittedReasonTooLarge
OmittedBinaryTypeImage = rpc.OmittedBinaryTypeImage
diff --git a/java/pom.xml b/java/pom.xml
index ac95090b8..e7a44be03 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -86,7 +86,7 @@
DO NOT EDIT MANUALLY. Updated by the update-copilot-dependency
workflow.
-->
- ^1.0.71
+ ^1.0.72-1
diff --git a/java/scripts/codegen/package-lock.json b/java/scripts/codegen/package-lock.json
index 372e3daab..8c88a4055 100644
--- a/java/scripts/codegen/package-lock.json
+++ b/java/scripts/codegen/package-lock.json
@@ -6,7 +6,7 @@
"": {
"name": "copilot-sdk-java-codegen",
"dependencies": {
- "@github/copilot": "^1.0.71",
+ "@github/copilot": "^1.0.72-1",
"json-schema": "^0.4.0",
"tsx": "^4.23.1"
}
@@ -428,9 +428,9 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.71.tgz",
- "integrity": "sha512-F3axBi+sXSLYDJbxCBW36bM6MYKNC2rlyAf3Ivo/MjiHKKJW7j5AmaR1IRYS9Gt8r9mxOwWFM1cJFA+CuLaR8g==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.72-1.tgz",
+ "integrity": "sha512-KZ0d4auTdsvcp47AHLoxFhhuHmwdHi7Eh+3IPV8RHQenUHh4onVsPqBXOjkwAna4XZb6rJHhzq1MBSGAb1d87g==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
"detect-libc": "^2.1.2"
@@ -439,20 +439,20 @@
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.71",
- "@github/copilot-darwin-x64": "1.0.71",
- "@github/copilot-linux-arm64": "1.0.71",
- "@github/copilot-linux-x64": "1.0.71",
- "@github/copilot-linuxmusl-arm64": "1.0.71",
- "@github/copilot-linuxmusl-x64": "1.0.71",
- "@github/copilot-win32-arm64": "1.0.71",
- "@github/copilot-win32-x64": "1.0.71"
+ "@github/copilot-darwin-arm64": "1.0.72-1",
+ "@github/copilot-darwin-x64": "1.0.72-1",
+ "@github/copilot-linux-arm64": "1.0.72-1",
+ "@github/copilot-linux-x64": "1.0.72-1",
+ "@github/copilot-linuxmusl-arm64": "1.0.72-1",
+ "@github/copilot-linuxmusl-x64": "1.0.72-1",
+ "@github/copilot-win32-arm64": "1.0.72-1",
+ "@github/copilot-win32-x64": "1.0.72-1"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.71.tgz",
- "integrity": "sha512-mEWzyqbqRAWgyU7i2uuSRoVPx/TwaFQX0nZmw0bc30aJ0BnO7cy2kYQyCHw8ykmf/tfxT0xauZ6k0BOFmWizzQ==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-n+2rVuMBKE8fxPULh/Cl1Y9PtrnGxOxykYIhRJb/VdjG4NwggO+8xv8/eTDECJFwWf0GM6kM6ZNzSxeTpiPbiw==",
"cpu": [
"arm64"
],
@@ -466,9 +466,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.71.tgz",
- "integrity": "sha512-Md9yEg406OBVBx3w4PeEj62TubulVLBcHleqmCoOoUmPgUxPZotUbrqz3rtbzADbXfrrD7JWvVsbd2UiNL194w==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.72-1.tgz",
+ "integrity": "sha512-RzU9+MVz3nW7ds8FbTc0AA83IZiewSTgFkkW8mN1vJJYNF7JC2Sh7mxKYKmdY5Ha6cQv+Fya+8kaH6CY2Aw7MQ==",
"cpu": [
"x64"
],
@@ -482,9 +482,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.71.tgz",
- "integrity": "sha512-ykLJYOqBj3jRB5IJCDugLClAqbr7DmtTbUjlNY7+Jdq/n6i+d7xUQGclf1IWL5gnxbGQVAf+zkToD+sRM389Kg==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-fGhWn6o2UnVYn+wltRqCLbhC8UWF6ZEzOwZ49Eax8xnIvaOkTKsb/AgahYeugbQTOHi/KiL1MNFL6vOhoeaAlQ==",
"cpu": [
"arm64"
],
@@ -498,9 +498,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.71.tgz",
- "integrity": "sha512-pC0FNHG+BBwZd6yZlM85kkAGN+uJhM6o+THi76N2GnnSxmw7+remb1mvYxdgRVbdCm+LBUIbCKRWJLuMwrfb6A==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.72-1.tgz",
+ "integrity": "sha512-MV6pGq34Pe9h3F8EuYVp45KrO0fDr+bUTwuzZSHXFPkpP0FQ0weuGN/rjzK1X8vU9NNpGX2750SusDWLsgPEZw==",
"cpu": [
"x64"
],
@@ -514,9 +514,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.71.tgz",
- "integrity": "sha512-hBmDljFTjacxqZTasCEy43H8EIzuXB/hHEBBCMFjhB9J00nIxsO6Dh0woTifKpx7knTYZdpTjjca3D0pAoZlUA==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-mumPen/RiMocs+5bGzEP2kS7R3fSYLoWxKqGD+8+9rSeAMRREuUiK0ffIYs0c7qrn1FbC2gB28/f2Ij/BV+JPw==",
"cpu": [
"arm64"
],
@@ -530,9 +530,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.71.tgz",
- "integrity": "sha512-CfTXU8pa5dxRz22xQzoi3TiG1PJo9+WR8PRDiPSdkIBSyPJ1NvX87DJmfXjTgeAfR+wkjt/p0keDCaBBVhNmUA==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.72-1.tgz",
+ "integrity": "sha512-tHTyNlgz2CVQfy97EOc9OlWu2/CGF1yK73nENozdSpCZ4M2q9DGvAJHCvpKHuMfukKZrBT0pwJMI0/N+FIykiQ==",
"cpu": [
"x64"
],
@@ -546,9 +546,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.71.tgz",
- "integrity": "sha512-+HI1DokixXhHUahj06Fw67ZAigBuXKC58BFma4UJOGrQsDgwOSbqeTQHCw6vuymzjKlg3sactfsCUTaefkjscQ==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-sz1eR/gM3ld/bIJq8rO+KbCXvGmHAfSnuHNBLUPmuzguHDlqEXBCuuVTG5CCJ9r6KYpXl3/H9tWTWVI9wexsUQ==",
"cpu": [
"arm64"
],
@@ -562,9 +562,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.71.tgz",
- "integrity": "sha512-02kXOBd9CwBbCaztuf71WYWn+uGapCuiaasomN4tcMH3HBVZ4gi3J0ZUoRcgcS80xh81uQyeBHbnUKzb/RE/9A==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.72-1.tgz",
+ "integrity": "sha512-Cc7V5cpB7hsoGJQB/JgZzyxnV8USSeSNkJqO5QbolB8fn2SKF0QBO8J6Le+2j7E+iLcJnSf/QMYOPUDUUY+cKQ==",
"cpu": [
"x64"
],
diff --git a/java/scripts/codegen/package.json b/java/scripts/codegen/package.json
index 32c609be4..ef8f553fc 100644
--- a/java/scripts/codegen/package.json
+++ b/java/scripts/codegen/package.json
@@ -7,7 +7,7 @@
"generate:java": "tsx java.ts"
},
"dependencies": {
- "@github/copilot": "^1.0.71",
+ "@github/copilot": "^1.0.72-1",
"json-schema": "^0.4.0",
"tsx": "^4.23.1"
}
diff --git a/java/src/generated/java/com/github/copilot/generated/AssistantUsageEvent.java b/java/src/generated/java/com/github/copilot/generated/AssistantUsageEvent.java
index 62cf9cfe8..47bfcbb4c 100644
--- a/java/src/generated/java/com/github/copilot/generated/AssistantUsageEvent.java
+++ b/java/src/generated/java/com/github/copilot/generated/AssistantUsageEvent.java
@@ -10,6 +10,7 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.time.OffsetDateTime;
import java.util.Map;
import javax.annotation.processing.Generated;
@@ -45,6 +46,8 @@ public record AssistantUsageEventData(
@JsonProperty("cacheReadTokens") Long cacheReadTokens,
/** Number of tokens written to prompt cache */
@JsonProperty("cacheWriteTokens") Long cacheWriteTokens,
+ /** Updated prompt-cache expiration for this model call. Present only when the call establishes or refreshes known cache state. */
+ @JsonProperty("cacheExpiresAt") OffsetDateTime cacheExpiresAt,
/** Number of output tokens used for reasoning (e.g., chain-of-thought) */
@JsonProperty("reasoningTokens") Long reasoningTokens,
/** Model multiplier cost for billing purposes */
diff --git a/java/src/generated/java/com/github/copilot/generated/ModelCallFailureEvent.java b/java/src/generated/java/com/github/copilot/generated/ModelCallFailureEvent.java
index 8797477d5..25c011fe3 100644
--- a/java/src/generated/java/com/github/copilot/generated/ModelCallFailureEvent.java
+++ b/java/src/generated/java/com/github/copilot/generated/ModelCallFailureEvent.java
@@ -49,6 +49,22 @@ public record ModelCallFailureEventData(
@JsonProperty("statusCode") Long statusCode,
/** Duration of the failed API call in milliseconds */
@JsonProperty("durationMs") Long durationMs,
+ /** API endpoint used for this model call, matching CAPI supported_endpoints vocabulary */
+ @JsonProperty("apiEndpoint") AssistantUsageApiEndpoint apiEndpoint,
+ /** Transport used for the failed model call (http or websocket) */
+ @JsonProperty("transport") ModelCallFailureTransport transport,
+ /** Whether the failure originated from an API response or the request transport */
+ @JsonProperty("failureKind") ModelCallFailureKind failureKind,
+ /** Effective maximum prompt-token limit for the failed call */
+ @JsonProperty("maxPromptTokens") Long maxPromptTokens,
+ /** Effective maximum output-token limit for the failed call */
+ @JsonProperty("maxOutputTokens") Long maxOutputTokens,
+ /** Whether the failed call used a bring-your-own-key provider */
+ @JsonProperty("isByok") Boolean isByok,
+ /** Whether the session selected Auto mode for the failed call */
+ @JsonProperty("isAuto") Boolean isAuto,
+ /** Reasoning effort level used for the failed model call, if applicable */
+ @JsonProperty("reasoningEffort") String reasoningEffort,
/** Where the failed model call originated */
@JsonProperty("source") ModelCallFailureSource source,
/** Raw provider/runtime error message for restricted telemetry */
diff --git a/java/src/generated/java/com/github/copilot/generated/ModelCallFailureKind.java b/java/src/generated/java/com/github/copilot/generated/ModelCallFailureKind.java
new file mode 100644
index 000000000..917bc270f
--- /dev/null
+++ b/java/src/generated/java/com/github/copilot/generated/ModelCallFailureKind.java
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------------------------------------------*/
+
+// AUTO-GENERATED FILE - DO NOT EDIT
+// Generated from: session-events.schema.json
+
+package com.github.copilot.generated;
+
+import javax.annotation.processing.Generated;
+
+/**
+ * Boundary that produced a model call failure
+ *
+ * @since 1.0.0
+ */
+@javax.annotation.processing.Generated("copilot-sdk-codegen")
+public enum ModelCallFailureKind {
+ /** The {@code api} variant. */
+ API("api"),
+ /** The {@code transport} variant. */
+ TRANSPORT("transport");
+
+ private final String value;
+ ModelCallFailureKind(String value) { this.value = value; }
+ @com.fasterxml.jackson.annotation.JsonValue
+ public String getValue() { return value; }
+ @com.fasterxml.jackson.annotation.JsonCreator
+ public static ModelCallFailureKind fromValue(String value) {
+ for (ModelCallFailureKind v : values()) {
+ if (v.value.equals(value)) return v;
+ }
+ throw new IllegalArgumentException("Unknown ModelCallFailureKind value: " + value);
+ }
+}
diff --git a/java/src/generated/java/com/github/copilot/generated/ModelCallFailureTransport.java b/java/src/generated/java/com/github/copilot/generated/ModelCallFailureTransport.java
new file mode 100644
index 000000000..6f656f837
--- /dev/null
+++ b/java/src/generated/java/com/github/copilot/generated/ModelCallFailureTransport.java
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------------------------------------------*/
+
+// AUTO-GENERATED FILE - DO NOT EDIT
+// Generated from: session-events.schema.json
+
+package com.github.copilot.generated;
+
+import javax.annotation.processing.Generated;
+
+/**
+ * Transport used for a failed model call
+ *
+ * @since 1.0.0
+ */
+@javax.annotation.processing.Generated("copilot-sdk-codegen")
+public enum ModelCallFailureTransport {
+ /** The {@code http} variant. */
+ HTTP("http"),
+ /** The {@code websocket} variant. */
+ WEBSOCKET("websocket");
+
+ private final String value;
+ ModelCallFailureTransport(String value) { this.value = value; }
+ @com.fasterxml.jackson.annotation.JsonValue
+ public String getValue() { return value; }
+ @com.fasterxml.jackson.annotation.JsonCreator
+ public static ModelCallFailureTransport fromValue(String value) {
+ for (ModelCallFailureTransport v : values()) {
+ if (v.value.equals(value)) return v;
+ }
+ throw new IllegalArgumentException("Unknown ModelCallFailureTransport value: " + value);
+ }
+}
diff --git a/java/src/generated/java/com/github/copilot/generated/SessionUsageCheckpointEvent.java b/java/src/generated/java/com/github/copilot/generated/SessionUsageCheckpointEvent.java
index 312cb196b..1a400c013 100644
--- a/java/src/generated/java/com/github/copilot/generated/SessionUsageCheckpointEvent.java
+++ b/java/src/generated/java/com/github/copilot/generated/SessionUsageCheckpointEvent.java
@@ -10,6 +10,7 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
import javax.annotation.processing.Generated;
/**
@@ -37,7 +38,9 @@ public record SessionUsageCheckpointEventData(
/** Session-wide accumulated nano-AI units cost at checkpoint time */
@JsonProperty("totalNanoAiu") Double totalNanoAiu,
/** Total number of premium API requests used at checkpoint time */
- @JsonProperty("totalPremiumRequests") Double totalPremiumRequests
+ @JsonProperty("totalPremiumRequests") Double totalPremiumRequests,
+ /** Internal per-model prompt-cache state used to restore expiration tracking on resume */
+ @JsonProperty("modelCacheState") List modelCacheState
) {
}
}
diff --git a/java/src/generated/java/com/github/copilot/generated/UsageCheckpointModelCacheState.java b/java/src/generated/java/com/github/copilot/generated/UsageCheckpointModelCacheState.java
new file mode 100644
index 000000000..802ac5cef
--- /dev/null
+++ b/java/src/generated/java/com/github/copilot/generated/UsageCheckpointModelCacheState.java
@@ -0,0 +1,32 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------------------------------------------*/
+
+// AUTO-GENERATED FILE - DO NOT EDIT
+// Generated from: session-events.schema.json
+
+package com.github.copilot.generated;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.time.OffsetDateTime;
+import javax.annotation.processing.Generated;
+
+/**
+ * Internal prompt-cache expiration state for one model
+ *
+ * @since 1.0.0
+ */
+@javax.annotation.processing.Generated("copilot-sdk-codegen")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public record UsageCheckpointModelCacheState(
+ /** Model identifier associated with this cache state */
+ @JsonProperty("modelId") String modelId,
+ /** Latest known prompt-cache expiration */
+ @JsonProperty("cacheExpiresAt") OffsetDateTime cacheExpiresAt,
+ /** Retained cache lifetime in seconds, used to refresh expiration after a cache read */
+ @JsonProperty("cacheTtlSeconds") Long cacheTtlSeconds
+) {
+}
diff --git a/java/src/generated/java/com/github/copilot/generated/rpc/HookType.java b/java/src/generated/java/com/github/copilot/generated/rpc/HookType.java
index 006f8a7c1..8d7cd913c 100644
--- a/java/src/generated/java/com/github/copilot/generated/rpc/HookType.java
+++ b/java/src/generated/java/com/github/copilot/generated/rpc/HookType.java
@@ -26,6 +26,8 @@ public enum HookType {
POSTTOOLUSEFAILURE("postToolUseFailure"),
/** The {@code userPromptSubmitted} variant. */
USERPROMPTSUBMITTED("userPromptSubmitted"),
+ /** The {@code userPromptTransformed} variant. */
+ USERPROMPTTRANSFORMED("userPromptTransformed"),
/** The {@code sessionStart} variant. */
SESSIONSTART("sessionStart"),
/** The {@code sessionEnd} variant. */
diff --git a/java/src/generated/java/com/github/copilot/generated/rpc/UsageMetricsModelMetric.java b/java/src/generated/java/com/github/copilot/generated/rpc/UsageMetricsModelMetric.java
index 1b66120cf..ed5f09305 100644
--- a/java/src/generated/java/com/github/copilot/generated/rpc/UsageMetricsModelMetric.java
+++ b/java/src/generated/java/com/github/copilot/generated/rpc/UsageMetricsModelMetric.java
@@ -10,6 +10,7 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.time.OffsetDateTime;
import java.util.Map;
import javax.annotation.processing.Generated;
@@ -26,6 +27,8 @@ public record UsageMetricsModelMetric(
@JsonProperty("requests") UsageMetricsModelMetricRequests requests,
/** Token usage metrics for this model */
@JsonProperty("usage") UsageMetricsModelMetricUsage usage,
+ /** Latest known prompt-cache expiration for this model. A timestamp in the past indicates that the observed cache has expired. */
+ @JsonProperty("cacheExpiresAt") OffsetDateTime cacheExpiresAt,
/** Accumulated nano-AI units cost for this model */
@JsonProperty("totalNanoAiu") Double totalNanoAiu,
/** Token count details per type */
diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json
index 799053c0f..562bc0f38 100644
--- a/nodejs/package-lock.json
+++ b/nodejs/package-lock.json
@@ -9,7 +9,7 @@
"version": "0.0.0-dev",
"license": "MIT",
"dependencies": {
- "@github/copilot": "^1.0.71",
+ "@github/copilot": "^1.0.72-1",
"koffi": "^3.1.0",
"vscode-jsonrpc": "^8.2.1",
"zod": "^4.3.6"
@@ -700,9 +700,9 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.71.tgz",
- "integrity": "sha512-F3axBi+sXSLYDJbxCBW36bM6MYKNC2rlyAf3Ivo/MjiHKKJW7j5AmaR1IRYS9Gt8r9mxOwWFM1cJFA+CuLaR8g==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.72-1.tgz",
+ "integrity": "sha512-KZ0d4auTdsvcp47AHLoxFhhuHmwdHi7Eh+3IPV8RHQenUHh4onVsPqBXOjkwAna4XZb6rJHhzq1MBSGAb1d87g==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
"detect-libc": "^2.1.2"
@@ -711,20 +711,20 @@
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.71",
- "@github/copilot-darwin-x64": "1.0.71",
- "@github/copilot-linux-arm64": "1.0.71",
- "@github/copilot-linux-x64": "1.0.71",
- "@github/copilot-linuxmusl-arm64": "1.0.71",
- "@github/copilot-linuxmusl-x64": "1.0.71",
- "@github/copilot-win32-arm64": "1.0.71",
- "@github/copilot-win32-x64": "1.0.71"
+ "@github/copilot-darwin-arm64": "1.0.72-1",
+ "@github/copilot-darwin-x64": "1.0.72-1",
+ "@github/copilot-linux-arm64": "1.0.72-1",
+ "@github/copilot-linux-x64": "1.0.72-1",
+ "@github/copilot-linuxmusl-arm64": "1.0.72-1",
+ "@github/copilot-linuxmusl-x64": "1.0.72-1",
+ "@github/copilot-win32-arm64": "1.0.72-1",
+ "@github/copilot-win32-x64": "1.0.72-1"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.71.tgz",
- "integrity": "sha512-mEWzyqbqRAWgyU7i2uuSRoVPx/TwaFQX0nZmw0bc30aJ0BnO7cy2kYQyCHw8ykmf/tfxT0xauZ6k0BOFmWizzQ==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-n+2rVuMBKE8fxPULh/Cl1Y9PtrnGxOxykYIhRJb/VdjG4NwggO+8xv8/eTDECJFwWf0GM6kM6ZNzSxeTpiPbiw==",
"cpu": [
"arm64"
],
@@ -738,9 +738,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.71.tgz",
- "integrity": "sha512-Md9yEg406OBVBx3w4PeEj62TubulVLBcHleqmCoOoUmPgUxPZotUbrqz3rtbzADbXfrrD7JWvVsbd2UiNL194w==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.72-1.tgz",
+ "integrity": "sha512-RzU9+MVz3nW7ds8FbTc0AA83IZiewSTgFkkW8mN1vJJYNF7JC2Sh7mxKYKmdY5Ha6cQv+Fya+8kaH6CY2Aw7MQ==",
"cpu": [
"x64"
],
@@ -754,9 +754,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.71.tgz",
- "integrity": "sha512-ykLJYOqBj3jRB5IJCDugLClAqbr7DmtTbUjlNY7+Jdq/n6i+d7xUQGclf1IWL5gnxbGQVAf+zkToD+sRM389Kg==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-fGhWn6o2UnVYn+wltRqCLbhC8UWF6ZEzOwZ49Eax8xnIvaOkTKsb/AgahYeugbQTOHi/KiL1MNFL6vOhoeaAlQ==",
"cpu": [
"arm64"
],
@@ -770,9 +770,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.71.tgz",
- "integrity": "sha512-pC0FNHG+BBwZd6yZlM85kkAGN+uJhM6o+THi76N2GnnSxmw7+remb1mvYxdgRVbdCm+LBUIbCKRWJLuMwrfb6A==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.72-1.tgz",
+ "integrity": "sha512-MV6pGq34Pe9h3F8EuYVp45KrO0fDr+bUTwuzZSHXFPkpP0FQ0weuGN/rjzK1X8vU9NNpGX2750SusDWLsgPEZw==",
"cpu": [
"x64"
],
@@ -786,9 +786,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.71.tgz",
- "integrity": "sha512-hBmDljFTjacxqZTasCEy43H8EIzuXB/hHEBBCMFjhB9J00nIxsO6Dh0woTifKpx7knTYZdpTjjca3D0pAoZlUA==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-mumPen/RiMocs+5bGzEP2kS7R3fSYLoWxKqGD+8+9rSeAMRREuUiK0ffIYs0c7qrn1FbC2gB28/f2Ij/BV+JPw==",
"cpu": [
"arm64"
],
@@ -802,9 +802,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.71.tgz",
- "integrity": "sha512-CfTXU8pa5dxRz22xQzoi3TiG1PJo9+WR8PRDiPSdkIBSyPJ1NvX87DJmfXjTgeAfR+wkjt/p0keDCaBBVhNmUA==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.72-1.tgz",
+ "integrity": "sha512-tHTyNlgz2CVQfy97EOc9OlWu2/CGF1yK73nENozdSpCZ4M2q9DGvAJHCvpKHuMfukKZrBT0pwJMI0/N+FIykiQ==",
"cpu": [
"x64"
],
@@ -818,9 +818,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.71.tgz",
- "integrity": "sha512-+HI1DokixXhHUahj06Fw67ZAigBuXKC58BFma4UJOGrQsDgwOSbqeTQHCw6vuymzjKlg3sactfsCUTaefkjscQ==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-sz1eR/gM3ld/bIJq8rO+KbCXvGmHAfSnuHNBLUPmuzguHDlqEXBCuuVTG5CCJ9r6KYpXl3/H9tWTWVI9wexsUQ==",
"cpu": [
"arm64"
],
@@ -834,9 +834,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.71.tgz",
- "integrity": "sha512-02kXOBd9CwBbCaztuf71WYWn+uGapCuiaasomN4tcMH3HBVZ4gi3J0ZUoRcgcS80xh81uQyeBHbnUKzb/RE/9A==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.72-1.tgz",
+ "integrity": "sha512-Cc7V5cpB7hsoGJQB/JgZzyxnV8USSeSNkJqO5QbolB8fn2SKF0QBO8J6Le+2j7E+iLcJnSf/QMYOPUDUUY+cKQ==",
"cpu": [
"x64"
],
diff --git a/nodejs/package.json b/nodejs/package.json
index 4f588640a..af3ddcd13 100644
--- a/nodejs/package.json
+++ b/nodejs/package.json
@@ -56,7 +56,7 @@
"author": "GitHub",
"license": "MIT",
"dependencies": {
- "@github/copilot": "^1.0.71",
+ "@github/copilot": "^1.0.72-1",
"koffi": "^3.1.0",
"vscode-jsonrpc": "^8.2.1",
"zod": "^4.3.6"
diff --git a/nodejs/samples/package-lock.json b/nodejs/samples/package-lock.json
index 89c74c153..4154530fb 100644
--- a/nodejs/samples/package-lock.json
+++ b/nodejs/samples/package-lock.json
@@ -18,7 +18,7 @@
"version": "0.0.0-dev",
"license": "MIT",
"dependencies": {
- "@github/copilot": "^1.0.71",
+ "@github/copilot": "^1.0.72-1",
"koffi": "^3.1.0",
"vscode-jsonrpc": "^8.2.1",
"zod": "^4.3.6"
diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts
index 255a769d5..39c15a6e0 100644
--- a/nodejs/src/generated/rpc.ts
+++ b/nodejs/src/generated/rpc.ts
@@ -540,6 +540,8 @@ export type HookType =
| "postToolUseFailure"
/** Runs after the user submits a prompt. */
| "userPromptSubmitted"
+ /** Runs after the runtime transforms the submitted prompt for the model, before it is added to session history. */
+ | "userPromptTransformed"
/** Runs when a session starts. */
| "sessionStart"
/** Runs when a session ends. */
@@ -15346,6 +15348,10 @@ export interface UsageMetricsCodeChanges {
export interface UsageMetricsModelMetric {
requests: UsageMetricsModelMetricRequests;
usage: UsageMetricsModelMetricUsage;
+ /**
+ * Latest known prompt-cache expiration for this model. A timestamp in the past indicates that the observed cache has expired.
+ */
+ cacheExpiresAt?: string;
/**
* Accumulated nano-AI units cost for this model
*/
diff --git a/nodejs/src/generated/session-events.ts b/nodejs/src/generated/session-events.ts
index 7581545a8..dae6ae5fb 100644
--- a/nodejs/src/generated/session-events.ts
+++ b/nodejs/src/generated/session-events.ts
@@ -332,6 +332,14 @@ export type ModelCallFailureBadRequestKind =
| "bodyless"
/** The 400 response carried a structured CAPI error envelope (deterministic validation failure). */
| "structured_error";
+/**
+ * Boundary that produced a model call failure
+ */
+export type ModelCallFailureKind =
+ /** The provider returned an API error response. */
+ | "api"
+ /** The request transport failed before a usable API response completed. */
+ | "transport";
/**
* Where the failed model call originated
*/
@@ -342,6 +350,14 @@ export type ModelCallFailureSource =
| "subagent"
/** Model call from MCP sampling. */
| "mcp_sampling";
+/**
+ * Transport used for a failed model call
+ */
+export type ModelCallFailureTransport =
+ /** HTTP transport, including SSE streams. */
+ | "http"
+ /** WebSocket transport. */
+ | "websocket";
/**
* Finite reason code describing why the current turn was aborted
*/
@@ -2155,6 +2171,12 @@ export interface UsageCheckpointEvent {
* Durable session usage checkpoint for reconstructing aggregate accounting on resume
*/
export interface UsageCheckpointData {
+ /**
+ * Internal per-model prompt-cache state used to restore expiration tracking on resume
+ *
+ * @internal
+ */
+ modelCacheState?: UsageCheckpointModelCacheState[];
/**
* Session-wide accumulated nano-AI units cost at checkpoint time
*/
@@ -2166,6 +2188,26 @@ export interface UsageCheckpointData {
*/
totalPremiumRequests?: number;
}
+/**
+ * Internal prompt-cache expiration state for one model
+ */
+/** @internal */
+export interface UsageCheckpointModelCacheState {
+ /**
+ * Latest known prompt-cache expiration
+ */
+ cacheExpiresAt: string;
+ /**
+ * Retained cache lifetime in seconds, used to refresh expiration after a cache read
+ *
+ * @internal
+ */
+ cacheTtlSeconds: number;
+ /**
+ * Model identifier associated with this cache state
+ */
+ modelId: string;
+}
/**
* Session event "session.context_changed". Updated working directory and git context after the change
*/
@@ -3884,6 +3926,10 @@ export interface AssistantUsageData {
*/
apiCallId?: string;
apiEndpoint?: AssistantUsageApiEndpoint;
+ /**
+ * Updated prompt-cache expiration for this model call. Present only when the call establishes or refreshes known cache state.
+ */
+ cacheExpiresAt?: string;
/**
* Number of tokens read from prompt cache
*/
@@ -4111,6 +4157,7 @@ export interface ModelCallFailureData {
* Completion ID from the model provider (e.g., chatcmpl-abc123)
*/
apiCallId?: string;
+ apiEndpoint?: AssistantUsageApiEndpoint;
badRequestKind?: ModelCallFailureBadRequestKind;
/**
* Duration of the failed API call in milliseconds
@@ -4128,10 +4175,27 @@ export interface ModelCallFailureData {
* For HTTP 400 failures only: the `type` from the CAPI error envelope (e.g. 'websocket_error'), a coarser companion to errorCode for envelopes that carry no code. Raw server-controlled string, emitted only through restricted telemetry. Absent for bodyless or non-400 failures.
*/
errorType?: string;
+ failureKind?: ModelCallFailureKind;
/**
* What initiated this API call (e.g., "sub-agent", "mcp-sampling"); absent for user-initiated calls
*/
initiator?: string;
+ /**
+ * Whether the session selected Auto mode for the failed call
+ */
+ isAuto?: boolean;
+ /**
+ * Whether the failed call used a bring-your-own-key provider
+ */
+ isByok?: boolean;
+ /**
+ * Effective maximum output-token limit for the failed call
+ */
+ maxOutputTokens?: number;
+ /**
+ * Effective maximum prompt-token limit for the failed call
+ */
+ maxPromptTokens?: number;
/**
* Model identifier used for the failed API call
*/
@@ -4148,6 +4212,10 @@ export interface ModelCallFailureData {
quotaSnapshots?: {
[k: string]: AssistantUsageQuotaSnapshot | undefined;
};
+ /**
+ * Reasoning effort level used for the failed model call, if applicable
+ */
+ reasoningEffort?: string;
requestFingerprint?: ModelCallFailureRequestFingerprint;
/**
* Copilot service request ID (x-copilot-service-request-id header) for CAPI log correlation
@@ -4158,6 +4226,7 @@ export interface ModelCallFailureData {
* HTTP status code from the failed request
*/
statusCode?: number;
+ transport?: ModelCallFailureTransport;
}
/**
* Content-free structural summary of the failing request for diagnosing malformed 4xx calls
diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py
index 828eaa3ce..32f84ab7f 100644
--- a/python/copilot/generated/rpc.py
+++ b/python/copilot/generated/rpc.py
@@ -2466,6 +2466,7 @@ class _HookType(Enum):
SUBAGENT_START = "subagentStart"
SUBAGENT_STOP = "subagentStop"
USER_PROMPT_SUBMITTED = "userPromptSubmitted"
+ USER_PROMPT_TRANSFORMED = "userPromptTransformed"
# Internal: this type is an internal SDK API and is not part of the public surface.
@dataclass
@@ -17953,6 +17954,10 @@ class UsageMetricsModelMetric:
usage: UsageMetricsModelMetricUsage
"""Token usage metrics for this model"""
+ cache_expires_at: datetime | None = None
+ """Latest known prompt-cache expiration for this model. A timestamp in the past indicates
+ that the observed cache has expired.
+ """
token_details: dict[str, UsageMetricsModelMetricTokenDetail] | None = None
"""Token count details per type"""
@@ -17964,14 +17969,17 @@ def from_dict(obj: Any) -> 'UsageMetricsModelMetric':
assert isinstance(obj, dict)
requests = UsageMetricsModelMetricRequests.from_dict(obj.get("requests"))
usage = UsageMetricsModelMetricUsage.from_dict(obj.get("usage"))
+ cache_expires_at = from_union([from_datetime, from_none], obj.get("cacheExpiresAt"))
token_details = from_union([lambda x: from_dict(UsageMetricsModelMetricTokenDetail.from_dict, x), from_none], obj.get("tokenDetails"))
total_nano_aiu = from_union([from_float, from_none], obj.get("totalNanoAiu"))
- return UsageMetricsModelMetric(requests, usage, token_details, total_nano_aiu)
+ return UsageMetricsModelMetric(requests, usage, cache_expires_at, token_details, total_nano_aiu)
def to_dict(self) -> dict:
result: dict = {}
result["requests"] = to_class(UsageMetricsModelMetricRequests, self.requests)
result["usage"] = to_class(UsageMetricsModelMetricUsage, self.usage)
+ if self.cache_expires_at is not None:
+ result["cacheExpiresAt"] = from_union([lambda x: x.isoformat(), from_none], self.cache_expires_at)
if self.token_details is not None:
result["tokenDetails"] = from_union([lambda x: from_dict(lambda x: to_class(UsageMetricsModelMetricTokenDetail, x), x), from_none], self.token_details)
if self.total_nano_aiu is not None:
diff --git a/python/copilot/generated/session_events.py b/python/copilot/generated/session_events.py
index a7c990e16..583849735 100644
--- a/python/copilot/generated/session_events.py
+++ b/python/copilot/generated/session_events.py
@@ -1640,6 +1640,7 @@ class AssistantUsageData:
model: str
api_call_id: str | None = None
api_endpoint: AssistantUsageApiEndpoint | None = None
+ cache_expires_at: datetime | None = None
cache_read_tokens: int | None = None
cache_write_tokens: int | None = None
content_filter_triggered: bool | None = None
@@ -1668,6 +1669,7 @@ def from_dict(obj: Any) -> "AssistantUsageData":
model = from_str(obj.get("model"))
api_call_id = from_union([from_none, from_str], obj.get("apiCallId"))
api_endpoint = from_union([from_none, lambda x: parse_enum(AssistantUsageApiEndpoint, x)], obj.get("apiEndpoint"))
+ cache_expires_at = from_union([from_none, from_datetime], obj.get("cacheExpiresAt"))
cache_read_tokens = from_union([from_none, from_int], obj.get("cacheReadTokens"))
cache_write_tokens = from_union([from_none, from_int], obj.get("cacheWriteTokens"))
content_filter_triggered = from_union([from_none, from_bool], obj.get("contentFilterTriggered"))
@@ -1690,6 +1692,7 @@ def from_dict(obj: Any) -> "AssistantUsageData":
model=model,
api_call_id=api_call_id,
api_endpoint=api_endpoint,
+ cache_expires_at=cache_expires_at,
cache_read_tokens=cache_read_tokens,
cache_write_tokens=cache_write_tokens,
content_filter_triggered=content_filter_triggered,
@@ -1717,6 +1720,8 @@ def to_dict(self) -> dict:
result["apiCallId"] = from_union([from_none, from_str], self.api_call_id)
if self.api_endpoint is not None:
result["apiEndpoint"] = from_union([from_none, lambda x: to_enum(AssistantUsageApiEndpoint, x)], self.api_endpoint)
+ if self.cache_expires_at is not None:
+ result["cacheExpiresAt"] = from_union([from_none, to_datetime], self.cache_expires_at)
if self.cache_read_tokens is not None:
result["cacheReadTokens"] = from_union([from_none, to_int], self.cache_read_tokens)
if self.cache_write_tokens is not None:
@@ -3862,52 +3867,76 @@ class ModelCallFailureData:
"Failed LLM API call metadata for telemetry"
source: ModelCallFailureSource
api_call_id: str | None = None
+ api_endpoint: AssistantUsageApiEndpoint | None = None
bad_request_kind: ModelCallFailureBadRequestKind | None = None
duration: timedelta | None = None
error_code: str | None = None
error_message: str | None = None
error_type: str | None = None
+ failure_kind: ModelCallFailureKind | None = None
initiator: str | None = None
+ is_auto: bool | None = None
+ is_byok: bool | None = None
+ max_output_tokens: int | None = None
+ max_prompt_tokens: int | None = None
model: str | None = None
provider_call_id: str | None = None
# Internal: this field is an internal SDK API and is not part of the public surface.
_quota_snapshots: dict[str, _AssistantUsageQuotaSnapshot] | None = None
+ reasoning_effort: str | None = None
request_fingerprint: ModelCallFailureRequestFingerprint | None = None
service_request_id: str | None = None
status_code: int | None = None
+ transport: ModelCallFailureTransport | None = None
@staticmethod
def from_dict(obj: Any) -> "ModelCallFailureData":
assert isinstance(obj, dict)
source = parse_enum(ModelCallFailureSource, obj.get("source"))
api_call_id = from_union([from_none, from_str], obj.get("apiCallId"))
+ api_endpoint = from_union([from_none, lambda x: parse_enum(AssistantUsageApiEndpoint, x)], obj.get("apiEndpoint"))
bad_request_kind = from_union([from_none, lambda x: parse_enum(ModelCallFailureBadRequestKind, x)], obj.get("badRequestKind"))
duration = from_union([from_none, from_timedelta], obj.get("durationMs"))
error_code = from_union([from_none, from_str], obj.get("errorCode"))
error_message = from_union([from_none, from_str], obj.get("errorMessage"))
error_type = from_union([from_none, from_str], obj.get("errorType"))
+ failure_kind = from_union([from_none, lambda x: parse_enum(ModelCallFailureKind, x)], obj.get("failureKind"))
initiator = from_union([from_none, from_str], obj.get("initiator"))
+ is_auto = from_union([from_none, from_bool], obj.get("isAuto"))
+ is_byok = from_union([from_none, from_bool], obj.get("isByok"))
+ max_output_tokens = from_union([from_none, from_int], obj.get("maxOutputTokens"))
+ max_prompt_tokens = from_union([from_none, from_int], obj.get("maxPromptTokens"))
model = from_union([from_none, from_str], obj.get("model"))
provider_call_id = from_union([from_none, from_str], obj.get("providerCallId"))
_quota_snapshots = from_union([from_none, lambda x: from_dict(_AssistantUsageQuotaSnapshot.from_dict, x)], obj.get("quotaSnapshots"))
+ reasoning_effort = from_union([from_none, from_str], obj.get("reasoningEffort"))
request_fingerprint = from_union([from_none, ModelCallFailureRequestFingerprint.from_dict], obj.get("requestFingerprint"))
service_request_id = from_union([from_none, from_str], obj.get("serviceRequestId"))
status_code = from_union([from_none, from_int], obj.get("statusCode"))
+ transport = from_union([from_none, lambda x: parse_enum(ModelCallFailureTransport, x)], obj.get("transport"))
return ModelCallFailureData(
source=source,
api_call_id=api_call_id,
+ api_endpoint=api_endpoint,
bad_request_kind=bad_request_kind,
duration=duration,
error_code=error_code,
error_message=error_message,
error_type=error_type,
+ failure_kind=failure_kind,
initiator=initiator,
+ is_auto=is_auto,
+ is_byok=is_byok,
+ max_output_tokens=max_output_tokens,
+ max_prompt_tokens=max_prompt_tokens,
model=model,
provider_call_id=provider_call_id,
_quota_snapshots=_quota_snapshots,
+ reasoning_effort=reasoning_effort,
request_fingerprint=request_fingerprint,
service_request_id=service_request_id,
status_code=status_code,
+ transport=transport,
)
def to_dict(self) -> dict:
@@ -3915,6 +3944,8 @@ def to_dict(self) -> dict:
result["source"] = to_enum(ModelCallFailureSource, self.source)
if self.api_call_id is not None:
result["apiCallId"] = from_union([from_none, from_str], self.api_call_id)
+ if self.api_endpoint is not None:
+ result["apiEndpoint"] = from_union([from_none, lambda x: to_enum(AssistantUsageApiEndpoint, x)], self.api_endpoint)
if self.bad_request_kind is not None:
result["badRequestKind"] = from_union([from_none, lambda x: to_enum(ModelCallFailureBadRequestKind, x)], self.bad_request_kind)
if self.duration is not None:
@@ -3925,20 +3956,34 @@ def to_dict(self) -> dict:
result["errorMessage"] = from_union([from_none, from_str], self.error_message)
if self.error_type is not None:
result["errorType"] = from_union([from_none, from_str], self.error_type)
+ if self.failure_kind is not None:
+ result["failureKind"] = from_union([from_none, lambda x: to_enum(ModelCallFailureKind, x)], self.failure_kind)
if self.initiator is not None:
result["initiator"] = from_union([from_none, from_str], self.initiator)
+ if self.is_auto is not None:
+ result["isAuto"] = from_union([from_none, from_bool], self.is_auto)
+ if self.is_byok is not None:
+ result["isByok"] = from_union([from_none, from_bool], self.is_byok)
+ if self.max_output_tokens is not None:
+ result["maxOutputTokens"] = from_union([from_none, to_int], self.max_output_tokens)
+ if self.max_prompt_tokens is not None:
+ result["maxPromptTokens"] = from_union([from_none, to_int], self.max_prompt_tokens)
if self.model is not None:
result["model"] = from_union([from_none, from_str], self.model)
if self.provider_call_id is not None:
result["providerCallId"] = from_union([from_none, from_str], self.provider_call_id)
if self._quota_snapshots is not None:
result["quotaSnapshots"] = from_union([from_none, lambda x: from_dict(lambda x: to_class(_AssistantUsageQuotaSnapshot, x), x)], self._quota_snapshots)
+ if self.reasoning_effort is not None:
+ result["reasoningEffort"] = from_union([from_none, from_str], self.reasoning_effort)
if self.request_fingerprint is not None:
result["requestFingerprint"] = from_union([from_none, lambda x: to_class(ModelCallFailureRequestFingerprint, x)], self.request_fingerprint)
if self.service_request_id is not None:
result["serviceRequestId"] = from_union([from_none, from_str], self.service_request_id)
if self.status_code is not None:
result["statusCode"] = from_union([from_none, to_int], self.status_code)
+ if self.transport is not None:
+ result["transport"] = from_union([from_none, lambda x: to_enum(ModelCallFailureTransport, x)], self.transport)
return result
@@ -6696,21 +6741,27 @@ class SessionUsageCheckpointData:
"Durable session usage checkpoint for reconstructing aggregate accounting on resume"
total_nano_aiu: float
# Internal: this field is an internal SDK API and is not part of the public surface.
+ _model_cache_state: list[_UsageCheckpointModelCacheState] | None = None
+ # Internal: this field is an internal SDK API and is not part of the public surface.
_total_premium_requests: float | None = None
@staticmethod
def from_dict(obj: Any) -> "SessionUsageCheckpointData":
assert isinstance(obj, dict)
total_nano_aiu = from_float(obj.get("totalNanoAiu"))
+ _model_cache_state = from_union([from_none, lambda x: from_list(_UsageCheckpointModelCacheState.from_dict, x)], obj.get("modelCacheState"))
_total_premium_requests = from_union([from_none, from_float], obj.get("totalPremiumRequests"))
return SessionUsageCheckpointData(
total_nano_aiu=total_nano_aiu,
+ _model_cache_state=_model_cache_state,
_total_premium_requests=_total_premium_requests,
)
def to_dict(self) -> dict:
result: dict = {}
result["totalNanoAiu"] = to_float(self.total_nano_aiu)
+ if self._model_cache_state is not None:
+ result["modelCacheState"] = from_union([from_none, lambda x: from_list(lambda x: to_class(_UsageCheckpointModelCacheState, x), x)], self._model_cache_state)
if self._total_premium_requests is not None:
result["totalPremiumRequests"] = from_union([from_none, to_float], self._total_premium_requests)
return result
@@ -8432,6 +8483,34 @@ def to_dict(self) -> dict:
return result
+@dataclass
+class _UsageCheckpointModelCacheState:
+ "Internal prompt-cache expiration state for one model"
+ cache_expires_at: datetime
+ # Internal: this field is an internal SDK API and is not part of the public surface.
+ _cache_ttl_seconds: int
+ model_id: str
+
+ @staticmethod
+ def from_dict(obj: Any) -> "_UsageCheckpointModelCacheState":
+ assert isinstance(obj, dict)
+ cache_expires_at = from_datetime(obj.get("cacheExpiresAt"))
+ _cache_ttl_seconds = from_int(obj.get("cacheTtlSeconds"))
+ model_id = from_str(obj.get("modelId"))
+ return _UsageCheckpointModelCacheState(
+ cache_expires_at=cache_expires_at,
+ _cache_ttl_seconds=_cache_ttl_seconds,
+ model_id=model_id,
+ )
+
+ def to_dict(self) -> dict:
+ result: dict = {}
+ result["cacheExpiresAt"] = to_datetime(self.cache_expires_at)
+ result["cacheTtlSeconds"] = to_int(self._cache_ttl_seconds)
+ result["modelId"] = from_str(self.model_id)
+ return result
+
+
@dataclass
class UserInputCompletedData:
"User input request completion with the user's response"
@@ -9249,6 +9328,14 @@ class ModelCallFailureBadRequestKind(Enum):
STRUCTURED_ERROR = "structured_error"
+class ModelCallFailureKind(Enum):
+ "Boundary that produced a model call failure"
+ # The provider returned an API error response.
+ API = "api"
+ # The request transport failed before a usable API response completed.
+ TRANSPORT = "transport"
+
+
class ModelCallFailureSource(Enum):
"Where the failed model call originated"
# Model call from the top-level agent.
@@ -9259,6 +9346,14 @@ class ModelCallFailureSource(Enum):
MCP_SAMPLING = "mcp_sampling"
+class ModelCallFailureTransport(Enum):
+ "Transport used for a failed model call"
+ # HTTP transport, including SSE streams.
+ HTTP = "http"
+ # WebSocket transport.
+ WEBSOCKET = "websocket"
+
+
class OmittedBinaryOmittedReason(Enum):
"Why the binary data is absent: it exceeded the inline size limit, or its asset was unavailable"
# Bytes exceeded the session's inline size limit.
@@ -9770,8 +9865,10 @@ def session_event_to_dict(x: SessionEvent) -> Any:
"McpToolsListChangedData",
"ModelCallFailureBadRequestKind",
"ModelCallFailureData",
+ "ModelCallFailureKind",
"ModelCallFailureRequestFingerprint",
"ModelCallFailureSource",
+ "ModelCallFailureTransport",
"OmittedBinaryOmittedReason",
"OmittedBinaryResult",
"OmittedBinaryType",
diff --git a/rust/src/generated/api_types.rs b/rust/src/generated/api_types.rs
index e243ec1dc..6b6160d0c 100644
--- a/rust/src/generated/api_types.rs
+++ b/rust/src/generated/api_types.rs
@@ -15100,6 +15100,9 @@ pub struct UsageMetricsModelMetricUsage {
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UsageMetricsModelMetric {
+ /// Latest known prompt-cache expiration for this model. A timestamp in the past indicates that the observed cache has expired.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub cache_expires_at: Option,
/// Request count and cost metrics for this model
pub requests: UsageMetricsModelMetricRequests,
/// Token count details per type
@@ -20866,6 +20869,9 @@ pub enum HookType {
/// Runs after the user submits a prompt.
#[serde(rename = "userPromptSubmitted")]
UserPromptSubmitted,
+ /// Runs after the runtime transforms the submitted prompt for the model, before it is added to session history.
+ #[serde(rename = "userPromptTransformed")]
+ UserPromptTransformed,
/// Runs when a session starts.
#[serde(rename = "sessionStart")]
SessionStart,
diff --git a/rust/src/generated/session_events.rs b/rust/src/generated/session_events.rs
index cf670c485..567bd9fe3 100644
--- a/rust/src/generated/session_events.rs
+++ b/rust/src/generated/session_events.rs
@@ -1209,10 +1209,27 @@ pub struct SessionShutdownData {
pub(crate) total_premium_requests: Option,
}
+/// Internal prompt-cache expiration state for one model
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub(crate) struct UsageCheckpointModelCacheState {
+ /// Latest known prompt-cache expiration
+ pub cache_expires_at: String,
+ /// Retained cache lifetime in seconds, used to refresh expiration after a cache read
+ #[doc(hidden)]
+ pub(crate) cache_ttl_seconds: i64,
+ /// Model identifier associated with this cache state
+ pub model_id: String,
+}
+
/// Session event "session.usage_checkpoint". Durable session usage checkpoint for reconstructing aggregate accounting on resume
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionUsageCheckpointData {
+ /// Internal per-model prompt-cache state used to restore expiration tracking on resume
+ #[doc(hidden)]
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub(crate) model_cache_state: Option>,
/// Session-wide accumulated nano-AI units cost at checkpoint time
pub total_nano_aiu: f64,
/// Total number of premium API requests used at checkpoint time
@@ -1870,6 +1887,9 @@ pub struct AssistantUsageData {
/// API endpoint used for this model call, matching CAPI supported_endpoints vocabulary
#[serde(skip_serializing_if = "Option::is_none")]
pub api_endpoint: Option,
+ /// Updated prompt-cache expiration for this model call. Present only when the call establishes or refreshes known cache state.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub cache_expires_at: Option,
/// Number of tokens read from prompt cache
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_read_tokens: Option,
@@ -1966,6 +1986,9 @@ pub struct ModelCallFailureData {
/// Completion ID from the model provider (e.g., chatcmpl-abc123)
#[serde(skip_serializing_if = "Option::is_none")]
pub api_call_id: Option,
+ /// API endpoint used for this model call, matching CAPI supported_endpoints vocabulary
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub api_endpoint: Option,
/// For HTTP 400 failures only: whether the response carried a structured CAPI error envelope (structured_error, a deterministic validation failure) or no error body (bodyless, the transient gateway/proxy signature). Absent for non-400 failures.
#[serde(skip_serializing_if = "Option::is_none")]
pub bad_request_kind: Option,
@@ -1981,9 +2004,24 @@ pub struct ModelCallFailureData {
/// For HTTP 400 failures only: the `type` from the CAPI error envelope (e.g. 'websocket_error'), a coarser companion to errorCode for envelopes that carry no code. Raw server-controlled string, emitted only through restricted telemetry. Absent for bodyless or non-400 failures.
#[serde(skip_serializing_if = "Option::is_none")]
pub error_type: Option,
+ /// Whether the failure originated from an API response or the request transport
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub failure_kind: Option,
/// What initiated this API call (e.g., "sub-agent", "mcp-sampling"); absent for user-initiated calls
#[serde(skip_serializing_if = "Option::is_none")]
pub initiator: Option,
+ /// Whether the session selected Auto mode for the failed call
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub is_auto: Option,
+ /// Whether the failed call used a bring-your-own-key provider
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub is_byok: Option,
+ /// Effective maximum output-token limit for the failed call
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub max_output_tokens: Option,
+ /// Effective maximum prompt-token limit for the failed call
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub max_prompt_tokens: Option,
/// Model identifier used for the failed API call
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option,
@@ -1994,6 +2032,9 @@ pub struct ModelCallFailureData {
#[doc(hidden)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) quota_snapshots: Option>,
+ /// Reasoning effort level used for the failed model call, if applicable
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub reasoning_effort: Option,
/// Content-free structural summary of the failing request. Contains only counts and shape flags (no prompt content), so it is safe for unrestricted telemetry. Populated only for client-error (4xx) failures.
#[serde(skip_serializing_if = "Option::is_none")]
pub request_fingerprint: Option,
@@ -2005,6 +2046,9 @@ pub struct ModelCallFailureData {
/// HTTP status code from the failed request
#[serde(skip_serializing_if = "Option::is_none")]
pub status_code: Option,
+ /// Transport used for the failed model call (http or websocket)
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub transport: Option,
}
/// Session event "abort". Turn abort information including the reason for termination
@@ -4830,6 +4874,21 @@ pub enum ModelCallFailureBadRequestKind {
Unknown,
}
+/// Boundary that produced a model call failure
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum ModelCallFailureKind {
+ /// The provider returned an API error response.
+ #[serde(rename = "api")]
+ Api,
+ /// The request transport failed before a usable API response completed.
+ #[serde(rename = "transport")]
+ Transport,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
/// Where the failed model call originated
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum ModelCallFailureSource {
@@ -4848,6 +4907,21 @@ pub enum ModelCallFailureSource {
Unknown,
}
+/// Transport used for a failed model call
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum ModelCallFailureTransport {
+ /// HTTP transport, including SSE streams.
+ #[serde(rename = "http")]
+ Http,
+ /// WebSocket transport.
+ #[serde(rename = "websocket")]
+ Websocket,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
/// Finite reason code describing why the current turn was aborted
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum AbortReason {
diff --git a/test/harness/package-lock.json b/test/harness/package-lock.json
index 1a8462d66..d3958fbec 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.71",
+ "@github/copilot": "^1.0.72-1",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",
@@ -501,9 +501,9 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.71.tgz",
- "integrity": "sha512-F3axBi+sXSLYDJbxCBW36bM6MYKNC2rlyAf3Ivo/MjiHKKJW7j5AmaR1IRYS9Gt8r9mxOwWFM1cJFA+CuLaR8g==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.72-1.tgz",
+ "integrity": "sha512-KZ0d4auTdsvcp47AHLoxFhhuHmwdHi7Eh+3IPV8RHQenUHh4onVsPqBXOjkwAna4XZb6rJHhzq1MBSGAb1d87g==",
"dev": true,
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
@@ -513,20 +513,20 @@
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.71",
- "@github/copilot-darwin-x64": "1.0.71",
- "@github/copilot-linux-arm64": "1.0.71",
- "@github/copilot-linux-x64": "1.0.71",
- "@github/copilot-linuxmusl-arm64": "1.0.71",
- "@github/copilot-linuxmusl-x64": "1.0.71",
- "@github/copilot-win32-arm64": "1.0.71",
- "@github/copilot-win32-x64": "1.0.71"
+ "@github/copilot-darwin-arm64": "1.0.72-1",
+ "@github/copilot-darwin-x64": "1.0.72-1",
+ "@github/copilot-linux-arm64": "1.0.72-1",
+ "@github/copilot-linux-x64": "1.0.72-1",
+ "@github/copilot-linuxmusl-arm64": "1.0.72-1",
+ "@github/copilot-linuxmusl-x64": "1.0.72-1",
+ "@github/copilot-win32-arm64": "1.0.72-1",
+ "@github/copilot-win32-x64": "1.0.72-1"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.71.tgz",
- "integrity": "sha512-mEWzyqbqRAWgyU7i2uuSRoVPx/TwaFQX0nZmw0bc30aJ0BnO7cy2kYQyCHw8ykmf/tfxT0xauZ6k0BOFmWizzQ==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-n+2rVuMBKE8fxPULh/Cl1Y9PtrnGxOxykYIhRJb/VdjG4NwggO+8xv8/eTDECJFwWf0GM6kM6ZNzSxeTpiPbiw==",
"cpu": [
"arm64"
],
@@ -541,9 +541,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.71.tgz",
- "integrity": "sha512-Md9yEg406OBVBx3w4PeEj62TubulVLBcHleqmCoOoUmPgUxPZotUbrqz3rtbzADbXfrrD7JWvVsbd2UiNL194w==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.72-1.tgz",
+ "integrity": "sha512-RzU9+MVz3nW7ds8FbTc0AA83IZiewSTgFkkW8mN1vJJYNF7JC2Sh7mxKYKmdY5Ha6cQv+Fya+8kaH6CY2Aw7MQ==",
"cpu": [
"x64"
],
@@ -558,9 +558,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.71.tgz",
- "integrity": "sha512-ykLJYOqBj3jRB5IJCDugLClAqbr7DmtTbUjlNY7+Jdq/n6i+d7xUQGclf1IWL5gnxbGQVAf+zkToD+sRM389Kg==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-fGhWn6o2UnVYn+wltRqCLbhC8UWF6ZEzOwZ49Eax8xnIvaOkTKsb/AgahYeugbQTOHi/KiL1MNFL6vOhoeaAlQ==",
"cpu": [
"arm64"
],
@@ -575,9 +575,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.71.tgz",
- "integrity": "sha512-pC0FNHG+BBwZd6yZlM85kkAGN+uJhM6o+THi76N2GnnSxmw7+remb1mvYxdgRVbdCm+LBUIbCKRWJLuMwrfb6A==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.72-1.tgz",
+ "integrity": "sha512-MV6pGq34Pe9h3F8EuYVp45KrO0fDr+bUTwuzZSHXFPkpP0FQ0weuGN/rjzK1X8vU9NNpGX2750SusDWLsgPEZw==",
"cpu": [
"x64"
],
@@ -592,9 +592,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.71.tgz",
- "integrity": "sha512-hBmDljFTjacxqZTasCEy43H8EIzuXB/hHEBBCMFjhB9J00nIxsO6Dh0woTifKpx7knTYZdpTjjca3D0pAoZlUA==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-mumPen/RiMocs+5bGzEP2kS7R3fSYLoWxKqGD+8+9rSeAMRREuUiK0ffIYs0c7qrn1FbC2gB28/f2Ij/BV+JPw==",
"cpu": [
"arm64"
],
@@ -609,9 +609,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.71.tgz",
- "integrity": "sha512-CfTXU8pa5dxRz22xQzoi3TiG1PJo9+WR8PRDiPSdkIBSyPJ1NvX87DJmfXjTgeAfR+wkjt/p0keDCaBBVhNmUA==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.72-1.tgz",
+ "integrity": "sha512-tHTyNlgz2CVQfy97EOc9OlWu2/CGF1yK73nENozdSpCZ4M2q9DGvAJHCvpKHuMfukKZrBT0pwJMI0/N+FIykiQ==",
"cpu": [
"x64"
],
@@ -626,9 +626,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.71.tgz",
- "integrity": "sha512-+HI1DokixXhHUahj06Fw67ZAigBuXKC58BFma4UJOGrQsDgwOSbqeTQHCw6vuymzjKlg3sactfsCUTaefkjscQ==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.72-1.tgz",
+ "integrity": "sha512-sz1eR/gM3ld/bIJq8rO+KbCXvGmHAfSnuHNBLUPmuzguHDlqEXBCuuVTG5CCJ9r6KYpXl3/H9tWTWVI9wexsUQ==",
"cpu": [
"arm64"
],
@@ -643,9 +643,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.71",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.71.tgz",
- "integrity": "sha512-02kXOBd9CwBbCaztuf71WYWn+uGapCuiaasomN4tcMH3HBVZ4gi3J0ZUoRcgcS80xh81uQyeBHbnUKzb/RE/9A==",
+ "version": "1.0.72-1",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.72-1.tgz",
+ "integrity": "sha512-Cc7V5cpB7hsoGJQB/JgZzyxnV8USSeSNkJqO5QbolB8fn2SKF0QBO8J6Le+2j7E+iLcJnSf/QMYOPUDUUY+cKQ==",
"cpu": [
"x64"
],
diff --git a/test/harness/package.json b/test/harness/package.json
index 18b19e21a..d179229e3 100644
--- a/test/harness/package.json
+++ b/test/harness/package.json
@@ -14,7 +14,7 @@
"node": "^20.19.0 || >=22.12.0"
},
"devDependencies": {
- "@github/copilot": "^1.0.71",
+ "@github/copilot": "^1.0.72-1",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",