diff --git a/dotnet/src/Generated/Rpc.cs b/dotnet/src/Generated/Rpc.cs index 97f9b52762..aa396a2a63 100644 --- a/dotnet/src/Generated/Rpc.cs +++ b/dotnet/src/Generated/Rpc.cs @@ -17455,6 +17455,78 @@ internal sealed class ScheduleStopRequest public string SessionId { get; set; } = string.Empty; } +/// Current per-window credit limit and consumption for an autopilot objective. +[Experimental(Diagnostics.Experimental)] +public sealed class AutopilotObjectiveCreditLimit +{ + /// Configured AI-credit cap, when one is set. + [JsonPropertyName("credits")] + public double? Credits { get; set; } + + /// Window consumption in fractional AI credits, for display. + [JsonPropertyName("creditsUsed")] + public double CreditsUsed { get; set; } + + /// Exact window consumption in integer nano-AIU, encoded as a decimal string. + [JsonPropertyName("creditsUsedNanoAiu")] + public string CreditsUsedNanoAiu { get; set; } = string.Empty; +} + +/// Public, persistence-independent projection of an autopilot objective. +[Experimental(Diagnostics.Experimental)] +public sealed class AutopilotObjectiveState +{ + /// Optional summary recorded when the objective completed. + [JsonPropertyName("completionSummary")] + public string? CompletionSummary { get; set; } + + /// Exact lifetime AI-credit consumption in integer nano-AIU, encoded as a decimal string. + [JsonPropertyName("creditCountNanoAiu")] + public string CreditCountNanoAiu { get; set; } = string.Empty; + + /// Current per-window credit limit and consumption, when configured. + [JsonPropertyName("creditLimit")] + public AutopilotObjectiveCreditLimit? CreditLimit { get; set; } + + /// Session-local objective identifier. + [JsonPropertyName("id")] + public long Id { get; set; } + + /// User-provided objective text. + [JsonPropertyName("objective")] + public string Objective { get; set; } = string.Empty; + + /// Optional reason the objective is paused. + [JsonPropertyName("pauseReason")] + public string? PauseReason { get; set; } + + /// Current normalized lifecycle status. + [JsonPropertyName("status")] + public AutopilotObjectiveStatus Status { get; set; } + + /// Number of objective turns started. + [JsonPropertyName("turnCount")] + public long TurnCount { get; set; } +} + +/// Canonical runtime state for the session's current autopilot objective. +[Experimental(Diagnostics.Experimental)] +public sealed class AutopilotObjectiveGetStateResult +{ + /// Current objective state, or `null` when the session has no objective. + [JsonPropertyName("state")] + public AutopilotObjectiveState? State { get; set; } +} + +/// Identifies the target session. +[Experimental(Diagnostics.Experimental)] +internal sealed class SessionAutopilotObjectiveGetStateRequest +{ + /// Target session identifier. + [JsonPropertyName("sessionId")] + public string SessionId { get; set; } = string.Empty; +} + /// A bearer token supplied by the SDK client for a BYOK provider. The runtime sets it as `Authorization: Bearer <token>` on the outbound request and does no caching; the SDK consumer owns token caching and refresh. [Experimental(Diagnostics.Experimental)] public sealed class ProviderTokenAcquireResult @@ -28503,6 +28575,72 @@ public override void Write(Utf8JsonWriter writer, SessionVisibilityStatus value, } +/// Current normalized autopilot objective lifecycle status. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct AutopilotObjectiveStatus : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public AutopilotObjectiveStatus(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// The objective is actively running. + public static AutopilotObjectiveStatus Active { get; } = new("active"); + + /// The objective is paused and may be resumed. + public static AutopilotObjectiveStatus Paused { get; } = new("paused"); + + /// The objective completed. + public static AutopilotObjectiveStatus Completed { get; } = new("completed"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(AutopilotObjectiveStatus left, AutopilotObjectiveStatus right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(AutopilotObjectiveStatus left, AutopilotObjectiveStatus right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is AutopilotObjectiveStatus other && Equals(other); + + /// + public bool Equals(AutopilotObjectiveStatus 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 AutopilotObjectiveStatus Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, AutopilotObjectiveStatus value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(AutopilotObjectiveStatus)); + } + } +} + + /// Error classification. [Experimental(Diagnostics.Experimental)] [JsonConverter(typeof(Converter))] @@ -30495,6 +30633,12 @@ internal SessionRpc(CopilotSession session) Interlocked.CompareExchange(ref field, new(_session), null) ?? field; + /// AutopilotObjective APIs. + public AutopilotObjectiveApi AutopilotObjective => + field ?? + Interlocked.CompareExchange(ref field, new(_session), null) ?? + field; + /// Suspends the session while preserving persisted state for later resume. /// The to monitor for cancellation requests. The default is . [Experimental(Diagnostics.Experimental)] @@ -34488,6 +34632,29 @@ public async Task StopAsync(long id, CancellationToken cance } } +/// Provides session-scoped AutopilotObjective APIs. +[Experimental(Diagnostics.Experimental)] +public sealed class AutopilotObjectiveApi +{ + private readonly CopilotSession _session; + + internal AutopilotObjectiveApi(CopilotSession session) + { + _session = session; + } + + /// Reads the current canonical autopilot objective state for this session. + /// The to monitor for cancellation requests. The default is . + /// Canonical runtime state for the session's current autopilot objective. + public async Task GetStateAsync(CancellationToken cancellationToken = default) + { + _session.ThrowIfDisposed(); + + var request = new SessionAutopilotObjectiveGetStateRequest { SessionId = _session.SessionId }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.autopilotObjective.getState", [request], cancellationToken); + } +} + /// Handles `providerToken` client session API methods. [Experimental(Diagnostics.Experimental)] public interface IProviderTokenHandler @@ -35238,6 +35405,9 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(AuthIdentity))] [JsonSerializable(typeof(AuthInfo))] [JsonSerializable(typeof(AuthValidationError))] +[JsonSerializable(typeof(AutopilotObjectiveCreditLimit))] +[JsonSerializable(typeof(AutopilotObjectiveGetStateResult))] +[JsonSerializable(typeof(AutopilotObjectiveState))] [JsonSerializable(typeof(BuiltInModelCatalog))] [JsonSerializable(typeof(BuiltInModelCatalogEntry))] [JsonSerializable(typeof(BuiltinToolDescriptor))] @@ -35763,6 +35933,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(SessionAuthLogoutUserRequest))] [JsonSerializable(typeof(SessionAuthStatus))] [JsonSerializable(typeof(SessionAuthSwitchRequest))] +[JsonSerializable(typeof(SessionAutopilotObjectiveGetStateRequest))] [JsonSerializable(typeof(SessionBulkDeleteResult))] [JsonSerializable(typeof(SessionCancelAllBackgroundAgentsRequest))] [JsonSerializable(typeof(SessionCanvasListOpenRequest))] diff --git a/dotnet/test/E2E/RpcSessionStateE2ETests.cs b/dotnet/test/E2E/RpcSessionStateE2ETests.cs index 6dce3c250f..a0090a8db6 100644 --- a/dotnet/test/E2E/RpcSessionStateE2ETests.cs +++ b/dotnet/test/E2E/RpcSessionStateE2ETests.cs @@ -130,6 +130,15 @@ public async Task Should_Read_Update_And_Delete_Plan() Assert.Null(afterDelete.Content); } + [Fact] + public async Task Should_Get_Empty_Autopilot_Objective_State() + { + await using var session = await CreateSessionAsync(); + + var result = await session.Rpc.AutopilotObjective.GetStateAsync(); + Assert.Null(result.State); + } + [Fact] public async Task Should_Call_Workspace_File_Rpc_Methods() { diff --git a/dotnet/test/Unit/ClientSessionLifetimeTests.cs b/dotnet/test/Unit/ClientSessionLifetimeTests.cs index a561ee44b2..c29cb93f2e 100644 --- a/dotnet/test/Unit/ClientSessionLifetimeTests.cs +++ b/dotnet/test/Unit/ClientSessionLifetimeTests.cs @@ -502,6 +502,24 @@ public async Task Generated_Session_Rpc_Throws_When_Session_Disposed() await Assert.ThrowsAsync(() => session.Rpc.Model.GetCurrentAsync()); } + [Fact] + public async Task Generated_AutopilotObjective_GetState_Injects_SessionId() + { + 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 + { + SessionId = "objective-session", + OnPermissionRequest = PermissionHandler.ApproveAll + }); + + var result = await session.Rpc.AutopilotObjective.GetStateAsync(); + + Assert.Null(result.State); + var request = await WaitForRequestAsync(server, "session.autopilotObjective.getState"); + Assert.Equal("objective-session", request.Params.GetProperty("sessionId").GetString()); + } + [MethodImpl(MethodImplOptions.NoInlining)] private static async Task> CreateDroppedSessionAsync(CopilotClient client) { @@ -1049,6 +1067,10 @@ private async Task HandleRequestAsync(Stream stream, JsonElement request, Cancel { ["success"] = true }, + "session.autopilotObjective.getState" => new Dictionary + { + ["state"] = null + }, "session.delete" => new Dictionary { ["success"] = true diff --git a/dotnet/test/Unit/SerializationTests.cs b/dotnet/test/Unit/SerializationTests.cs index 6edf168093..af40f0d7de 100644 --- a/dotnet/test/Unit/SerializationTests.cs +++ b/dotnet/test/Unit/SerializationTests.cs @@ -1082,6 +1082,112 @@ public void ToolResultObject_OmitsToolReferences_WhenNull_WithSdkOptions() Assert.False(document.RootElement.TryGetProperty("toolReferences", out _)); } + [Fact] + public void AutopilotObjectiveState_DeserializesCanonicalPayloads_WithSdkOptions() + { + var options = GetSerializerOptions(); + + var noObjective = JsonSerializer.Deserialize( + """{"state":null}""", + options); + Assert.NotNull(noObjective); + Assert.Null(noObjective.State); + + var active = DeserializeState( + """ + { + "state": { + "id": 1, + "objective": "Ship the release", + "status": "active", + "turnCount": 2, + "creditCountNanoAiu": "0" + } + } + """, + options); + Assert.Equal(1, active.Id); + Assert.Equal("Ship the release", active.Objective); + Assert.Equal(AutopilotObjectiveStatus.Active, active.Status); + Assert.Equal(2, active.TurnCount); + Assert.Equal("0", active.CreditCountNanoAiu); + Assert.Null(active.PauseReason); + Assert.Null(active.CompletionSummary); + Assert.Null(active.CreditLimit); + var activeJson = JsonSerializer.SerializeToElement(active, options); + Assert.False(activeJson.TryGetProperty("pauseReason", out _)); + Assert.False(activeJson.TryGetProperty("completionSummary", out _)); + Assert.False(activeJson.TryGetProperty("creditLimit", out _)); + + var paused = DeserializeState( + """ + { + "state": { + "id": 2, + "objective": "Wait for approval", + "status": "paused", + "turnCount": 3, + "pauseReason": "Approval required", + "creditCountNanoAiu": "9007199254740993", + "creditLimit": { + "creditsUsed": 9007199.254740993, + "creditsUsedNanoAiu": "9007199254740993" + } + } + } + """, + options); + Assert.Equal(2, paused.Id); + Assert.Equal("Wait for approval", paused.Objective); + Assert.Equal(AutopilotObjectiveStatus.Paused, paused.Status); + Assert.Equal(3, paused.TurnCount); + Assert.Equal("Approval required", paused.PauseReason); + Assert.Equal("9007199254740993", paused.CreditCountNanoAiu); + Assert.NotNull(paused.CreditLimit); + Assert.Null(paused.CreditLimit.Credits); + Assert.Equal(9007199.254740993, paused.CreditLimit.CreditsUsed); + Assert.Equal("9007199254740993", paused.CreditLimit.CreditsUsedNanoAiu); + + var completed = DeserializeState( + """ + { + "state": { + "id": 3, + "objective": "Publish the SDK", + "status": "completed", + "turnCount": 4, + "completionSummary": "Published", + "creditCountNanoAiu": "9007199254740994", + "creditLimit": { + "credits": 2.5, + "creditsUsed": 1.25, + "creditsUsedNanoAiu": "1250000000" + } + } + } + """, + options); + Assert.Equal(3, completed.Id); + Assert.Equal("Publish the SDK", completed.Objective); + Assert.Equal(AutopilotObjectiveStatus.Completed, completed.Status); + Assert.Equal(4, completed.TurnCount); + Assert.Equal("Published", completed.CompletionSummary); + Assert.Equal("9007199254740994", completed.CreditCountNanoAiu); + Assert.NotNull(completed.CreditLimit); + Assert.Equal(2.5, completed.CreditLimit.Credits); + Assert.Equal(1.25, completed.CreditLimit.CreditsUsed); + Assert.Equal("1250000000", completed.CreditLimit.CreditsUsedNanoAiu); + } + + private static AutopilotObjectiveState DeserializeState( + string json, + JsonSerializerOptions options) + { + var result = JsonSerializer.Deserialize(json, options); + Assert.NotNull(result); + return Assert.IsType(result.State); + } + private static JsonSerializerOptions GetSerializerOptions() { var prop = typeof(CopilotClient) diff --git a/go/internal/e2e/rpc_session_state_e2e_test.go b/go/internal/e2e/rpc_session_state_e2e_test.go index 88673a9ba9..bdb6536445 100644 --- a/go/internal/e2e/rpc_session_state_e2e_test.go +++ b/go/internal/e2e/rpc_session_state_e2e_test.go @@ -233,6 +233,24 @@ func TestRPCSessionStateE2E(t *testing.T) { } }) + t.Run("should get empty autopilot objective state", func(t *testing.T) { + session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{ + OnPermissionRequest: copilot.PermissionHandler.ApproveAll, + }) + if err != nil { + t.Fatalf("Failed to create session: %v", err) + } + defer session.Disconnect() + + result, err := session.RPC.AutopilotObjective.GetState(t.Context()) + if err != nil { + t.Fatalf("AutopilotObjective.GetState failed: %v", err) + } + if result.State != nil { + t.Fatalf("Expected empty objective state, got %+v", result.State) + } + }) + t.Run("should call workspace file rpc methods", func(t *testing.T) { session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{ OnPermissionRequest: copilot.PermissionHandler.ApproveAll, diff --git a/go/rpc/generated_rpc_union_test.go b/go/rpc/generated_rpc_union_test.go index 92bcb4c077..8146b8c901 100644 --- a/go/rpc/generated_rpc_union_test.go +++ b/go/rpc/generated_rpc_union_test.go @@ -163,11 +163,7 @@ func TestTaskProgressUnmarshalsTaskAgentProgressVariants(t *testing.T) { } func TestCommandsInvokeUnmarshalsSlashCommandInvocationResult(t *testing.T) { - clientToServerReader, clientToServerWriter := io.Pipe() - serverToClientReader, serverToClientWriter := io.Pipe() - - client := jsonrpc2.NewClient(clientToServerWriter, serverToClientReader) - server := jsonrpc2.NewClient(serverToClientWriter, clientToServerReader) + client, server := newTestRPCPair(t) server.SetRequestHandler("session.commands.invoke", func(params json.RawMessage) (json.RawMessage, *jsonrpc2.Error) { var request struct { Input string `json:"input"` @@ -183,17 +179,6 @@ func TestCommandsInvokeUnmarshalsSlashCommandInvocationResult(t *testing.T) { return json.RawMessage(`{"kind":"text","text":"hello","markdown":true}`), nil }) - client.Start() - server.Start() - t.Cleanup(func() { - client.Stop() - server.Stop() - _ = clientToServerWriter.Close() - _ = clientToServerReader.Close() - _ = serverToClientWriter.Close() - _ = serverToClientReader.Close() - }) - input := "details" result, err := NewSessionRPC(client, "session-1").Commands.Invoke(t.Context(), &CommandsInvokeRequest{ Input: &input, @@ -360,3 +345,124 @@ func TestUIElicitationSchemaPropertyJSONUnion(t *testing.T) { t.Fatalf("round-trip confirmed property = %T, want *UIElicitationSchemaPropertyBoolean", roundTrip.Properties["confirmed"]) } } + +func TestAutopilotObjectiveGetState(t *testing.T) { + client, server := newTestRPCPair(t) + responses := []json.RawMessage{ + json.RawMessage(`{"state":null}`), + json.RawMessage(`{"state":{"id":1,"objective":"Ship the release","status":"active","turnCount":2,"creditCountNanoAiu":"0"}}`), + json.RawMessage(`{"state":{"id":2,"objective":"Wait for approval","status":"paused","turnCount":3,"pauseReason":"Approval required","creditCountNanoAiu":"9007199254740993","creditLimit":{"creditsUsed":9007199.254740993,"creditsUsedNanoAiu":"9007199254740993"}}}`), + json.RawMessage(`{"state":{"id":3,"objective":"Publish the SDK","status":"completed","turnCount":4,"completionSummary":"Published","creditCountNanoAiu":"9007199254740994","creditLimit":{"credits":2.5,"creditsUsed":1.25,"creditsUsedNanoAiu":"1250000000"}}}`), + } + callIndex := 0 + server.SetRequestHandler("session.autopilotObjective.getState", func(params json.RawMessage) (json.RawMessage, *jsonrpc2.Error) { + var request struct { + SessionID string `json:"sessionId"` + } + if err := json.Unmarshal(params, &request); err != nil { + return nil, &jsonrpc2.Error{Code: -32602, Message: err.Error()} + } + if request.SessionID != "session-1" { + return nil, &jsonrpc2.Error{Code: -32602, Message: "unexpected session ID"} + } + response := responses[callIndex] + callIndex++ + return response, nil + }) + + api := NewSessionRPC(client, "session-1").AutopilotObjective + results := make([]*AutopilotObjectiveGetStateResult, 0, len(responses)) + for range responses { + result, err := api.GetState(t.Context()) + if err != nil { + t.Fatalf("get objective state: %v", err) + } + results = append(results, result) + } + + if results[0].State != nil { + t.Fatalf("state = %#v, want nil", results[0].State) + } + + active := results[1].State + if active == nil { + t.Fatal("active state is nil") + } + if active.ID != 1 || active.Objective != "Ship the release" || + active.Status != AutopilotObjectiveStatusActive || active.TurnCount != 2 || + active.CreditCountNanoAiu != "0" { + t.Fatalf("active state = %#v", active) + } + activeJSON, err := json.Marshal(active) + if err != nil { + t.Fatalf("marshal active state: %v", err) + } + var activeFields map[string]json.RawMessage + if err := json.Unmarshal(activeJSON, &activeFields); err != nil { + t.Fatalf("unmarshal active state: %v", err) + } + for _, field := range []string{"pauseReason", "completionSummary", "creditLimit"} { + if _, ok := activeFields[field]; ok { + t.Errorf("active state unexpectedly serialized %q", field) + } + } + + paused := results[2].State + if paused == nil { + t.Fatal("paused state is nil") + } + if paused.ID != 2 || paused.Objective != "Wait for approval" || + paused.Status != AutopilotObjectiveStatusPaused || paused.TurnCount != 3 || + paused.CreditCountNanoAiu != "9007199254740993" { + t.Fatalf("paused state = %#v", paused) + } + if paused.PauseReason == nil || *paused.PauseReason != "Approval required" { + t.Fatalf("pause reason = %v", paused.PauseReason) + } + if paused.CreditLimit == nil || paused.CreditLimit.Credits != nil || + paused.CreditLimit.CreditsUsed != 9007199.254740993 || + paused.CreditLimit.CreditsUsedNanoAiu != "9007199254740993" { + t.Fatalf("paused credit limit = %#v", paused.CreditLimit) + } + + completed := results[3].State + if completed == nil { + t.Fatal("completed state is nil") + } + if completed.ID != 3 || completed.Objective != "Publish the SDK" || + completed.Status != AutopilotObjectiveStatusCompleted || completed.TurnCount != 4 || + completed.CreditCountNanoAiu != "9007199254740994" { + t.Fatalf("completed state = %#v", completed) + } + if completed.CompletionSummary == nil || *completed.CompletionSummary != "Published" { + t.Fatalf("completion summary = %v", completed.CompletionSummary) + } + if completed.CreditLimit == nil || completed.CreditLimit.Credits == nil || + *completed.CreditLimit.Credits != 2.5 || + completed.CreditLimit.CreditsUsed != 1.25 || + completed.CreditLimit.CreditsUsedNanoAiu != "1250000000" { + t.Fatalf("completed credit limit = %#v", completed.CreditLimit) + } +} + +func newTestRPCPair(t *testing.T) (*jsonrpc2.Client, *jsonrpc2.Client) { + t.Helper() + + clientToServerReader, clientToServerWriter := io.Pipe() + serverToClientReader, serverToClientWriter := io.Pipe() + client := jsonrpc2.NewClient(clientToServerWriter, serverToClientReader) + server := jsonrpc2.NewClient(serverToClientWriter, clientToServerReader) + + client.Start() + server.Start() + t.Cleanup(func() { + client.Stop() + server.Stop() + _ = clientToServerWriter.Close() + _ = clientToServerReader.Close() + _ = serverToClientWriter.Close() + _ = serverToClientReader.Close() + }) + + return client, server +} diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go index 69b44cef4c..3d6146903c 100644 --- a/go/rpc/zrpc.go +++ b/go/rpc/zrpc.go @@ -1042,6 +1042,48 @@ type AuthValidationError struct { // removed. type AuthValidationErrors []AuthValidationError +// Current per-window credit limit and consumption for an autopilot objective. +// Experimental: AutopilotObjectiveCreditLimit is part of an experimental API and may change +// or be removed. +type AutopilotObjectiveCreditLimit struct { + // Configured AI-credit cap, when one is set. + Credits *float64 `json:"credits,omitempty"` + // Window consumption in fractional AI credits, for display. + CreditsUsed float64 `json:"creditsUsed"` + // Exact window consumption in integer nano-AIU, encoded as a decimal string. + CreditsUsedNanoAiu string `json:"creditsUsedNanoAiu"` +} + +// Canonical runtime state for the session's current autopilot objective. +// Experimental: AutopilotObjectiveGetStateResult is part of an experimental API and may +// change or be removed. +type AutopilotObjectiveGetStateResult struct { + // Current objective state, or `null` when the session has no objective. + State *AutopilotObjectiveState `json:"state"` +} + +// Public, persistence-independent projection of an autopilot objective. +// Experimental: AutopilotObjectiveState is part of an experimental API and may change or be +// removed. +type AutopilotObjectiveState struct { + // Optional summary recorded when the objective completed. + CompletionSummary *string `json:"completionSummary,omitempty"` + // Exact lifetime AI-credit consumption in integer nano-AIU, encoded as a decimal string. + CreditCountNanoAiu string `json:"creditCountNanoAiu"` + // Current per-window credit limit and consumption, when configured. + CreditLimit *AutopilotObjectiveCreditLimit `json:"creditLimit,omitempty"` + // Session-local objective identifier. + ID int64 `json:"id"` + // User-provided objective text. + Objective string `json:"objective"` + // Optional reason the objective is paused. + PauseReason *string `json:"pauseReason,omitempty"` + // Current normalized lifecycle status. + Status AutopilotObjectiveStatus `json:"status"` + // Number of objective turns started. + TurnCount int64 `json:"turnCount"` +} + // The running runtime's complete catalog of well-known built-in model IDs, including // supported models and additional IDs with built-in metadata. // Experimental: BuiltInModelCatalog is part of an experimental API and may change or be @@ -15554,6 +15596,20 @@ const ( AuthInfoTypeUser AuthInfoType = "user" ) +// Current normalized autopilot objective lifecycle status. +// Experimental: AutopilotObjectiveStatus is part of an experimental API and may change or +// be removed. +type AutopilotObjectiveStatus string + +const ( + // The objective is actively running. + AutopilotObjectiveStatusActive AutopilotObjectiveStatus = "active" + // The objective completed. + AutopilotObjectiveStatusCompleted AutopilotObjectiveStatus = "completed" + // The objective is paused and may be resumed. + AutopilotObjectiveStatusPaused AutopilotObjectiveStatus = "paused" +) + // Custom input-format kind. // Experimental: BuiltinToolFormatType is part of an experimental API and may change or be // removed. @@ -20740,6 +20796,28 @@ func (a *AgentAPI) SetPrompt(ctx context.Context, params *AgentSetPromptRequest) return &result, nil } +// Experimental: AutopilotObjectiveAPI contains experimental APIs that may change or be +// removed. +type AutopilotObjectiveAPI sessionAPI + +// GetState reads the current canonical autopilot objective state for this session. +// +// RPC method: session.autopilotObjective.getState. +// +// Returns: Canonical runtime state for the session's current autopilot objective. +func (a *AutopilotObjectiveAPI) GetState(ctx context.Context) (*AutopilotObjectiveGetStateResult, error) { + req := map[string]any{"sessionId": a.sessionID} + raw, err := a.client.Request(ctx, "session.autopilotObjective.getState", req) + if err != nil { + return nil, err + } + var result AutopilotObjectiveGetStateResult + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + // Experimental: CanvasAPI contains experimental APIs that may change or be removed. type CanvasAPI sessionAPI @@ -26181,43 +26259,44 @@ type SessionRPC struct { // Reuse a single struct instead of allocating one for each service on the heap. common sessionAPI - Agent *AgentAPI - Canvas *CanvasAPI - Commands *CommandsAPI - Completions *CompletionsAPI - ContentExclusion *ContentExclusionAPI - Debug *DebugAPI - EventLog *EventLogAPI - Extensions *ExtensionsAPI - Factory *FactoryAPI - Fleet *FleetAPI - GitHubAuth *GitHubAuthAPI - History *HistoryAPI - Instructions *InstructionsAPI - LimitPrediction *LimitPredictionAPI - Lsp *LspAPI - MCP *MCPAPI - Metadata *MetadataAPI - Mode *ModeAPI - Model *ModelAPI - Name *NameAPI - Options *OptionsAPI - Permissions *PermissionsAPI - Plan *PlanAPI - Plugins *PluginsAPI - Provider *ProviderAPI - Queue *QueueAPI - Remote *RemoteAPI - Schedule *ScheduleAPI - Shell *ShellAPI - Skills *SkillsAPI - Tasks *TasksAPI - Telemetry *TelemetryAPI - Tools *ToolsAPI - UI *UIAPI - Usage *UsageAPI - Visibility *VisibilityAPI - Workspaces *WorkspacesAPI + Agent *AgentAPI + AutopilotObjective *AutopilotObjectiveAPI + Canvas *CanvasAPI + Commands *CommandsAPI + Completions *CompletionsAPI + ContentExclusion *ContentExclusionAPI + Debug *DebugAPI + EventLog *EventLogAPI + Extensions *ExtensionsAPI + Factory *FactoryAPI + Fleet *FleetAPI + GitHubAuth *GitHubAuthAPI + History *HistoryAPI + Instructions *InstructionsAPI + LimitPrediction *LimitPredictionAPI + Lsp *LspAPI + MCP *MCPAPI + Metadata *MetadataAPI + Mode *ModeAPI + Model *ModelAPI + Name *NameAPI + Options *OptionsAPI + Permissions *PermissionsAPI + Plan *PlanAPI + Plugins *PluginsAPI + Provider *ProviderAPI + Queue *QueueAPI + Remote *RemoteAPI + Schedule *ScheduleAPI + Shell *ShellAPI + Skills *SkillsAPI + Tasks *TasksAPI + Telemetry *TelemetryAPI + Tools *ToolsAPI + UI *UIAPI + Usage *UsageAPI + Visibility *VisibilityAPI + Workspaces *WorkspacesAPI } // Aborts the current agent turn. @@ -26503,6 +26582,7 @@ func NewSessionRPC(client *jsonrpc2.Client, sessionID string) *SessionRPC { r := &SessionRPC{} r.common = sessionAPI{client: client, sessionID: sessionID} r.Agent = (*AgentAPI)(&r.common) + r.AutopilotObjective = (*AutopilotObjectiveAPI)(&r.common) r.Canvas = (*CanvasAPI)(&r.common) r.Commands = (*CommandsAPI)(&r.common) r.Completions = (*CompletionsAPI)(&r.common) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveCreditLimit.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveCreditLimit.java new file mode 100644 index 0000000000..edfbaa3717 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveCreditLimit.java @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * 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 com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import javax.annotation.processing.Generated; + +/** + * Current per-window credit limit and consumption for an autopilot objective. + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public record AutopilotObjectiveCreditLimit( + /** Configured AI-credit cap, when one is set. */ + @JsonProperty("credits") Double credits, + /** Window consumption in fractional AI credits, for display. */ + @JsonProperty("creditsUsed") Double creditsUsed, + /** Exact window consumption in integer nano-AIU, encoded as a decimal string. */ + @JsonProperty("creditsUsedNanoAiu") String creditsUsedNanoAiu +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveState.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveState.java new file mode 100644 index 0000000000..d7abc2b438 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveState.java @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * 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 com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import javax.annotation.processing.Generated; + +/** + * Public, persistence-independent projection of an autopilot objective. + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public record AutopilotObjectiveState( + /** Session-local objective identifier. */ + @JsonProperty("id") Long id, + /** User-provided objective text. */ + @JsonProperty("objective") String objective, + /** Current normalized lifecycle status. */ + @JsonProperty("status") AutopilotObjectiveStatus status, + /** Number of objective turns started. */ + @JsonProperty("turnCount") Long turnCount, + /** Optional reason the objective is paused. */ + @JsonProperty("pauseReason") String pauseReason, + /** Optional summary recorded when the objective completed. */ + @JsonProperty("completionSummary") String completionSummary, + /** Exact lifetime AI-credit consumption in integer nano-AIU, encoded as a decimal string. */ + @JsonProperty("creditCountNanoAiu") String creditCountNanoAiu, + /** Current per-window credit limit and consumption, when configured. */ + @JsonProperty("creditLimit") AutopilotObjectiveCreditLimit creditLimit +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveStatus.java new file mode 100644 index 0000000000..b50cf2072c --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/AutopilotObjectiveStatus.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; + +/** + * Current normalized autopilot objective lifecycle status. + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public enum AutopilotObjectiveStatus { + /** The {@code active} variant. */ + ACTIVE("active"), + /** The {@code paused} variant. */ + PAUSED("paused"), + /** The {@code completed} variant. */ + COMPLETED("completed"); + + private final String value; + AutopilotObjectiveStatus(String value) { this.value = value; } + @com.fasterxml.jackson.annotation.JsonValue + public String getValue() { return value; } + @com.fasterxml.jackson.annotation.JsonCreator + public static AutopilotObjectiveStatus fromValue(String value) { + for (AutopilotObjectiveStatus v : values()) { + if (v.value.equals(value)) return v; + } + throw new IllegalArgumentException("Unknown AutopilotObjectiveStatus value: " + value); + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveApi.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveApi.java new file mode 100644 index 0000000000..ab4058e6b6 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveApi.java @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * 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 com.github.copilot.CopilotExperimental; +import java.util.concurrent.CompletableFuture; +import javax.annotation.processing.Generated; + +/** + * API methods for the {@code autopilotObjective} namespace. + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class SessionAutopilotObjectiveApi { + + private final RpcCaller caller; + private final String sessionId; + + /** @param caller the RPC transport function */ + SessionAutopilotObjectiveApi(RpcCaller caller, String sessionId) { + this.caller = caller; + this.sessionId = sessionId; + } + + /** + * Identifies the target session. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture getState() { + return caller.invoke("session.autopilotObjective.getState", java.util.Map.of("sessionId", this.sessionId), SessionAutopilotObjectiveGetStateResult.class); + } + +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveGetStateParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveGetStateParams.java new file mode 100644 index 0000000000..94ca56d3b5 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveGetStateParams.java @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * 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 com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; +import javax.annotation.processing.Generated; + +/** + * Identifies the target session. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ +@CopilotExperimental +@javax.annotation.processing.Generated("copilot-sdk-codegen") +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public record SessionAutopilotObjectiveGetStateParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveGetStateResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveGetStateResult.java new file mode 100644 index 0000000000..d4d2185365 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionAutopilotObjectiveGetStateResult.java @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * 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 com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; +import javax.annotation.processing.Generated; + +/** + * Canonical runtime state for the session's current autopilot objective. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ +@CopilotExperimental +@javax.annotation.processing.Generated("copilot-sdk-codegen") +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public record SessionAutopilotObjectiveGetStateResult( + /** Current objective state, or `null` when the session has no objective. */ + @JsonProperty("state") AutopilotObjectiveState state +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionRpc.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionRpc.java index 05cfd396d4..ca8b22f624 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionRpc.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionRpc.java @@ -105,6 +105,8 @@ public final class SessionRpc { public final SessionVisibilityApi visibility; /** API methods for the {@code schedule} namespace. */ public final SessionScheduleApi schedule; + /** API methods for the {@code autopilotObjective} namespace. */ + public final SessionAutopilotObjectiveApi autopilotObjective; /** * Creates a new session RPC client. @@ -153,6 +155,7 @@ public SessionRpc(RpcCaller caller, String sessionId) { this.remote = new SessionRemoteApi(caller, sessionId); this.visibility = new SessionVisibilityApi(caller, sessionId); this.schedule = new SessionScheduleApi(caller, sessionId); + this.autopilotObjective = new SessionAutopilotObjectiveApi(caller, sessionId); } /** diff --git a/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java b/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java index 18045f3e86..8c485ab07c 100644 --- a/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java +++ b/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java @@ -110,6 +110,19 @@ void testShouldReportVisibilityAsUnsyncedForLocalSession() throws Exception { } } + @Test + void testShouldGetEmptyAutopilotObjectiveState() throws Exception { + ctx.configureForTest("rpc_session_state", "should_get_empty_autopilot_objective_state"); + + try (var client = ctx.createClient()) { + try (var session = client + .createSession(new SessionConfig().setOnPermissionRequest(PermissionHandler.APPROVE_ALL)).get()) { + var result = session.getRpc().autopilotObjective.getState().get(30, TimeUnit.SECONDS); + assertNull(result.state()); + } + } + } + @Test void testShouldGetContextAttributionAndHeaviestMessagesAfterTurn() throws Exception { ctx.configureForTest("rpc_session_state_extras", diff --git a/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcApiCoverageTest.java b/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcApiCoverageTest.java index fd0fdaaea1..9fe492d02c 100644 --- a/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcApiCoverageTest.java +++ b/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcApiCoverageTest.java @@ -121,6 +121,20 @@ void sessionRpc_mode_get_injects_sessionId() { assertEquals("sess-mode", ((Map) params).get("sessionId")); } + @Test + void sessionRpc_autopilotObjective_getState_injects_sessionId() { + var stub = new StubCaller(); + var session = new SessionRpc(stub, "sess-objective"); + + session.autopilotObjective.getState(); + + assertEquals(1, stub.calls.size()); + assertEquals("session.autopilotObjective.getState", stub.calls.get(0).method()); + var params = stub.calls.get(0).params(); + assertInstanceOf(Map.class, params); + assertEquals("sess-objective", ((Map) params).get("sessionId")); + } + @Test void sessionRpc_mode_set_merges_sessionId() { var stub = new StubCaller(); diff --git a/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java b/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java index cf5b0426c5..5d9e6f2691 100644 --- a/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java +++ b/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java @@ -512,6 +512,95 @@ void sessionAgentSelectResult_nested() { assertEquals("selected", result.agent().name()); } + @Test + void sessionAutopilotObjectiveGetStateResult_preservesCanonicalPayloads() throws Exception { + var noObjective = RpcMapper.INSTANCE.readValue("{\"state\":null}", + SessionAutopilotObjectiveGetStateResult.class); + assertNull(noObjective.state()); + + var activeResult = RpcMapper.INSTANCE.readValue(""" + { + "state": { + "id": 1, + "objective": "Ship the release", + "status": "active", + "turnCount": 2, + "creditCountNanoAiu": "0" + } + } + """, SessionAutopilotObjectiveGetStateResult.class); + assertNotNull(activeResult.state()); + var active = activeResult.state(); + assertEquals(1L, active.id()); + assertEquals("Ship the release", active.objective()); + assertEquals(AutopilotObjectiveStatus.ACTIVE, active.status()); + assertEquals(2L, active.turnCount()); + assertEquals("0", active.creditCountNanoAiu()); + var activeJson = RpcMapper.INSTANCE.valueToTree(active); + assertFalse(activeJson.has("pauseReason")); + assertFalse(activeJson.has("completionSummary")); + assertFalse(activeJson.has("creditLimit")); + + var pausedResult = RpcMapper.INSTANCE.readValue(""" + { + "state": { + "id": 2, + "objective": "Wait for approval", + "status": "paused", + "turnCount": 3, + "pauseReason": "Approval required", + "creditCountNanoAiu": "9007199254740993", + "creditLimit": { + "creditsUsed": 9007199.254740993, + "creditsUsedNanoAiu": "9007199254740993" + } + } + } + """, SessionAutopilotObjectiveGetStateResult.class); + assertNotNull(pausedResult.state()); + var paused = pausedResult.state(); + assertEquals(2L, paused.id()); + assertEquals("Wait for approval", paused.objective()); + assertEquals(AutopilotObjectiveStatus.PAUSED, paused.status()); + assertEquals(3L, paused.turnCount()); + assertEquals("Approval required", paused.pauseReason()); + assertEquals("9007199254740993", paused.creditCountNanoAiu()); + assertNotNull(paused.creditLimit()); + assertNull(paused.creditLimit().credits()); + assertEquals(9007199.254740993, paused.creditLimit().creditsUsed()); + assertEquals("9007199254740993", paused.creditLimit().creditsUsedNanoAiu()); + + var completedResult = RpcMapper.INSTANCE.readValue(""" + { + "state": { + "id": 3, + "objective": "Publish the SDK", + "status": "completed", + "turnCount": 4, + "completionSummary": "Published", + "creditCountNanoAiu": "9007199254740994", + "creditLimit": { + "credits": 2.5, + "creditsUsed": 1.25, + "creditsUsedNanoAiu": "1250000000" + } + } + } + """, SessionAutopilotObjectiveGetStateResult.class); + assertNotNull(completedResult.state()); + var completed = completedResult.state(); + assertEquals(3L, completed.id()); + assertEquals("Publish the SDK", completed.objective()); + assertEquals(AutopilotObjectiveStatus.COMPLETED, completed.status()); + assertEquals(4L, completed.turnCount()); + assertEquals("Published", completed.completionSummary()); + assertEquals("9007199254740994", completed.creditCountNanoAiu()); + assertNotNull(completed.creditLimit()); + assertEquals(2.5, completed.creditLimit().credits()); + assertEquals(1.25, completed.creditLimit().creditsUsed()); + assertEquals("1250000000", completed.creditLimit().creditsUsedNanoAiu()); + } + @Test void sessionCommandsHandlePendingCommandResult_record() { var result = new SessionCommandsHandlePendingCommandResult(true); diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts index 0174e476bf..54fcfc6a68 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -3640,6 +3640,20 @@ export type WorkspacesWorkspaceDetailsHostType = | "github" /** Workspace repository is hosted on Azure DevOps. */ | "ado"; +/** + * Current normalized autopilot objective lifecycle status. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "AutopilotObjectiveStatus". + */ +/** @experimental */ +export type AutopilotObjectiveStatus = + /** The objective is actively running. */ + | "active" + /** The objective is paused and may be resumed. */ + | "paused" + /** The objective completed. */ + | "completed"; /** * List of all authenticated users * @@ -22303,6 +22317,75 @@ export interface WorkspacesWriteAutopilotObjectiveResult { */ operation: string; } +/** + * Current per-window credit limit and consumption for an autopilot objective. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "AutopilotObjectiveCreditLimit". + */ +/** @experimental */ +export interface AutopilotObjectiveCreditLimit { + /** + * Configured AI-credit cap, when one is set. + */ + credits?: number; + /** + * Window consumption in fractional AI credits, for display. + */ + creditsUsed: number; + /** + * Exact window consumption in integer nano-AIU, encoded as a decimal string. + */ + creditsUsedNanoAiu: string; +} +/** + * Canonical runtime state for the session's current autopilot objective. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "AutopilotObjectiveGetStateResult". + */ +/** @experimental */ +export interface AutopilotObjectiveGetStateResult { + /** + * Current objective state, or `null` when the session has no objective. + */ + state: AutopilotObjectiveState | null; +} +/** + * Public, persistence-independent projection of an autopilot objective. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "AutopilotObjectiveState". + */ +/** @experimental */ +export interface AutopilotObjectiveState { + /** + * Session-local objective identifier. + */ + id: number; + /** + * User-provided objective text. + */ + objective: string; + status: AutopilotObjectiveStatus; + /** + * Number of objective turns started. + */ + turnCount: number; + /** + * Optional reason the objective is paused. + */ + pauseReason?: string; + /** + * Optional summary recorded when the objective completed. + */ + completionSummary?: string; + /** + * Exact lifetime AI-credit consumption in integer nano-AIU, encoded as a decimal string. + */ + creditCountNanoAiu: string; + creditLimit?: AutopilotObjectiveCreditLimit; +} /** @experimental */ export interface SessionModelListRequest { @@ -25165,6 +25248,16 @@ export function createSessionRpc(connection: MessageConnection, sessionId: strin stop: async (params: ScheduleStopRequest): Promise => connection.sendRequest("session.schedule.stop", { sessionId, ...params }), }, + /** @experimental */ + autopilotObjective: { + /** + * Reads the current canonical autopilot objective state for this session. + * + * @returns Canonical runtime state for the session's current autopilot objective. + */ + getState: async (): Promise => + connection.sendRequest("session.autopilotObjective.getState", { sessionId }), + }, }; } diff --git a/nodejs/test/autopilot-objective-rpc.test.ts b/nodejs/test/autopilot-objective-rpc.test.ts new file mode 100644 index 0000000000..cad0c65fe8 --- /dev/null +++ b/nodejs/test/autopilot-objective-rpc.test.ts @@ -0,0 +1,106 @@ +import { describe, expect, it } from "vitest"; +import type { MessageConnection } from "vscode-jsonrpc/node.js"; + +import { createSessionRpc, type AutopilotObjectiveGetStateResult } from "../src/generated/rpc.js"; + +describe("autopilot objective RPC", () => { + it("dispatches getState and preserves canonical objective state", async () => { + const responses: AutopilotObjectiveGetStateResult[] = [ + { state: null }, + { + state: { + id: 1, + objective: "Ship the release", + status: "active", + turnCount: 2, + creditCountNanoAiu: "0", + }, + }, + { + state: { + id: 2, + objective: "Wait for approval", + status: "paused", + turnCount: 3, + pauseReason: "Approval required", + creditCountNanoAiu: "9007199254740993", + creditLimit: { + creditsUsed: 9007199.254740993, + creditsUsedNanoAiu: "9007199254740993", + }, + }, + }, + { + state: { + id: 3, + objective: "Publish the SDK", + status: "completed", + turnCount: 4, + completionSummary: "Published", + creditCountNanoAiu: "9007199254740994", + creditLimit: { + credits: 2.5, + creditsUsed: 1.25, + creditsUsedNanoAiu: "1250000000", + }, + }, + }, + ]; + const calls: Array<{ method: string; params: unknown }> = []; + const connection = { + sendRequest: async (method: string, params: unknown) => { + calls.push({ method, params }); + return responses[calls.length - 1]; + }, + } as unknown as MessageConnection; + const rpc = createSessionRpc(connection, "session-1"); + + const results = []; + for (let index = 0; index < responses.length; index++) { + results.push(await rpc.autopilotObjective.getState()); + } + + expect(calls).toEqual( + responses.map(() => ({ + method: "session.autopilotObjective.getState", + params: { sessionId: "session-1" }, + })) + ); + expect(results[0]).toEqual({ state: null }); + + const active = results[1].state; + expect(active).toEqual({ + id: 1, + objective: "Ship the release", + status: "active", + turnCount: 2, + creditCountNanoAiu: "0", + }); + + const paused = results[2].state; + expect(paused).toMatchObject({ + id: 2, + objective: "Wait for approval", + status: "paused", + turnCount: 3, + pauseReason: "Approval required", + creditCountNanoAiu: "9007199254740993", + }); + expect(paused?.creditLimit?.credits).toBeUndefined(); + expect(paused?.creditLimit?.creditsUsed).toBe(9007199.254740993); + expect(paused?.creditLimit?.creditsUsedNanoAiu).toBe("9007199254740993"); + + const completed = results[3].state; + expect(completed).toMatchObject({ + id: 3, + objective: "Publish the SDK", + status: "completed", + turnCount: 4, + completionSummary: "Published", + creditCountNanoAiu: "9007199254740994", + }); + expect(completed?.creditLimit?.credits).toBe(2.5); + expect(completed?.creditLimit?.creditsUsed).toBe(1.25); + expect(completed?.creditLimit?.creditsUsedNanoAiu).toBe("1250000000"); + }); +}); diff --git a/nodejs/test/e2e/rpc_session_state.e2e.test.ts b/nodejs/test/e2e/rpc_session_state.e2e.test.ts index 5164f99232..71f08d6b55 100644 --- a/nodejs/test/e2e/rpc_session_state.e2e.test.ts +++ b/nodejs/test/e2e/rpc_session_state.e2e.test.ts @@ -151,6 +151,16 @@ describe("Session-scoped RPC", async () => { await session.disconnect(); }); + it("should get empty autopilot objective state", async () => { + const session = await client.createSession({ onPermissionRequest: approveAll }); + try { + const result = await session.rpc.autopilotObjective.getState(); + expect(result.state).toBeNull(); + } finally { + await session.disconnect(); + } + }); + it("should call workspace file rpc methods", async () => { const session = await client.createSession({ onPermissionRequest: approveAll }); diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py index d7c86509e8..5e4d63888e 100644 --- a/python/copilot/generated/rpc.py +++ b/python/copilot/generated/rpc.py @@ -742,6 +742,48 @@ def to_dict(self) -> dict: result["githubMessage"] = from_union([from_str, from_none], self.github_message) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class AutopilotObjectiveCreditLimit: + """Current per-window credit limit and consumption for an autopilot objective. + + Current per-window credit limit and consumption, when configured. + """ + credits_used: float + """Window consumption in fractional AI credits, for display.""" + + credits_used_nano_aiu: str + """Exact window consumption in integer nano-AIU, encoded as a decimal string.""" + + credits: float | None = None + """Configured AI-credit cap, when one is set.""" + + @staticmethod + def from_dict(obj: Any) -> 'AutopilotObjectiveCreditLimit': + assert isinstance(obj, dict) + credits_used = from_float(obj.get("creditsUsed")) + credits_used_nano_aiu = from_str(obj.get("creditsUsedNanoAiu")) + credits = from_union([from_float, from_none], obj.get("credits")) + return AutopilotObjectiveCreditLimit(credits_used, credits_used_nano_aiu, credits) + + def to_dict(self) -> dict: + result: dict = {} + result["creditsUsed"] = to_float(self.credits_used) + result["creditsUsedNanoAiu"] = from_str(self.credits_used_nano_aiu) + if self.credits is not None: + result["credits"] = from_union([to_float, from_none], self.credits) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +class AutopilotObjectiveStatus(Enum): + """Current normalized lifecycle status. + + Current normalized autopilot objective lifecycle status. + """ + ACTIVE = "active" + COMPLETED = "completed" + PAUSED = "paused" + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class BuiltInModelCatalogEntry: @@ -14572,6 +14614,63 @@ def to_dict(self) -> dict: result["field"] = from_union([lambda x: to_enum(AgentRegistrySpawnValidationErrorField, x), from_none], self.field) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class AutopilotObjectiveState: + """Public, persistence-independent projection of an autopilot objective.""" + + credit_count_nano_aiu: str + """Exact lifetime AI-credit consumption in integer nano-AIU, encoded as a decimal string.""" + + id: int + """Session-local objective identifier.""" + + objective: str + """User-provided objective text.""" + + status: AutopilotObjectiveStatus + """Current normalized lifecycle status.""" + + turn_count: int + """Number of objective turns started.""" + + completion_summary: str | None = None + """Optional summary recorded when the objective completed.""" + + credit_limit: AutopilotObjectiveCreditLimit | None = None + """Current per-window credit limit and consumption, when configured.""" + + pause_reason: str | None = None + """Optional reason the objective is paused.""" + + @staticmethod + def from_dict(obj: Any) -> 'AutopilotObjectiveState': + assert isinstance(obj, dict) + credit_count_nano_aiu = from_str(obj.get("creditCountNanoAiu")) + id = from_int(obj.get("id")) + objective = from_str(obj.get("objective")) + status = AutopilotObjectiveStatus(obj.get("status")) + turn_count = from_int(obj.get("turnCount")) + completion_summary = from_union([from_str, from_none], obj.get("completionSummary")) + credit_limit = from_union([AutopilotObjectiveCreditLimit.from_dict, from_none], obj.get("creditLimit")) + pause_reason = from_union([from_str, from_none], obj.get("pauseReason")) + return AutopilotObjectiveState(credit_count_nano_aiu, id, objective, status, turn_count, completion_summary, credit_limit, pause_reason) + + def to_dict(self) -> dict: + result: dict = {} + result["creditCountNanoAiu"] = from_str(self.credit_count_nano_aiu) + result["id"] = from_int(self.id) + result["objective"] = from_str(self.objective) + result["status"] = to_enum(AutopilotObjectiveStatus, self.status) + result["turnCount"] = from_int(self.turn_count) + if self.completion_summary is not None: + result["completionSummary"] = from_union([from_str, from_none], self.completion_summary) + if self.credit_limit is not None: + result["creditLimit"] = from_union([lambda x: to_class(AutopilotObjectiveCreditLimit, x), from_none], self.credit_limit) + if self.pause_reason is not None: + result["pauseReason"] = from_union([from_str, from_none], self.pause_reason) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class BuiltInModelCatalog: @@ -24652,6 +24751,25 @@ def to_dict(self) -> dict: result["logCapture"] = from_union([lambda x: to_class(AgentRegistryLogCapture, x), from_none], self.log_capture) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class AutopilotObjectiveGetStateResult: + """Canonical runtime state for the session's current autopilot objective.""" + + state: AutopilotObjectiveState | None = None + """Current objective state, or `null` when the session has no objective.""" + + @staticmethod + def from_dict(obj: Any) -> 'AutopilotObjectiveGetStateResult': + assert isinstance(obj, dict) + state = from_union([AutopilotObjectiveState.from_dict, from_none], obj.get("state")) + return AutopilotObjectiveGetStateResult(state) + + def to_dict(self) -> dict: + result: dict = {} + result["state"] = from_union([lambda x: to_class(AutopilotObjectiveState, x), from_none], self.state) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class MCPPlanProvenance: @@ -34551,6 +34669,10 @@ class RPC: auth_info_type: AuthInfoType auth_validation_error: AuthValidationError auth_validation_errors: list[AuthValidationError] + autopilot_objective_credit_limit: AutopilotObjectiveCreditLimit + autopilot_objective_get_state_result: AutopilotObjectiveGetStateResult + autopilot_objective_state: AutopilotObjectiveState + autopilot_objective_status: AutopilotObjectiveStatus built_in_model_catalog: BuiltInModelCatalog built_in_model_catalog_entry: BuiltInModelCatalogEntry builtin_tool_descriptor: BuiltinToolDescriptor @@ -35721,6 +35843,10 @@ def from_dict(obj: Any) -> 'RPC': auth_info_type = AuthInfoType(obj.get("AuthInfoType")) auth_validation_error = AuthValidationError.from_dict(obj.get("AuthValidationError")) auth_validation_errors = from_list(AuthValidationError.from_dict, obj.get("AuthValidationErrors")) + autopilot_objective_credit_limit = AutopilotObjectiveCreditLimit.from_dict(obj.get("AutopilotObjectiveCreditLimit")) + autopilot_objective_get_state_result = AutopilotObjectiveGetStateResult.from_dict(obj.get("AutopilotObjectiveGetStateResult")) + autopilot_objective_state = AutopilotObjectiveState.from_dict(obj.get("AutopilotObjectiveState")) + autopilot_objective_status = AutopilotObjectiveStatus(obj.get("AutopilotObjectiveStatus")) built_in_model_catalog = BuiltInModelCatalog.from_dict(obj.get("BuiltInModelCatalog")) built_in_model_catalog_entry = BuiltInModelCatalogEntry.from_dict(obj.get("BuiltInModelCatalogEntry")) builtin_tool_descriptor = BuiltinToolDescriptor.from_dict(obj.get("BuiltinToolDescriptor")) @@ -36838,7 +36964,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, 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, disable_bypass_permissions_mode, 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, 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_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, 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_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, 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, 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, autopilot_objective_credit_limit, autopilot_objective_get_state_result, autopilot_objective_state, autopilot_objective_status, 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, 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, disable_bypass_permissions_mode, 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, 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_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, 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_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, 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, 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 = {} @@ -36891,6 +37017,10 @@ def to_dict(self) -> dict: result["AuthInfoType"] = to_enum(AuthInfoType, self.auth_info_type) result["AuthValidationError"] = to_class(AuthValidationError, self.auth_validation_error) result["AuthValidationErrors"] = from_list(lambda x: to_class(AuthValidationError, x), self.auth_validation_errors) + result["AutopilotObjectiveCreditLimit"] = to_class(AutopilotObjectiveCreditLimit, self.autopilot_objective_credit_limit) + result["AutopilotObjectiveGetStateResult"] = to_class(AutopilotObjectiveGetStateResult, self.autopilot_objective_get_state_result) + result["AutopilotObjectiveState"] = to_class(AutopilotObjectiveState, self.autopilot_objective_state) + result["AutopilotObjectiveStatus"] = to_enum(AutopilotObjectiveStatus, self.autopilot_objective_status) result["BuiltInModelCatalog"] = to_class(BuiltInModelCatalog, self.built_in_model_catalog) result["BuiltInModelCatalogEntry"] = to_class(BuiltInModelCatalogEntry, self.built_in_model_catalog_entry) result["BuiltinToolDescriptor"] = to_class(BuiltinToolDescriptor, self.builtin_tool_descriptor) @@ -40532,6 +40662,17 @@ async def stop(self, params: ScheduleStopRequest, *, timeout: float | None = Non return ScheduleStopResult.from_dict(await self._client.request("session.schedule.stop", params_dict, **_timeout_kwargs(timeout))) +# Experimental: this API group is experimental and may change or be removed. +class AutopilotObjectiveApi: + def __init__(self, client: "JsonRpcClient", session_id: str): + self._client = client + self._session_id = session_id + + async def get_state(self, *, timeout: float | None = None) -> AutopilotObjectiveGetStateResult: + "Reads the current canonical autopilot objective state for this session.\n\nReturns:\n Canonical runtime state for the session's current autopilot objective." + return AutopilotObjectiveGetStateResult.from_dict(await self._client.request("session.autopilotObjective.getState", {"sessionId": self._session_id}, **_timeout_kwargs(timeout))) + + class SessionRpc: """Typed session-scoped RPC methods.""" def __init__(self, client: "JsonRpcClient", session_id: str): @@ -40574,6 +40715,7 @@ def __init__(self, client: "JsonRpcClient", session_id: str): self.remote = RemoteApi(client, session_id) self.visibility = VisibilityApi(client, session_id) self.schedule = ScheduleApi(client, session_id) + self.autopilot_objective = AutopilotObjectiveApi(client, session_id) async def suspend(self, *, timeout: float | None = None) -> None: "Suspends the session while preserving persisted state for later resume.\n\n.. warning:: This API is experimental and may change or be removed in future versions." @@ -41235,6 +41377,11 @@ async def handle_git_hub_telemetry_event(params: dict) -> None: "AuthInfoType", "AuthValidationError", "AuthValidationErrors", + "AutopilotObjectiveApi", + "AutopilotObjectiveCreditLimit", + "AutopilotObjectiveGetStateResult", + "AutopilotObjectiveState", + "AutopilotObjectiveStatus", "BuiltInModelCatalog", "BuiltInModelCatalogEntry", "BuiltinToolDescriptor", diff --git a/python/e2e/test_rpc_session_state_e2e.py b/python/e2e/test_rpc_session_state_e2e.py index f4b03d2e65..82cf592b2e 100644 --- a/python/e2e/test_rpc_session_state_e2e.py +++ b/python/e2e/test_rpc_session_state_e2e.py @@ -215,6 +215,16 @@ async def test_should_read_update_and_delete_plan(self, ctx: E2ETestContext): finally: await session.disconnect() + async def test_should_get_empty_autopilot_objective_state(self, ctx: E2ETestContext): + session = await ctx.client.create_session( + on_permission_request=PermissionHandler.approve_all, + ) + try: + result = await session.rpc.autopilot_objective.get_state() + assert result.state is None + finally: + await session.disconnect() + async def test_should_call_workspace_file_rpc_methods(self, ctx: E2ETestContext): session = await ctx.client.create_session( on_permission_request=PermissionHandler.approve_all, diff --git a/python/test_rpc_generated.py b/python/test_rpc_generated.py index a23173727a..05b05b1a81 100644 --- a/python/test_rpc_generated.py +++ b/python/test_rpc_generated.py @@ -1,11 +1,13 @@ """Tests for generated RPC method behavior.""" import json -from unittest.mock import AsyncMock +from unittest.mock import AsyncMock, call import pytest from copilot.rpc import ( + AutopilotObjectiveApi, + AutopilotObjectiveStatus, BuiltinToolInputSchemaType, CommandsApi, CommandsInvokeRequest, @@ -131,3 +133,99 @@ def test_queued_command_result_serializes_boolean_discriminator( assert request.to_dict()["result"]["handled"] is expected_handled assert isinstance(round_tripped.result, type(variant)) + + +@pytest.mark.asyncio +async def test_autopilot_objective_get_state_preserves_canonical_state(): + payloads = [ + {"state": None}, + { + "state": { + "id": 1, + "objective": "Ship the release", + "status": "active", + "turnCount": 2, + "creditCountNanoAiu": "0", + } + }, + { + "state": { + "id": 2, + "objective": "Wait for approval", + "status": "paused", + "turnCount": 3, + "pauseReason": "Approval required", + "creditCountNanoAiu": "9007199254740993", + "creditLimit": { + "creditsUsed": 9007199.254740993, + "creditsUsedNanoAiu": "9007199254740993", + }, + } + }, + { + "state": { + "id": 3, + "objective": "Publish the SDK", + "status": "completed", + "turnCount": 4, + "completionSummary": "Published", + "creditCountNanoAiu": "9007199254740994", + "creditLimit": { + "credits": 2.5, + "creditsUsed": 1.25, + "creditsUsedNanoAiu": "1250000000", + }, + } + }, + ] + client = AsyncMock() + client.request = AsyncMock(side_effect=payloads) + api = AutopilotObjectiveApi(client, "session-1") + + results = [await api.get_state() for _ in payloads] + + client.request.assert_has_awaits( + [call("session.autopilotObjective.getState", {"sessionId": "session-1"}) for _ in payloads] + ) + assert results[0].state is None + + active = results[1].state + assert active is not None + assert active.id == 1 + assert active.objective == "Ship the release" + assert active.status is AutopilotObjectiveStatus.ACTIVE + assert active.turn_count == 2 + assert active.credit_count_nano_aiu == "0" + assert active.to_dict() == { + "creditCountNanoAiu": "0", + "id": 1, + "objective": "Ship the release", + "status": "active", + "turnCount": 2, + } + + paused = results[2].state + assert paused is not None + assert paused.id == 2 + assert paused.objective == "Wait for approval" + assert paused.status is AutopilotObjectiveStatus.PAUSED + assert paused.turn_count == 3 + assert paused.pause_reason == "Approval required" + assert paused.credit_count_nano_aiu == "9007199254740993" + assert paused.credit_limit is not None + assert paused.credit_limit.credits is None + assert paused.credit_limit.credits_used == 9007199.254740993 + assert paused.credit_limit.credits_used_nano_aiu == "9007199254740993" + + completed = results[3].state + assert completed is not None + assert completed.id == 3 + assert completed.objective == "Publish the SDK" + assert completed.status is AutopilotObjectiveStatus.COMPLETED + assert completed.turn_count == 4 + assert completed.completion_summary == "Published" + assert completed.credit_count_nano_aiu == "9007199254740994" + assert completed.credit_limit is not None + assert completed.credit_limit.credits == 2.5 + assert completed.credit_limit.credits_used == 1.25 + assert completed.credit_limit.credits_used_nano_aiu == "1250000000" diff --git a/rust/src/generated/api_types.rs b/rust/src/generated/api_types.rs index 0583c09229..a0e0f727e7 100644 --- a/rust/src/generated/api_types.rs +++ b/rust/src/generated/api_types.rs @@ -730,6 +730,8 @@ pub mod rpc_methods { pub const SESSION_SCHEDULE_REARMSELFPACED: &str = "session.schedule.rearmSelfPaced"; /// `session.schedule.stop` pub const SESSION_SCHEDULE_STOP: &str = "session.schedule.stop"; + /// `session.autopilotObjective.getState` + pub const SESSION_AUTOPILOTOBJECTIVE_GETSTATE: &str = "session.autopilotObjective.getState"; /// `providerToken.getToken` pub const PROVIDERTOKEN_GETTOKEN: &str = "providerToken.getToken"; /// `factory.execute` @@ -21069,6 +21071,73 @@ pub struct WorkspacesWriteAutopilotObjectiveResult { pub operation: String, } +/// Current per-window credit limit and consumption for an autopilot objective. +/// +///
+/// +/// **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, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AutopilotObjectiveCreditLimit { + /// Configured AI-credit cap, when one is set. + #[serde(skip_serializing_if = "Option::is_none")] + pub credits: Option, + /// Window consumption in fractional AI credits, for display. + pub credits_used: f64, + /// Exact window consumption in integer nano-AIU, encoded as a decimal string. + pub credits_used_nano_aiu: String, +} + +/// Public, persistence-independent projection of an autopilot objective. +/// +///
+/// +/// **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, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AutopilotObjectiveState { + /// Optional summary recorded when the objective completed. + #[serde(skip_serializing_if = "Option::is_none")] + pub completion_summary: Option, + /// Exact lifetime AI-credit consumption in integer nano-AIU, encoded as a decimal string. + pub credit_count_nano_aiu: String, + /// Current per-window credit limit and consumption, when configured. + #[serde(skip_serializing_if = "Option::is_none")] + pub credit_limit: Option, + /// Session-local objective identifier. + pub id: i64, + /// User-provided objective text. + pub objective: String, + /// Optional reason the objective is paused. + #[serde(skip_serializing_if = "Option::is_none")] + pub pause_reason: Option, + /// Current normalized lifecycle status. + pub status: AutopilotObjectiveStatus, + /// Number of objective turns started. + pub turn_count: i64, +} + +/// Canonical runtime state for the session's current autopilot objective. +/// +///
+/// +/// **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, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AutopilotObjectiveGetStateResult { + /// Current objective state, or `null` when the session has no objective. + pub state: Option, +} + /// List of Copilot models available to the resolved user, including capabilities and billing metadata. /// ///
@@ -26617,6 +26686,36 @@ pub struct SessionScheduleStopResult { pub entry: Option, } +/// Identifies the target session. +/// +///
+/// +/// **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, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SessionAutopilotObjectiveGetStateParams { + /// Target session identifier + pub session_id: SessionId, +} + +/// Canonical runtime state for the session's current autopilot objective. +/// +///
+/// +/// **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, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SessionAutopilotObjectiveGetStateResult { + /// Current objective state, or `null` when the session has no objective. + pub state: Option, +} + /// A bearer token supplied by the SDK client for a BYOK provider. The runtime sets it as `Authorization: Bearer ` on the outbound request and does no caching; the SDK consumer owns token caching and refresh. /// ///
@@ -33113,3 +33212,28 @@ pub enum WorkspacesWorkspaceDetailsHostType { #[serde(other)] Unknown, } + +/// Current normalized autopilot objective lifecycle status. +/// +///
+/// +/// **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 AutopilotObjectiveStatus { + /// The objective is actively running. + #[serde(rename = "active")] + Active, + /// The objective is paused and may be resumed. + #[serde(rename = "paused")] + Paused, + /// The objective completed. + #[serde(rename = "completed")] + Completed, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} diff --git a/rust/src/generated/rpc.rs b/rust/src/generated/rpc.rs index c955637e31..ec5c7ef8f7 100644 --- a/rust/src/generated/rpc.rs +++ b/rust/src/generated/rpc.rs @@ -3003,6 +3003,13 @@ impl<'a> SessionRpc<'a> { } } + /// `session.autopilotObjective.*` sub-namespace. + pub fn autopilot_objective(&self) -> SessionRpcAutopilotObjective<'a> { + SessionRpcAutopilotObjective { + session: self.session, + } + } + /// `session.canvas.*` sub-namespace. pub fn canvas(&self) -> SessionRpcCanvas<'a> { SessionRpcCanvas { @@ -3718,6 +3725,42 @@ impl<'a> SessionRpcAgent<'a> { } } +/// `session.autopilotObjective.*` RPCs. +#[derive(Clone, Copy)] +pub struct SessionRpcAutopilotObjective<'a> { + pub(crate) session: &'a Session, +} + +impl<'a> SessionRpcAutopilotObjective<'a> { + /// Reads the current canonical autopilot objective state for this session. + /// + /// Wire method: `session.autopilotObjective.getState`. + /// + /// # Returns + /// + /// Canonical runtime state for the session's current autopilot objective. + /// + ///
+ /// + /// **Experimental.** This API is part of an experimental wire-protocol surface + /// and may change or be removed in future SDK or CLI releases. Pin both the + /// SDK and CLI versions if your code depends on it. + /// + ///
+ pub async fn get_state(&self) -> Result { + let wire_params = serde_json::json!({ "sessionId": self.session.id() }); + let _value = self + .session + .client() + .call( + rpc_methods::SESSION_AUTOPILOTOBJECTIVE_GETSTATE, + Some(wire_params), + ) + .await?; + Ok(serde_json::from_value(_value)?) + } +} + /// `session.canvas.*` RPCs. #[derive(Clone, Copy)] pub struct SessionRpcCanvas<'a> { diff --git a/rust/tests/api_types_test.rs b/rust/tests/api_types_test.rs index 9b86b1367a..1620de00b2 100644 --- a/rust/tests/api_types_test.rs +++ b/rust/tests/api_types_test.rs @@ -4,8 +4,9 @@ #![allow(clippy::unwrap_used)] use github_copilot_sdk::rpc::{ - Extension, ExtensionList, ExtensionSource, ExtensionStatus, ExtensionsDisableRequest, - ExtensionsEnableRequest, FleetStartRequest, FleetStartResult, TasksStartAgentRequest, + AutopilotObjectiveGetStateResult, AutopilotObjectiveStatus, Extension, ExtensionList, + ExtensionSource, ExtensionStatus, ExtensionsDisableRequest, ExtensionsEnableRequest, + FleetStartRequest, FleetStartResult, TasksStartAgentRequest, }; use github_copilot_sdk::session_events::{PermissionRequest, PermissionRequestedData}; @@ -104,6 +105,63 @@ fn permission_event_exposes_managed_approval_required() { assert_eq!(request.managed_approval_required, Some(true)); } +#[test] +fn autopilot_objective_state_preserves_canonical_payloads() { + let no_objective: AutopilotObjectiveGetStateResult = + serde_json::from_str(r#"{"state":null}"#).unwrap(); + assert!(no_objective.state.is_none()); + + let active: AutopilotObjectiveGetStateResult = serde_json::from_str( + r#"{"state":{"id":1,"objective":"Ship the release","status":"active","turnCount":2,"creditCountNanoAiu":"0"}}"#, + ) + .unwrap(); + let active = active.state.unwrap(); + assert_eq!(active.id, 1); + assert_eq!(active.objective, "Ship the release"); + assert_eq!(active.status, AutopilotObjectiveStatus::Active); + assert_eq!(active.turn_count, 2); + assert_eq!(active.credit_count_nano_aiu, "0"); + let active_json = serde_json::to_value(active).unwrap(); + assert!(active_json.get("pauseReason").is_none()); + assert!(active_json.get("completionSummary").is_none()); + assert!(active_json.get("creditLimit").is_none()); + + let paused: AutopilotObjectiveGetStateResult = serde_json::from_str( + r#"{"state":{"id":2,"objective":"Wait for approval","status":"paused","turnCount":3,"pauseReason":"Approval required","creditCountNanoAiu":"9007199254740993","creditLimit":{"creditsUsed":9007199.254740993,"creditsUsedNanoAiu":"9007199254740993"}}}"#, + ) + .unwrap(); + let paused = paused.state.unwrap(); + assert_eq!(paused.id, 2); + assert_eq!(paused.objective, "Wait for approval"); + assert_eq!(paused.status, AutopilotObjectiveStatus::Paused); + assert_eq!(paused.turn_count, 3); + assert_eq!(paused.pause_reason.as_deref(), Some("Approval required")); + assert_eq!(paused.credit_count_nano_aiu, "9007199254740993"); + let paused_credit_limit = paused.credit_limit.unwrap(); + assert_eq!(paused_credit_limit.credits, None); + assert_eq!(paused_credit_limit.credits_used, 9007199.254740993); + assert_eq!( + paused_credit_limit.credits_used_nano_aiu, + "9007199254740993" + ); + + let completed: AutopilotObjectiveGetStateResult = serde_json::from_str( + r#"{"state":{"id":3,"objective":"Publish the SDK","status":"completed","turnCount":4,"completionSummary":"Published","creditCountNanoAiu":"9007199254740994","creditLimit":{"credits":2.5,"creditsUsed":1.25,"creditsUsedNanoAiu":"1250000000"}}}"#, + ) + .unwrap(); + let completed = completed.state.unwrap(); + assert_eq!(completed.id, 3); + assert_eq!(completed.objective, "Publish the SDK"); + assert_eq!(completed.status, AutopilotObjectiveStatus::Completed); + assert_eq!(completed.turn_count, 4); + assert_eq!(completed.completion_summary.as_deref(), Some("Published")); + assert_eq!(completed.credit_count_nano_aiu, "9007199254740994"); + let completed_credit_limit = completed.credit_limit.unwrap(); + assert_eq!(completed_credit_limit.credits, Some(2.5)); + assert_eq!(completed_credit_limit.credits_used, 1.25); + assert_eq!(completed_credit_limit.credits_used_nano_aiu, "1250000000"); +} + fn running_extension(id: &str, name: &str) -> Extension { Extension { id: id.to_string(), diff --git a/rust/tests/e2e/rpc_session_state.rs b/rust/tests/e2e/rpc_session_state.rs index 15db6e3a9a..5572335259 100644 --- a/rust/tests/e2e/rpc_session_state.rs +++ b/rust/tests/e2e/rpc_session_state.rs @@ -226,6 +226,36 @@ async fn should_set_and_get_each_session_mode_value() { .await; } +#[tokio::test] +async fn should_get_empty_autopilot_objective_state() { + super::support::with_shared_e2e_context( + &E2E, + "rpc_session_state", + "should_get_empty_autopilot_objective_state", + |ctx| { + Box::pin(async move { + let client = ctx.start_client().await; + let session = client + .create_session(ctx.approve_all_session_config()) + .await + .expect("create session"); + + let result = session + .rpc() + .autopilot_objective() + .get_state() + .await + .expect("get autopilot objective state"); + assert!(result.state.is_none()); + + session.disconnect().await.expect("disconnect session"); + client.stop().await.expect("stop client"); + }) + }, + ) + .await; +} + #[tokio::test] async fn should_read_update_and_delete_plan() { super::support::with_shared_e2e_context( @@ -1212,4 +1242,4 @@ fn assistant_message_content_if_present( } } static E2E: super::support::SharedE2eGroup = - super::support::SharedE2eGroup::standard("rpc_session_state", 22); + super::support::SharedE2eGroup::standard("rpc_session_state", 23); diff --git a/rust/tests/session_test.rs b/rust/tests/session_test.rs index 69a65a558a..4536705b50 100644 --- a/rust/tests/session_test.rs +++ b/rust/tests/session_test.rs @@ -4088,6 +4088,25 @@ async fn rpc_namespace_session_tasks_list_dispatches_correctly() { assert!(result.tasks.is_empty()); } +#[tokio::test] +async fn rpc_namespace_session_autopilot_objective_get_state_dispatches_correctly() { + let (session, mut server) = create_session_pair().await; + let session = Arc::new(session); + + let s = session.clone(); + let handle = tokio::spawn(async move { s.rpc().autopilot_objective().get_state().await }); + + let request = server.read_request().await; + assert_eq!(request["method"], "session.autopilotObjective.getState"); + assert_eq!(request["params"]["sessionId"], server.session_id); + server + .respond(&request, serde_json::json!({ "state": null })) + .await; + + let result = timeout(TIMEOUT, handle).await.unwrap().unwrap().unwrap(); + assert!(result.state.is_none()); +} + #[tokio::test] async fn rpc_namespace_client_models_list_dispatches_correctly() { let (session, mut server) = create_session_pair().await; diff --git a/test/snapshots/rpc_session_state/should_get_empty_autopilot_objective_state.yaml b/test/snapshots/rpc_session_state/should_get_empty_autopilot_objective_state.yaml new file mode 100644 index 0000000000..056351ddb4 --- /dev/null +++ b/test/snapshots/rpc_session_state/should_get_empty_autopilot_objective_state.yaml @@ -0,0 +1,3 @@ +models: + - claude-sonnet-4.5 +conversations: []