diff --git a/dotnet/src/Generated/Rpc.cs b/dotnet/src/Generated/Rpc.cs index 3b9445f726..ba8b844d83 100644 --- a/dotnet/src/Generated/Rpc.cs +++ b/dotnet/src/Generated/Rpc.cs @@ -13882,6 +13882,10 @@ public sealed class PermissionDecisionContext [JsonPropertyName("outcome")] public PermissionDecisionOutcome Outcome { get; set; } + /// Whether the responding client could ask a user interactively, was running headlessly, or had no response path. Omit when the client cannot determine this authoritatively. + [JsonPropertyName("responseCapability")] + public PermissionResponseCapability? ResponseCapability { get; set; } + /// Controlled reason or actor responsible for the response. [JsonPropertyName("source")] public PermissionDecisionSource Source { get; set; } @@ -18522,6 +18526,14 @@ public sealed class GitHubTelemetryClientInfo [JsonPropertyName("copilot_plan")] public string? CopilotPlan { get; set; } + /// Number of logical CPU cores on the host. + [JsonPropertyName("cpu_count")] + public long? CpuCount { get; set; } + + /// Distinct CPU model names for the host, comma-separated. + [JsonPropertyName("cpu_model")] + public string? CpuModel { get; set; } + /// Stable machine identifier for the device. [JsonPropertyName("dev_device_id")] public string? DevDeviceId { get; set; } @@ -27137,6 +27149,72 @@ public override void Write(Utf8JsonWriter writer, PermissionDecisionOutcome valu } +/// Response capability available to the client when it settled a permission request. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct PermissionResponseCapability : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public PermissionResponseCapability(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// The client could ask a user for this decision. + public static PermissionResponseCapability Interactive { get; } = new("interactive"); + + /// The client could return an automated response but could not ask a user. + public static PermissionResponseCapability Headless { get; } = new("headless"); + + /// The client had no response path available. + public static PermissionResponseCapability None { get; } = new("none"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(PermissionResponseCapability left, PermissionResponseCapability right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(PermissionResponseCapability left, PermissionResponseCapability right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is PermissionResponseCapability other && Equals(other); + + /// + public bool Equals(PermissionResponseCapability 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 PermissionResponseCapability Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, PermissionResponseCapability value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(PermissionResponseCapability)); + } + } +} + + /// Controlled reason or actor responsible for a permission response. [Experimental(Diagnostics.Experimental)] [JsonConverter(typeof(Converter))] @@ -27235,6 +27313,9 @@ public PermissionDecisionSurface(string value) /// The Copilot App client. public static PermissionDecisionSurface CopilotApp { get; } = new("copilot_app"); + /// An Agent Client Protocol host. + public static PermissionDecisionSurface Acp { get; } = new("acp"); + /// A generic Copilot SDK client. public static PermissionDecisionSurface Sdk { get; } = new("sdk"); diff --git a/dotnet/src/Generated/SessionEvents.cs b/dotnet/src/Generated/SessionEvents.cs index ccfda24fa3..bb2f3f9979 100644 --- a/dotnet/src/Generated/SessionEvents.cs +++ b/dotnet/src/Generated/SessionEvents.cs @@ -2002,6 +2002,11 @@ public sealed partial class SessionIdleData [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("aborted")] public bool? Aborted { get; set; } + + /// The session mode the agent was operating in when it went idle, when the mode is known. Lets turn-scoped consumers distinguish an autopilot continuation boundary (where the agent keeps working after this idle) from a genuine turn completion. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("mode")] + public SessionMode? Mode { get; set; } } /// Session title change payload containing the new display title. @@ -9797,6 +9802,70 @@ public override void Write(Utf8JsonWriter writer, Verbosity value, JsonSerialize } } +/// The session mode the agent is operating in. +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct SessionMode : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public SessionMode(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// The agent is responding interactively to the user. + public static SessionMode Interactive { get; } = new("interactive"); + + /// The agent is preparing a plan before making changes. + public static SessionMode Plan { get; } = new("plan"); + + /// The agent is working autonomously toward task completion. + public static SessionMode Autopilot { get; } = new("autopilot"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(SessionMode left, SessionMode right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(SessionMode left, SessionMode right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is SessionMode other && Equals(other); + + /// + public bool Equals(SessionMode 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 SessionMode Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, SessionMode value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SessionMode)); + } + } +} + /// Who created the schedule: `user` (an explicit user action such as `/every` or `/after`) or `model` (the agent via the `manage_schedule` tool). Gates whether a scheduled skill that opted out of model invocation may fire: only user-created schedules may. [JsonConverter(typeof(Converter))] [DebuggerDisplay("{Value,nq}")] @@ -10077,70 +10146,6 @@ public override void Write(Utf8JsonWriter writer, ModelChangeSource value, JsonS } } -/// The session mode the agent is operating in. -[JsonConverter(typeof(Converter))] -[DebuggerDisplay("{Value,nq}")] -public readonly struct SessionMode : IEquatable -{ - private readonly string? _value; - - /// Initializes a new instance of the struct. - /// The value to associate with this . - [JsonConstructor] - public SessionMode(string value) - { - ArgumentException.ThrowIfNullOrWhiteSpace(value); - _value = value; - } - - /// Gets the value associated with this . - public string Value => _value ?? string.Empty; - - /// The agent is responding interactively to the user. - public static SessionMode Interactive { get; } = new("interactive"); - - /// The agent is preparing a plan before making changes. - public static SessionMode Plan { get; } = new("plan"); - - /// The agent is working autonomously toward task completion. - public static SessionMode Autopilot { get; } = new("autopilot"); - - /// Returns a value indicating whether two instances are equivalent. - public static bool operator ==(SessionMode left, SessionMode right) => left.Equals(right); - - /// Returns a value indicating whether two instances are not equivalent. - public static bool operator !=(SessionMode left, SessionMode right) => !(left == right); - - /// - public override bool Equals(object? obj) => obj is SessionMode other && Equals(other); - - /// - public bool Equals(SessionMode 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 SessionMode Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); - } - - /// - public override void Write(Utf8JsonWriter writer, SessionMode value, JsonSerializerOptions options) - { - GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SessionMode)); - } - } -} - /// Permission mode for the session. [Experimental(Diagnostics.Experimental)] [JsonConverter(typeof(Converter))] diff --git a/dotnet/src/Session.cs b/dotnet/src/Session.cs index 3176e7db23..7d076d14b0 100644 --- a/dotnet/src/Session.cs +++ b/dotnet/src/Session.cs @@ -371,7 +371,7 @@ void Handler(SessionEvent evt) } break; - case SessionIdleEvent: + case SessionIdleEvent idleEvent when idleEvent.Data.Mode != SessionMode.Autopilot: LoggingHelpers.LogTiming(_logger, LogLevel.Debug, null, "CopilotSession.SendAndWaitAsync idle received. Elapsed={Elapsed}, SessionId={SessionId}", totalTimestamp, diff --git a/dotnet/test/Unit/ClientSessionLifetimeTests.cs b/dotnet/test/Unit/ClientSessionLifetimeTests.cs index 98bd36f928..b61546c650 100644 --- a/dotnet/test/Unit/ClientSessionLifetimeTests.cs +++ b/dotnet/test/Unit/ClientSessionLifetimeTests.cs @@ -829,6 +829,66 @@ public async Task Generated_Session_Rpc_Throws_When_Session_Disposed() await Assert.ThrowsAsync(() => session.Rpc.Model.GetCurrentAsync()); } + [Fact] + public async Task SendAndWaitAsync_Skips_Autopilot_Continuation_Idle() + { + await using var server = await FakeCopilotServer.StartAsync(); + await using var client = new CopilotClient(new CopilotClientOptions { Connection = RuntimeConnection.ForUri(server.Url) }); + await using var session = await client.CreateSessionAsync(new SessionConfig + { + OnPermissionRequest = PermissionHandler.ApproveAll + }); + + var sendTask = session.SendAndWaitAsync(new MessageOptions { Prompt = "keep going" }); + await WaitForRequestAsync(server, "session.send"); + + var continuationIdleProcessed = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + using var subscription = session.On(idle => + { + if (idle.Data.Mode == SessionMode.Autopilot) + { + continuationIdleProcessed.TrySetResult(); + } + }); + + DispatchEvent(session, new AssistantMessageEvent + { + Id = Guid.NewGuid(), + Data = new AssistantMessageData + { + Content = "intermediate", + MessageId = "assistant-1" + } + }); + DispatchEvent(session, new SessionIdleEvent + { + Id = Guid.NewGuid(), + Data = new SessionIdleData { Mode = SessionMode.Autopilot } + }); + + await continuationIdleProcessed.Task.WaitAsync(TimeSpan.FromSeconds(5)); + Assert.False(sendTask.IsCompleted); + + DispatchEvent(session, new AssistantMessageEvent + { + Id = Guid.NewGuid(), + Data = new AssistantMessageData + { + Content = "final", + MessageId = "assistant-2" + } + }); + DispatchEvent(session, new SessionIdleEvent + { + Id = Guid.NewGuid(), + Data = new SessionIdleData { Mode = SessionMode.Interactive } + }); + + var result = await sendTask.WaitAsync(TimeSpan.FromSeconds(5)); + Assert.NotNull(result); + Assert.Equal("final", result.Data.Content); + } + [MethodImpl(MethodImplOptions.NoInlining)] private static async Task> CreateDroppedSessionAsync(CopilotClient client) { diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go index ad82a27823..2b3943988d 100644 --- a/go/rpc/zrpc.go +++ b/go/rpc/zrpc.go @@ -3746,6 +3746,10 @@ type GitHubTelemetryClientInfo struct { CLIVersion string `json:"cli_version"` // Copilot subscription plan, when known. CopilotPlan *string `json:"copilot_plan,omitempty"` + // Number of logical CPU cores on the host. + CpuCount *int64 `json:"cpu_count,omitempty"` + // Distinct CPU model names for the host, comma-separated. + CpuModel *string `json:"cpu_model,omitempty"` // Stable machine identifier for the device. DevDeviceID *string `json:"dev_device_id,omitempty"` // Whether the user is a GitHub/Microsoft staff member. @@ -7994,6 +7998,9 @@ func (PermissionDecisionApproveForSessionApprovalWrite) Kind() PermissionDecisio type PermissionDecisionContext struct { // Disposition of the permission request as observed by the responding client. Outcome PermissionDecisionOutcome `json:"outcome"` + // Whether the responding client could ask a user interactively, was running headlessly, or + // had no response path. Omit when the client cannot determine this authoritatively. + ResponseCapability *PermissionResponseCapability `json:"responseCapability,omitempty"` // Controlled reason or actor responsible for the response. Source PermissionDecisionSource `json:"source"` // Client surface that submitted the response. @@ -17675,6 +17682,8 @@ const ( type PermissionDecisionSurface string const ( + // An Agent Client Protocol host. + PermissionDecisionSurfaceAcp PermissionDecisionSurface = "acp" // The Copilot App client. PermissionDecisionSurfaceCopilotApp PermissionDecisionSurface = "copilot_app" // The non-interactive Copilot CLI prompt mode. @@ -17730,6 +17739,20 @@ const ( PermissionModeSourceUserSetting PermissionModeSource = "user_setting" ) +// Response capability available to the client when it settled a permission request. +// Experimental: PermissionResponseCapability is part of an experimental API and may change +// or be removed. +type PermissionResponseCapability string + +const ( + // The client could return an automated response but could not ask a user. + PermissionResponseCapabilityHeadless PermissionResponseCapability = "headless" + // The client could ask a user for this decision. + PermissionResponseCapabilityInteractive PermissionResponseCapability = "interactive" + // The client had no response path available. + PermissionResponseCapabilityNone PermissionResponseCapability = "none" +) + // Allowed values for the `PermissionsConfigureAdditionalContentExclusionPolicyScope` // enumeration. // Experimental: PermissionsConfigureAdditionalContentExclusionPolicyScope is part of an diff --git a/go/rpc/zsession_events.go b/go/rpc/zsession_events.go index 282d616be0..2abfd75a66 100644 --- a/go/rpc/zsession_events.go +++ b/go/rpc/zsession_events.go @@ -1376,6 +1376,8 @@ func (*MCPToolsListChangedData) Type() SessionEventType { return SessionEventTyp type SessionIdleData struct { // True when the preceding agentic loop was cancelled via abort signal Aborted *bool `json:"aborted,omitempty"` + // The session mode the agent was operating in when it went idle, when the mode is known. Lets turn-scoped consumers distinguish an autopilot continuation boundary (where the agent keeps working after this idle) from a genuine turn completion. + Mode *SessionMode `json:"mode,omitempty"` } func (*SessionIdleData) sessionEventData() {} diff --git a/go/session.go b/go/session.go index 3f6c4f605f..5d45d19ef2 100644 --- a/go/session.go +++ b/go/session.go @@ -498,6 +498,9 @@ func (s *Session) SendAndWait(ctx context.Context, options MessageOptions) (*Ses lastAssistantMessage = &eventCopy mu.Unlock() case *SessionIdleData: + if d.Mode != nil && *d.Mode == SessionModeAutopilot { + break + } select { case idleCh <- struct{}{}: default: diff --git a/go/session_test.go b/go/session_test.go index 9c5f4df8c9..74e212c418 100644 --- a/go/session_test.go +++ b/go/session_test.go @@ -366,6 +366,138 @@ func readTestJSONRPCFrame(r io.Reader) ([]byte, error) { return data, err } +func TestSession_SendAndWaitSkipsAutopilotContinuationIdle(t *testing.T) { + stdinR, stdinW := io.Pipe() + stdoutR, stdoutW := io.Pipe() + defer stdinR.Close() + defer stdinW.Close() + defer stdoutR.Close() + defer stdoutW.Close() + + client := jsonrpc2.NewClient(stdinW, stdoutR) + client.Start() + defer client.Stop() + + requestReceived := make(chan struct{}) + errCh := make(chan error, 1) + go func() { + frame, err := readTestJSONRPCFrame(stdinR) + if err != nil { + errCh <- err + return + } + + var request struct { + ID json.RawMessage `json:"id"` + Method string `json:"method"` + } + if err := json.Unmarshal(frame, &request); err != nil { + errCh <- err + return + } + if request.Method != "session.send" { + errCh <- fmt.Errorf("expected session.send, got %s", request.Method) + return + } + + response := map[string]any{ + "jsonrpc": "2.0", + "id": json.RawMessage(request.ID), + "result": map[string]any{"messageId": "message-1"}, + } + data, err := json.Marshal(response) + if err != nil { + errCh <- err + return + } + if _, err := fmt.Fprintf(stdoutW, "Content-Length: %d\r\n\r\n%s", len(data), data); err != nil { + errCh <- err + return + } + close(requestReceived) + }() + + session := &Session{ + SessionID: "session-1", + client: client, + RPC: rpc.NewSessionRPC(client, "session-1"), + handlers: make([]sessionHandler, 0), + eventCh: make(chan SessionEvent, 8), + } + go session.processEvents() + defer close(session.eventCh) + + resultCh := make(chan *SessionEvent, 1) + go func() { + result, err := session.SendAndWait(t.Context(), MessageOptions{Prompt: "keep going"}) + if err != nil { + errCh <- err + return + } + resultCh <- result + }() + + select { + case <-requestReceived: + case err := <-errCh: + t.Fatal(err) + case <-time.After(2 * time.Second): + t.Fatal("timed out waiting for session.send request") + } + + continuationIdleProcessed := make(chan struct{}) + unsubscribe := session.On(func(event SessionEvent) { + if idle, ok := event.Data.(*SessionIdleData); ok && + idle.Mode != nil && *idle.Mode == SessionModeAutopilot { + close(continuationIdleProcessed) + } + }) + defer unsubscribe() + + autopilot := SessionModeAutopilot + session.dispatchEvent(SessionEvent{Data: &AssistantMessageData{ + Content: "intermediate", + MessageID: "assistant-1", + }}) + session.dispatchEvent(SessionEvent{Data: &SessionIdleData{Mode: &autopilot}}) + + select { + case <-continuationIdleProcessed: + case err := <-errCh: + t.Fatal(err) + case <-time.After(2 * time.Second): + t.Fatal("timed out waiting for autopilot continuation idle") + } + + select { + case <-resultCh: + t.Fatal("SendAndWait returned at an autopilot continuation idle") + default: + } + + interactive := SessionModeInteractive + session.dispatchEvent(SessionEvent{Data: &AssistantMessageData{ + Content: "final", + MessageID: "assistant-2", + }}) + session.dispatchEvent(SessionEvent{Data: &SessionIdleData{Mode: &interactive}}) + + select { + case result := <-resultCh: + message, ok := result.Data.(*AssistantMessageData) + if !ok { + t.Fatalf("expected assistant message, got %T", result.Data) + } + if message.Content != "final" { + t.Fatalf("expected final assistant message, got %q", message.Content) + } + case err := <-errCh: + t.Fatal(err) + case <-time.After(2 * time.Second): + t.Fatal("timed out waiting for terminal idle") + } +} + func TestSession_On(t *testing.T) { t.Run("multiple handlers all receive events", func(t *testing.T) { session, cleanup := newTestSession() diff --git a/go/types.go b/go/types.go index 38ddaf5663..1d98e06158 100644 --- a/go/types.go +++ b/go/types.go @@ -393,6 +393,16 @@ type PermissionInvocation struct { // may change or be removed. type PermissionDecisionContext = rpc.PermissionDecisionContext +// PermissionResponseCapability describes whether the responding client could +// ask a user for a permission decision. +type PermissionResponseCapability = rpc.PermissionResponseCapability + +const ( + PermissionResponseCapabilityHeadless = rpc.PermissionResponseCapabilityHeadless + PermissionResponseCapabilityInteractive = rpc.PermissionResponseCapabilityInteractive + PermissionResponseCapabilityNone = rpc.PermissionResponseCapabilityNone +) + // PermissionDecisionOutcome describes the disposition of a permission request // as observed by the responding client. type PermissionDecisionOutcome = rpc.PermissionDecisionOutcome @@ -419,6 +429,7 @@ const ( type PermissionDecisionSurface = rpc.PermissionDecisionSurface const ( + PermissionDecisionSurfaceAcp = rpc.PermissionDecisionSurfaceAcp PermissionDecisionSurfaceCopilotApp = rpc.PermissionDecisionSurfaceCopilotApp PermissionDecisionSurfacePromptMode = rpc.PermissionDecisionSurfacePromptMode PermissionDecisionSurfaceSDK = rpc.PermissionDecisionSurfaceSDK diff --git a/java/pom.xml b/java/pom.xml index 358eb64985..b7618b897a 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -63,7 +63,7 @@ DO NOT EDIT MANUALLY. Updated by the update-copilot-dependency workflow. --> - ^1.0.81-10 + ^1.0.81-11 true diff --git a/java/scripts/codegen/package-lock.json b/java/scripts/codegen/package-lock.json index a81af6e0d1..d0b602e846 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.81-10", + "@github/copilot": "^1.0.81-11", "json-schema": "^0.4.0", "tsx": "^4.23.12" } @@ -428,9 +428,9 @@ } }, "node_modules/@github/copilot": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.81-10.tgz", - "integrity": "sha512-Ac99EvN16s4hKRhJLSEn1HMNaZ6MD8BzIey1zzJNBQy1/yP4PQDZ2CWitEq+XQQEi+6SsqeJRqXOKiWk1EyK7g==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.81-11.tgz", + "integrity": "sha512-F7hZ6G6fhWH4uq862mbs2JE3nL0KIVBOc94/EFOdEjux3oHUQst9a06gKibEJS6VRULaYTXzatA1EAgNC9dzFA==", "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.81-10", - "@github/copilot-darwin-x64": "1.0.81-10", - "@github/copilot-linux-arm64": "1.0.81-10", - "@github/copilot-linux-x64": "1.0.81-10", - "@github/copilot-linuxmusl-arm64": "1.0.81-10", - "@github/copilot-linuxmusl-x64": "1.0.81-10", - "@github/copilot-win32-arm64": "1.0.81-10", - "@github/copilot-win32-x64": "1.0.81-10" + "@github/copilot-darwin-arm64": "1.0.81-11", + "@github/copilot-darwin-x64": "1.0.81-11", + "@github/copilot-linux-arm64": "1.0.81-11", + "@github/copilot-linux-x64": "1.0.81-11", + "@github/copilot-linuxmusl-arm64": "1.0.81-11", + "@github/copilot-linuxmusl-x64": "1.0.81-11", + "@github/copilot-win32-arm64": "1.0.81-11", + "@github/copilot-win32-x64": "1.0.81-11" } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.81-10.tgz", - "integrity": "sha512-s90Av0iwjTSU6Gky8T9wI1PJdlfbdUcPAVgKDtimaOiAwcdLG4fKTpGxrk96KJrnOHHK3x9SiXsw/pW0ThAH/A==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.81-11.tgz", + "integrity": "sha512-3eLs71CLnJH9RNnESnv4esipZPeGXMlBxQeKXwZY+crwcW2RAR8YuovQyfoZ/5by1PLPbYrOjXNfQL6kXSisrA==", "cpu": [ "arm64" ], @@ -466,9 +466,9 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.81-10.tgz", - "integrity": "sha512-8RnPI4J311oJQ0GPB6JxuLJq4JNY/KF9ZIIQm8KpxXBY6d+6fmmAsMDEk7OiF/Asl2I7+LTi+qU2ZVhP7FYhbg==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.81-11.tgz", + "integrity": "sha512-GdFLiUC8UL9k6K+woG8AyL3zBafd0Br1TIPDV5iiZsyBtTe4g67FjL7DGCYDt6AN9G43jWdK0M0InoNDVq1K1A==", "cpu": [ "x64" ], @@ -482,9 +482,9 @@ } }, "node_modules/@github/copilot-linux-arm64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.81-10.tgz", - "integrity": "sha512-2UtK5CBrE6ZVSIzU2KHeIgO8N7056axjbF2lE6WuK+H+oJJ4v3w5eQkalqGzRHhkaPfCW4kT1lDMhZFW+XbLjA==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.81-11.tgz", + "integrity": "sha512-C4hcAow5CdaVJITbdtGqFgxWpW7TqwyCPNn8OtcbvdWeiKcfOBDrgkvbsezG98/5Ovs3HWxZRT4oZqCEmGF9Ww==", "cpu": [ "arm64" ], @@ -498,9 +498,9 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.81-10.tgz", - "integrity": "sha512-61+KAfo1TBARrBfss3w4dfmRVSf0PiFg0c9JNuT9HjoNnytl7maJBPEgUvI4YBcxScNEAlCMXaUUG3Tuuh1g+w==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.81-11.tgz", + "integrity": "sha512-izu0PwWx+wL4zxacO6cd6r0zMMMQ3pTz+2euWcAd7HCJ/CIR6+YYfjU3TI3TPBZ9zDLZGoxHKYYPfJ1ZbSTzEg==", "cpu": [ "x64" ], @@ -514,9 +514,9 @@ } }, "node_modules/@github/copilot-linuxmusl-arm64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.81-10.tgz", - "integrity": "sha512-CR6KRPCFoGkaD8I2an1FyrT5avF1U5aTbwW2sYCP7w1KExYFknxEL8ES6BkFuPEA7YcjmLa0SOq26Z+TgIVHSg==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.81-11.tgz", + "integrity": "sha512-uWGUjaxOSMu6dKFWcTvXGUUp76vC3OV7nlSupecRkQ7gA3OxdrrB8rXE5/leC606Hk6oe9Wl7wKCH9EwuZ6afg==", "cpu": [ "arm64" ], @@ -530,9 +530,9 @@ } }, "node_modules/@github/copilot-linuxmusl-x64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.81-10.tgz", - "integrity": "sha512-fvZfyEOfRkvUDPXY6UUjAqV8Mkf08PQV+jgtiAFUryuas5VP9cYaAmQSmNpzNMNi3kSX/ycUJe7oc3zXZ8ylog==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.81-11.tgz", + "integrity": "sha512-BpWKd/iu1tTyuPR2zuPFs1pVOlley4yt/TXkn6/gVwt52VI0rUxEO+n77RVjDcyMxWaUApbad2VNRPIH77guCA==", "cpu": [ "x64" ], @@ -546,9 +546,9 @@ } }, "node_modules/@github/copilot-win32-arm64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.81-10.tgz", - "integrity": "sha512-n30PPBgCT4Iq9MgH6is6L3eUEE+sF6xB2fb+dGsclj5j/hCkT7+ef0j8YcAGipsvGfzGAuywIsWlvF7fzYsOKQ==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.81-11.tgz", + "integrity": "sha512-GOK3cACgD96m065uJxbgcXL7MQ1qm+wq1qtvGBpprY0r9wTYJG/rVCtayjYB6B57rnaBwPll3+PQ2J1qgfO57A==", "cpu": [ "arm64" ], @@ -562,9 +562,9 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "1.0.81-10", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.81-10.tgz", - "integrity": "sha512-lb8kvhrXwGCN3LeRDQfLHsUp+F43XvPYznaYK1sPtK1kFGa4/kL690tasoSEvzu8ZKoTY6kZ6YmDbUZgqOislw==", + "version": "1.0.81-11", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.81-11.tgz", + "integrity": "sha512-u4K6UU2iGQJqQwsdHNilJBwiaC48PfMsWVFnTSlJD5lCYp9zCk1odrvrcmB3ARYinE/IcXLUosiHaM/ChR/pdA==", "cpu": [ "x64" ], diff --git a/java/scripts/codegen/package.json b/java/scripts/codegen/package.json index f619ebd627..d5669c39f0 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.81-10", + "@github/copilot": "^1.0.81-11", "json-schema": "^0.4.0", "tsx": "^4.23.12" } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/SessionIdleEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/SessionIdleEvent.java index e51a26e5ae..ae509c4b42 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/SessionIdleEvent.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/SessionIdleEvent.java @@ -35,7 +35,9 @@ public final class SessionIdleEvent extends SessionEvent { @JsonInclude(JsonInclude.Include.NON_NULL) public record SessionIdleEventData( /** True when the preceding agentic loop was cancelled via abort signal */ - @JsonProperty("aborted") Boolean aborted + @JsonProperty("aborted") Boolean aborted, + /** The session mode the agent was operating in when it went idle, when the mode is known. Lets turn-scoped consumers distinguish an autopilot continuation boundary (where the agent keeps working after this idle) from a genuine turn completion. */ + @JsonProperty("mode") SessionMode mode ) { } } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java index 7d7a1eaf72..b6bef1bffd 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java @@ -40,6 +40,10 @@ public record GitHubTelemetryClientInfo( /** Whether the user is a GitHub/Microsoft staff member. */ @JsonProperty("is_staff") Boolean isStaff, /** Stable machine identifier for the device. */ - @JsonProperty("dev_device_id") String devDeviceId + @JsonProperty("dev_device_id") String devDeviceId, + /** Distinct CPU model names for the host, comma-separated. */ + @JsonProperty("cpu_model") String cpuModel, + /** Number of logical CPU cores on the host. */ + @JsonProperty("cpu_count") Long cpuCount ) { } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionContext.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionContext.java index 73934eea66..5200f4cd51 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionContext.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionContext.java @@ -26,6 +26,8 @@ public record PermissionDecisionContext( /** Controlled reason or actor responsible for the response. */ @JsonProperty("source") PermissionDecisionSource source, /** Client surface that submitted the response. */ - @JsonProperty("surface") PermissionDecisionSurface surface + @JsonProperty("surface") PermissionDecisionSurface surface, + /** Whether the responding client could ask a user interactively, was running headlessly, or had no response path. Omit when the client cannot determine this authoritatively. */ + @JsonProperty("responseCapability") PermissionResponseCapability responseCapability ) { } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionSurface.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionSurface.java index 2cf6348794..c6d2db8c5f 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionSurface.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionDecisionSurface.java @@ -22,6 +22,8 @@ public enum PermissionDecisionSurface { PROMPT_MODE("prompt_mode"), /** The {@code copilot_app} variant. */ COPILOT_APP("copilot_app"), + /** The {@code acp} variant. */ + ACP("acp"), /** The {@code sdk} variant. */ SDK("sdk"); diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionResponseCapability.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionResponseCapability.java new file mode 100644 index 0000000000..c52bfd3234 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionResponseCapability.java @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +// AUTO-GENERATED FILE - DO NOT EDIT +// Generated from: api.schema.json + +package com.github.copilot.generated.rpc; + +import javax.annotation.processing.Generated; + +/** + * Response capability available to the client when it settled a permission request. + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public enum PermissionResponseCapability { + /** The {@code interactive} variant. */ + INTERACTIVE("interactive"), + /** The {@code headless} variant. */ + HEADLESS("headless"), + /** The {@code none} variant. */ + NONE("none"); + + private final String value; + PermissionResponseCapability(String value) { this.value = value; } + @com.fasterxml.jackson.annotation.JsonValue + public String getValue() { return value; } + @com.fasterxml.jackson.annotation.JsonCreator + public static PermissionResponseCapability fromValue(String value) { + for (PermissionResponseCapability v : values()) { + if (v.value.equals(value)) return v; + } + throw new IllegalArgumentException("Unknown PermissionResponseCapability value: " + value); + } +} diff --git a/java/sdk/src/main/java/com/github/copilot/CopilotSession.java b/java/sdk/src/main/java/com/github/copilot/CopilotSession.java index 83ce49654e..f3a35967d3 100644 --- a/java/sdk/src/main/java/com/github/copilot/CopilotSession.java +++ b/java/sdk/src/main/java/com/github/copilot/CopilotSession.java @@ -57,6 +57,7 @@ import com.github.copilot.generated.SessionErrorEvent; import com.github.copilot.generated.SessionEvent; import com.github.copilot.generated.SessionIdleEvent; +import com.github.copilot.generated.SessionMode; import com.github.copilot.generated.rpc.OpenCanvasInstance; import com.github.copilot.rpc.AgentInfo; import com.github.copilot.rpc.AutoModeSwitchHandler; @@ -562,7 +563,8 @@ public CompletableFuture sendAndWait(MessageOptions optio + sessionId, totalNanos); } - } else if (evt instanceof SessionIdleEvent) { + } else if (evt instanceof SessionIdleEvent idleEvent + && (idleEvent.getData() == null || idleEvent.getData().mode() != SessionMode.AUTOPILOT)) { LoggingHelpers.logTiming(LOG, Level.FINE, "CopilotSession.sendAndWait idle received. Elapsed={Elapsed}, SessionId=" + sessionId, totalNanos); diff --git a/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java b/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java index 47d537f134..a1a22674b9 100644 --- a/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java +++ b/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java @@ -5,11 +5,14 @@ package com.github.copilot; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; import java.io.Closeable; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -24,7 +27,10 @@ import com.github.copilot.generated.SessionEvent; import com.github.copilot.generated.AssistantMessageEvent; import com.github.copilot.generated.SessionIdleEvent; +import com.github.copilot.generated.SessionMode; import com.github.copilot.generated.SessionStartEvent; +import com.github.copilot.rpc.MessageOptions; +import com.github.copilot.rpc.SendMessageResponse; /** * Unit tests for session event handling API. @@ -85,6 +91,33 @@ void testTypedEventHandler() { assertEquals("Second message", receivedMessages.get(1).getData().content()); } + @Test + void testSendAndWaitSkipsAutopilotContinuationIdle() throws Exception { + var rpc = mock(JsonRpcClient.class); + when(rpc.invoke(eq("session.send"), any(), eq(SendMessageResponse.class))) + .thenReturn(CompletableFuture.completedFuture(new SendMessageResponse("message-1"))); + when(rpc.invoke(eq("session.destroy"), any(), eq(Void.class))) + .thenReturn(CompletableFuture.completedFuture(null)); + session = new CopilotSession("test-session-id", rpc); + + try { + var pending = session.sendAndWait(new MessageOptions().setPrompt("keep going")); + + dispatchEvent(createAssistantMessageEvent("intermediate")); + dispatchEvent(createSessionIdleEvent(SessionMode.AUTOPILOT)); + assertFalse(pending.isDone(), "Autopilot continuation idle must not complete sendAndWait"); + + dispatchEvent(createAssistantMessageEvent("final")); + dispatchEvent(createSessionIdleEvent(SessionMode.INTERACTIVE)); + + var result = pending.get(5, TimeUnit.SECONDS); + assertNotNull(result); + assertEquals("final", result.getData().content()); + } finally { + session.close(); + } + } + @Test void testMultipleTypedHandlers() { var messages = new ArrayList(); @@ -873,4 +906,10 @@ private AssistantMessageEvent createAssistantMessageEvent(String content) { private SessionIdleEvent createSessionIdleEvent() { return new SessionIdleEvent(); } + + private SessionIdleEvent createSessionIdleEvent(SessionMode mode) { + var event = new SessionIdleEvent(); + event.setData(new SessionIdleEvent.SessionIdleEventData(null, mode)); + return event; + } } diff --git a/java/sdk/src/test/java/com/github/copilot/rpc/PermissionRequestResultDecisionContextTest.java b/java/sdk/src/test/java/com/github/copilot/rpc/PermissionRequestResultDecisionContextTest.java index 395ad50ad6..1097b9ea0e 100644 --- a/java/sdk/src/test/java/com/github/copilot/rpc/PermissionRequestResultDecisionContextTest.java +++ b/java/sdk/src/test/java/com/github/copilot/rpc/PermissionRequestResultDecisionContextTest.java @@ -31,7 +31,7 @@ class PermissionRequestResultDecisionContextTest { private static PermissionDecisionContext sampleContext() { return new PermissionDecisionContext(PermissionDecisionOutcome.AUTO_APPROVED, - PermissionDecisionSource.HOST_POLICY, PermissionDecisionSurface.SDK); + PermissionDecisionSource.HOST_POLICY, PermissionDecisionSurface.SDK, null); } @Test @@ -68,7 +68,7 @@ void withoutContextOmitsDecisionContextKey() throws Exception { void setDecisionContextTwiceReplacesRatherThanNests() { var first = sampleContext(); var second = new PermissionDecisionContext(PermissionDecisionOutcome.PROMPTED_USER, - PermissionDecisionSource.HUMAN_RESPONSE, PermissionDecisionSurface.TUI); + PermissionDecisionSource.HUMAN_RESPONSE, PermissionDecisionSurface.TUI, null); var result = PermissionRequestResult.approveOnce().setDecisionContext(first).setDecisionContext(second); diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json index c931069940..84430ac141 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.81-10", + "@github/copilot": "^1.0.81-11", "koffi": "^3.1.0", "vscode-jsonrpc": "^8.2.1", "zod": "^4.3.6" @@ -658,8 +658,8 @@ } }, "node_modules/@github/copilot": { - "version": "1.0.81-10", - "integrity": "sha512-Ac99EvN16s4hKRhJLSEn1HMNaZ6MD8BzIey1zzJNBQy1/yP4PQDZ2CWitEq+XQQEi+6SsqeJRqXOKiWk1EyK7g==", + "version": "1.0.81-11", + "integrity": "sha512-F7hZ6G6fhWH4uq862mbs2JE3nL0KIVBOc94/EFOdEjux3oHUQst9a06gKibEJS6VRULaYTXzatA1EAgNC9dzFA==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "detect-libc": "^2.1.2" @@ -668,19 +668,19 @@ "copilot": "npm-loader.js" }, "optionalDependencies": { - "@github/copilot-darwin-arm64": "1.0.81-10", - "@github/copilot-darwin-x64": "1.0.81-10", - "@github/copilot-linux-arm64": "1.0.81-10", - "@github/copilot-linux-x64": "1.0.81-10", - "@github/copilot-linuxmusl-arm64": "1.0.81-10", - "@github/copilot-linuxmusl-x64": "1.0.81-10", - "@github/copilot-win32-arm64": "1.0.81-10", - "@github/copilot-win32-x64": "1.0.81-10" + "@github/copilot-darwin-arm64": "1.0.81-11", + "@github/copilot-darwin-x64": "1.0.81-11", + "@github/copilot-linux-arm64": "1.0.81-11", + "@github/copilot-linux-x64": "1.0.81-11", + "@github/copilot-linuxmusl-arm64": "1.0.81-11", + "@github/copilot-linuxmusl-x64": "1.0.81-11", + "@github/copilot-win32-arm64": "1.0.81-11", + "@github/copilot-win32-x64": "1.0.81-11" } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-s90Av0iwjTSU6Gky8T9wI1PJdlfbdUcPAVgKDtimaOiAwcdLG4fKTpGxrk96KJrnOHHK3x9SiXsw/pW0ThAH/A==", + "version": "1.0.81-11", + "integrity": "sha512-3eLs71CLnJH9RNnESnv4esipZPeGXMlBxQeKXwZY+crwcW2RAR8YuovQyfoZ/5by1PLPbYrOjXNfQL6kXSisrA==", "cpu": [ "arm64" ], @@ -694,8 +694,8 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "1.0.81-10", - "integrity": "sha512-8RnPI4J311oJQ0GPB6JxuLJq4JNY/KF9ZIIQm8KpxXBY6d+6fmmAsMDEk7OiF/Asl2I7+LTi+qU2ZVhP7FYhbg==", + "version": "1.0.81-11", + "integrity": "sha512-GdFLiUC8UL9k6K+woG8AyL3zBafd0Br1TIPDV5iiZsyBtTe4g67FjL7DGCYDt6AN9G43jWdK0M0InoNDVq1K1A==", "cpu": [ "x64" ], @@ -709,8 +709,8 @@ } }, "node_modules/@github/copilot-linux-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-2UtK5CBrE6ZVSIzU2KHeIgO8N7056axjbF2lE6WuK+H+oJJ4v3w5eQkalqGzRHhkaPfCW4kT1lDMhZFW+XbLjA==", + "version": "1.0.81-11", + "integrity": "sha512-C4hcAow5CdaVJITbdtGqFgxWpW7TqwyCPNn8OtcbvdWeiKcfOBDrgkvbsezG98/5Ovs3HWxZRT4oZqCEmGF9Ww==", "cpu": [ "arm64" ], @@ -724,8 +724,8 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "1.0.81-10", - "integrity": "sha512-61+KAfo1TBARrBfss3w4dfmRVSf0PiFg0c9JNuT9HjoNnytl7maJBPEgUvI4YBcxScNEAlCMXaUUG3Tuuh1g+w==", + "version": "1.0.81-11", + "integrity": "sha512-izu0PwWx+wL4zxacO6cd6r0zMMMQ3pTz+2euWcAd7HCJ/CIR6+YYfjU3TI3TPBZ9zDLZGoxHKYYPfJ1ZbSTzEg==", "cpu": [ "x64" ], @@ -739,8 +739,8 @@ } }, "node_modules/@github/copilot-linuxmusl-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-CR6KRPCFoGkaD8I2an1FyrT5avF1U5aTbwW2sYCP7w1KExYFknxEL8ES6BkFuPEA7YcjmLa0SOq26Z+TgIVHSg==", + "version": "1.0.81-11", + "integrity": "sha512-uWGUjaxOSMu6dKFWcTvXGUUp76vC3OV7nlSupecRkQ7gA3OxdrrB8rXE5/leC606Hk6oe9Wl7wKCH9EwuZ6afg==", "cpu": [ "arm64" ], @@ -754,8 +754,8 @@ } }, "node_modules/@github/copilot-linuxmusl-x64": { - "version": "1.0.81-10", - "integrity": "sha512-fvZfyEOfRkvUDPXY6UUjAqV8Mkf08PQV+jgtiAFUryuas5VP9cYaAmQSmNpzNMNi3kSX/ycUJe7oc3zXZ8ylog==", + "version": "1.0.81-11", + "integrity": "sha512-BpWKd/iu1tTyuPR2zuPFs1pVOlley4yt/TXkn6/gVwt52VI0rUxEO+n77RVjDcyMxWaUApbad2VNRPIH77guCA==", "cpu": [ "x64" ], @@ -769,8 +769,8 @@ } }, "node_modules/@github/copilot-win32-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-n30PPBgCT4Iq9MgH6is6L3eUEE+sF6xB2fb+dGsclj5j/hCkT7+ef0j8YcAGipsvGfzGAuywIsWlvF7fzYsOKQ==", + "version": "1.0.81-11", + "integrity": "sha512-GOK3cACgD96m065uJxbgcXL7MQ1qm+wq1qtvGBpprY0r9wTYJG/rVCtayjYB6B57rnaBwPll3+PQ2J1qgfO57A==", "cpu": [ "arm64" ], @@ -784,8 +784,8 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "1.0.81-10", - "integrity": "sha512-lb8kvhrXwGCN3LeRDQfLHsUp+F43XvPYznaYK1sPtK1kFGa4/kL690tasoSEvzu8ZKoTY6kZ6YmDbUZgqOislw==", + "version": "1.0.81-11", + "integrity": "sha512-u4K6UU2iGQJqQwsdHNilJBwiaC48PfMsWVFnTSlJD5lCYp9zCk1odrvrcmB3ARYinE/IcXLUosiHaM/ChR/pdA==", "cpu": [ "x64" ], diff --git a/nodejs/package.json b/nodejs/package.json index de507419fe..9f464788ee 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -56,7 +56,7 @@ "author": "GitHub", "license": "MIT", "dependencies": { - "@github/copilot": "^1.0.81-10", + "@github/copilot": "^1.0.81-11", "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 2b055e025b..7c2a1052d8 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.81-10", + "@github/copilot": "^1.0.81-11", "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 65b7c3701a..9e7304bde2 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -2548,8 +2548,24 @@ export type PermissionDecisionSurface = | "prompt_mode" /** The Copilot App client. */ | "copilot_app" + /** An Agent Client Protocol host. */ + | "acp" /** A generic Copilot SDK client. */ | "sdk"; +/** + * Response capability available to the client when it settled a permission request. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "PermissionResponseCapability". + */ +/** @experimental */ +export type PermissionResponseCapability = + /** The client could ask a user for this decision. */ + | "interactive" + /** The client could return an automated response but could not ask a user. */ + | "headless" + /** The client had no response path available. */ + | "none"; /** * Tool approval to persist and apply * @@ -8372,6 +8388,14 @@ export interface GitHubTelemetryClientInfo { * Stable machine identifier for the device. */ dev_device_id?: string; + /** + * Distinct CPU model names for the host, comma-separated. + */ + cpu_model?: string; + /** + * Number of logical CPU cores on the host. + */ + cpu_count?: number; } /** * A single telemetry event in the runtime's native GitHub-shaped telemetry format, forwarded verbatim to opted-in hosts. The `restricted` flag on the enclosing GitHubTelemetryNotification distinguishes standard from restricted events; the payload shape is identical for both. @@ -13498,6 +13522,7 @@ export interface PermissionDecisionContext { outcome: PermissionDecisionOutcome; source: PermissionDecisionSource; surface: PermissionDecisionSurface; + responseCapability?: PermissionResponseCapability; } /** * Pending permission request ID and the decision to apply (approve/reject and scope). diff --git a/nodejs/src/generated/session-events.ts b/nodejs/src/generated/session-events.ts index 3ec55aacda..473a2dbe16 100644 --- a/nodejs/src/generated/session-events.ts +++ b/nodejs/src/generated/session-events.ts @@ -163,6 +163,16 @@ export type Verbosity = | "medium" /** A more detailed response was requested. */ | "high"; +/** + * The session mode the agent is operating in + */ +export type SessionMode = + /** The agent is responding interactively to the user. */ + | "interactive" + /** The agent is preparing a plan before making changes. */ + | "plan" + /** The agent is working autonomously toward task completion. */ + | "autopilot"; /** * Who created the schedule: `user` (an explicit user action such as `/every` or `/after`) or `model` (the agent via the `manage_schedule` tool). Gates whether a scheduled skill that opted out of model invocation may fire: only user-created schedules may. */ @@ -219,16 +229,6 @@ export type ModelChangeSource = | "automatic" /** An SDK or RPC caller selected the model. */ | "sdk"; -/** - * The session mode the agent is operating in - */ -export type SessionMode = - /** The agent is responding interactively to the user. */ - | "interactive" - /** The agent is preparing a plan before making changes. */ - | "plan" - /** The agent is working autonomously toward task completion. */ - | "autopilot"; /** * Permission mode for the session. */ @@ -1362,6 +1362,7 @@ export interface IdleData { * True when the preceding agentic loop was cancelled via abort signal */ aborted?: boolean; + mode?: SessionMode; } /** * Session event "session.title_changed". Session title change payload containing the new display title diff --git a/nodejs/src/index.ts b/nodejs/src/index.ts index bf7405c87b..9d55ab1d10 100644 --- a/nodejs/src/index.ts +++ b/nodejs/src/index.ts @@ -135,6 +135,7 @@ export type { PermissionDecisionOutcome, PermissionDecisionSource, PermissionDecisionSurface, + PermissionResponseCapability, ProviderConfig, ProviderModelConfig, ProviderTokenArgs, diff --git a/nodejs/src/session.ts b/nodejs/src/session.ts index d8b67133ff..65ff00921c 100644 --- a/nodejs/src/session.ts +++ b/nodejs/src/session.ts @@ -764,7 +764,7 @@ export class CopilotSession { const unsubscribe = this.on((event) => { if (event.type === "assistant.message") { lastAssistantMessage = event; - } else if (event.type === "session.idle") { + } else if (event.type === "session.idle" && event.data.mode !== "autopilot") { resolveOutcome({ kind: "idle" }); } else if (event.type === "session.error") { const error = new Error(event.data.message); diff --git a/nodejs/src/types.ts b/nodejs/src/types.ts index f9c3c6110e..616e15a467 100644 --- a/nodejs/src/types.ts +++ b/nodejs/src/types.ts @@ -88,6 +88,7 @@ export type { PermissionDecisionOutcome, PermissionDecisionSource, PermissionDecisionSurface, + PermissionResponseCapability, } from "./generated/rpc.js"; export type { CopilotRequestContext } from "./copilotRequestHandler.js"; export { diff --git a/nodejs/test/session-event-types.test.ts b/nodejs/test/session-event-types.test.ts index 213670216d..5c41f2216a 100644 --- a/nodejs/test/session-event-types.test.ts +++ b/nodejs/test/session-event-types.test.ts @@ -24,6 +24,7 @@ import type { PermissionRequest, PermissionRequestedData, PermissionRequestedEvent, + PermissionResponseCapability, ManagedSettingsResolvedData, ManagedSettingsResolvedEvent, ManagedSettingsResolvedSource, @@ -321,6 +322,7 @@ describe("Session event type exports (#1156)", () => { assertImportable(); assertImportable(); assertImportable(); + assertImportable(); assertImportable(); assertImportable(); diff --git a/nodejs/test/session-send-and-wait.test.ts b/nodejs/test/session-send-and-wait.test.ts index 8b6e390c4a..4ee2e8eebc 100644 --- a/nodejs/test/session-send-and-wait.test.ts +++ b/nodejs/test/session-send-and-wait.test.ts @@ -7,7 +7,10 @@ import type { MessageConnection } from "vscode-jsonrpc/node.js"; import { CopilotSession } from "../src/session.js"; import type { SessionEvent } from "../src/generated/session-events.js"; -function sessionEvent(type: "session.idle", data: Record = {}): SessionEvent { +function sessionEvent( + type: "session.idle", + data: { mode?: "interactive" | "plan" | "autopilot" } = {} +): SessionEvent { return { type, id: "00000000-0000-4000-8000-000000000001", @@ -106,6 +109,24 @@ describe("sendAndWait", () => { await expect(pending).resolves.toBeUndefined(); }); + it("ignores autopilot continuation idle events", async () => { + const { session, sendStarted, resolveSend } = controlledSession(); + const pending = session.sendAndWait({ prompt: "hi" }); + await sendStarted; + + session._dispatchEvent(sessionEvent("session.idle", { mode: "autopilot" })); + resolveSend(); + + const stateAfterContinuation = await Promise.race([ + pending.then(() => "settled"), + new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 0)), + ]); + expect(stateAfterContinuation).toBe("pending"); + + session._dispatchEvent(sessionEvent("session.idle", { mode: "interactive" })); + await expect(pending).resolves.toBeUndefined(); + }); + it("preserves the send rejection when a session error arrives first", async () => { const { session, sendStarted, rejectSend } = controlledSession(); const pending = session.sendAndWait({ prompt: "hi" }); diff --git a/python/copilot/__init__.py b/python/copilot/__init__.py index 5f5bef88bd..608dacf253 100644 --- a/python/copilot/__init__.py +++ b/python/copilot/__init__.py @@ -100,6 +100,7 @@ PermissionDecisionOutcome, PermissionDecisionSource, PermissionDecisionSurface, + PermissionResponseCapability, ) from .generated.session_events import ( PermissionRequest, @@ -324,6 +325,7 @@ "PermissionDecisionOutcome", "PermissionDecisionSource", "PermissionDecisionSurface", + "PermissionResponseCapability", "PingResponse", "PostToolUseHandler", "PostToolUseFailureHandler", diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py index ca782bd363..242e4041ed 100644 --- a/python/copilot/generated/rpc.py +++ b/python/copilot/generated/rpc.py @@ -3542,6 +3542,12 @@ class GitHubTelemetryClientInfo: copilot_plan: str | None = None """Copilot subscription plan, when known.""" + cpu_count: int | None = None + """Number of logical CPU cores on the host.""" + + cpu_model: str | None = None + """Distinct CPU model names for the host, comma-separated.""" + dev_device_id: str | None = None """Stable machine identifier for the device.""" @@ -3559,9 +3565,11 @@ def from_dict(obj: Any) -> 'GitHubTelemetryClientInfo': client_name = from_union([from_str, from_none], obj.get("client_name")) client_type = from_union([from_str, from_none], obj.get("client_type")) copilot_plan = from_union([from_str, from_none], obj.get("copilot_plan")) + cpu_count = from_union([from_int, from_none], obj.get("cpu_count")) + cpu_model = from_union([from_str, from_none], obj.get("cpu_model")) dev_device_id = from_union([from_str, from_none], obj.get("dev_device_id")) is_staff = from_union([from_bool, from_none], obj.get("is_staff")) - return GitHubTelemetryClientInfo(cli_version, node_version, os_arch, os_platform, os_version, client_name, client_type, copilot_plan, dev_device_id, is_staff) + return GitHubTelemetryClientInfo(cli_version, node_version, os_arch, os_platform, os_version, client_name, client_type, copilot_plan, cpu_count, cpu_model, dev_device_id, is_staff) def to_dict(self) -> dict: result: dict = {} @@ -3576,6 +3584,10 @@ def to_dict(self) -> dict: result["client_type"] = from_union([from_str, from_none], self.client_type) if self.copilot_plan is not None: result["copilot_plan"] = from_union([from_str, from_none], self.copilot_plan) + if self.cpu_count is not None: + result["cpu_count"] = from_union([from_int, from_none], self.cpu_count) + if self.cpu_model is not None: + result["cpu_model"] = from_union([from_str, from_none], self.cpu_model) if self.dev_device_id is not None: result["dev_device_id"] = from_union([from_str, from_none], self.dev_device_id) if self.is_staff is not None: @@ -7216,6 +7228,17 @@ class PermissionDecisionOutcome(Enum): AUTO_APPROVED = "auto_approved" PROMPTED_USER = "prompted_user" +# Experimental: this type is part of an experimental API and may change or be removed. +class PermissionResponseCapability(Enum): + """Whether the responding client could ask a user interactively, was running headlessly, or + had no response path. Omit when the client cannot determine this authoritatively. + + Response capability available to the client when it settled a permission request. + """ + HEADLESS = "headless" + INTERACTIVE = "interactive" + NONE = "none" + # Experimental: this type is part of an experimental API and may change or be removed. class PermissionDecisionSource(Enum): """Controlled reason or actor responsible for the response. @@ -7233,6 +7256,7 @@ class PermissionDecisionSurface(Enum): Client surface that submitted a permission response. """ + ACP = "acp" COPILOT_APP = "copilot_app" PROMPT_MODE = "prompt_mode" SDK = "sdk" @@ -20648,19 +20672,27 @@ class PermissionDecisionContext: surface: PermissionDecisionSurface """Client surface that submitted the response.""" + response_capability: PermissionResponseCapability | None = None + """Whether the responding client could ask a user interactively, was running headlessly, or + had no response path. Omit when the client cannot determine this authoritatively. + """ + @staticmethod def from_dict(obj: Any) -> 'PermissionDecisionContext': assert isinstance(obj, dict) outcome = PermissionDecisionOutcome(obj.get("outcome")) source = PermissionDecisionSource(obj.get("source")) surface = PermissionDecisionSurface(obj.get("surface")) - return PermissionDecisionContext(outcome, source, surface) + response_capability = from_union([PermissionResponseCapability, from_none], obj.get("responseCapability")) + return PermissionDecisionContext(outcome, source, surface, response_capability) def to_dict(self) -> dict: result: dict = {} result["outcome"] = to_enum(PermissionDecisionOutcome, self.outcome) result["source"] = to_enum(PermissionDecisionSource, self.source) result["surface"] = to_enum(PermissionDecisionSurface, self.surface) + if self.response_capability is not None: + result["responseCapability"] = from_union([lambda x: to_enum(PermissionResponseCapability, x), from_none], self.response_capability) return result # Experimental: this type is part of an experimental API and may change or be removed. @@ -35523,6 +35555,7 @@ class RPC: permission_paths_workspace_check_result: PermissionPathsWorkspaceCheckResult permission_prompt_shown_notification: PermissionPromptShownNotification permission_request_result: PermissionRequestResult + permission_response_capability: PermissionResponseCapability permission_rules_set: PermissionRulesSet permissions_configure_additional_content_exclusion_policy: PermissionsConfigureAdditionalContentExclusionPolicy permissions_configure_additional_content_exclusion_policy_rule: PermissionsConfigureAdditionalContentExclusionPolicyRule @@ -36702,6 +36735,7 @@ def from_dict(obj: Any) -> 'RPC': permission_paths_workspace_check_result = PermissionPathsWorkspaceCheckResult.from_dict(obj.get("PermissionPathsWorkspaceCheckResult")) permission_prompt_shown_notification = PermissionPromptShownNotification.from_dict(obj.get("PermissionPromptShownNotification")) permission_request_result = PermissionRequestResult.from_dict(obj.get("PermissionRequestResult")) + permission_response_capability = PermissionResponseCapability(obj.get("PermissionResponseCapability")) permission_rules_set = PermissionRulesSet.from_dict(obj.get("PermissionRulesSet")) permissions_configure_additional_content_exclusion_policy = PermissionsConfigureAdditionalContentExclusionPolicy.from_dict(obj.get("PermissionsConfigureAdditionalContentExclusionPolicy")) permissions_configure_additional_content_exclusion_policy_rule = PermissionsConfigureAdditionalContentExclusionPolicyRule.from_dict(obj.get("PermissionsConfigureAdditionalContentExclusionPolicyRule")) @@ -37257,7 +37291,7 @@ def from_dict(obj: Any) -> 'RPC': subagent_settings = from_union([SubagentSettings.from_dict, from_none], obj.get("SubagentSettings")) task_progress = from_union([TaskProgress.from_dict, from_none], obj.get("TaskProgress")) workspace_summary = from_union([WorkspaceSummary.from_dict, from_none], obj.get("WorkspaceSummary")) - return RPC(abort_request, abort_result, account_all_users, account_get_all_users_result, account_get_current_auth_result, account_get_quota_request, account_get_quota_result, account_login_request, account_login_result, account_logout_request, account_logout_result, account_quota_snapshot, adaptive_thinking_support, agent_discovery_path, agent_discovery_path_list, agent_discovery_path_scope, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_list_request, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, agent_set_prompt_request, agents_get_discovery_paths_request, api_key_auth_info, auth_identity, auth_info, auth_info_type, auth_validation_error, auth_validation_errors, built_in_model_catalog, built_in_model_catalog_entry, builtin_tool_descriptor, builtin_tool_format, builtin_tool_format_type, builtin_tool_input_schema, builtin_tool_input_schema_type, builtin_tool_safe_for_telemetry, builtin_tool_safe_telemetry_fields, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_provider_register_request, canvas_provider_unregister_request, canvas_session_context, capi_session_options, card_digest, card_digest_algorithm, card_digest_value, catalog_ai_skill_candidate, catalog_ai_skill_candidate_provenance, catalog_authentication_required_error, catalog_authentication_required_reason, catalog_candidate, catalog_candidate_kind, catalog_candidate_source, catalog_candidate_source_embedded, catalog_candidate_source_url, catalog_capability, catalog_capability_id, catalog_client_contract, catalog_contract_violation_error, catalog_contract_violation_reason, catalog_handle_rejected_error, catalog_handle_rejection_reason, catalog_handle_type, catalog_invalid_request_error, catalog_invalid_request_field, catalog_malformed_card_error, catalog_malformed_card_reason, catalog_mcp_server_candidate, catalog_mcp_server_candidate_provenance, catalog_mcp_server_installability, catalog_media_type, catalog_negotiated_contract, catalog_negotiation_refused_error, catalog_negotiation_refused_reason, catalog_network_failure_error, catalog_network_failure_reason, catalog_not_installable_error, catalog_not_installable_reason, catalog_policy_rejected_error, catalog_search_request, catalog_search_result, catalog_search_succeeded, catalog_unavailable_error, catalog_unavailable_reason, catalog_unavailable_transport_error, catalog_unavailable_transport_reason, catalog_unsafe_retrieval_error, catalog_unsafe_retrieval_reason, catalog_unsupported_kind_error, command_list, commands_finalize_invocation_effect_request, commands_finalize_invocation_effect_result, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invocation_effect_outcome, commands_invocation_origin, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, completions_get_trigger_characters_result, completions_request_request, completions_request_result, configure_session_extensions_params, connect_client_info, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_exclusion_check_paths_request, content_exclusion_check_paths_result, content_exclusion_path_check, content_filter_mode, context_heaviest_message, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, debug_collect_logs_collected_entry, debug_collect_logs_destination, debug_collect_logs_entry, debug_collect_logs_entry_kind, debug_collect_logs_include, debug_collect_logs_redaction, debug_collect_logs_request, debug_collect_logs_result, debug_collect_logs_result_kind, debug_collect_logs_skipped_entry, debug_collect_logs_source, discovered_canvas, discovered_extension, discovered_extension_mode, discovered_extension_plugin, discovered_extensions, discovered_extensions_disable_request, discovered_extensions_enable_request, discovered_extension_source, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_direction, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_launch_profile, extension_launch_provider_resolve_request, extension_launch_provider_resolve_result, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_shell_exit, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, factory_abort_request, factory_ack_result, factory_agent_options, factory_agent_request, factory_agent_result, factory_agent_summary, factory_cancel_request, factory_current_phase, factory_declared_limits, factory_durable_operation, factory_execute_request, factory_execute_result, factory_get_run_progress_request, factory_get_run_request, factory_journal_get_request, factory_journal_get_result, factory_journal_put_request, factory_list_runs_request, factory_list_runs_result, factory_log_line, factory_log_line_kind, factory_log_request, factory_phase_observation, factory_phase_status, factory_progress_line, factory_progress_page, factory_resume_request, factory_resume_result, factory_run_consumed, factory_run_detail, factory_run_failure, factory_run_failure_kind, factory_run_limits, factory_run_request, factory_run_result, factory_run_status, factory_run_summary, factory_run_terminal, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, git_hub_telemetry_client_info, git_hub_telemetry_event, git_hub_telemetry_notification, git_hub_token_acquire_reason, git_hub_token_acquire_request, git_hub_token_acquire_result, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_clear_context_request, history_clear_context_result, history_compact_context_window, history_compact_request, history_compact_result, history_file_restore_skip_reason, history_list_rewind_points_result, history_preview_rewind_request, history_preview_rewind_result, history_rewind_change_type, history_rewind_file_preview, history_rewind_mode, history_rewind_outcome, history_rewind_point, history_rewind_request, history_rewind_result, history_rewind_unavailable_reason, history_skipped_file_restore, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, hook_invoke_request, hook_invoke_response, hook_type, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instruction_discovery_path, instruction_discovery_path_kind, instruction_discovery_path_list, instruction_discovery_path_location, instructions_discover_request, instructions_get_discovery_paths_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, interrupt_main_turn_request, interrupt_main_turn_result, llm_inference_headers, llm_inference_http_request_chunk_request, llm_inference_http_request_chunk_result, llm_inference_http_request_start_request, llm_inference_http_request_start_result, llm_inference_http_request_start_transport, llm_inference_http_response_chunk_error, llm_inference_http_response_chunk_request, llm_inference_http_response_chunk_result, llm_inference_http_response_start_request, llm_inference_http_response_start_result, llm_inference_set_provider_result, local_session_metadata_value, log_request, log_result, lsp_initialize_request, managed_settings_read_result, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_elicitation_form_mode, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_failed_server, mcp_filtered_server, mcp_headers_handle_pending_headers_refresh_request, mcp_headers_handle_pending_headers_refresh_request_request, mcp_headers_handle_pending_headers_refresh_request_result, mcp_host_state, mcp_install_plan, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_authentication_state_changed_request, mcp_oauth_handle_pending_request, mcp_oauth_handle_pending_result, mcp_oauth_login_grant_type, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_pending_request_response, mcp_oauth_probe_needs_auth_reason, mcp_oauth_probe_request, mcp_oauth_probe_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_plan_configuration_change, mcp_plan_configuration_operation, mcp_plan_enum_value_type, mcp_plan_install_planned, mcp_plan_install_request, mcp_plan_install_result, mcp_plan_install_source, mcp_plan_install_source_candidate, mcp_plan_install_source_candidate_kind, mcp_plan_install_source_card, mcp_plan_install_source_card_kind, mcp_plan_package_install_method, mcp_plan_package_transport, mcp_plan_policy_decision, mcp_plan_policy_result, mcp_plan_policy_source, mcp_plan_provenance, mcp_plan_remote_install_method, mcp_plan_remote_transport, mcp_plan_required_value, mcp_plan_required_value_enum, mcp_plan_required_value_enum_kind, mcp_plan_required_value_scalar, mcp_plan_required_value_scalar_kind, mcp_plan_resource_identity, mcp_plan_scalar_value_type, mcp_plan_scope, mcp_plan_secret_placeholder, mcp_plan_secret_reference, mcp_plan_target, mcp_plan_transport_choice, mcp_plan_transport_choice_package, mcp_plan_transport_choice_remote, mcp_plan_value_category, mcp_register_external_client_request, mcp_reload_config, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_resource, mcp_resource_annotations, mcp_resource_content, mcp_resource_icon, mcp_resources_list_request, mcp_resources_list_result, mcp_resources_list_templates_request, mcp_resources_list_templates_result, mcp_resources_read_request, mcp_resources_read_result, mcp_resource_template, mcp_restart_server_request, mcp_safe_for_telemetry, mcp_safe_for_telemetry_fields, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_serializable_server_config, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_card_embedded, mcp_server_card_embedded_kind, mcp_server_card_media_type, mcp_server_card_reference, mcp_server_card_url, mcp_server_card_url_kind, mcp_server_config, mcp_server_config_defer_tools, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_memory, mcp_server_config_memory_type, mcp_server_config_stdio, mcp_server_config_stdio_type, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_task_metadata, mcp_tools, mcp_tool_ui, mcp_tool_ui_visibility, mcp_unregister_external_client_request, memory_configuration, metadata_context_attribution_result, metadata_context_heaviest_messages_request, metadata_context_heaviest_messages_result, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, model, model_apply_startup_overlay_request, model_billing, model_billing_promo, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_message, model_picker_category, model_picker_persistence_request, model_picker_price_category, model_picker_settings_context, model_policy, model_policy_state, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_confirmation, model_switch_to_request, model_switch_to_result, model_warning_text, mode_set_request, mode_set_result, move_mcp_loading_to_background_result, named_provider_config, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_env_access, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_factory, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_env_access, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_factory, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_context, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_outcome, permission_decision_reject, permission_decision_request, permission_decision_source, permission_decision_surface, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_mode_source, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_mode_request, permissions_get_mode_result, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_env_access, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_factory, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_mode_request, permissions_set_mode_result, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_list, plugin_list_result, plugins_builtin_set_request, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, protocol_external_tool_defer, protocol_external_tool_definition, provider_add_request, provider_add_result, provider_config, provider_config_azure, provider_config_transport, provider_config_type, provider_config_wire_api, provider_endpoint, provider_endpoint_transport, provider_endpoint_type, provider_endpoint_wire_api, provider_get_endpoint_request, provider_model_config, provider_session_token, provider_token_acquire_request, provider_token_acquire_result, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_actions_job, push_attachment_git_hub_commit, push_attachment_git_hub_file, push_attachment_git_hub_file_diff, push_attachment_git_hub_file_diff_side, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_git_hub_release, push_attachment_git_hub_repository, push_attachment_git_hub_snippet, push_attachment_git_hub_tree_comparison, push_attachment_git_hub_tree_comparison_side, push_attachment_git_hub_url, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, push_git_hub_repo_ref, queue_begin_deferred_idle_drain_request, queue_begin_deferred_idle_drain_result, queue_consume_system_notifications_request, queued_command_handled, queued_command_not_handled, queued_command_result, queue_defer_session_idle_request, queue_duplicate_at_request, queue_duplicate_at_result, queue_enqueue_resume_pending_result, queue_finish_deferred_idle_drain_request, queue_finish_deferred_idle_drain_result, queue_has_pending_result, queue_insert_at_request, queue_insert_at_result, queue_insert_message, queue_move_item_request, queue_move_item_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_at_request, queue_remove_at_result, queue_remove_most_recent_result, queue_send_now_request, queue_send_now_result, queue_set_drain_paused_request, queue_snapshot_result, queue_update_text_request, queue_update_text_result, register_event_interest_params, register_event_interest_result, register_extension_tools_params, register_extension_tools_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_host_status, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, run_options, sandbox_config, sandbox_config_auth, sandbox_config_source, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, sandbox_config_user_policy_network_proxy, sandbox_config_user_policy_seatbelt, schedule_add_at_request, schedule_add_cron_request, schedule_add_request, schedule_add_result, schedule_add_self_paced_request, schedule_entry, schedule_has_self_paced_result, schedule_list, schedule_rearm_self_paced_request, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_message_item, send_messages_request, send_messages_result, send_mode, send_request, send_result, send_system_notification_request, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_agent_list_request, session_auth_login_request, session_auth_logout_user_request, session_auth_status, session_auth_switch_request, session_bulk_delete_result, session_cancel_all_background_agents_result, session_capability, session_commands_list_request, session_completion_item, session_context, session_context_host_type, session_enrich_metadata_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_sqlite_transaction_error, session_fs_sqlite_transaction_error_class, session_fs_sqlite_transaction_request, session_fs_sqlite_transaction_result, session_fs_sqlite_transaction_statement, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_git_hub_auth_get_all_auth_available_result, session_git_hub_auth_logout_result, session_git_hub_auth_logout_user_result, session_history_compact_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_limit_prediction_baseline_data, session_limit_prediction_client_type, session_limit_prediction_details, session_limit_prediction_predict_request, session_limit_prediction_request, session_limit_prediction_result, session_limit_prediction_source, session_limit_prediction_tier, session_limit_prediction_tier_option, session_limit_prediction_unavailable_reason, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_managed_permissions, session_managed_settings, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_model_list_request, session_model_price_category, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_plugins_reload_request, session_provider_get_endpoint_request, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_close_request, sessions_close_result, sessions_delete_request, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, session_settings_built_in_tool_availability_snapshot, session_settings_evaluate_predicate_request, session_settings_evaluate_predicate_result, session_settings_job_snapshot, session_settings_model_snapshot, session_settings_online_evaluation_snapshot, session_settings_predicate_name, session_settings_repo_snapshot, session_settings_snapshot, session_settings_validation_snapshot, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_metadata_request, sessions_get_metadata_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_non_empty_session_ids_request, sessions_list_non_empty_session_ids_result, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_prune_old_request, sessions_register_extension_tools_on_session_options, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_visibility_status, session_working_directory_context, session_working_directory_context_host_type, settable_auth_info, settable_token_auth_info, shell_cancel_user_requested_request, shell_credentials, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_init_profile, shell_init_script, shell_init_script_shell, shell_kill_request, shell_kill_result, shell_kill_signal, shell_options, shutdown_request, skill, skill_discovery_path, skill_discovery_path_list, skill_discovery_scope, skill_list, skills_config_set_disabled_skills_request, skills_config_set_skill_disabled_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_discovery_paths_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_add_timeline_entry_result, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_choice, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_model_picker_dialog, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_set_model_result, slash_command_set_plan_model_result, slash_command_show_dialog_result, slash_command_text_result, slash_command_timeline_entry, subagent_settings_entry, subagent_settings_entry_context_tier, task_agent_info, task_agent_progress, task_complete_data, task_completion_decision, task_execution_mode, task_info, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, token_provider_auth_info, tool, tool_list, tool_result, tool_result_expanded, tool_result_new_message, tool_result_type, tools_execute_request, tools_get_builtin_descriptors_request, tools_get_builtin_descriptors_result, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_set_request, tools_set_result, tools_shell_descriptor_config, tools_task_complete_event_data_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_session_limits_exhausted_request, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_session_limits_exhausted_response, ui_session_limits_exhausted_response_action, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_agent_metric, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, user_setting_metadata, user_settings_get_result, user_settings_set_request, user_settings_set_result, visibility_get_result, visibility_set_request, visibility_set_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_add_summary_request, workspaces_add_summary_result, workspaces_autopilot_objective_exists_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_delete_autopilot_objective_result, workspaces_diff_request, workspaces_ensure_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_autopilot_objective_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspaces_truncate_summaries_request, workspace_summary_host_type, workspaces_update_metadata_request, workspaces_workspace_details_host_type, workspaces_write_autopilot_objective_request, workspaces_write_autopilot_objective_result, session_auth_info_result, session_context_attribution, session_context_info, subagent_settings, task_progress, workspace_summary) + return RPC(abort_request, abort_result, account_all_users, account_get_all_users_result, account_get_current_auth_result, account_get_quota_request, account_get_quota_result, account_login_request, account_login_result, account_logout_request, account_logout_result, account_quota_snapshot, adaptive_thinking_support, agent_discovery_path, agent_discovery_path_list, agent_discovery_path_scope, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_list_request, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, agent_set_prompt_request, agents_get_discovery_paths_request, api_key_auth_info, auth_identity, auth_info, auth_info_type, auth_validation_error, auth_validation_errors, built_in_model_catalog, built_in_model_catalog_entry, builtin_tool_descriptor, builtin_tool_format, builtin_tool_format_type, builtin_tool_input_schema, builtin_tool_input_schema_type, builtin_tool_safe_for_telemetry, builtin_tool_safe_telemetry_fields, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_provider_register_request, canvas_provider_unregister_request, canvas_session_context, capi_session_options, card_digest, card_digest_algorithm, card_digest_value, catalog_ai_skill_candidate, catalog_ai_skill_candidate_provenance, catalog_authentication_required_error, catalog_authentication_required_reason, catalog_candidate, catalog_candidate_kind, catalog_candidate_source, catalog_candidate_source_embedded, catalog_candidate_source_url, catalog_capability, catalog_capability_id, catalog_client_contract, catalog_contract_violation_error, catalog_contract_violation_reason, catalog_handle_rejected_error, catalog_handle_rejection_reason, catalog_handle_type, catalog_invalid_request_error, catalog_invalid_request_field, catalog_malformed_card_error, catalog_malformed_card_reason, catalog_mcp_server_candidate, catalog_mcp_server_candidate_provenance, catalog_mcp_server_installability, catalog_media_type, catalog_negotiated_contract, catalog_negotiation_refused_error, catalog_negotiation_refused_reason, catalog_network_failure_error, catalog_network_failure_reason, catalog_not_installable_error, catalog_not_installable_reason, catalog_policy_rejected_error, catalog_search_request, catalog_search_result, catalog_search_succeeded, catalog_unavailable_error, catalog_unavailable_reason, catalog_unavailable_transport_error, catalog_unavailable_transport_reason, catalog_unsafe_retrieval_error, catalog_unsafe_retrieval_reason, catalog_unsupported_kind_error, command_list, commands_finalize_invocation_effect_request, commands_finalize_invocation_effect_result, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invocation_effect_outcome, commands_invocation_origin, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, completions_get_trigger_characters_result, completions_request_request, completions_request_result, configure_session_extensions_params, connect_client_info, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_exclusion_check_paths_request, content_exclusion_check_paths_result, content_exclusion_path_check, content_filter_mode, context_heaviest_message, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, debug_collect_logs_collected_entry, debug_collect_logs_destination, debug_collect_logs_entry, debug_collect_logs_entry_kind, debug_collect_logs_include, debug_collect_logs_redaction, debug_collect_logs_request, debug_collect_logs_result, debug_collect_logs_result_kind, debug_collect_logs_skipped_entry, debug_collect_logs_source, discovered_canvas, discovered_extension, discovered_extension_mode, discovered_extension_plugin, discovered_extensions, discovered_extensions_disable_request, discovered_extensions_enable_request, discovered_extension_source, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_direction, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_launch_profile, extension_launch_provider_resolve_request, extension_launch_provider_resolve_result, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_shell_exit, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, factory_abort_request, factory_ack_result, factory_agent_options, factory_agent_request, factory_agent_result, factory_agent_summary, factory_cancel_request, factory_current_phase, factory_declared_limits, factory_durable_operation, factory_execute_request, factory_execute_result, factory_get_run_progress_request, factory_get_run_request, factory_journal_get_request, factory_journal_get_result, factory_journal_put_request, factory_list_runs_request, factory_list_runs_result, factory_log_line, factory_log_line_kind, factory_log_request, factory_phase_observation, factory_phase_status, factory_progress_line, factory_progress_page, factory_resume_request, factory_resume_result, factory_run_consumed, factory_run_detail, factory_run_failure, factory_run_failure_kind, factory_run_limits, factory_run_request, factory_run_result, factory_run_status, factory_run_summary, factory_run_terminal, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, git_hub_telemetry_client_info, git_hub_telemetry_event, git_hub_telemetry_notification, git_hub_token_acquire_reason, git_hub_token_acquire_request, git_hub_token_acquire_result, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_clear_context_request, history_clear_context_result, history_compact_context_window, history_compact_request, history_compact_result, history_file_restore_skip_reason, history_list_rewind_points_result, history_preview_rewind_request, history_preview_rewind_result, history_rewind_change_type, history_rewind_file_preview, history_rewind_mode, history_rewind_outcome, history_rewind_point, history_rewind_request, history_rewind_result, history_rewind_unavailable_reason, history_skipped_file_restore, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, hook_invoke_request, hook_invoke_response, hook_type, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instruction_discovery_path, instruction_discovery_path_kind, instruction_discovery_path_list, instruction_discovery_path_location, instructions_discover_request, instructions_get_discovery_paths_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, interrupt_main_turn_request, interrupt_main_turn_result, llm_inference_headers, llm_inference_http_request_chunk_request, llm_inference_http_request_chunk_result, llm_inference_http_request_start_request, llm_inference_http_request_start_result, llm_inference_http_request_start_transport, llm_inference_http_response_chunk_error, llm_inference_http_response_chunk_request, llm_inference_http_response_chunk_result, llm_inference_http_response_start_request, llm_inference_http_response_start_result, llm_inference_set_provider_result, local_session_metadata_value, log_request, log_result, lsp_initialize_request, managed_settings_read_result, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_elicitation_form_mode, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_failed_server, mcp_filtered_server, mcp_headers_handle_pending_headers_refresh_request, mcp_headers_handle_pending_headers_refresh_request_request, mcp_headers_handle_pending_headers_refresh_request_result, mcp_host_state, mcp_install_plan, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_authentication_state_changed_request, mcp_oauth_handle_pending_request, mcp_oauth_handle_pending_result, mcp_oauth_login_grant_type, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_pending_request_response, mcp_oauth_probe_needs_auth_reason, mcp_oauth_probe_request, mcp_oauth_probe_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_plan_configuration_change, mcp_plan_configuration_operation, mcp_plan_enum_value_type, mcp_plan_install_planned, mcp_plan_install_request, mcp_plan_install_result, mcp_plan_install_source, mcp_plan_install_source_candidate, mcp_plan_install_source_candidate_kind, mcp_plan_install_source_card, mcp_plan_install_source_card_kind, mcp_plan_package_install_method, mcp_plan_package_transport, mcp_plan_policy_decision, mcp_plan_policy_result, mcp_plan_policy_source, mcp_plan_provenance, mcp_plan_remote_install_method, mcp_plan_remote_transport, mcp_plan_required_value, mcp_plan_required_value_enum, mcp_plan_required_value_enum_kind, mcp_plan_required_value_scalar, mcp_plan_required_value_scalar_kind, mcp_plan_resource_identity, mcp_plan_scalar_value_type, mcp_plan_scope, mcp_plan_secret_placeholder, mcp_plan_secret_reference, mcp_plan_target, mcp_plan_transport_choice, mcp_plan_transport_choice_package, mcp_plan_transport_choice_remote, mcp_plan_value_category, mcp_register_external_client_request, mcp_reload_config, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_resource, mcp_resource_annotations, mcp_resource_content, mcp_resource_icon, mcp_resources_list_request, mcp_resources_list_result, mcp_resources_list_templates_request, mcp_resources_list_templates_result, mcp_resources_read_request, mcp_resources_read_result, mcp_resource_template, mcp_restart_server_request, mcp_safe_for_telemetry, mcp_safe_for_telemetry_fields, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_serializable_server_config, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_card_embedded, mcp_server_card_embedded_kind, mcp_server_card_media_type, mcp_server_card_reference, mcp_server_card_url, mcp_server_card_url_kind, mcp_server_config, mcp_server_config_defer_tools, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_memory, mcp_server_config_memory_type, mcp_server_config_stdio, mcp_server_config_stdio_type, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_task_metadata, mcp_tools, mcp_tool_ui, mcp_tool_ui_visibility, mcp_unregister_external_client_request, memory_configuration, metadata_context_attribution_result, metadata_context_heaviest_messages_request, metadata_context_heaviest_messages_result, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, model, model_apply_startup_overlay_request, model_billing, model_billing_promo, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_message, model_picker_category, model_picker_persistence_request, model_picker_price_category, model_picker_settings_context, model_policy, model_policy_state, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_confirmation, model_switch_to_request, model_switch_to_result, model_warning_text, mode_set_request, mode_set_result, move_mcp_loading_to_background_result, named_provider_config, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_env_access, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_factory, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_env_access, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_factory, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_context, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_outcome, permission_decision_reject, permission_decision_request, permission_decision_source, permission_decision_surface, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_mode_source, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_response_capability, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_mode_request, permissions_get_mode_result, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_env_access, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_factory, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_mode_request, permissions_set_mode_result, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_list, plugin_list_result, plugins_builtin_set_request, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, protocol_external_tool_defer, protocol_external_tool_definition, provider_add_request, provider_add_result, provider_config, provider_config_azure, provider_config_transport, provider_config_type, provider_config_wire_api, provider_endpoint, provider_endpoint_transport, provider_endpoint_type, provider_endpoint_wire_api, provider_get_endpoint_request, provider_model_config, provider_session_token, provider_token_acquire_request, provider_token_acquire_result, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_actions_job, push_attachment_git_hub_commit, push_attachment_git_hub_file, push_attachment_git_hub_file_diff, push_attachment_git_hub_file_diff_side, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_git_hub_release, push_attachment_git_hub_repository, push_attachment_git_hub_snippet, push_attachment_git_hub_tree_comparison, push_attachment_git_hub_tree_comparison_side, push_attachment_git_hub_url, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, push_git_hub_repo_ref, queue_begin_deferred_idle_drain_request, queue_begin_deferred_idle_drain_result, queue_consume_system_notifications_request, queued_command_handled, queued_command_not_handled, queued_command_result, queue_defer_session_idle_request, queue_duplicate_at_request, queue_duplicate_at_result, queue_enqueue_resume_pending_result, queue_finish_deferred_idle_drain_request, queue_finish_deferred_idle_drain_result, queue_has_pending_result, queue_insert_at_request, queue_insert_at_result, queue_insert_message, queue_move_item_request, queue_move_item_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_at_request, queue_remove_at_result, queue_remove_most_recent_result, queue_send_now_request, queue_send_now_result, queue_set_drain_paused_request, queue_snapshot_result, queue_update_text_request, queue_update_text_result, register_event_interest_params, register_event_interest_result, register_extension_tools_params, register_extension_tools_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_host_status, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, run_options, sandbox_config, sandbox_config_auth, sandbox_config_source, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, sandbox_config_user_policy_network_proxy, sandbox_config_user_policy_seatbelt, schedule_add_at_request, schedule_add_cron_request, schedule_add_request, schedule_add_result, schedule_add_self_paced_request, schedule_entry, schedule_has_self_paced_result, schedule_list, schedule_rearm_self_paced_request, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_message_item, send_messages_request, send_messages_result, send_mode, send_request, send_result, send_system_notification_request, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_agent_list_request, session_auth_login_request, session_auth_logout_user_request, session_auth_status, session_auth_switch_request, session_bulk_delete_result, session_cancel_all_background_agents_result, session_capability, session_commands_list_request, session_completion_item, session_context, session_context_host_type, session_enrich_metadata_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_sqlite_transaction_error, session_fs_sqlite_transaction_error_class, session_fs_sqlite_transaction_request, session_fs_sqlite_transaction_result, session_fs_sqlite_transaction_statement, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_git_hub_auth_get_all_auth_available_result, session_git_hub_auth_logout_result, session_git_hub_auth_logout_user_result, session_history_compact_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_limit_prediction_baseline_data, session_limit_prediction_client_type, session_limit_prediction_details, session_limit_prediction_predict_request, session_limit_prediction_request, session_limit_prediction_result, session_limit_prediction_source, session_limit_prediction_tier, session_limit_prediction_tier_option, session_limit_prediction_unavailable_reason, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_managed_permissions, session_managed_settings, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_model_list_request, session_model_price_category, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_plugins_reload_request, session_provider_get_endpoint_request, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_close_request, sessions_close_result, sessions_delete_request, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, session_settings_built_in_tool_availability_snapshot, session_settings_evaluate_predicate_request, session_settings_evaluate_predicate_result, session_settings_job_snapshot, session_settings_model_snapshot, session_settings_online_evaluation_snapshot, session_settings_predicate_name, session_settings_repo_snapshot, session_settings_snapshot, session_settings_validation_snapshot, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_metadata_request, sessions_get_metadata_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_non_empty_session_ids_request, sessions_list_non_empty_session_ids_result, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_prune_old_request, sessions_register_extension_tools_on_session_options, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_visibility_status, session_working_directory_context, session_working_directory_context_host_type, settable_auth_info, settable_token_auth_info, shell_cancel_user_requested_request, shell_credentials, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_init_profile, shell_init_script, shell_init_script_shell, shell_kill_request, shell_kill_result, shell_kill_signal, shell_options, shutdown_request, skill, skill_discovery_path, skill_discovery_path_list, skill_discovery_scope, skill_list, skills_config_set_disabled_skills_request, skills_config_set_skill_disabled_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_discovery_paths_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_add_timeline_entry_result, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_choice, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_model_picker_dialog, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_set_model_result, slash_command_set_plan_model_result, slash_command_show_dialog_result, slash_command_text_result, slash_command_timeline_entry, subagent_settings_entry, subagent_settings_entry_context_tier, task_agent_info, task_agent_progress, task_complete_data, task_completion_decision, task_execution_mode, task_info, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, token_provider_auth_info, tool, tool_list, tool_result, tool_result_expanded, tool_result_new_message, tool_result_type, tools_execute_request, tools_get_builtin_descriptors_request, tools_get_builtin_descriptors_result, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_set_request, tools_set_result, tools_shell_descriptor_config, tools_task_complete_event_data_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_session_limits_exhausted_request, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_session_limits_exhausted_response, ui_session_limits_exhausted_response_action, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_agent_metric, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, user_setting_metadata, user_settings_get_result, user_settings_set_request, user_settings_set_result, visibility_get_result, visibility_set_request, visibility_set_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_add_summary_request, workspaces_add_summary_result, workspaces_autopilot_objective_exists_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_delete_autopilot_objective_result, workspaces_diff_request, workspaces_ensure_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_autopilot_objective_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspaces_truncate_summaries_request, workspace_summary_host_type, workspaces_update_metadata_request, workspaces_workspace_details_host_type, workspaces_write_autopilot_objective_request, workspaces_write_autopilot_objective_result, session_auth_info_result, session_context_attribution, session_context_info, subagent_settings, task_progress, workspace_summary) def to_dict(self) -> dict: result: dict = {} @@ -37881,6 +37915,7 @@ def to_dict(self) -> dict: result["PermissionPathsWorkspaceCheckResult"] = to_class(PermissionPathsWorkspaceCheckResult, self.permission_paths_workspace_check_result) result["PermissionPromptShownNotification"] = to_class(PermissionPromptShownNotification, self.permission_prompt_shown_notification) result["PermissionRequestResult"] = to_class(PermissionRequestResult, self.permission_request_result) + result["PermissionResponseCapability"] = to_enum(PermissionResponseCapability, self.permission_response_capability) result["PermissionRulesSet"] = to_class(PermissionRulesSet, self.permission_rules_set) result["PermissionsConfigureAdditionalContentExclusionPolicy"] = to_class(PermissionsConfigureAdditionalContentExclusionPolicy, self.permissions_configure_additional_content_exclusion_policy) result["PermissionsConfigureAdditionalContentExclusionPolicyRule"] = to_class(PermissionsConfigureAdditionalContentExclusionPolicyRule, self.permissions_configure_additional_content_exclusion_policy_rule) @@ -42387,6 +42422,7 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "PermissionPathsWorkspaceCheckResult", "PermissionPromptShownNotification", "PermissionRequestResult", + "PermissionResponseCapability", "PermissionRulesSet", "PermissionSource", "PermissionUrlsConfig", diff --git a/python/copilot/generated/session_events.py b/python/copilot/generated/session_events.py index 528e6657fc..d4af5f2735 100644 --- a/python/copilot/generated/session_events.py +++ b/python/copilot/generated/session_events.py @@ -7169,19 +7169,24 @@ def to_dict(self) -> dict: class SessionIdleData: "Payload indicating the session is idle with no background agents or attached shell commands in flight" aborted: bool | None = None + mode: SessionMode | None = None @staticmethod def from_dict(obj: Any) -> "SessionIdleData": assert isinstance(obj, dict) aborted = from_union([from_none, from_bool], obj.get("aborted")) + mode = from_union([from_none, lambda x: parse_enum(SessionMode, x)], obj.get("mode")) return SessionIdleData( aborted=aborted, + mode=mode, ) def to_dict(self) -> dict: result: dict = {} if self.aborted is not None: result["aborted"] = from_union([from_none, from_bool], self.aborted) + if self.mode is not None: + result["mode"] = from_union([from_none, lambda x: to_enum(SessionMode, x)], self.mode) return result diff --git a/python/copilot/session.py b/python/copilot/session.py index b3d8aa45ce..78afdde139 100644 --- a/python/copilot/session.py +++ b/python/copilot/session.py @@ -78,6 +78,7 @@ SessionErrorData, SessionEvent, SessionIdleData, + SessionMode, session_event_from_dict, ) from .generated.session_events import ( @@ -1793,7 +1794,7 @@ def handler(event: SessionEventTypeAlias) -> None: total_start, session_id=self.session_id, ) - case SessionIdleData(): + case SessionIdleData() as data if data.mode != SessionMode.AUTOPILOT: log_timing( logger, logging.DEBUG, diff --git a/python/test_permission_decision_context.py b/python/test_permission_decision_context.py index 2b013942d7..70b3a74de5 100644 --- a/python/test_permission_decision_context.py +++ b/python/test_permission_decision_context.py @@ -1,5 +1,6 @@ from unittest.mock import AsyncMock, MagicMock +from copilot import PermissionResponseCapability from copilot.rpc import ( PermissionDecisionApproveOnce, PermissionDecisionContext, @@ -16,6 +17,10 @@ from copilot.session_events import PermissionRequestRead +def test_permission_response_capability_is_exported_from_package_root() -> None: + assert PermissionResponseCapability.INTERACTIVE.value == "interactive" + + def _context() -> PermissionDecisionContext: return PermissionDecisionContext( outcome=PermissionDecisionOutcome.AUTO_APPROVED, diff --git a/python/test_session.py b/python/test_session.py new file mode 100644 index 0000000000..dd2d0a72f6 --- /dev/null +++ b/python/test_session.py @@ -0,0 +1,69 @@ +"""CopilotSession unit tests.""" + +import asyncio +from datetime import UTC, datetime +from unittest.mock import AsyncMock, Mock +from uuid import uuid4 + +import pytest + +from copilot.session import CopilotSession +from copilot.session_events import ( + AssistantMessageData, + SessionEvent, + SessionEventType, + SessionIdleData, + SessionMode, +) + + +def _event(data, event_type: SessionEventType) -> SessionEvent: + return SessionEvent( + data=data, + id=uuid4(), + timestamp=datetime.now(UTC), + type=event_type, + ) + + +@pytest.mark.asyncio +async def test_send_and_wait_skips_autopilot_continuation_idle(): + client = Mock() + client.request = AsyncMock(return_value={"messageId": "message-1"}) + session = CopilotSession("session-1", client) + + pending = asyncio.create_task(session.send_and_wait("keep going")) + await asyncio.sleep(0) + client.request.assert_awaited_once() + + session._dispatch_event( + _event( + AssistantMessageData(content="intermediate", message_id="assistant-1"), + SessionEventType.ASSISTANT_MESSAGE, + ) + ) + session._dispatch_event( + _event( + SessionIdleData(mode=SessionMode.AUTOPILOT), + SessionEventType.SESSION_IDLE, + ) + ) + assert not pending.done() + + session._dispatch_event( + _event( + AssistantMessageData(content="final", message_id="assistant-2"), + SessionEventType.ASSISTANT_MESSAGE, + ) + ) + session._dispatch_event( + _event( + SessionIdleData(mode=SessionMode.INTERACTIVE), + SessionEventType.SESSION_IDLE, + ) + ) + + result = await asyncio.wait_for(pending, timeout=1) + assert result is not None + assert isinstance(result.data, AssistantMessageData) + assert result.data.content == "final" diff --git a/rust/src/generated/api_types.rs b/rust/src/generated/api_types.rs index 43ea119f8a..bdf291e599 100644 --- a/rust/src/generated/api_types.rs +++ b/rust/src/generated/api_types.rs @@ -5832,6 +5832,12 @@ pub struct GitHubTelemetryClientInfo { /// Copilot subscription plan, when known. #[serde(rename = "copilot_plan", skip_serializing_if = "Option::is_none")] pub copilot_plan: Option, + /// Number of logical CPU cores on the host. + #[serde(rename = "cpu_count", skip_serializing_if = "Option::is_none")] + pub cpu_count: Option, + /// Distinct CPU model names for the host, comma-separated. + #[serde(rename = "cpu_model", skip_serializing_if = "Option::is_none")] + pub cpu_model: Option, /// Stable machine identifier for the device. #[serde(rename = "dev_device_id", skip_serializing_if = "Option::is_none")] pub dev_device_id: Option, @@ -11415,6 +11421,9 @@ pub struct PermissionDecisionDeniedByPermissionRequestHook { pub struct PermissionDecisionContext { /// Disposition of the permission request as observed by the responding client. pub outcome: PermissionDecisionOutcome, + /// Whether the responding client could ask a user interactively, was running headlessly, or had no response path. Omit when the client cannot determine this authoritatively. + #[serde(skip_serializing_if = "Option::is_none")] + pub response_capability: Option, /// Controlled reason or actor responsible for the response. pub source: PermissionDecisionSource, /// Client surface that submitted the response. @@ -31285,6 +31294,31 @@ pub enum PermissionDecisionOutcome { Unknown, } +/// Response capability available to the client when it settled a permission request. +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum PermissionResponseCapability { + /// The client could ask a user for this decision. + #[serde(rename = "interactive")] + Interactive, + /// The client could return an automated response but could not ask a user. + #[serde(rename = "headless")] + Headless, + /// The client had no response path available. + #[serde(rename = "none")] + None, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + /// Controlled reason or actor responsible for a permission response. /// ///
@@ -31332,6 +31366,9 @@ pub enum PermissionDecisionSurface { /// The Copilot App client. #[serde(rename = "copilot_app")] CopilotApp, + /// An Agent Client Protocol host. + #[serde(rename = "acp")] + Acp, /// A generic Copilot SDK client. #[serde(rename = "sdk")] Sdk, diff --git a/rust/src/generated/session_events.rs b/rust/src/generated/session_events.rs index f0508660b4..a5b123d3b5 100644 --- a/rust/src/generated/session_events.rs +++ b/rust/src/generated/session_events.rs @@ -943,6 +943,9 @@ pub struct SessionIdleData { /// True when the preceding agentic loop was cancelled via abort signal #[serde(skip_serializing_if = "Option::is_none")] pub aborted: Option, + /// The session mode the agent was operating in when it went idle, when the mode is known. Lets turn-scoped consumers distinguish an autopilot continuation boundary (where the agent keeps working after this idle) from a genuine turn completion. + #[serde(skip_serializing_if = "Option::is_none")] + pub mode: Option, } /// Session event "session.title_changed". Session title change payload containing the new display title @@ -5752,6 +5755,24 @@ pub enum Verbosity { Unknown, } +/// The session mode the agent is operating in +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum SessionMode { + /// The agent is responding interactively to the user. + #[serde(rename = "interactive")] + Interactive, + /// The agent is preparing a plan before making changes. + #[serde(rename = "plan")] + Plan, + /// The agent is working autonomously toward task completion. + #[serde(rename = "autopilot")] + Autopilot, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + /// Who created the schedule: `user` (an explicit user action such as `/every` or `/after`) or `model` (the agent via the `manage_schedule` tool). Gates whether a scheduled skill that opted out of model invocation may fire: only user-created schedules may. #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub enum ScheduleOrigin { @@ -5848,24 +5869,6 @@ pub enum ModelChangeSource { Unknown, } -/// The session mode the agent is operating in -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] -pub enum SessionMode { - /// The agent is responding interactively to the user. - #[serde(rename = "interactive")] - Interactive, - /// The agent is preparing a plan before making changes. - #[serde(rename = "plan")] - Plan, - /// The agent is working autonomously toward task completion. - #[serde(rename = "autopilot")] - Autopilot, - /// Unknown variant for forward compatibility. - #[default] - #[serde(other)] - Unknown, -} - /// Permission mode for the session. /// ///
diff --git a/rust/src/handler.rs b/rust/src/handler.rs index f1f0d9566d..e036b75a10 100644 --- a/rust/src/handler.rs +++ b/rust/src/handler.rs @@ -114,6 +114,7 @@ impl PermissionResult { /// /// let result = PermissionResult::approve_once().with_context(PermissionDecisionContext { /// outcome: PermissionDecisionOutcome::AutoApproved, + /// response_capability: None, /// source: PermissionDecisionSource::HostPolicy, /// surface: PermissionDecisionSurface::Sdk, /// }); diff --git a/rust/src/session.rs b/rust/src/session.rs index 767b4cb78d..b9d2173055 100644 --- a/rust/src/session.rs +++ b/rust/src/session.rs @@ -17,7 +17,7 @@ use crate::generated::api_types::{ }; use crate::generated::session_events::{ CommandExecuteData, ElicitationRequestedData, ExternalToolRequestedData, McpOauthRequiredData, - SessionCanvasClosedData, SessionErrorData, SessionEventType, + SessionCanvasClosedData, SessionErrorData, SessionEventType, SessionIdleData, SessionMode, }; use crate::handler::{ AutoModeSwitchHandler, AutoModeSwitchResponse, ElicitationHandler, ExitPlanModeHandler, @@ -1701,6 +1701,12 @@ fn tool_failure_result(message: impl Into) -> ToolResult { }) } +fn is_autopilot_continuation_idle(event: &SessionEvent) -> bool { + event + .typed_data::() + .is_some_and(|data| data.mode == Some(SessionMode::Autopilot)) +} + /// Process a notification from the CLI's broadcast channel. #[allow(clippy::too_many_arguments)] async fn handle_notification( @@ -1745,6 +1751,7 @@ async fn handle_notification( } waiter.last_assistant_message = Some(event.clone()); } + SessionEventType::SessionIdle if is_autopilot_continuation_idle(&event) => {} SessionEventType::SessionIdle | SessionEventType::SessionError => { if let Some(waiter) = guard.take() { if event_type == SessionEventType::SessionIdle { @@ -2652,15 +2659,38 @@ mod tests { use serde_json::json; use super::{ - build_mode_post_create_patch, has_managed_settings, permission_request_data, - permission_response_params, + build_mode_post_create_patch, has_managed_settings, is_autopilot_continuation_idle, + permission_request_data, permission_response_params, }; use crate::handler::PermissionResult; use crate::types::{ PermissionDecisionContext, PermissionDecisionOutcome, PermissionDecisionSource, - PermissionDecisionSurface, RequestId, SessionId, + PermissionDecisionSurface, RequestId, SessionEvent, SessionId, }; + #[test] + fn identifies_only_autopilot_continuation_idles() { + let mut event = SessionEvent { + id: "event-1".to_string(), + timestamp: "2026-01-01T00:00:00Z".to_string(), + parent_id: None, + ephemeral: None, + agent_id: None, + debug_cli_received_at_ms: None, + debug_ws_forwarded_at_ms: None, + event_type: "session.idle".to_string(), + data: json!({ "mode": "autopilot" }), + }; + + assert!(is_autopilot_continuation_idle(&event)); + + event.data = json!({ "mode": "interactive" }); + assert!(!is_autopilot_continuation_idle(&event)); + + event.data = json!({}); + assert!(!is_autopilot_continuation_idle(&event)); + } + #[test] fn empty_mode_post_patch_sets_empty_included_builtin_skills() { let patch = @@ -2748,6 +2778,7 @@ mod tests { fn attribution_context() -> PermissionDecisionContext { PermissionDecisionContext { outcome: PermissionDecisionOutcome::AutoApproved, + response_capability: None, source: PermissionDecisionSource::AssistedApproval, surface: PermissionDecisionSurface::CopilotApp, } @@ -2836,6 +2867,7 @@ mod tests { .with_context(attribution_context()) .with_context(PermissionDecisionContext { outcome: PermissionDecisionOutcome::PromptedUser, + response_capability: None, source: PermissionDecisionSource::HumanResponse, surface: PermissionDecisionSurface::Sdk, }); diff --git a/rust/src/types.rs b/rust/src/types.rs index 1d64a7a0ea..6e451eb452 100644 --- a/rust/src/types.rs +++ b/rust/src/types.rs @@ -5860,7 +5860,7 @@ pub use crate::generated::api_types::{ ModelCapabilitiesSupports, ModelList, ModelPolicy, PermissionDecision, PermissionDecisionApproveOnce, PermissionDecisionContext, PermissionDecisionOutcome, PermissionDecisionReject, PermissionDecisionSource, PermissionDecisionSurface, - PermissionDecisionUserNotAvailable, + PermissionDecisionUserNotAvailable, PermissionResponseCapability, }; /// Permission categories the CLI may request approval for. @@ -5970,13 +5970,21 @@ mod tests { CopilotExpAssignmentResponse, CustomAgentConfig, DeliveryMode, ExpConfigEntry, ExpFlagValue, ExtensionInfo, GitHubMcpToolConfig, GitHubReferenceType, InfiniteSessionConfig, LargeToolOutputConfig, McpServerConfig, McpStdioServerConfig, - MemoryConfiguration, NamedProviderConfig, ProviderConfig, ProviderModelConfig, - ReasoningSummary, ResumeSessionConfig, SessionConfig, SessionEvent, SessionId, - SystemMessageConfig, Tool, ToolBinaryResult, ToolResult, ToolResultExpanded, + MemoryConfiguration, NamedProviderConfig, PermissionResponseCapability, ProviderConfig, + ProviderModelConfig, ReasoningSummary, ResumeSessionConfig, SessionConfig, SessionEvent, + SessionId, SystemMessageConfig, Tool, ToolBinaryResult, ToolResult, ToolResultExpanded, ToolResultResponse, ensure_attachment_display_names, }; use crate::generated::session_events::TypedSessionEvent; + #[test] + fn permission_response_capability_is_publicly_exported() { + assert_eq!( + serde_json::to_value(PermissionResponseCapability::Interactive).unwrap(), + json!("interactive") + ); + } + #[test] fn tool_builder_composes() { let tool = Tool::new("greet") diff --git a/rust/tests/session_test.rs b/rust/tests/session_test.rs index 378d7120bf..a51d61910d 100644 --- a/rust/tests/session_test.rs +++ b/rust/tests/session_test.rs @@ -54,6 +54,7 @@ impl PermissionHandler for ContextualApproveHandler { ) -> PermissionResult { PermissionResult::approve_once().with_context(PermissionDecisionContext { outcome: PermissionDecisionOutcome::PromptedUser, + response_capability: None, source: PermissionDecisionSource::HumanResponse, surface: PermissionDecisionSurface::CopilotApp, }) diff --git a/test/harness/package-lock.json b/test/harness/package-lock.json index d2340d6c94..5566e2e34c 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.81-10", + "@github/copilot": "^1.0.81-11", "@modelcontextprotocol/sdk": "^1.26.0", "@types/node": "^25.3.3", "@types/node-forge": "^1.3.14", @@ -472,8 +472,8 @@ } }, "node_modules/@github/copilot": { - "version": "1.0.81-10", - "integrity": "sha512-Ac99EvN16s4hKRhJLSEn1HMNaZ6MD8BzIey1zzJNBQy1/yP4PQDZ2CWitEq+XQQEi+6SsqeJRqXOKiWk1EyK7g==", + "version": "1.0.81-11", + "integrity": "sha512-F7hZ6G6fhWH4uq862mbs2JE3nL0KIVBOc94/EFOdEjux3oHUQst9a06gKibEJS6VRULaYTXzatA1EAgNC9dzFA==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { @@ -483,19 +483,19 @@ "copilot": "npm-loader.js" }, "optionalDependencies": { - "@github/copilot-darwin-arm64": "1.0.81-10", - "@github/copilot-darwin-x64": "1.0.81-10", - "@github/copilot-linux-arm64": "1.0.81-10", - "@github/copilot-linux-x64": "1.0.81-10", - "@github/copilot-linuxmusl-arm64": "1.0.81-10", - "@github/copilot-linuxmusl-x64": "1.0.81-10", - "@github/copilot-win32-arm64": "1.0.81-10", - "@github/copilot-win32-x64": "1.0.81-10" + "@github/copilot-darwin-arm64": "1.0.81-11", + "@github/copilot-darwin-x64": "1.0.81-11", + "@github/copilot-linux-arm64": "1.0.81-11", + "@github/copilot-linux-x64": "1.0.81-11", + "@github/copilot-linuxmusl-arm64": "1.0.81-11", + "@github/copilot-linuxmusl-x64": "1.0.81-11", + "@github/copilot-win32-arm64": "1.0.81-11", + "@github/copilot-win32-x64": "1.0.81-11" } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-s90Av0iwjTSU6Gky8T9wI1PJdlfbdUcPAVgKDtimaOiAwcdLG4fKTpGxrk96KJrnOHHK3x9SiXsw/pW0ThAH/A==", + "version": "1.0.81-11", + "integrity": "sha512-3eLs71CLnJH9RNnESnv4esipZPeGXMlBxQeKXwZY+crwcW2RAR8YuovQyfoZ/5by1PLPbYrOjXNfQL6kXSisrA==", "cpu": [ "arm64" ], @@ -510,8 +510,8 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "1.0.81-10", - "integrity": "sha512-8RnPI4J311oJQ0GPB6JxuLJq4JNY/KF9ZIIQm8KpxXBY6d+6fmmAsMDEk7OiF/Asl2I7+LTi+qU2ZVhP7FYhbg==", + "version": "1.0.81-11", + "integrity": "sha512-GdFLiUC8UL9k6K+woG8AyL3zBafd0Br1TIPDV5iiZsyBtTe4g67FjL7DGCYDt6AN9G43jWdK0M0InoNDVq1K1A==", "cpu": [ "x64" ], @@ -526,8 +526,8 @@ } }, "node_modules/@github/copilot-linux-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-2UtK5CBrE6ZVSIzU2KHeIgO8N7056axjbF2lE6WuK+H+oJJ4v3w5eQkalqGzRHhkaPfCW4kT1lDMhZFW+XbLjA==", + "version": "1.0.81-11", + "integrity": "sha512-C4hcAow5CdaVJITbdtGqFgxWpW7TqwyCPNn8OtcbvdWeiKcfOBDrgkvbsezG98/5Ovs3HWxZRT4oZqCEmGF9Ww==", "cpu": [ "arm64" ], @@ -542,8 +542,8 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "1.0.81-10", - "integrity": "sha512-61+KAfo1TBARrBfss3w4dfmRVSf0PiFg0c9JNuT9HjoNnytl7maJBPEgUvI4YBcxScNEAlCMXaUUG3Tuuh1g+w==", + "version": "1.0.81-11", + "integrity": "sha512-izu0PwWx+wL4zxacO6cd6r0zMMMQ3pTz+2euWcAd7HCJ/CIR6+YYfjU3TI3TPBZ9zDLZGoxHKYYPfJ1ZbSTzEg==", "cpu": [ "x64" ], @@ -558,8 +558,8 @@ } }, "node_modules/@github/copilot-linuxmusl-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-CR6KRPCFoGkaD8I2an1FyrT5avF1U5aTbwW2sYCP7w1KExYFknxEL8ES6BkFuPEA7YcjmLa0SOq26Z+TgIVHSg==", + "version": "1.0.81-11", + "integrity": "sha512-uWGUjaxOSMu6dKFWcTvXGUUp76vC3OV7nlSupecRkQ7gA3OxdrrB8rXE5/leC606Hk6oe9Wl7wKCH9EwuZ6afg==", "cpu": [ "arm64" ], @@ -574,8 +574,8 @@ } }, "node_modules/@github/copilot-linuxmusl-x64": { - "version": "1.0.81-10", - "integrity": "sha512-fvZfyEOfRkvUDPXY6UUjAqV8Mkf08PQV+jgtiAFUryuas5VP9cYaAmQSmNpzNMNi3kSX/ycUJe7oc3zXZ8ylog==", + "version": "1.0.81-11", + "integrity": "sha512-BpWKd/iu1tTyuPR2zuPFs1pVOlley4yt/TXkn6/gVwt52VI0rUxEO+n77RVjDcyMxWaUApbad2VNRPIH77guCA==", "cpu": [ "x64" ], @@ -590,8 +590,8 @@ } }, "node_modules/@github/copilot-win32-arm64": { - "version": "1.0.81-10", - "integrity": "sha512-n30PPBgCT4Iq9MgH6is6L3eUEE+sF6xB2fb+dGsclj5j/hCkT7+ef0j8YcAGipsvGfzGAuywIsWlvF7fzYsOKQ==", + "version": "1.0.81-11", + "integrity": "sha512-GOK3cACgD96m065uJxbgcXL7MQ1qm+wq1qtvGBpprY0r9wTYJG/rVCtayjYB6B57rnaBwPll3+PQ2J1qgfO57A==", "cpu": [ "arm64" ], @@ -606,8 +606,8 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "1.0.81-10", - "integrity": "sha512-lb8kvhrXwGCN3LeRDQfLHsUp+F43XvPYznaYK1sPtK1kFGa4/kL690tasoSEvzu8ZKoTY6kZ6YmDbUZgqOislw==", + "version": "1.0.81-11", + "integrity": "sha512-u4K6UU2iGQJqQwsdHNilJBwiaC48PfMsWVFnTSlJD5lCYp9zCk1odrvrcmB3ARYinE/IcXLUosiHaM/ChR/pdA==", "cpu": [ "x64" ], diff --git a/test/harness/package.json b/test/harness/package.json index e968848315..e8868750a0 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.81-10", + "@github/copilot": "^1.0.81-11", "@modelcontextprotocol/sdk": "^1.26.0", "@types/node": "^25.3.3", "@types/node-forge": "^1.3.14",