diff --git a/docs/features/mcp.md b/docs/features/mcp.md index caac633275..a111040cf9 100644 --- a/docs/features/mcp.md +++ b/docs/features/mcp.md @@ -24,6 +24,73 @@ The SDK supports two types of MCP servers: | **Local/Stdio** | Runs as a subprocess, communicates via stdin/stdout | Local tools, file access, custom scripts | | **HTTP/SSE** | Remote server accessed via HTTP | Shared services, cloud-hosted tools | +## Copilot Connectors + +The experimental Connector session API lets SDK hosts offer the same non-UI +Connector flow as Copilot CLI. The runtime owns catalog validation, GitHub +authorization, bounded connection polling, MCP projection, and authoritative +same-session reconciliation. The SDK host owns account selection, browser +opening, confirmation, and presentation. + +Use `mcpServers` for MCP servers that your application configures directly. +Use the Connector API for service-backed catalog entries whose connection and +session lifecycle the runtime manages. + +Start with capability detection. When availability is `enabled`, obtain the +opaque account ID from your host's account-selection flow, list the catalog, +reconcile already-connected entries, and drive the typed connection result: + + + +```typescript +async function connectConnector(session, accountId, openConsentUrl) { + const capabilities = await session.rpc.connectors.getCapabilities(); + if (capabilities.availability !== "enabled") return; + + const catalog = await session.rpc.connectors.list({ accountId }); + await session.rpc.connectors.reconcile({ accountId }); + const connectorName = await chooseConnector(catalog.connectors); + + const result = await session.rpc.connectors.connect({ + accountId, + connectorName, + }); + if (result.kind === "consent_required") { + await openConsentUrl(result.consentUrl); + } + if (result.kind !== "connected") { + await session.rpc.connectors.continueConnection({ + continuationId: result.continuationId, + maxAttempts: Math.min(30, capabilities.maxPollAttempts), + pollIntervalMs: Math.min(2_000, capabilities.maxPollIntervalMs), + deadlineMs: Math.min(60_000, capabilities.maxDeadlineMs), + }); + } +} +``` + +The generated API also exposes `refresh`, `reconnect`, `disconnect`, +`getStatus`, and `reconcile`. Connect and continuation results are discriminated +as `connected`, `consent_required`, or `pending`. Disconnect and reconcile +return authoritative session state, including live Connector-owned MCP status. +Account IDs and continuation IDs are opaque. The host obtains the account ID +through its existing account-selection flow and passes only that identifier to +Connector methods; credentials and provider tokens never appear in Connector +DTOs. + +| SDK | Connector API | +| --- | --- | +| Node.js | `session.rpc.connectors` | +| Python | `session.rpc.connectors` | +| Go | `session.RPC.Connectors` | +| .NET | `session.Rpc.Connectors` | +| Java | `session.getRpc().connectors` | +| Rust | `session.rpc().connectors()` | + +> [!NOTE] +> Connector support is experimental and may be unavailable in some runtime +> versions. Always call the capability method before using the API. + ## Configuration ### Node.js / TypeScript diff --git a/dotnet/README.md b/dotnet/README.md index 0e764b6c2d..dd9e70c8c1 100644 --- a/dotnet/README.md +++ b/dotnet/README.md @@ -77,6 +77,44 @@ tool name is `-`. For `AvailableTools` and `mcp:-`. For `CustomAgents[].Tools` and `DefaultAgent.ExcludedTools`, use `-` directly. +## Experimental Connector API + +`session.Rpc.Connectors` exposes the runtime-owned Connector catalog and +lifecycle. The API is experimental, so call `GetCapabilitiesAsync()` first and +use the remaining methods only when availability is enabled. + +```csharp +using GitHub.Copilot.Rpc; + +const string accountId = "opaque-account-selection-id"; +var connectors = session.Rpc.Connectors; +var capabilities = await connectors.GetCapabilitiesAsync(); + +if (capabilities.Availability == ConnectorAvailability.Enabled) +{ + var catalog = await connectors.ListAsync(accountId); + await connectors.ReconcileAsync(accountId); + var result = await connectors.ConnectAsync(accountId, catalog.Connectors[0].Name); + + if (result is ConnectorConnectResultConsentRequired consent) + { + OpenBrowser(consent.ConsentUrl); + result = await connectors.ContinueConnectionAsync( + consent.ContinuationId, + maxAttempts: capabilities.MaxPollAttempts, + pollIntervalMs: capabilities.MaxPollIntervalMs, + deadlineMs: capabilities.MaxDeadlineMs); + } +} +``` + +The nine experimental methods are `GetCapabilitiesAsync`, `GetStatusAsync`, +`ListAsync`, `RefreshAsync`, `ConnectAsync`, `ReconnectAsync`, +`ContinueConnectionAsync`, `DisconnectAsync`, and `ReconcileAsync`. The host +selects the opaque GitHub account and handles consent UI. Connector methods +accept only that account ID, never credentials or provider tokens; credentials +and MCP projection remain runtime-owned. + ## API Reference ### CopilotClient diff --git a/dotnet/src/Generated/Rpc.cs b/dotnet/src/Generated/Rpc.cs index 81cd4e6da8..0af77cdba8 100644 --- a/dotnet/src/Generated/Rpc.cs +++ b/dotnet/src/Generated/Rpc.cs @@ -19773,6 +19773,293 @@ internal sealed class ScheduleStopRequest public string SessionId { get; set; } = string.Empty; } +/// Feature detection and hard polling limits for the EXPERIMENTAL session connector API. +[Experimental(Diagnostics.Experimental)] +public sealed class ConnectorCapabilities +{ + /// Connector API contract version. + [JsonPropertyName("apiVersion")] + public long ApiVersion { get; set; } + + /// Current session availability. Disabled availability is reported without making a Connector request. + [JsonPropertyName("availability")] + public ConnectorAvailability Availability { get; set; } + + /// Whether connect and reconnect can return an opaque continuation for bounded consent polling. + [JsonPropertyName("consentContinuation")] + public bool ConsentContinuation { get; set; } + + /// Maximum accepted wall-clock deadline in milliseconds for one continuation call. + [JsonPropertyName("maxDeadlineMs")] + public long MaxDeadlineMs { get; set; } + + /// Maximum accepted polling attempts for one continuation call. + [JsonPropertyName("maxPollAttempts")] + public long MaxPollAttempts { get; set; } + + /// Maximum accepted delay in milliseconds between polling attempts. + [JsonPropertyName("maxPollIntervalMs")] + public long MaxPollIntervalMs { get; set; } + + /// Whether callers select a host-owned GitHub account through an opaque selection ID rather than supplying a provider token. + [JsonPropertyName("opaqueAccountSelection")] + public bool OpaqueAccountSelection { get; set; } +} + +/// Identifies the target session. +[Experimental(Diagnostics.Experimental)] +internal sealed class SessionConnectorsGetCapabilitiesRequest +{ + /// Target session identifier. + [JsonPropertyName("sessionId")] + public string SessionId { get; set; } = string.Empty; +} + +/// Credential-free Connector catalog entry. +[Experimental(Diagnostics.Experimental)] +public sealed class ConnectorCatalogEntry +{ + /// Untrusted service description, when present. + [JsonPropertyName("description")] + public string? Description { get; set; } + + /// Untrusted display label from the service. + [JsonPropertyName("displayName")] + public string DisplayName { get; set; } = string.Empty; + + /// Canonical Connector name used by lifecycle methods. + [JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// Opaque stable runtime IDs currently projected into the session for this Connector. + [JsonPropertyName("runtimeServerIds")] + public IList RuntimeServerIds { get => field ??= []; set; } + + /// Current authoritative service connection state. + [JsonPropertyName("status")] + public ConnectorCatalogStatus Status { get; set; } +} + +/// Validated Connector catalog snapshot cached by the session. +[Experimental(Diagnostics.Experimental)] +public sealed class ConnectorCatalogResult +{ + /// Validated catalog entries in service order. + [JsonPropertyName("connectors")] + public IList Connectors { get => field ??= []; set; } + + /// Unix epoch milliseconds when this snapshot was accepted. + [JsonPropertyName("refreshedAtMs")] + public long RefreshedAtMs { get; set; } + + /// Monotonically increasing session-local catalog revision. + [JsonPropertyName("revision")] + public long Revision { get; set; } +} + +/// Live status of one session-owned MCP projection. +[Experimental(Diagnostics.Experimental)] +public sealed class ConnectorRuntimeStatus +{ + /// Canonical Connector name that owns this server. + [JsonPropertyName("connectorName")] + public string ConnectorName { get; set; } = string.Empty; + + /// Opaque runtime server ID. + [JsonPropertyName("runtimeServerId")] + public string RuntimeServerId { get; set; } = string.Empty; + + /// Current live MCP host status. + [JsonPropertyName("status")] + public ConnectorMcpStatus Status { get; set; } +} + +/// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. +[Experimental(Diagnostics.Experimental)] +public sealed class ConnectorStatus +{ + /// Opaque account selection pinned to this session, when one has been selected. + [JsonPropertyName("accountId")] + public string? AccountId { get; set; } + + /// Connector API contract version. + [JsonPropertyName("apiVersion")] + public long ApiVersion { get; set; } + + /// Current feature and session availability. + [JsonPropertyName("availability")] + public ConnectorAvailability Availability { get; set; } + + /// Latest validated catalog snapshot, when available. + [JsonPropertyName("catalog")] + public ConnectorCatalogResult? Catalog { get; set; } + + /// Number of active opaque connection continuations. + [JsonPropertyName("pendingConnections")] + public long PendingConnections { get; set; } + + /// Live MCP status for every Connector-owned runtime server. + [JsonPropertyName("runtimeServers")] + public IList RuntimeServers { get => field ??= []; set; } +} + +/// Identifies the target session. +[Experimental(Diagnostics.Experimental)] +internal sealed class SessionConnectorsGetStatusRequest +{ + /// Target session identifier. + [JsonPropertyName("sessionId")] + public string SessionId { get; set; } = string.Empty; +} + +/// Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. +[Experimental(Diagnostics.Experimental)] +internal sealed class ConnectorAccountRequest +{ + /// Opaque account selection ID previously returned by an account discovery API. + [JsonPropertyName("accountId")] + public string AccountId { get; set; } = string.Empty; + + /// Target session identifier. + [JsonPropertyName("sessionId")] + public string SessionId { get; set; } = string.Empty; +} + +/// Typed result of initiating or continuing a Connector connection. +/// Polymorphic base type discriminated by kind. +[Experimental(Diagnostics.Experimental)] +[JsonPolymorphic( + TypeDiscriminatorPropertyName = "kind", + UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)] +[JsonDerivedType(typeof(ConnectorConnectResultConnected), "connected")] +[JsonDerivedType(typeof(ConnectorConnectResultConsentRequired), "consent_required")] +[JsonDerivedType(typeof(ConnectorConnectResultPending), "pending")] +public partial class ConnectorConnectResult +{ + /// The type discriminator. + [JsonPropertyName("kind")] + public virtual string Kind { get; set; } = string.Empty; +} + + +/// The service is connected and the session MCP graph was reconciled. +/// The connected variant of . +[Experimental(Diagnostics.Experimental)] +public partial class ConnectorConnectResultConnected : ConnectorConnectResult +{ + /// + [JsonIgnore] + public override string Kind => "connected"; + + /// Fresh authoritative Connector state after MCP reconciliation. + [JsonPropertyName("status")] + public required ConnectorStatus Status { get; set; } +} + +/// Host-owned consent is required before bounded continuation can complete. +/// The consent_required variant of . +[Experimental(Diagnostics.Experimental)] +public partial class ConnectorConnectResultConsentRequired : ConnectorConnectResult +{ + /// + [JsonIgnore] + public override string Kind => "consent_required"; + + /// Validated HTTPS consent URL. The runtime does not open it. + [JsonPropertyName("consentUrl")] + public required string ConsentUrl { get; set; } + + /// Opaque ID accepted by continueConnection. + [JsonPropertyName("continuationId")] + public required string ContinuationId { get; set; } +} + +/// The service is still completing the connection without a consent URL. +/// The pending variant of . +[Experimental(Diagnostics.Experimental)] +public partial class ConnectorConnectResultPending : ConnectorConnectResult +{ + /// + [JsonIgnore] + public override string Kind => "pending"; + + /// Opaque ID accepted by continueConnection. + [JsonPropertyName("continuationId")] + public required string ContinuationId { get; set; } +} + +/// Selects one Connector and the pinned host-owned account used for its service and MCP authorization. +[Experimental(Diagnostics.Experimental)] +internal sealed class ConnectorConnectRequest +{ + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + [JsonPropertyName("accountId")] + public string AccountId { get; set; } = string.Empty; + + /// Canonical Connector name from the current catalog. + [JsonPropertyName("connectorName")] + public string ConnectorName { get; set; } = string.Empty; + + /// Target session identifier. + [JsonPropertyName("sessionId")] + public string SessionId { get; set; } = string.Empty; +} + +/// Explicitly bounded continuation of a pending Connector connection. +[Experimental(Diagnostics.Experimental)] +internal sealed class ConnectorContinueRequest +{ + /// Opaque continuation ID returned by connect, reconnect, or an earlier continuation. + [JsonPropertyName("continuationId")] + public string ContinuationId { get; set; } = string.Empty; + + /// Maximum wall-clock duration in milliseconds for this call. Must be between one and the capability limit. + [JsonPropertyName("deadlineMs")] + public int DeadlineMs { get; set; } + + /// Maximum catalog requests made by this call. Must be between one and the capability limit. + [JsonPropertyName("maxAttempts")] + public int MaxAttempts { get; set; } + + /// Delay in milliseconds between attempts. Must not exceed the capability limit. + [JsonPropertyName("pollIntervalMs")] + public int PollIntervalMs { get; set; } + + /// Target session identifier. + [JsonPropertyName("sessionId")] + public string SessionId { get; set; } = string.Empty; +} + +/// Authoritative result after disconnect and MCP reconciliation. +[Experimental(Diagnostics.Experimental)] +public sealed class ConnectorDisconnectResult +{ + /// Whether the service accepted the idempotent disconnect. + [JsonPropertyName("disconnected")] + public bool Disconnected { get; set; } + + /// Fresh authoritative session state after removing Connector-owned MCP servers. + [JsonPropertyName("status")] + public ConnectorStatus Status { get => field ??= new(); set; } +} + +/// Requests authoritative Connector-to-MCP reconciliation for the pinned account. +[Experimental(Diagnostics.Experimental)] +internal sealed class ConnectorReconcileRequest +{ + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + [JsonPropertyName("accountId")] + public string AccountId { get; set; } = string.Empty; + + /// When true, refresh the catalog before reconciling. A disabled Connector API performs no service request. + [JsonPropertyName("refreshCatalog")] + public bool? RefreshCatalog { get; set; } + + /// 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 @@ -32486,6 +32773,222 @@ public override void Write(Utf8JsonWriter writer, SessionVisibilityStatus value, } +/// Availability of the EXPERIMENTAL session connector API. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct ConnectorAvailability : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public ConnectorAvailability(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// The resolved Connector feature is enabled and Connector requests are permitted. + public static ConnectorAvailability Enabled { get; } = new("enabled"); + + /// The resolved Connector feature is off. No Connector service request is made while disabled. + public static ConnectorAvailability Disabled { get; } = new("disabled"); + + /// The session has no eligible host-owned GitHub account or does not support local Connector projection. + public static ConnectorAvailability Unavailable { get; } = new("unavailable"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(ConnectorAvailability left, ConnectorAvailability right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(ConnectorAvailability left, ConnectorAvailability right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is ConnectorAvailability other && Equals(other); + + /// + public bool Equals(ConnectorAvailability 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 ConnectorAvailability Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, ConnectorAvailability value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ConnectorAvailability)); + } + } +} + + +/// Authoritative service connection state for one Connector. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct ConnectorCatalogStatus : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public ConnectorCatalogStatus(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// The Connector is available but not connected. + public static ConnectorCatalogStatus NotConnected { get; } = new("not_connected"); + + /// The Connector service is still completing connection or consent. + public static ConnectorCatalogStatus Pending { get; } = new("pending"); + + /// The Connector is connected and may contribute MCP servers. + public static ConnectorCatalogStatus Connected { get; } = new("connected"); + + /// The Connector service reports an unusable connection. + public static ConnectorCatalogStatus Error { get; } = new("error"); + + /// The service returned a future or unrecognized state. + public static ConnectorCatalogStatus Unknown { get; } = new("unknown"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(ConnectorCatalogStatus left, ConnectorCatalogStatus right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(ConnectorCatalogStatus left, ConnectorCatalogStatus right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is ConnectorCatalogStatus other && Equals(other); + + /// + public bool Equals(ConnectorCatalogStatus 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 ConnectorCatalogStatus Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, ConnectorCatalogStatus value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ConnectorCatalogStatus)); + } + } +} + + +/// Live MCP status of one Connector-owned runtime server. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct ConnectorMcpStatus : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public ConnectorMcpStatus(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// The server is connected and its tools are available. + public static ConnectorMcpStatus Connected { get; } = new("connected"); + + /// The server connection is still being established. + public static ConnectorMcpStatus Pending { get; } = new("pending"); + + /// The server requires refreshed GitHub authorization. + public static ConnectorMcpStatus NeedsAuth { get; } = new("needs_auth"); + + /// The server failed to connect or initialize. + public static ConnectorMcpStatus Failed { get; } = new("failed"); + + /// The server is intentionally stopped, including when managed policy blocks it. + public static ConnectorMcpStatus Stopped { get; } = new("stopped"); + + /// The server is configured but explicitly disabled. + public static ConnectorMcpStatus Disabled { get; } = new("disabled"); + + /// The Connector currently has no live server configuration. + public static ConnectorMcpStatus NotConfigured { get; } = new("not_configured"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(ConnectorMcpStatus left, ConnectorMcpStatus right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(ConnectorMcpStatus left, ConnectorMcpStatus right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is ConnectorMcpStatus other && Equals(other); + + /// + public bool Equals(ConnectorMcpStatus 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 ConnectorMcpStatus Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, ConnectorMcpStatus value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ConnectorMcpStatus)); + } + } +} + + /// Why the runtime requests client-task cancellation. [Experimental(Diagnostics.Experimental)] [JsonConverter(typeof(Converter))] @@ -34673,6 +35176,12 @@ internal SessionRpc(CopilotSession session) Interlocked.CompareExchange(ref field, new(_session), null) ?? field; + /// Connectors APIs. + public ConnectorsApi Connectors => + 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)] @@ -38939,6 +39448,141 @@ public async Task StopAsync(long id, CancellationToken cance } } +/// Provides session-scoped Connectors APIs. +[Experimental(Diagnostics.Experimental)] +public sealed class ConnectorsApi +{ + private readonly CopilotSession _session; + + internal ConnectorsApi(CopilotSession session) + { + _session = session; + } + + /// Returns feature availability and bounded polling limits for the EXPERIMENTAL session connector API. This method never performs a Connector service request. + /// The to monitor for cancellation requests. The default is . + /// Feature detection and hard polling limits for the EXPERIMENTAL session connector API. + public async Task GetCapabilitiesAsync(CancellationToken cancellationToken = default) + { + _session.ThrowIfDisposed(); + + var request = new SessionConnectorsGetCapabilitiesRequest { SessionId = _session.SessionId }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.getCapabilities", [request], cancellationToken); + } + + /// Returns authoritative session Connector state from current availability, pinned account selection, cached catalog, and live MCP projection without performing a Connector service request. + /// The to monitor for cancellation requests. The default is . + /// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + public async Task GetStatusAsync(CancellationToken cancellationToken = default) + { + _session.ThrowIfDisposed(); + + var request = new SessionConnectorsGetStatusRequest { SessionId = _session.SessionId }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.getStatus", [request], cancellationToken); + } + + /// Returns the cached Connector catalog for the pinned opaque account selection, fetching it only when this session has no cached catalog. + /// Opaque account selection ID previously returned by an account discovery API. + /// The to monitor for cancellation requests. The default is . + /// Validated Connector catalog snapshot cached by the session. + public async Task ListAsync(string accountId, CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(accountId); + _session.ThrowIfDisposed(); + + var request = new ConnectorAccountRequest { SessionId = _session.SessionId, AccountId = accountId }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.list", [request], cancellationToken); + } + + /// Refreshes and validates the Connector catalog for the pinned opaque account selection. + /// Opaque account selection ID previously returned by an account discovery API. + /// The to monitor for cancellation requests. The default is . + /// Validated Connector catalog snapshot cached by the session. + public async Task RefreshAsync(string accountId, CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(accountId); + _session.ThrowIfDisposed(); + + var request = new ConnectorAccountRequest { SessionId = _session.SessionId, AccountId = accountId }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.refresh", [request], cancellationToken); + } + + /// Initiates an idempotent Connector connection request without opening a browser. Returns connected when the service is immediately authoritative, consent_required with a validated URL, or pending with an opaque continuation ID. + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + /// Canonical Connector name from the current catalog. + /// The to monitor for cancellation requests. The default is . + /// Typed result of initiating or continuing a Connector connection. + public async Task ConnectAsync(string accountId, string connectorName, CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(accountId); + ArgumentNullException.ThrowIfNull(connectorName); + _session.ThrowIfDisposed(); + + var request = new ConnectorConnectRequest { SessionId = _session.SessionId, AccountId = accountId, ConnectorName = connectorName }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.connect", [request], cancellationToken); + } + + /// Re-initiates an idempotent Connector connection request without browser or UI effects, with the same typed outcomes as connect. + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + /// Canonical Connector name from the current catalog. + /// The to monitor for cancellation requests. The default is . + /// Typed result of initiating or continuing a Connector connection. + public async Task ReconnectAsync(string accountId, string connectorName, CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(accountId); + ArgumentNullException.ThrowIfNull(connectorName); + _session.ThrowIfDisposed(); + + var request = new ConnectorConnectRequest { SessionId = _session.SessionId, AccountId = accountId, ConnectorName = connectorName }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.reconnect", [request], cancellationToken); + } + + /// Continues a pending Connector connection with caller-supplied attempt, interval, and deadline bounds. The runtime never opens the returned consent URL. + /// Opaque continuation ID returned by connect, reconnect, or an earlier continuation. + /// Maximum catalog requests made by this call. Must be between one and the capability limit. + /// Delay in milliseconds between attempts. Must not exceed the capability limit. + /// Maximum wall-clock duration in milliseconds for this call. Must be between one and the capability limit. + /// The to monitor for cancellation requests. The default is . + /// Typed result of initiating or continuing a Connector connection. + public async Task ContinueConnectionAsync(string continuationId, int maxAttempts, int pollIntervalMs, int deadlineMs, CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(continuationId); + _session.ThrowIfDisposed(); + + var request = new ConnectorContinueRequest { SessionId = _session.SessionId, ContinuationId = continuationId, MaxAttempts = maxAttempts, PollIntervalMs = pollIntervalMs, DeadlineMs = deadlineMs }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.continueConnection", [request], cancellationToken); + } + + /// Disconnects one Connector for the pinned opaque account selection, refreshes the authoritative catalog, and removes its session-owned MCP projection. + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + /// Canonical Connector name from the current catalog. + /// The to monitor for cancellation requests. The default is . + /// Authoritative result after disconnect and MCP reconciliation. + public async Task DisconnectAsync(string accountId, string connectorName, CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(accountId); + ArgumentNullException.ThrowIfNull(connectorName); + _session.ThrowIfDisposed(); + + var request = new ConnectorConnectRequest { SessionId = _session.SessionId, AccountId = accountId, ConnectorName = connectorName }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.disconnect", [request], cancellationToken); + } + + /// Reconciles the authoritative cached or freshly requested Connector catalog into the session Connector MCP projection and returns live status. + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + /// When true, refresh the catalog before reconciling. A disabled Connector API performs no service request. + /// The to monitor for cancellation requests. The default is . + /// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + public async Task ReconcileAsync(string accountId, bool? refreshCatalog = null, CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(accountId); + _session.ThrowIfDisposed(); + + var request = new ConnectorReconcileRequest { SessionId = _session.SessionId, AccountId = accountId, RefreshCatalog = refreshCatalog }; + return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.connectors.reconcile", [request], cancellationToken); + } +} + /// Handles `providerToken` client session API methods. [Experimental(Diagnostics.Experimental)] public interface IProviderTokenHandler @@ -39845,6 +40489,17 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(ConnectResult))] [JsonSerializable(typeof(ConnectedRemoteSessionMetadata))] [JsonSerializable(typeof(ConnectedRemoteSessionMetadataRepository))] +[JsonSerializable(typeof(ConnectorAccountRequest))] +[JsonSerializable(typeof(ConnectorCapabilities))] +[JsonSerializable(typeof(ConnectorCatalogEntry))] +[JsonSerializable(typeof(ConnectorCatalogResult))] +[JsonSerializable(typeof(ConnectorConnectRequest))] +[JsonSerializable(typeof(ConnectorConnectResult))] +[JsonSerializable(typeof(ConnectorContinueRequest))] +[JsonSerializable(typeof(ConnectorDisconnectResult))] +[JsonSerializable(typeof(ConnectorReconcileRequest))] +[JsonSerializable(typeof(ConnectorRuntimeStatus))] +[JsonSerializable(typeof(ConnectorStatus))] [JsonSerializable(typeof(ContentExclusionCheckPathsRequest))] [JsonSerializable(typeof(ContentExclusionCheckPathsResult))] [JsonSerializable(typeof(ContentExclusionPathCheck))] @@ -40362,6 +41017,8 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(SessionCommandsListRequestWithSession))] [JsonSerializable(typeof(SessionCompletionItem))] [JsonSerializable(typeof(SessionCompletionsGetTriggerCharactersRequest))] +[JsonSerializable(typeof(SessionConnectorsGetCapabilitiesRequest))] +[JsonSerializable(typeof(SessionConnectorsGetStatusRequest))] [JsonSerializable(typeof(SessionContext))] [JsonSerializable(typeof(SessionEnrichMetadataResult))] [JsonSerializable(typeof(SessionEventLogTailRequest))] diff --git a/dotnet/test/Unit/ClientSessionLifetimeTests.cs b/dotnet/test/Unit/ClientSessionLifetimeTests.cs index e6764c0ef4..e46ac3fe85 100644 --- a/dotnet/test/Unit/ClientSessionLifetimeTests.cs +++ b/dotnet/test/Unit/ClientSessionLifetimeTests.cs @@ -2412,6 +2412,8 @@ public static Task StartAsync() public Func? AfterResponseAsync { get; set; } + public Func? ResponseFactory { get; set; } + public IReadOnlyList Requests { get @@ -2711,6 +2713,7 @@ private async Task HandleRequestAsync(Stream stream, JsonElement request, Cancel }, "session.detach" => await DetachSessionAsync(cancellationToken), "runtime.shutdown" => HandleRuntimeShutdown(), + _ when ResponseFactory is { } responseFactory => responseFactory(requestRecord), _ => throw new InvalidOperationException($"Unexpected RPC method '{method}'.") }; diff --git a/dotnet/test/Unit/RpcConnectorsTests.cs b/dotnet/test/Unit/RpcConnectorsTests.cs new file mode 100644 index 0000000000..f7304700bd --- /dev/null +++ b/dotnet/test/Unit/RpcConnectorsTests.cs @@ -0,0 +1,297 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +#if NET8_0_OR_GREATER +using System.Text.Json; +using GitHub.Copilot.Rpc; +using Xunit; + +namespace GitHub.Copilot.Test.Unit; + +public sealed partial class ClientSessionLifetimeTests +{ + [Fact] + public async Task Session_Rpc_Connectors_Reports_Capabilities_Status_And_Catalogs() + { + await using var server = await FakeCopilotServer.StartAsync(); + server.ResponseFactory = CreateConnectorRpcResponse; + await using var client = new CopilotClient(new CopilotClientOptions + { + Connection = RuntimeConnection.ForUri(server.Url) + }); + await using var session = await client.CreateSessionAsync(new SessionConfig()); + server.ClearRequests(); + + var connectors = session.Rpc.Connectors; + Assert.Same(connectors, session.Rpc.Connectors); + + var capabilities = await connectors.GetCapabilitiesAsync(); + Assert.Equal(1, capabilities.ApiVersion); + Assert.Equal(ConnectorAvailability.Enabled, capabilities.Availability); + Assert.True(capabilities.ConsentContinuation); + Assert.Equal(5, capabilities.MaxPollAttempts); + Assert.Equal(2_000, capabilities.MaxPollIntervalMs); + Assert.Equal(30_000, capabilities.MaxDeadlineMs); + Assert.True(capabilities.OpaqueAccountSelection); + + var status = await connectors.GetStatusAsync(); + Assert.Equal("account-1", status.AccountId); + Assert.Equal(2, status.PendingConnections); + Assert.Equal(7, status.Catalog?.Revision); + var runtimeServer = Assert.Single(status.RuntimeServers); + Assert.Equal("slack", runtimeServer.ConnectorName); + Assert.Equal("connector-slack", runtimeServer.RuntimeServerId); + Assert.Equal(ConnectorMcpStatus.Connected, runtimeServer.Status); + + var listed = await connectors.ListAsync("account-1"); + AssertConnectorCatalog(listed, 3, ConnectorCatalogStatus.NotConnected); + + var refreshed = await connectors.RefreshAsync("account-1"); + AssertConnectorCatalog(refreshed, 4, ConnectorCatalogStatus.Connected); + + Assert.Collection( + server.Requests, + request => AssertConnectorRequest( + request, + "session.connectors.getCapabilities", + session.SessionId), + request => AssertConnectorRequest( + request, + "session.connectors.getStatus", + session.SessionId), + request => AssertConnectorRequest( + request, + "session.connectors.list", + session.SessionId, + ("accountId", "account-1")), + request => AssertConnectorRequest( + request, + "session.connectors.refresh", + session.SessionId, + ("accountId", "account-1"))); + } + + [Fact] + public async Task Session_Rpc_Connectors_Maps_Connection_Wire_And_Result_Variants() + { + await using var server = await FakeCopilotServer.StartAsync(); + server.ResponseFactory = CreateConnectorRpcResponse; + await using var client = new CopilotClient(new CopilotClientOptions + { + Connection = RuntimeConnection.ForUri(server.Url) + }); + await using var session = await client.CreateSessionAsync(new SessionConfig()); + server.ClearRequests(); + + var connected = Assert.IsType( + await session.Rpc.Connectors.ConnectAsync("account-1", "slack")); + Assert.Equal("connected", connected.Kind); + Assert.Equal(8, connected.Status.Catalog?.Revision); + + var consent = Assert.IsType( + await session.Rpc.Connectors.ReconnectAsync("account-1", "slack")); + Assert.Equal("consent_required", consent.Kind); + Assert.Equal("https://example.com/consent", consent.ConsentUrl); + Assert.Equal("continuation-reconnect", consent.ContinuationId); + + var pending = Assert.IsType( + await session.Rpc.Connectors.ContinueConnectionAsync( + "continuation-reconnect", + maxAttempts: 3, + pollIntervalMs: 1_000, + deadlineMs: 10_000)); + Assert.Equal("pending", pending.Kind); + Assert.Equal("continuation-next", pending.ContinuationId); + + Assert.Collection( + server.Requests, + request => AssertConnectorRequest( + request, + "session.connectors.connect", + session.SessionId, + ("accountId", "account-1"), + ("connectorName", "slack")), + request => AssertConnectorRequest( + request, + "session.connectors.reconnect", + session.SessionId, + ("accountId", "account-1"), + ("connectorName", "slack")), + request => AssertConnectorRequest( + request, + "session.connectors.continueConnection", + session.SessionId, + ("continuationId", "continuation-reconnect"), + ("maxAttempts", 3L), + ("pollIntervalMs", 1_000L), + ("deadlineMs", 10_000L))); + } + + [Fact] + public async Task Session_Rpc_Connectors_Maps_Disconnect_And_Reconcile() + { + await using var server = await FakeCopilotServer.StartAsync(); + server.ResponseFactory = CreateConnectorRpcResponse; + await using var client = new CopilotClient(new CopilotClientOptions + { + Connection = RuntimeConnection.ForUri(server.Url) + }); + await using var session = await client.CreateSessionAsync(new SessionConfig()); + server.ClearRequests(); + + var disconnected = await session.Rpc.Connectors.DisconnectAsync("account-1", "slack"); + Assert.True(disconnected.Disconnected); + Assert.Equal(9, disconnected.Status.Catalog?.Revision); + + var reconciled = await session.Rpc.Connectors.ReconcileAsync("account-1", refreshCatalog: true); + Assert.Equal(10, reconciled.Catalog?.Revision); + Assert.Empty(reconciled.RuntimeServers); + + Assert.Collection( + server.Requests, + request => AssertConnectorRequest( + request, + "session.connectors.disconnect", + session.SessionId, + ("accountId", "account-1"), + ("connectorName", "slack")), + request => AssertConnectorRequest( + request, + "session.connectors.reconcile", + session.SessionId, + ("accountId", "account-1"), + ("refreshCatalog", true))); + } + + private static Dictionary CreateConnectorRpcResponse(RpcRequestRecord request) => + request.Method switch + { + "session.connectors.getCapabilities" => new Dictionary + { + ["apiVersion"] = 1L, + ["availability"] = "enabled", + ["consentContinuation"] = true, + ["maxDeadlineMs"] = 30_000L, + ["maxPollAttempts"] = 5L, + ["maxPollIntervalMs"] = 2_000L, + ["opaqueAccountSelection"] = true + }, + "session.connectors.getStatus" => CreateConnectorStatusResponse(7, pendingConnections: 2), + "session.connectors.list" => CreateConnectorCatalogResponse(3, "not_connected"), + "session.connectors.refresh" => CreateConnectorCatalogResponse(4, "connected"), + "session.connectors.connect" => new Dictionary + { + ["kind"] = "connected", + ["status"] = CreateConnectorStatusResponse(8) + }, + "session.connectors.reconnect" => new Dictionary + { + ["kind"] = "consent_required", + ["consentUrl"] = "https://example.com/consent", + ["continuationId"] = "continuation-reconnect" + }, + "session.connectors.continueConnection" => new Dictionary + { + ["kind"] = "pending", + ["continuationId"] = "continuation-next" + }, + "session.connectors.disconnect" => new Dictionary + { + ["disconnected"] = true, + ["status"] = CreateConnectorStatusResponse(9) + }, + "session.connectors.reconcile" => CreateConnectorStatusResponse( + 10, + includeRuntimeServer: false), + _ => throw new InvalidOperationException($"Unexpected Connector RPC method '{request.Method}'.") + }; + + private static Dictionary CreateConnectorStatusResponse( + long revision, + long pendingConnections = 0, + bool includeRuntimeServer = true) => + new() + { + ["accountId"] = "account-1", + ["apiVersion"] = 1L, + ["availability"] = "enabled", + ["catalog"] = CreateConnectorCatalogResponse(revision, "connected"), + ["pendingConnections"] = pendingConnections, + ["runtimeServers"] = includeRuntimeServer + ? new object?[] + { + new Dictionary + { + ["connectorName"] = "slack", + ["runtimeServerId"] = "connector-slack", + ["status"] = "connected" + } + } + : Array.Empty() + }; + + private static Dictionary CreateConnectorCatalogResponse(long revision, string status) => + new() + { + ["connectors"] = new object?[] + { + new Dictionary + { + ["description"] = "Slack workspace search", + ["displayName"] = "Slack", + ["name"] = "slack", + ["runtimeServerIds"] = new object?[] { "connector-slack" }, + ["status"] = status + } + }, + ["refreshedAtMs"] = 1_750_000_000_000L, + ["revision"] = revision + }; + + private static void AssertConnectorCatalog( + ConnectorCatalogResult catalog, + long revision, + ConnectorCatalogStatus status) + { + Assert.Equal(revision, catalog.Revision); + Assert.Equal(1_750_000_000_000L, catalog.RefreshedAtMs); + var connector = Assert.Single(catalog.Connectors); + Assert.Equal("Slack", connector.DisplayName); + Assert.Equal("slack", connector.Name); + Assert.Equal(status, connector.Status); + Assert.Equal(["connector-slack"], connector.RuntimeServerIds); + } + + private static void AssertConnectorRequest( + RpcRequestRecord request, + string method, + string sessionId, + params (string Name, object Value)[] expectedProperties) + { + Assert.Equal(method, request.Method); + Assert.Equal(expectedProperties.Length + 1, request.Params.EnumerateObject().Count()); + Assert.Equal(sessionId, request.Params.GetProperty("sessionId").GetString()); + + foreach (var (name, expectedValue) in expectedProperties) + { + var actualValue = request.Params.GetProperty(name); + switch (expectedValue) + { + case string stringValue: + Assert.Equal(stringValue, actualValue.GetString()); + break; + case long longValue: + Assert.Equal(longValue, actualValue.GetInt64()); + break; + case bool boolValue: + Assert.Equal(boolValue, actualValue.GetBoolean()); + break; + default: + throw new InvalidOperationException( + $"Unsupported expected JSON value type '{expectedValue.GetType().Name}'."); + } + } + } +} +#endif diff --git a/go/README.md b/go/README.md index fd8bdd245a..4f7eb456f9 100644 --- a/go/README.md +++ b/go/README.md @@ -278,6 +278,19 @@ Initial acquisition runs during session creation or resume. Cancellation, provid - `UI() *SessionUI` - Interactive UI API for elicitation dialogs - `Capabilities() SessionCapabilities` - Host capabilities (e.g. elicitation support) +#### Connector session API (Experimental) + +`session.RPC.Connectors` exposes the runtime-owned Connector catalog, lifecycle, +bounded consent continuation, and MCP reconciliation APIs: +`GetCapabilities`, `GetStatus`, `List`, `Refresh`, `Connect`, `Reconnect`, +`ContinueConnection`, `Disconnect`, and `Reconcile`. The host account-selection +flow supplies an opaque `selectionId`, passed as `AccountID` (`accountId` on the +wire), and owns consent/browser UX. Connector APIs neither require nor return +tokens; Connector credentials and MCP projection remain runtime-owned. + +`GetCapabilities` reports API availability and bounded continuation limits +without changing Connector state. Check it before using the remaining methods. + #### Message source Set `MessageOptions.Source` to `copilot.MessageSourceAgent(id)` for messages from diff --git a/go/connectors_rpc_test.go b/go/connectors_rpc_test.go new file mode 100644 index 0000000000..ff92a1b29a --- /dev/null +++ b/go/connectors_rpc_test.go @@ -0,0 +1,309 @@ +package copilot + +import ( + "encoding/json" + "fmt" + "net" + "reflect" + "testing" + + "github.com/github/copilot-sdk/go/internal/jsonrpc2" + "github.com/github/copilot-sdk/go/rpc" +) + +const ( + connectorAccountID = "opaque-account-selection" + connectorStatusResult = `{ + "accountId":"` + connectorAccountID + `", + "apiVersion":1, + "availability":"enabled", + "catalog":{ + "connectors":[{ + "description":"Calendar and mail", + "displayName":"Outlook", + "name":"outlook", + "runtimeServerIds":["connector-outlook"], + "status":"connected" + }], + "refreshedAtMs":1700000000000, + "revision":7 + }, + "pendingConnections":2, + "runtimeServers":[{ + "connectorName":"outlook", + "runtimeServerId":"connector-outlook", + "status":"connected" + }] +}` +) + +func TestSessionRPCConnectors(t *testing.T) { + clientConn, serverConn := net.Pipe() + client := jsonrpc2.NewClient(clientConn, clientConn) + server := jsonrpc2.NewClient(serverConn, serverConn) + client.Start() + server.Start() + t.Cleanup(func() { + client.Stop() + server.Stop() + _ = clientConn.Close() + _ = serverConn.Close() + }) + + session := newSession("session-1", client, "", false) + t.Cleanup(session.stopEventProcessing) + if session.RPC == nil || session.RPC.Connectors == nil { + t.Fatal("session.RPC.Connectors is not initialized") + } + + t.Run("get capabilities", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.getCapabilities", map[string]any{ + "sessionId": "session-1", + }, `{ + "apiVersion":1, + "availability":"enabled", + "consentContinuation":true, + "maxDeadlineMs":60000, + "maxPollAttempts":10, + "maxPollIntervalMs":5000, + "opaqueAccountSelection":true + }`) + + result, err := session.RPC.Connectors.GetCapabilities(t.Context()) + if err != nil { + t.Fatalf("GetCapabilities: %v", err) + } + if result.APIVersion != 1 || + result.Availability != rpc.ConnectorAvailabilityEnabled || + !result.ConsentContinuation || + result.MaxDeadlineMs != 60000 || + result.MaxPollAttempts != 10 || + result.MaxPollIntervalMs != 5000 || + !result.OpaqueAccountSelection { + t.Fatalf("GetCapabilities result = %#v", result) + } + }) + + t.Run("get status", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.getStatus", map[string]any{ + "sessionId": "session-1", + }, connectorStatusResult) + + result, err := session.RPC.Connectors.GetStatus(t.Context()) + if err != nil { + t.Fatalf("GetStatus: %v", err) + } + assertConnectorStatus(t, result) + }) + + t.Run("list", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.list", map[string]any{ + "accountId": connectorAccountID, + "sessionId": "session-1", + }, `{ + "connectors":[{ + "description":"Calendar and mail", + "displayName":"Outlook", + "name":"outlook", + "runtimeServerIds":["connector-outlook"], + "status":"connected" + }], + "refreshedAtMs":1700000000000, + "revision":7 + }`) + + result, err := session.RPC.Connectors.List(t.Context(), &rpc.ConnectorAccountRequest{ + AccountID: connectorAccountID, + }) + if err != nil { + t.Fatalf("List: %v", err) + } + assertConnectorCatalog(t, result, 7, rpc.ConnectorCatalogStatusConnected) + }) + + t.Run("refresh", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.refresh", map[string]any{ + "accountId": connectorAccountID, + "sessionId": "session-1", + }, `{ + "connectors":[{ + "displayName":"Outlook", + "name":"outlook", + "runtimeServerIds":[], + "status":"not_connected" + }], + "refreshedAtMs":1700000000100, + "revision":8 + }`) + + result, err := session.RPC.Connectors.Refresh(t.Context(), &rpc.ConnectorAccountRequest{ + AccountID: connectorAccountID, + }) + if err != nil { + t.Fatalf("Refresh: %v", err) + } + assertConnectorCatalog(t, result, 8, rpc.ConnectorCatalogStatusNotConnected) + }) + + t.Run("connect", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.connect", map[string]any{ + "accountId": connectorAccountID, + "connectorName": "outlook", + "sessionId": "session-1", + }, `{ + "kind":"consent_required", + "consentUrl":"https://example.com/consent", + "continuationId":"continuation-1" + }`) + + result, err := session.RPC.Connectors.Connect(t.Context(), &rpc.ConnectorConnectRequest{ + AccountID: connectorAccountID, + ConnectorName: "outlook", + }) + if err != nil { + t.Fatalf("Connect: %v", err) + } + consent, ok := result.(*rpc.ConnectorConnectResultConsentRequired) + if !ok || consent.ConsentURL != "https://example.com/consent" || consent.ContinuationID != "continuation-1" { + t.Fatalf("Connect result = %#v", result) + } + }) + + t.Run("reconnect", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.reconnect", map[string]any{ + "accountId": connectorAccountID, + "connectorName": "outlook", + "sessionId": "session-1", + }, `{"kind":"pending","continuationId":"continuation-2"}`) + + result, err := session.RPC.Connectors.Reconnect(t.Context(), &rpc.ConnectorConnectRequest{ + AccountID: connectorAccountID, + ConnectorName: "outlook", + }) + if err != nil { + t.Fatalf("Reconnect: %v", err) + } + pending, ok := result.(*rpc.ConnectorConnectResultPending) + if !ok || pending.ContinuationID != "continuation-2" { + t.Fatalf("Reconnect result = %#v", result) + } + }) + + t.Run("continue connection", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.continueConnection", map[string]any{ + "continuationId": "continuation-2", + "deadlineMs": float64(30000), + "maxAttempts": float64(4), + "pollIntervalMs": float64(500), + "sessionId": "session-1", + }, `{"kind":"connected","status":`+connectorStatusResult+`}`) + + result, err := session.RPC.Connectors.ContinueConnection(t.Context(), &rpc.ConnectorContinueRequest{ + ContinuationID: "continuation-2", + DeadlineMs: 30000, + MaxAttempts: 4, + PollIntervalMs: 500, + }) + if err != nil { + t.Fatalf("ContinueConnection: %v", err) + } + connected, ok := result.(*rpc.ConnectorConnectResultConnected) + if !ok { + t.Fatalf("ContinueConnection result = %T", result) + } + assertConnectorStatus(t, &connected.Status) + }) + + t.Run("disconnect", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.disconnect", map[string]any{ + "accountId": connectorAccountID, + "connectorName": "outlook", + "sessionId": "session-1", + }, `{"disconnected":true,"status":`+connectorStatusResult+`}`) + + result, err := session.RPC.Connectors.Disconnect(t.Context(), &rpc.ConnectorConnectRequest{ + AccountID: connectorAccountID, + ConnectorName: "outlook", + }) + if err != nil { + t.Fatalf("Disconnect: %v", err) + } + if !result.Disconnected { + t.Fatalf("Disconnect result = %#v", result) + } + assertConnectorStatus(t, &result.Status) + }) + + t.Run("reconcile", func(t *testing.T) { + expectConnectorRPC(t, server, "session.connectors.reconcile", map[string]any{ + "accountId": connectorAccountID, + "refreshCatalog": true, + "sessionId": "session-1", + }, connectorStatusResult) + + result, err := session.RPC.Connectors.Reconcile(t.Context(), &rpc.ConnectorReconcileRequest{ + AccountID: connectorAccountID, + RefreshCatalog: Bool(true), + }) + if err != nil { + t.Fatalf("Reconcile: %v", err) + } + assertConnectorStatus(t, result) + }) +} + +func expectConnectorRPC(t *testing.T, server *jsonrpc2.Client, method string, wantParams map[string]any, result string) { + t.Helper() + wantJSON, err := json.Marshal(wantParams) + if err != nil { + t.Fatalf("marshal expected %s params: %v", method, err) + } + var want any + if err := json.Unmarshal(wantJSON, &want); err != nil { + t.Fatalf("normalize expected %s params: %v", method, err) + } + + server.SetRequestHandler(method, func(params json.RawMessage) (json.RawMessage, *jsonrpc2.Error) { + var got any + if err := json.Unmarshal(params, &got); err != nil { + return nil, &jsonrpc2.Error{Code: -32602, Message: err.Error()} + } + if !reflect.DeepEqual(got, want) { + return nil, &jsonrpc2.Error{ + Code: -32602, + Message: fmt.Sprintf("%s params = %s, want %s", method, params, wantJSON), + } + } + return json.RawMessage(result), nil + }) +} + +func assertConnectorCatalog(t *testing.T, catalog *rpc.ConnectorCatalogResult, revision int64, status rpc.ConnectorCatalogStatus) { + t.Helper() + if catalog.Revision != revision || len(catalog.Connectors) != 1 { + t.Fatalf("catalog = %#v", catalog) + } + connector := catalog.Connectors[0] + if connector.Name != "outlook" || connector.DisplayName != "Outlook" || connector.Status != status { + t.Fatalf("connector = %#v", connector) + } +} + +func assertConnectorStatus(t *testing.T, status *rpc.ConnectorStatus) { + t.Helper() + if status.AccountID == nil || + *status.AccountID != connectorAccountID || + status.APIVersion != 1 || + status.Availability != rpc.ConnectorAvailabilityEnabled || + status.PendingConnections != 2 || + len(status.RuntimeServers) != 1 { + t.Fatalf("status = %#v", status) + } + assertConnectorCatalog(t, status.Catalog, 7, rpc.ConnectorCatalogStatusConnected) + runtimeServer := status.RuntimeServers[0] + if runtimeServer.ConnectorName != "outlook" || + runtimeServer.RuntimeServerID != "connector-outlook" || + runtimeServer.Status != rpc.ConnectorMCPStatusConnected { + t.Fatalf("runtime server = %#v", runtimeServer) + } +} diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go index e974c9ed62..69d571564e 100644 --- a/go/rpc/zrpc.go +++ b/go/rpc/zrpc.go @@ -2308,6 +2308,198 @@ type ConnectedRemoteSessionMetadataRepository struct { Owner string `json:"owner"` } +// Pins a Connector operation to one host-owned GitHub account through its opaque selection +// ID. Provider tokens are never accepted. +// Experimental: ConnectorAccountRequest is part of an experimental API and may change or be +// removed. +type ConnectorAccountRequest struct { + // Opaque account selection ID previously returned by an account discovery API. + AccountID string `json:"accountId"` +} + +// Feature detection and hard polling limits for the EXPERIMENTAL session connector API. +// Experimental: ConnectorCapabilities is part of an experimental API and may change or be +// removed. +type ConnectorCapabilities struct { + // Connector API contract version. + APIVersion int64 `json:"apiVersion"` + // Current session availability. Disabled availability is reported without making a + // Connector request. + Availability ConnectorAvailability `json:"availability"` + // Whether connect and reconnect can return an opaque continuation for bounded consent + // polling. + ConsentContinuation bool `json:"consentContinuation"` + // Maximum accepted wall-clock deadline in milliseconds for one continuation call. + MaxDeadlineMs int64 `json:"maxDeadlineMs"` + // Maximum accepted polling attempts for one continuation call. + MaxPollAttempts int64 `json:"maxPollAttempts"` + // Maximum accepted delay in milliseconds between polling attempts. + MaxPollIntervalMs int64 `json:"maxPollIntervalMs"` + // Whether callers select a host-owned GitHub account through an opaque selection ID rather + // than supplying a provider token. + OpaqueAccountSelection bool `json:"opaqueAccountSelection"` +} + +// Credential-free Connector catalog entry. +// Experimental: ConnectorCatalogEntry is part of an experimental API and may change or be +// removed. +type ConnectorCatalogEntry struct { + // Untrusted service description, when present. + Description *string `json:"description,omitempty"` + // Untrusted display label from the service. + DisplayName string `json:"displayName"` + // Canonical Connector name used by lifecycle methods. + Name string `json:"name"` + // Opaque stable runtime IDs currently projected into the session for this Connector. + RuntimeServerIDs []string `json:"runtimeServerIds"` + // Current authoritative service connection state. + Status ConnectorCatalogStatus `json:"status"` +} + +// Validated Connector catalog snapshot cached by the session. +// Experimental: ConnectorCatalogResult is part of an experimental API and may change or be +// removed. +type ConnectorCatalogResult struct { + // Validated catalog entries in service order. + Connectors []ConnectorCatalogEntry `json:"connectors"` + // Unix epoch milliseconds when this snapshot was accepted. + RefreshedAtMs int64 `json:"refreshedAtMs"` + // Monotonically increasing session-local catalog revision. + Revision int64 `json:"revision"` +} + +// Selects one Connector and the pinned host-owned account used for its service and MCP +// authorization. +// Experimental: ConnectorConnectRequest is part of an experimental API and may change or be +// removed. +type ConnectorConnectRequest struct { + // Opaque account selection ID. It must match the account already pinned to the session, if + // any. + AccountID string `json:"accountId"` + // Canonical Connector name from the current catalog. + ConnectorName string `json:"connectorName"` +} + +// Typed result of initiating or continuing a Connector connection. +// Experimental: ConnectorConnectResult is part of an experimental API and may change or be +// removed. +type ConnectorConnectResult interface { + connectorConnectResult() + Kind() ConnectorConnectResultKind +} + +type RawConnectorConnectResultData struct { + Discriminator ConnectorConnectResultKind + Raw json.RawMessage +} + +func (RawConnectorConnectResultData) connectorConnectResult() {} +func (r RawConnectorConnectResultData) Kind() ConnectorConnectResultKind { + return r.Discriminator +} + +// The service is connected and the session MCP graph was reconciled. +type ConnectorConnectResultConnected struct { + // Fresh authoritative Connector state after MCP reconciliation. + Status ConnectorStatus `json:"status"` +} + +func (ConnectorConnectResultConnected) connectorConnectResult() {} +func (ConnectorConnectResultConnected) Kind() ConnectorConnectResultKind { + return ConnectorConnectResultKindConnected +} + +// Host-owned consent is required before bounded continuation can complete. +type ConnectorConnectResultConsentRequired struct { + // Validated HTTPS consent URL. The runtime does not open it. + ConsentURL string `json:"consentUrl"` + // Opaque ID accepted by continueConnection. + ContinuationID string `json:"continuationId"` +} + +func (ConnectorConnectResultConsentRequired) connectorConnectResult() {} +func (ConnectorConnectResultConsentRequired) Kind() ConnectorConnectResultKind { + return ConnectorConnectResultKindConsentRequired +} + +// The service is still completing the connection without a consent URL. +type ConnectorConnectResultPending struct { + // Opaque ID accepted by continueConnection. + ContinuationID string `json:"continuationId"` +} + +func (ConnectorConnectResultPending) connectorConnectResult() {} +func (ConnectorConnectResultPending) Kind() ConnectorConnectResultKind { + return ConnectorConnectResultKindPending +} + +// Explicitly bounded continuation of a pending Connector connection. +// Experimental: ConnectorContinueRequest is part of an experimental API and may change or +// be removed. +type ConnectorContinueRequest struct { + // Opaque continuation ID returned by connect, reconnect, or an earlier continuation. + ContinuationID string `json:"continuationId"` + // Maximum wall-clock duration in milliseconds for this call. Must be between one and the + // capability limit. + DeadlineMs int32 `json:"deadlineMs"` + // Maximum catalog requests made by this call. Must be between one and the capability limit. + MaxAttempts int32 `json:"maxAttempts"` + // Delay in milliseconds between attempts. Must not exceed the capability limit. + PollIntervalMs int32 `json:"pollIntervalMs"` +} + +// Authoritative result after disconnect and MCP reconciliation. +// Experimental: ConnectorDisconnectResult is part of an experimental API and may change or +// be removed. +type ConnectorDisconnectResult struct { + // Whether the service accepted the idempotent disconnect. + Disconnected bool `json:"disconnected"` + // Fresh authoritative session state after removing Connector-owned MCP servers. + Status ConnectorStatus `json:"status"` +} + +// Requests authoritative Connector-to-MCP reconciliation for the pinned account. +// Experimental: ConnectorReconcileRequest is part of an experimental API and may change or +// be removed. +type ConnectorReconcileRequest struct { + // Opaque account selection ID. It must match the account already pinned to the session, if + // any. + AccountID string `json:"accountId"` + // When true, refresh the catalog before reconciling. A disabled Connector API performs no + // service request. + RefreshCatalog *bool `json:"refreshCatalog,omitempty"` +} + +// Live status of one session-owned MCP projection. +// Experimental: ConnectorRuntimeStatus is part of an experimental API and may change or be +// removed. +type ConnectorRuntimeStatus struct { + // Canonical Connector name that owns this server. + ConnectorName string `json:"connectorName"` + // Opaque runtime server ID. + RuntimeServerID string `json:"runtimeServerId"` + // Current live MCP host status. + Status ConnectorMCPStatus `json:"status"` +} + +// Authoritative session connector state. Account IDs are opaque routing identifiers and +// credentials are never included. +// Experimental: ConnectorStatus is part of an experimental API and may change or be removed. +type ConnectorStatus struct { + // Opaque account selection pinned to this session, when one has been selected. + AccountID *string `json:"accountId,omitempty"` + // Connector API contract version. + APIVersion int64 `json:"apiVersion"` + // Current feature and session availability. + Availability ConnectorAvailability `json:"availability"` + // Latest validated catalog snapshot, when available. + Catalog *ConnectorCatalogResult `json:"catalog,omitempty"` + // Number of active opaque connection continuations. + PendingConnections int64 `json:"pendingConnections"` + // Live MCP status for every Connector-owned runtime server. + RuntimeServers []ConnectorRuntimeStatus `json:"runtimeServers"` +} + // Remote session connection parameters. // Experimental: ConnectRemoteSessionParams is part of an experimental API and may change or // be removed. @@ -17815,6 +18007,73 @@ const ( ConnectedRemoteSessionMetadataKindRemoteSession ConnectedRemoteSessionMetadataKind = "remote-session" ) +// Availability of the EXPERIMENTAL session connector API. +// Experimental: ConnectorAvailability is part of an experimental API and may change or be +// removed. +type ConnectorAvailability string + +const ( + // The resolved Connector feature is off. No Connector service request is made while + // disabled. + ConnectorAvailabilityDisabled ConnectorAvailability = "disabled" + // The resolved Connector feature is enabled and Connector requests are permitted. + ConnectorAvailabilityEnabled ConnectorAvailability = "enabled" + // The session has no eligible host-owned GitHub account or does not support local Connector + // projection. + ConnectorAvailabilityUnavailable ConnectorAvailability = "unavailable" +) + +// Authoritative service connection state for one Connector. +// Experimental: ConnectorCatalogStatus is part of an experimental API and may change or be +// removed. +type ConnectorCatalogStatus string + +const ( + // The Connector is connected and may contribute MCP servers. + ConnectorCatalogStatusConnected ConnectorCatalogStatus = "connected" + // The Connector service reports an unusable connection. + ConnectorCatalogStatusError ConnectorCatalogStatus = "error" + // The Connector is available but not connected. + ConnectorCatalogStatusNotConnected ConnectorCatalogStatus = "not_connected" + // The Connector service is still completing connection or consent. + ConnectorCatalogStatusPending ConnectorCatalogStatus = "pending" + // The service returned a future or unrecognized state. + ConnectorCatalogStatusUnknown ConnectorCatalogStatus = "unknown" +) + +// Kind discriminator for ConnectorConnectResult. +// Experimental: ConnectorConnectResultKind is part of an experimental API and may change or +// be removed. +type ConnectorConnectResultKind string + +const ( + ConnectorConnectResultKindConnected ConnectorConnectResultKind = "connected" + ConnectorConnectResultKindConsentRequired ConnectorConnectResultKind = "consent_required" + ConnectorConnectResultKindPending ConnectorConnectResultKind = "pending" +) + +// Live MCP status of one Connector-owned runtime server. +// Experimental: ConnectorMCPStatus is part of an experimental API and may change or be +// removed. +type ConnectorMCPStatus string + +const ( + // The server is connected and its tools are available. + ConnectorMCPStatusConnected ConnectorMCPStatus = "connected" + // The server is configured but explicitly disabled. + ConnectorMCPStatusDisabled ConnectorMCPStatus = "disabled" + // The server failed to connect or initialize. + ConnectorMCPStatusFailed ConnectorMCPStatus = "failed" + // The server requires refreshed GitHub authorization. + ConnectorMCPStatusNeedsAuth ConnectorMCPStatus = "needs_auth" + // The Connector currently has no live server configuration. + ConnectorMCPStatusNotConfigured ConnectorMCPStatus = "not_configured" + // The server connection is still being established. + ConnectorMCPStatusPending ConnectorMCPStatus = "pending" + // The server is intentionally stopped, including when managed policy blocks it. + ConnectorMCPStatusStopped ConnectorMCPStatus = "stopped" +) + // Controls how MCP tool result content is filtered: none leaves content unchanged, markdown // sanitizes HTML while preserving Markdown-friendly output, and hidden_characters removes // characters that can hide directives. @@ -23449,6 +23708,234 @@ func (a *CompletionsAPI) Request(ctx context.Context, params *CompletionsRequest return &result, nil } +// Experimental: ConnectorsAPI contains experimental APIs that may change or be removed. +type ConnectorsAPI sessionAPI + +// Connect initiates an idempotent Connector connection request without opening a browser. +// Returns connected when the service is immediately authoritative, consent_required with a +// validated URL, or pending with an opaque continuation ID. +// +// RPC method: session.connectors.connect. +// +// Parameters: Selects one Connector and the pinned host-owned account used for its service +// and MCP authorization. +// +// Returns: Typed result of initiating or continuing a Connector connection. +func (a *ConnectorsAPI) Connect(ctx context.Context, params *ConnectorConnectRequest) (ConnectorConnectResult, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + req["accountId"] = params.AccountID + req["connectorName"] = params.ConnectorName + } + raw, err := a.client.Request(ctx, "session.connectors.connect", req) + if err != nil { + return nil, err + } + result, err := unmarshalConnectorConnectResult(raw) + if err != nil { + return nil, err + } + return result, nil +} + +// ContinueConnection continues a pending Connector connection with caller-supplied attempt, +// interval, and deadline bounds. The runtime never opens the returned consent URL. +// +// RPC method: session.connectors.continueConnection. +// +// Parameters: Explicitly bounded continuation of a pending Connector connection. +// +// Returns: Typed result of initiating or continuing a Connector connection. +func (a *ConnectorsAPI) ContinueConnection(ctx context.Context, params *ConnectorContinueRequest) (ConnectorConnectResult, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + req["continuationId"] = params.ContinuationID + req["deadlineMs"] = params.DeadlineMs + req["maxAttempts"] = params.MaxAttempts + req["pollIntervalMs"] = params.PollIntervalMs + } + raw, err := a.client.Request(ctx, "session.connectors.continueConnection", req) + if err != nil { + return nil, err + } + result, err := unmarshalConnectorConnectResult(raw) + if err != nil { + return nil, err + } + return result, nil +} + +// Disconnects one Connector for the pinned opaque account selection, refreshes the +// authoritative catalog, and removes its session-owned MCP projection. +// +// RPC method: session.connectors.disconnect. +// +// Parameters: Selects one Connector and the pinned host-owned account used for its service +// and MCP authorization. +// +// Returns: Authoritative result after disconnect and MCP reconciliation. +func (a *ConnectorsAPI) Disconnect(ctx context.Context, params *ConnectorConnectRequest) (*ConnectorDisconnectResult, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + req["accountId"] = params.AccountID + req["connectorName"] = params.ConnectorName + } + raw, err := a.client.Request(ctx, "session.connectors.disconnect", req) + if err != nil { + return nil, err + } + var result ConnectorDisconnectResult + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + +// GetCapabilities returns feature availability and bounded polling limits for the +// EXPERIMENTAL session connector API. This method never performs a Connector service +// request. +// +// RPC method: session.connectors.getCapabilities. +// +// Returns: Feature detection and hard polling limits for the EXPERIMENTAL session connector +// API. +func (a *ConnectorsAPI) GetCapabilities(ctx context.Context) (*ConnectorCapabilities, error) { + req := map[string]any{"sessionId": a.sessionID} + raw, err := a.client.Request(ctx, "session.connectors.getCapabilities", req) + if err != nil { + return nil, err + } + var result ConnectorCapabilities + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + +// GetStatus returns authoritative session Connector state from current availability, pinned +// account selection, cached catalog, and live MCP projection without performing a Connector +// service request. +// +// RPC method: session.connectors.getStatus. +// +// Returns: Authoritative session connector state. Account IDs are opaque routing +// identifiers and credentials are never included. +func (a *ConnectorsAPI) GetStatus(ctx context.Context) (*ConnectorStatus, error) { + req := map[string]any{"sessionId": a.sessionID} + raw, err := a.client.Request(ctx, "session.connectors.getStatus", req) + if err != nil { + return nil, err + } + var result ConnectorStatus + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + +// List returns the cached Connector catalog for the pinned opaque account selection, +// fetching it only when this session has no cached catalog. +// +// RPC method: session.connectors.list. +// +// Parameters: Pins a Connector operation to one host-owned GitHub account through its +// opaque selection ID. Provider tokens are never accepted. +// +// Returns: Validated Connector catalog snapshot cached by the session. +func (a *ConnectorsAPI) List(ctx context.Context, params *ConnectorAccountRequest) (*ConnectorCatalogResult, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + req["accountId"] = params.AccountID + } + raw, err := a.client.Request(ctx, "session.connectors.list", req) + if err != nil { + return nil, err + } + var result ConnectorCatalogResult + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + +// Reconciles the authoritative cached or freshly requested Connector catalog into the +// session Connector MCP projection and returns live status. +// +// RPC method: session.connectors.reconcile. +// +// Parameters: Requests authoritative Connector-to-MCP reconciliation for the pinned account. +// +// Returns: Authoritative session connector state. Account IDs are opaque routing +// identifiers and credentials are never included. +func (a *ConnectorsAPI) Reconcile(ctx context.Context, params *ConnectorReconcileRequest) (*ConnectorStatus, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + req["accountId"] = params.AccountID + if params.RefreshCatalog != nil { + req["refreshCatalog"] = *params.RefreshCatalog + } + } + raw, err := a.client.Request(ctx, "session.connectors.reconcile", req) + if err != nil { + return nil, err + } + var result ConnectorStatus + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + +// Reconnect re-initiates an idempotent Connector connection request without browser or UI +// effects, with the same typed outcomes as connect. +// +// RPC method: session.connectors.reconnect. +// +// Parameters: Selects one Connector and the pinned host-owned account used for its service +// and MCP authorization. +// +// Returns: Typed result of initiating or continuing a Connector connection. +func (a *ConnectorsAPI) Reconnect(ctx context.Context, params *ConnectorConnectRequest) (ConnectorConnectResult, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + req["accountId"] = params.AccountID + req["connectorName"] = params.ConnectorName + } + raw, err := a.client.Request(ctx, "session.connectors.reconnect", req) + if err != nil { + return nil, err + } + result, err := unmarshalConnectorConnectResult(raw) + if err != nil { + return nil, err + } + return result, nil +} + +// Refreshes and validates the Connector catalog for the pinned opaque account selection. +// +// RPC method: session.connectors.refresh. +// +// Parameters: Pins a Connector operation to one host-owned GitHub account through its +// opaque selection ID. Provider tokens are never accepted. +// +// Returns: Validated Connector catalog snapshot cached by the session. +func (a *ConnectorsAPI) Refresh(ctx context.Context, params *ConnectorAccountRequest) (*ConnectorCatalogResult, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + req["accountId"] = params.AccountID + } + raw, err := a.client.Request(ctx, "session.connectors.refresh", req) + if err != nil { + return nil, err + } + var result ConnectorCatalogResult + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + // Experimental: ContentExclusionAPI contains experimental APIs that may change or be // removed. type ContentExclusionAPI sessionAPI @@ -28939,6 +29426,7 @@ type SessionRPC struct { Canvas *CanvasAPI Commands *CommandsAPI Completions *CompletionsAPI + Connectors *ConnectorsAPI ContentExclusion *ContentExclusionAPI Debug *DebugAPI EventLog *EventLogAPI @@ -29271,6 +29759,7 @@ func NewSessionRPC(client *jsonrpc2.Client, sessionID string) *SessionRPC { r.Canvas = (*CanvasAPI)(&r.common) r.Commands = (*CommandsAPI)(&r.common) r.Completions = (*CompletionsAPI)(&r.common) + r.Connectors = (*ConnectorsAPI)(&r.common) r.ContentExclusion = (*ContentExclusionAPI)(&r.common) r.Debug = (*DebugAPI)(&r.common) r.EventLog = (*EventLogAPI)(&r.common) diff --git a/go/rpc/zrpc_encoding.go b/go/rpc/zrpc_encoding.go index d18b2c09e7..97d6353411 100644 --- a/go/rpc/zrpc_encoding.go +++ b/go/rpc/zrpc_encoding.go @@ -1528,6 +1528,86 @@ func (r *CommandsRespondToQueuedCommandRequest) UnmarshalJSON(data []byte) error return nil } +func unmarshalConnectorConnectResult(data []byte) (ConnectorConnectResult, error) { + if string(data) == "null" { + return nil, nil + } + type rawUnion struct { + Kind ConnectorConnectResultKind `json:"kind"` + } + var raw rawUnion + if err := json.Unmarshal(data, &raw); err != nil { + return nil, err + } + + switch raw.Kind { + case ConnectorConnectResultKindConnected: + var d ConnectorConnectResultConnected + if err := json.Unmarshal(data, &d); err != nil { + return nil, err + } + return &d, nil + case ConnectorConnectResultKindConsentRequired: + var d ConnectorConnectResultConsentRequired + if err := json.Unmarshal(data, &d); err != nil { + return nil, err + } + return &d, nil + case ConnectorConnectResultKindPending: + var d ConnectorConnectResultPending + if err := json.Unmarshal(data, &d); err != nil { + return nil, err + } + return &d, nil + default: + return &RawConnectorConnectResultData{Discriminator: raw.Kind, Raw: data}, nil + } +} + +func (r RawConnectorConnectResultData) MarshalJSON() ([]byte, error) { + if r.Raw != nil { + return r.Raw, nil + } + return json.Marshal(struct { + Kind ConnectorConnectResultKind `json:"kind"` + }{ + Kind: r.Discriminator, + }) +} + +func (r ConnectorConnectResultConnected) MarshalJSON() ([]byte, error) { + type alias ConnectorConnectResultConnected + return json.Marshal(struct { + Kind ConnectorConnectResultKind `json:"kind"` + alias + }{ + Kind: r.Kind(), + alias: alias(r), + }) +} + +func (r ConnectorConnectResultConsentRequired) MarshalJSON() ([]byte, error) { + type alias ConnectorConnectResultConsentRequired + return json.Marshal(struct { + Kind ConnectorConnectResultKind `json:"kind"` + alias + }{ + Kind: r.Kind(), + alias: alias(r), + }) +} + +func (r ConnectorConnectResultPending) MarshalJSON() ([]byte, error) { + type alias ConnectorConnectResultPending + return json.Marshal(struct { + Kind ConnectorConnectResultKind `json:"kind"` + alias + }{ + Kind: r.Kind(), + alias: alias(r), + }) +} + func unmarshalDebugCollectLogsDestination(data []byte) (DebugCollectLogsDestination, error) { if string(data) == "null" { return nil, nil diff --git a/java/README.md b/java/README.md index 153f838346..63796516c2 100644 --- a/java/README.md +++ b/java/README.md @@ -176,6 +176,63 @@ and `setExcludedTools(...)`, prefer the source-qualified filter form `DefaultAgentConfig.setExcludedTools(...)`, use `-` directly. +## Connector session API (experimental) + +The Connector API is experimental and may be unavailable in some runtime +versions. Check `getCapabilities()` before using the remaining methods. + +Opt in to experimental APIs, then use the generated DTOs through +`session.getRpc().connectors`: + +```java +import com.github.copilot.AllowCopilotExperimental; +import com.github.copilot.CopilotSession; +import com.github.copilot.generated.rpc.ConnectorAvailability; +import com.github.copilot.generated.rpc.ConnectorConnectResultConsentRequired; +import com.github.copilot.generated.rpc.SessionConnectorsConnectParams; +import com.github.copilot.generated.rpc.SessionConnectorsContinueConnectionParams; +import com.github.copilot.generated.rpc.SessionConnectorsListParams; +import com.github.copilot.generated.rpc.SessionConnectorsReconcileParams; + +@AllowCopilotExperimental +static void connectConnector(CopilotSession session, String accountId) + throws Exception { + var connectors = session.getRpc().connectors; + var capabilities = connectors.getCapabilities().get(); + if (capabilities.availability() != ConnectorAvailability.ENABLED) { + return; + } + + var catalog = connectors + .list(new SessionConnectorsListParams(null, accountId)).get(); + connectors + .reconcile(new SessionConnectorsReconcileParams( + null, accountId, false)).get(); + var connectorName = chooseConnector(catalog.connectors()); + var connection = connectors + .connect(new SessionConnectorsConnectParams( + null, accountId, connectorName)).get(); + if (connection instanceof ConnectorConnectResultConsentRequired consent) { + openConsentUrl(consent.getConsentUrl()); + connection = connectors + .continueConnection(new SessionConnectorsContinueConnectionParams( + null, + consent.getContinuationId(), + capabilities.maxPollAttempts(), + capabilities.maxPollIntervalMs(), + capabilities.maxDeadlineMs())) + .get(); + } +} +``` + +Pass `null` for each DTO's `sessionId`; the session-scoped wrapper injects the +active session ID. Bound continuation values using `getCapabilities()`. The +host supplies only its opaque account selection ID and owns browser and consent +UI; Connector methods never accept or return credentials or provider tokens. +The namespace also exposes `getStatus`, `refresh`, `reconnect`, `disconnect`, +and `reconcile`. + `CopilotClientOptions.setCwd(...)` sets the runtime process working directory, which otherwise inherits the current process working directory. `SessionConfig.setWorkingDirectory(...)` sets the session working directory, which otherwise defaults to the runtime process working directory. `SessionConfig.setAskUserVariant(AskUserVariant.ELICITATION)` selects the diff --git a/java/scripts/codegen/java.ts b/java/scripts/codegen/java.ts index 97fdfe3250..93b9289769 100644 --- a/java/scripts/codegen/java.ts +++ b/java/scripts/codegen/java.ts @@ -12,6 +12,8 @@ import type { JSONSchema7 } from "json-schema"; import path from "path"; import { fileURLToPath } from "url"; +import { applyConnectorSessionApiOverlay } from "../../../scripts/codegen/connectorSessionApiOverlay.js"; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -27,6 +29,19 @@ function isSchemaInternal(schema: JSONSchema7 | null | undefined): boolean { (schema as Record).visibility === "internal"; } +function isSchemaExperimental(schema: JSONSchema7 | null | undefined): boolean { + return typeof schema === "object" && + schema !== null && + (schema as Record).stability === "experimental"; +} + +function appendExperimentalTypeApiNote(lines: string[], schema: JSONSchema7): void { + if (isSchemaExperimental(schema)) { + lines.push(` *`); + lines.push(` * @apiNote This type is experimental and may change in a future version.`); + } +} + const AUTO_GENERATED_HEADER = `// AUTO-GENERATED FILE - DO NOT EDIT`; const GENERATED_FROM_SESSION_EVENTS = `// Generated from: session-events.schema.json`; const GENERATED_FROM_API = `// Generated from: api.schema.json`; @@ -435,6 +450,7 @@ async function generatePolymorphicResultClass( const anyOf = schema.anyOf as JSONSchema7[]; const variants = resolveAnyOfVariants(anyOf); const discriminator = findDiscriminator(variants); + const experimental = isSchemaExperimental(schema); if (!discriminator) { console.warn(`[codegen] Cannot find discriminator for ${className} — skipping polymorphic generation`); @@ -466,11 +482,15 @@ async function generatePolymorphicResultClass( baseLines.push(`import com.fasterxml.jackson.annotation.JsonIgnoreProperties;`); baseLines.push(`import com.fasterxml.jackson.annotation.JsonSubTypes;`); baseLines.push(`import com.fasterxml.jackson.annotation.JsonTypeInfo;`); + if (experimental) { + baseLines.push(`import com.github.copilot.CopilotExperimental;`); + } baseLines.push(`import javax.annotation.processing.Generated;`); baseLines.push(""); - if (schema.description) { + if (schema.description || experimental) { baseLines.push(`/**`); - baseLines.push(` * ${schema.description}`); + baseLines.push(` * ${schema.description ?? `Polymorphic result type {@code ${className}}.`}`); + appendExperimentalTypeApiNote(baseLines, schema); baseLines.push(` *`); baseLines.push(` * @since 1.0.0`); baseLines.push(` */`); @@ -486,6 +506,9 @@ async function generatePolymorphicResultClass( baseLines.push(` @JsonSubTypes.Type(value = ${v.variantClassName}.class, name = "${v.discriminatorValue}")${comma}`); } baseLines.push(`})`); + if (experimental) { + baseLines.push(`@CopilotExperimental`); + } baseLines.push(`@JsonIgnoreProperties(ignoreUnknown = true)`); baseLines.push(GENERATED_ANNOTATION); baseLines.push(`public abstract class ${className} {`); @@ -519,12 +542,16 @@ async function generatePolymorphicVariantClass( packageName: string, packageDir: string ): Promise { + const experimental = isSchemaExperimental(schema); const allImports = new Set([ "com.fasterxml.jackson.annotation.JsonIgnoreProperties", "com.fasterxml.jackson.annotation.JsonInclude", "com.fasterxml.jackson.annotation.JsonProperty", "javax.annotation.processing.Generated", ]); + if (experimental) { + allImports.add("com.github.copilot.CopilotExperimental"); + } const nestedTypes = new Map(); // Collect fields (excluding the discriminator property) @@ -569,16 +596,21 @@ async function generatePolymorphicVariantClass( if (schema.description) { lines.push(`/**`); lines.push(` * ${schema.description}`); + appendExperimentalTypeApiNote(lines, schema); lines.push(` *`); lines.push(` * @since 1.0.0`); lines.push(` */`); } else { lines.push(`/**`); lines.push(` * Variant {@code ${discriminatorValue}} of {@link ${baseClassName}}.`); + appendExperimentalTypeApiNote(lines, schema); lines.push(` *`); lines.push(` * @since 1.0.0`); lines.push(` */`); } + if (experimental) { + lines.push(`@CopilotExperimental`); + } lines.push(`@JsonIgnoreProperties(ignoreUnknown = true)`); lines.push(`@JsonInclude(JsonInclude.Include.NON_NULL)`); lines.push(GENERATED_ANNOTATION); @@ -1281,6 +1313,7 @@ async function generateStandaloneEnum( headerComment: string ): Promise { const values = schema.enum as string[]; + const experimental = isSchemaExperimental(schema); const lines: string[] = []; lines.push(COPYRIGHT); lines.push(""); @@ -1289,15 +1322,22 @@ async function generateStandaloneEnum( lines.push(""); lines.push(`package ${packageName};`); lines.push(""); + if (experimental) { + lines.push(`import com.github.copilot.CopilotExperimental;`); + } lines.push(`import javax.annotation.processing.Generated;`); lines.push(""); - if (schema.description) { + if (schema.description || experimental) { lines.push(`/**`); - lines.push(` * ${schema.description}`); + lines.push(` * ${schema.description ?? `Values for {@code ${name}}.`}`); + appendExperimentalTypeApiNote(lines, schema); lines.push(` *`); lines.push(` * @since 1.0.0`); lines.push(` */`); } + if (experimental) { + lines.push(`@CopilotExperimental`); + } lines.push(GENERATED_ANNOTATION); lines.push(`public enum ${name} {`); for (let i = 0; i < values.length; i++) { @@ -1333,6 +1373,7 @@ async function generateStandaloneRecord( ): Promise { const nestedTypes = new Map(); const { code, imports } = generateRpcClass(name, schema, nestedTypes, packageName); + const experimental = isSchemaExperimental(schema); const lines: string[] = []; lines.push(COPYRIGHT); @@ -1350,19 +1391,26 @@ async function generateStandaloneRecord( "javax.annotation.processing.Generated", ...imports, ]); + if (experimental) { + allImports.add("com.github.copilot.CopilotExperimental"); + } const sortedImports = [...allImports].sort(); for (const imp of sortedImports) { lines.push(`import ${imp};`); } lines.push(""); - if (schema.description) { + if (schema.description || experimental) { lines.push(`/**`); - lines.push(` * ${schema.description}`); + lines.push(` * ${schema.description ?? `Data type {@code ${name}}.`}`); + appendExperimentalTypeApiNote(lines, schema); lines.push(` *`); lines.push(` * @since 1.0.0`); lines.push(` */`); } + if (experimental) { + lines.push(`@CopilotExperimental`); + } lines.push(GENERATED_ANNOTATION); lines.push(code); lines.push(""); @@ -1478,7 +1526,9 @@ function generateRpcClass( async function generateRpcTypes(schemaPath: string): Promise { console.log("\n🔌 Generating RPC types..."); const schemaContent = await fs.readFile(schemaPath, "utf-8"); - const schema = normalizeSchemaBrandCasing(JSON.parse(schemaContent)) as Record & { + const schema = normalizeSchemaBrandCasing( + applyConnectorSessionApiOverlay(JSON.parse(schemaContent), path.basename(schemaPath)) + ) as Record & { server?: Record; session?: Record; clientSession?: Record; @@ -2342,7 +2392,9 @@ async function generateRpcWrappers(schemaPath: string): Promise { console.log("\n🔧 Generating RPC wrapper classes..."); const schemaContent = await fs.readFile(schemaPath, "utf-8"); - const schema = normalizeSchemaBrandCasing(JSON.parse(schemaContent)) as { + const schema = normalizeSchemaBrandCasing( + applyConnectorSessionApiOverlay(JSON.parse(schemaContent), path.basename(schemaPath)) + ) as { server?: Record; session?: Record; clientSession?: Record; diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageReasoningBlocks.java b/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageReasoningBlocks.java index ee9c5fd485..3603e09f1e 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageReasoningBlocks.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageReasoningBlocks.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import javax.annotation.processing.Generated; /** * Neutral provider-tagged reasoning content blocks preserved verbatim for round-tripping * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageServerTools.java b/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageServerTools.java index 6d67f6ecbe..eb75a75121 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageServerTools.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageServerTools.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import java.util.Map; import javax.annotation.processing.Generated; @@ -17,8 +18,11 @@ /** * Neutral provider-tagged server-side tool-use payload (tool search, advisor) for verbatim round-tripping * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvas.java b/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvas.java index 12518491e8..b0f2a8d23e 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvas.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvas.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import javax.annotation.processing.Generated; /** * A single canvas declaration in `session.canvas.registry_changed`, including provider IDs, display metadata, input schema, and actions. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvasAction.java b/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvasAction.java index 99c390efb2..68fe3a6444 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvasAction.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/CanvasRegistryChangedCanvasAction.java @@ -10,13 +10,17 @@ 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; /** * A single action within a canvas declaration, with its name, optional description, and optional input schema. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/CitableSource.java b/java/sdk/src/generated/java/com/github/copilot/generated/CitableSource.java index c66809fc15..6f11f99bc1 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/CitableSource.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/CitableSource.java @@ -10,13 +10,17 @@ 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; /** * A source supplied by a tool that should be made available to the model as citable content. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/CitationProvider.java b/java/sdk/src/generated/java/com/github/copilot/generated/CitationProvider.java index 46a02b2561..4122059df8 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/CitationProvider.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/CitationProvider.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * The system that produced a citation. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum CitationProvider { /** The {@code anthropic} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/CitationReference.java b/java/sdk/src/generated/java/com/github/copilot/generated/CitationReference.java index e9ad222c10..db15713df4 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/CitationReference.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/CitationReference.java @@ -10,13 +10,17 @@ 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; /** * A single citation occurrence linking a span of generated text to a supporting source. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/CitationSource.java b/java/sdk/src/generated/java/com/github/copilot/generated/CitationSource.java index 561c5eced7..a1daf7def4 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/CitationSource.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/CitationSource.java @@ -10,13 +10,17 @@ 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; /** * A source that backs one or more cited spans in the assistant's response. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/CitationSpan.java b/java/sdk/src/generated/java/com/github/copilot/generated/CitationSpan.java index aaa8647a64..6aeb1d994c 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/CitationSpan.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/CitationSpan.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import javax.annotation.processing.Generated; /** * A contiguous span of generated assistant text and the source references that support it. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/Citations.java b/java/sdk/src/generated/java/com/github/copilot/generated/Citations.java index c153c39a7b..c18758e87e 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/Citations.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/Citations.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import javax.annotation.processing.Generated; /** * Provider-agnostic citations linking spans of the assistant's response to their supporting sources. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionAttribution.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionAttribution.java index 8e4ae7e937..90de85e586 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionAttribution.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionAttribution.java @@ -10,13 +10,17 @@ 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; /** * Experimental attribution linking an ordinary event to the HydraFusion turn, phase, and concrete source that produced it. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionConversationScope.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionConversationScope.java index d38381ed48..702c43ea7e 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionConversationScope.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionConversationScope.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Conversation scope in which a HydraFusion phase executes. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionConversationScope { /** The {@code root} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpAction.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpAction.java index e54bf4604f..e9ec06aff8 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpAction.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpAction.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Server-recommended routing behavior for a later HydraFusion turn. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionFollowUpAction { /** The {@code reuse_primary} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpRecommendation.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpRecommendation.java index 101d497fb2..f2678d9373 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpRecommendation.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionFollowUpRecommendation.java @@ -10,13 +10,17 @@ 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; /** * Durable server recommendation for subsequent HydraFusion turns. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPattern.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPattern.java index d37ef4ee83..ed9a2391a6 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPattern.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPattern.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Validated HydraFusion execution pattern. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionPattern { /** The {@code single} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseActivityKind.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseActivityKind.java index a95a08cf91..e0b10db828 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseActivityKind.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseActivityKind.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Content-safe activity observed while a HydraFusion phase is running. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionPhaseActivityKind { /** The {@code model_output} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseKind.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseKind.java index ead79b75fc..512ea698ef 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseKind.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseKind.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * HydraFusion phase kind. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionPhaseKind { /** The {@code primary} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhasePlanStep.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhasePlanStep.java index cfb07a789a..de40eaf0ac 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhasePlanStep.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhasePlanStep.java @@ -10,13 +10,17 @@ 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; /** * Presentation-neutral phase planned for a HydraFusion turn. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseStatus.java index f670332b5c..88f8a751aa 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseStatus.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseStatus.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Durable outcome status of a HydraFusion phase. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionPhaseStatus { /** The {@code succeeded} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseUsage.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseUsage.java index 4a707bb69e..a21ece2845 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseUsage.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionPhaseUsage.java @@ -10,13 +10,17 @@ 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; /** * Aggregate concrete-model usage for one HydraFusion phase. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionProjectionMode.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionProjectionMode.java index 9681efc0ba..ef705b48d2 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionProjectionMode.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionProjectionMode.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * How a durable phase checkpoint contributes its exact message to canonical root history. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionProjectionMode { /** The {@code append} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionScores.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionScores.java index eefb8190a1..ae2b219d9d 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionScores.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionScores.java @@ -10,13 +10,17 @@ 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; /** * Validated HydraFusion routing capability scores. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionStagedTerminal.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionStagedTerminal.java index 262c8c664b..297a4325d4 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionStagedTerminal.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionStagedTerminal.java @@ -10,13 +10,17 @@ 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; /** * Internal durable terminal request staged by a HydraFusion phase until an idempotent final commit selects it. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/FusionTurnKind.java b/java/sdk/src/generated/java/com/github/copilot/generated/FusionTurnKind.java index 24e39b976c..ec55bab2bb 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/FusionTurnKind.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/FusionTurnKind.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Kind of turn for which HydraFusion routing is running. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FusionTurnKind { /** The {@code user} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMessageAuthorizationPolarity.java b/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMessageAuthorizationPolarity.java index 14bc8e2895..e142238e7b 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMessageAuthorizationPolarity.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMessageAuthorizationPolarity.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Which direction a message-backed authorization claim moves authority in. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum PermissionMessageAuthorizationPolarity { /** The {@code grant} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMode.java b/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMode.java index 421ad76139..fec188d66e 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMode.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/PermissionMode.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Permission mode for the session. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum PermissionMode { /** The {@code manual} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteShellExecution.java b/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteShellExecution.java index e08ac623f9..4c9a304c40 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteShellExecution.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteShellExecution.java @@ -10,13 +10,17 @@ 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; /** * Experimental shell completion facts retained independently of the full tool result. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/UIEphemeralQueryPhase.java b/java/sdk/src/generated/java/com/github/copilot/generated/UIEphemeralQueryPhase.java index 7798c159eb..63a53aa0bb 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/UIEphemeralQueryPhase.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/UIEphemeralQueryPhase.java @@ -7,13 +7,17 @@ package com.github.copilot.generated; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Lifecycle phase for a Rust-owned ephemeral query stream. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum UIEphemeralQueryPhase { /** The {@code started} variant. */ 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 index d3f6a585b8..776e25273a 100644 --- 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 @@ -10,13 +10,17 @@ 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; /** * Current per-window credit limit and consumption for an autopilot objective. * + * @apiNote This type 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) 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 index 657884c4f6..3b2c3002fa 100644 --- 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 @@ -10,13 +10,17 @@ 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; /** * Public, persistence-independent projection of an autopilot objective. * + * @apiNote This type 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) 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 index b50cf2072c..024ca37c43 100644 --- 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 @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Current normalized autopilot objective lifecycle status. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum AutopilotObjectiveStatus { /** The {@code active} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolDescriptor.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolDescriptor.java index 057498fb98..e36268609f 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolDescriptor.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolDescriptor.java @@ -10,13 +10,17 @@ 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; /** * Rust-owned metadata and input schema for a built-in tool. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormat.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormat.java index 7af5ef2d45..c03c92afc4 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormat.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormat.java @@ -10,13 +10,17 @@ 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; /** * Custom grammar input format accepted by a built-in tool. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormatType.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormatType.java index 6239493671..fcb277e6c9 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormatType.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolFormatType.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Custom input-format kind. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum BuiltinToolFormatType { /** The {@code grammar} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchema.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchema.java index 764450b37e..277eba0751 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchema.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchema.java @@ -10,13 +10,17 @@ 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; /** * JSON Schema object accepted by a built-in tool. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchemaType.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchemaType.java index 729f3329b5..d935afb4a6 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchemaType.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/BuiltinToolInputSchemaType.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Root JSON Schema type for a built-in tool input. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum BuiltinToolInputSchemaType { /** The {@code object} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasAction.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasAction.java index 36554ed767..b31f9d6fdb 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasAction.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasAction.java @@ -10,13 +10,17 @@ 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; /** * Canvas action that the agent or host can invoke. To discover the input schema for a particular action, call the list_canvas_capabilities tool. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContext.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContext.java index 8dba8156e4..cf09ce5679 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContext.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContext.java @@ -10,13 +10,17 @@ 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; /** * Host context supplied by the runtime. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContextCapabilities.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContextCapabilities.java index a8118eeebf..c3133d0099 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContextCapabilities.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasHostContextCapabilities.java @@ -10,13 +10,17 @@ 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; /** * Host capabilities * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasSessionContext.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasSessionContext.java index 422d32e542..d3c5c75bde 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasSessionContext.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CanvasSessionContext.java @@ -10,13 +10,17 @@ 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; /** * Session context supplied by the runtime. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CommandsInvocationEffectOutcome.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CommandsInvocationEffectOutcome.java index 79f3be8baf..65293f1219 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CommandsInvocationEffectOutcome.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/CommandsInvocationEffectOutcome.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Whether a pending slash-command invocation effect was applied or cancelled by the host. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum CommandsInvocationEffectOutcome { /** The {@code applied} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorAvailability.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorAvailability.java new file mode 100644 index 0000000000..00f11aed79 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorAvailability.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.github.copilot.CopilotExperimental; +import javax.annotation.processing.Generated; + +/** + * Availability of the EXPERIMENTAL session connector API. + * + * @apiNote This type is experimental and may change in a future version. + * + * @since 1.0.0 + */ +@CopilotExperimental +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public enum ConnectorAvailability { + /** The {@code enabled} variant. */ + ENABLED("enabled"), + /** The {@code disabled} variant. */ + DISABLED("disabled"), + /** The {@code unavailable} variant. */ + UNAVAILABLE("unavailable"); + + private final String value; + ConnectorAvailability(String value) { this.value = value; } + @com.fasterxml.jackson.annotation.JsonValue + public String getValue() { return value; } + @com.fasterxml.jackson.annotation.JsonCreator + public static ConnectorAvailability fromValue(String value) { + for (ConnectorAvailability v : values()) { + if (v.value.equals(value)) return v; + } + throw new IllegalArgumentException("Unknown ConnectorAvailability value: " + value); + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogEntry.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogEntry.java new file mode 100644 index 0000000000..53c3750792 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogEntry.java @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * 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 java.util.List; +import javax.annotation.processing.Generated; + +/** + * Credential-free Connector catalog entry. + * + * @apiNote This type 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 ConnectorCatalogEntry( + /** Canonical Connector name used by lifecycle methods. */ + @JsonProperty("name") String name, + /** Untrusted display label from the service. */ + @JsonProperty("displayName") String displayName, + /** Untrusted service description, when present. */ + @JsonProperty("description") String description, + /** Current authoritative service connection state. */ + @JsonProperty("status") ConnectorCatalogStatus status, + /** Opaque stable runtime IDs currently projected into the session for this Connector. */ + @JsonProperty("runtimeServerIds") List runtimeServerIds +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogResult.java new file mode 100644 index 0000000000..2d10c7ad93 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogResult.java @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * 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 java.util.List; +import javax.annotation.processing.Generated; + +/** + * Validated Connector catalog snapshot cached by the session. + * + * @apiNote This type 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 ConnectorCatalogResult( + /** Monotonically increasing session-local catalog revision. */ + @JsonProperty("revision") Long revision, + /** Unix epoch milliseconds when this snapshot was accepted. */ + @JsonProperty("refreshedAtMs") Long refreshedAtMs, + /** Validated catalog entries in service order. */ + @JsonProperty("connectors") List connectors +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogStatus.java new file mode 100644 index 0000000000..7be156a58b --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorCatalogStatus.java @@ -0,0 +1,45 @@ +/*--------------------------------------------------------------------------------------------- + * 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 javax.annotation.processing.Generated; + +/** + * Authoritative service connection state for one Connector. + * + * @apiNote This type is experimental and may change in a future version. + * + * @since 1.0.0 + */ +@CopilotExperimental +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public enum ConnectorCatalogStatus { + /** The {@code not_connected} variant. */ + NOT_CONNECTED("not_connected"), + /** The {@code pending} variant. */ + PENDING("pending"), + /** The {@code connected} variant. */ + CONNECTED("connected"), + /** The {@code error} variant. */ + ERROR("error"), + /** The {@code unknown} variant. */ + UNKNOWN("unknown"); + + private final String value; + ConnectorCatalogStatus(String value) { this.value = value; } + @com.fasterxml.jackson.annotation.JsonValue + public String getValue() { return value; } + @com.fasterxml.jackson.annotation.JsonCreator + public static ConnectorCatalogStatus fromValue(String value) { + for (ConnectorCatalogStatus v : values()) { + if (v.value.equals(value)) return v; + } + throw new IllegalArgumentException("Unknown ConnectorCatalogStatus value: " + value); + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResult.java new file mode 100644 index 0000000000..3598e407d1 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResult.java @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * 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.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.github.copilot.CopilotExperimental; +import javax.annotation.processing.Generated; + +/** + * Typed result of initiating or continuing a Connector connection. + * + * @apiNote This type is experimental and may change in a future version. + * + * @since 1.0.0 + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "kind", visible = true) +@JsonSubTypes({ + @JsonSubTypes.Type(value = ConnectorConnectResultConnected.class, name = "connected"), + @JsonSubTypes.Type(value = ConnectorConnectResultConsentRequired.class, name = "consent_required"), + @JsonSubTypes.Type(value = ConnectorConnectResultPending.class, name = "pending") +}) +@CopilotExperimental +@JsonIgnoreProperties(ignoreUnknown = true) +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public abstract class ConnectorConnectResult { + + /** + * Returns the discriminator value for this variant. + * + * @return the kind discriminator + */ + public abstract String getKind(); +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultConnected.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultConnected.java new file mode 100644 index 0000000000..cf5051e62c --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultConnected.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 com.github.copilot.CopilotExperimental; +import javax.annotation.processing.Generated; + +/** + * The service is connected and the session MCP graph was reconciled. + * + * @apiNote This type is experimental and may change in a future version. + * + * @since 1.0.0 + */ +@CopilotExperimental +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class ConnectorConnectResultConnected extends ConnectorConnectResult { + + @JsonProperty("kind") + private final String kind = "connected"; + + @Override + public String getKind() { return kind; } + + /** Fresh authoritative Connector state after MCP reconciliation. */ + @JsonProperty("status") + private ConnectorStatus status; + + public ConnectorStatus getStatus() { return status; } + public void setStatus(ConnectorStatus status) { this.status = status; } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultConsentRequired.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultConsentRequired.java new file mode 100644 index 0000000000..3552bdc9e3 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultConsentRequired.java @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Host-owned consent is required before bounded continuation can complete. + * + * @apiNote This type is experimental and may change in a future version. + * + * @since 1.0.0 + */ +@CopilotExperimental +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class ConnectorConnectResultConsentRequired extends ConnectorConnectResult { + + @JsonProperty("kind") + private final String kind = "consent_required"; + + @Override + public String getKind() { return kind; } + + /** Validated HTTPS consent URL. The runtime does not open it. */ + @JsonProperty("consentUrl") + private String consentUrl; + + /** Opaque ID accepted by continueConnection. */ + @JsonProperty("continuationId") + private String continuationId; + + public String getConsentUrl() { return consentUrl; } + public void setConsentUrl(String consentUrl) { this.consentUrl = consentUrl; } + + public String getContinuationId() { return continuationId; } + public void setContinuationId(String continuationId) { this.continuationId = continuationId; } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultPending.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultPending.java new file mode 100644 index 0000000000..a31a009382 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorConnectResultPending.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 com.github.copilot.CopilotExperimental; +import javax.annotation.processing.Generated; + +/** + * The service is still completing the connection without a consent URL. + * + * @apiNote This type is experimental and may change in a future version. + * + * @since 1.0.0 + */ +@CopilotExperimental +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class ConnectorConnectResultPending extends ConnectorConnectResult { + + @JsonProperty("kind") + private final String kind = "pending"; + + @Override + public String getKind() { return kind; } + + /** Opaque ID accepted by continueConnection. */ + @JsonProperty("continuationId") + private String continuationId; + + public String getContinuationId() { return continuationId; } + public void setContinuationId(String continuationId) { this.continuationId = continuationId; } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorMcpStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorMcpStatus.java new file mode 100644 index 0000000000..d517230f4f --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorMcpStatus.java @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * 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 javax.annotation.processing.Generated; + +/** + * Live MCP status of one Connector-owned runtime server. + * + * @apiNote This type is experimental and may change in a future version. + * + * @since 1.0.0 + */ +@CopilotExperimental +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public enum ConnectorMcpStatus { + /** The {@code connected} variant. */ + CONNECTED("connected"), + /** The {@code pending} variant. */ + PENDING("pending"), + /** The {@code needs_auth} variant. */ + NEEDS_AUTH("needs_auth"), + /** The {@code failed} variant. */ + FAILED("failed"), + /** The {@code stopped} variant. */ + STOPPED("stopped"), + /** The {@code disabled} variant. */ + DISABLED("disabled"), + /** The {@code not_configured} variant. */ + NOT_CONFIGURED("not_configured"); + + private final String value; + ConnectorMcpStatus(String value) { this.value = value; } + @com.fasterxml.jackson.annotation.JsonValue + public String getValue() { return value; } + @com.fasterxml.jackson.annotation.JsonCreator + public static ConnectorMcpStatus fromValue(String value) { + for (ConnectorMcpStatus v : values()) { + if (v.value.equals(value)) return v; + } + throw new IllegalArgumentException("Unknown ConnectorMcpStatus value: " + value); + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorRuntimeStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorRuntimeStatus.java new file mode 100644 index 0000000000..af01caaba8 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorRuntimeStatus.java @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Live status of one session-owned MCP projection. + * + * @apiNote This type 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 ConnectorRuntimeStatus( + /** Opaque runtime server ID. */ + @JsonProperty("runtimeServerId") String runtimeServerId, + /** Canonical Connector name that owns this server. */ + @JsonProperty("connectorName") String connectorName, + /** Current live MCP host status. */ + @JsonProperty("status") ConnectorMcpStatus status +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorStatus.java new file mode 100644 index 0000000000..ca0505ea0e --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ConnectorStatus.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.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; +import java.util.List; +import javax.annotation.processing.Generated; + +/** + * Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + * + * @apiNote This type 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 ConnectorStatus( + /** Connector API contract version. */ + @JsonProperty("apiVersion") Long apiVersion, + /** Current feature and session availability. */ + @JsonProperty("availability") ConnectorAvailability availability, + /** Opaque account selection pinned to this session, when one has been selected. */ + @JsonProperty("accountId") String accountId, + /** Latest validated catalog snapshot, when available. */ + @JsonProperty("catalog") ConnectorCatalogResult catalog, + /** Live MCP status for every Connector-owned runtime server. */ + @JsonProperty("runtimeServers") List runtimeServers, + /** Number of active opaque connection continuations. */ + @JsonProperty("pendingConnections") Long pendingConnections +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ContentExclusionPathCheck.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ContentExclusionPathCheck.java index ba48326c2e..5dd0809887 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ContentExclusionPathCheck.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ContentExclusionPathCheck.java @@ -10,13 +10,17 @@ 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; /** * Content-exclusion decision for one requested path. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DiscoveredCanvas.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DiscoveredCanvas.java index 0b0c518040..ce8759ee33 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DiscoveredCanvas.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DiscoveredCanvas.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import javax.annotation.processing.Generated; /** * Canvas available in the current session. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProfile.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProfile.java index e7590c7f9e..a2c5bb7ed2 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProfile.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProfile.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import java.util.Map; import javax.annotation.processing.Generated; @@ -17,8 +18,11 @@ /** * Opaque integrator-owned process launch profile for one extension entrypoint. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProviderResolveRequest.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProviderResolveRequest.java index 7b520f9067..d33956d10d 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProviderResolveRequest.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ExtensionLaunchProviderResolveRequest.java @@ -10,13 +10,17 @@ 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; /** * A discovered extension entrypoint that the registered integrator may classify and resolve to an opaque launch profile. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentOptions.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentOptions.java index 51b9077ba1..35470e7199 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentOptions.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentOptions.java @@ -10,13 +10,17 @@ 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; /** * Options for one factory-scoped subagent call. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentSummary.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentSummary.java index d1bd2329b2..d063fc9c6b 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentSummary.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryAgentSummary.java @@ -10,13 +10,17 @@ 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; /** * Prompt-safe durable identity and live status for a direct factory agent. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryCurrentPhase.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryCurrentPhase.java index e0a30f51a6..c15631835d 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryCurrentPhase.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryCurrentPhase.java @@ -10,13 +10,17 @@ 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; /** * Current factory phase identity. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryDeclaredLimits.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryDeclaredLimits.java index 7fa99b005b..7e2e4e6b5b 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryDeclaredLimits.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryDeclaredLimits.java @@ -10,13 +10,17 @@ 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; /** * Declared or approved factory resource ceilings. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryLogLine.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryLogLine.java index 28a9690450..1f7afdd583 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryLogLine.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryLogLine.java @@ -10,13 +10,17 @@ 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; /** * One ordered factory progress line. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseObservation.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseObservation.java index aa96e0cb90..167766885c 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseObservation.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseObservation.java @@ -10,13 +10,17 @@ 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; /** * Durable lifecycle and timing for one factory phase. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseStatus.java index d9fea0bc36..8432507176 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseStatus.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryPhaseStatus.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Derived lifecycle state of a factory phase. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum FactoryPhaseStatus { /** The {@code pending} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressLine.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressLine.java index 3a26b67d79..c9ed149610 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressLine.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressLine.java @@ -10,13 +10,17 @@ 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; /** * One durable factory progress record. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressPage.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressPage.java index 76278a1585..935140612e 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressPage.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryProgressPage.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import javax.annotation.processing.Generated; /** * A bidirectional page of factory progress. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunConsumed.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunConsumed.java index a492db26f6..5ffc43435d 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunConsumed.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunConsumed.java @@ -10,13 +10,17 @@ 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; /** * Durable factory resource consumption. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunLimits.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunLimits.java index 79304772a0..300e4977b3 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunLimits.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunLimits.java @@ -10,13 +10,17 @@ 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; /** * Wire-only per-invocation factory resource ceiling overrides. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunSummary.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunSummary.java index e58b774bcb..56d1f91763 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunSummary.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunSummary.java @@ -10,13 +10,17 @@ 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; /** * Durable factory run summary with read-time live overlays. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunTerminal.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunTerminal.java index 0123e19793..0b0db7d9b7 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunTerminal.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryRunTerminal.java @@ -10,13 +10,17 @@ 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; /** * Prompt-safe terminal factory outcome. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryToolRunOptions.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryToolRunOptions.java index cc3e7c8da1..e2444c7053 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryToolRunOptions.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/FactoryToolRunOptions.java @@ -10,13 +10,17 @@ 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; /** * Options for an internal tool-originated factory invocation. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java index b6bef1bffd..513fa2ec98 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryClientInfo.java @@ -10,13 +10,17 @@ 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; /** * Client environment metadata describing the process that produced a telemetry event. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryEvent.java index efbf920b4f..58c550af05 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryEvent.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryEvent.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.Map; import javax.annotation.processing.Generated; /** * A single telemetry event in the runtime's native GitHub-shaped telemetry format, forwarded verbatim to opted-in hosts. The `restricted` flag on the enclosing GitHubTelemetryNotification distinguishes standard from restricted events; the payload shape is identical for both. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryNotification.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryNotification.java index 6059f1ff6c..7d1cf5b1a3 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryNotification.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTelemetryNotification.java @@ -10,13 +10,17 @@ 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; /** * Payload for a `gitHubTelemetry.event` notification: a single GitHub telemetry event the runtime forwards to a host connection that opted into telemetry forwarding during the `server.connect` handshake. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireRequest.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireRequest.java index 59ba9d8ed5..890af9a526 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireRequest.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireRequest.java @@ -10,13 +10,17 @@ 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; /** * Asks the SDK client to acquire a GitHub access token from an opaque callback registration. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireResult.java index a20724c337..f0d0b2d3ee 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireResult.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/GitHubTokenAcquireResult.java @@ -10,11 +10,14 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * SDK host response to a GitHub credential request. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "kind", visible = true) @@ -22,6 +25,7 @@ @JsonSubTypes.Type(value = GitHubTokenAcquireResultToken.class, name = "token"), @JsonSubTypes.Type(value = GitHubTokenAcquireResultCancelled.class, name = "cancelled") }) +@CopilotExperimental @JsonIgnoreProperties(ignoreUnknown = true) @javax.annotation.processing.Generated("copilot-sdk-codegen") public abstract class GitHubTokenAcquireResult { diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpExecuteSamplingResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpExecuteSamplingResult.java index 18a838d30c..07b07ab376 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpExecuteSamplingResult.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpExecuteSamplingResult.java @@ -10,13 +10,17 @@ 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; /** * MCP CreateMessageResult payload (with optional 'tools' extension), present when action='success'. Treated as opaque at the schema layer; consumers should construct/consume it per the MCP CreateMessageResult shape. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ModelSwitchAutoTierStatus.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ModelSwitchAutoTierStatus.java index e4a1baed5e..f3f607dbfd 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ModelSwitchAutoTierStatus.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ModelSwitchAutoTierStatus.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Whether the requested preference was already effective or was accepted for later transactional activation. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum ModelSwitchAutoTierStatus { /** The {@code unchanged} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/OpenCanvasInstance.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/OpenCanvasInstance.java index f38ba82c4f..d84108e62b 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/OpenCanvasInstance.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/OpenCanvasInstance.java @@ -10,13 +10,17 @@ 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; /** * Open canvas instance snapshot. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionMode.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionMode.java index 1f4ea9b6bc..ddbd006872 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionMode.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionMode.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Current or requested permission mode. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum PermissionMode { /** The {@code manual} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionModeSource.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionModeSource.java index 107ac3f6d9..52f3e6cea3 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionModeSource.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/PermissionModeSource.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Optional source for permission-mode telemetry. Defaults to `rpc` when omitted for SDK callers. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum PermissionModeSource { /** The {@code cli_flag} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefer.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefer.java index 58f1ec24d5..0129cf4091 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefer.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefer.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Controls whether the runtime may defer loading an external tool definition. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum ProtocolExternalToolDefer { /** The {@code auto} variant. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefinition.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefinition.java index 5e7095700c..27d0c23a9b 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefinition.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProtocolExternalToolDefinition.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.Map; import javax.annotation.processing.Generated; /** * Serializable definition of a caller-implemented tool whose execution is handled over the SDK connection. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderConfig.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderConfig.java index 25cc365ab0..22c7414996 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderConfig.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderConfig.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.Map; import javax.annotation.processing.Generated; /** * Custom model-provider configuration (BYOK). * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/RunOptions.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/RunOptions.java index 11ac51827a..ae535af8cf 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/RunOptions.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/RunOptions.java @@ -10,13 +10,17 @@ 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; /** * Options controlling factory invocation. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfig.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfig.java index dd522f7a34..0b02851782 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfig.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfig.java @@ -10,13 +10,17 @@ 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; /** * Resolved sandbox configuration. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsApi.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsApi.java new file mode 100644 index 0000000000..84537bed58 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsApi.java @@ -0,0 +1,167 @@ +/*--------------------------------------------------------------------------------------------- + * 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 connectors} namespace. + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class SessionConnectorsApi { + + private static final com.fasterxml.jackson.databind.ObjectMapper MAPPER = RpcMapper.INSTANCE; + + private final RpcCaller caller; + private final String sessionId; + + /** @param caller the RPC transport function */ + SessionConnectorsApi(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 getCapabilities() { + return caller.invoke("session.connectors.getCapabilities", java.util.Map.of("sessionId", this.sessionId), SessionConnectorsGetCapabilitiesResult.class); + } + + /** + * Identifies the target session. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture getStatus() { + return caller.invoke("session.connectors.getStatus", java.util.Map.of("sessionId", this.sessionId), SessionConnectorsGetStatusResult.class); + } + + /** + * Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + *

+ * Note: the {@code sessionId} field in the params record is overridden + * by the session-scoped wrapper; any value provided is ignored. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture list(SessionConnectorsListParams params) { + com.fasterxml.jackson.databind.node.ObjectNode _p = MAPPER.valueToTree(params); + _p.put("sessionId", this.sessionId); + return caller.invoke("session.connectors.list", _p, SessionConnectorsListResult.class); + } + + /** + * Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + *

+ * Note: the {@code sessionId} field in the params record is overridden + * by the session-scoped wrapper; any value provided is ignored. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture refresh(SessionConnectorsRefreshParams params) { + com.fasterxml.jackson.databind.node.ObjectNode _p = MAPPER.valueToTree(params); + _p.put("sessionId", this.sessionId); + return caller.invoke("session.connectors.refresh", _p, SessionConnectorsRefreshResult.class); + } + + /** + * Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + *

+ * Note: the {@code sessionId} field in the params record is overridden + * by the session-scoped wrapper; any value provided is ignored. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture connect(SessionConnectorsConnectParams params) { + com.fasterxml.jackson.databind.node.ObjectNode _p = MAPPER.valueToTree(params); + _p.put("sessionId", this.sessionId); + return caller.invoke("session.connectors.connect", _p, ConnectorConnectResult.class); + } + + /** + * Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + *

+ * Note: the {@code sessionId} field in the params record is overridden + * by the session-scoped wrapper; any value provided is ignored. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture reconnect(SessionConnectorsReconnectParams params) { + com.fasterxml.jackson.databind.node.ObjectNode _p = MAPPER.valueToTree(params); + _p.put("sessionId", this.sessionId); + return caller.invoke("session.connectors.reconnect", _p, ConnectorConnectResult.class); + } + + /** + * Explicitly bounded continuation of a pending Connector connection. + *

+ * Note: the {@code sessionId} field in the params record is overridden + * by the session-scoped wrapper; any value provided is ignored. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture continueConnection(SessionConnectorsContinueConnectionParams params) { + com.fasterxml.jackson.databind.node.ObjectNode _p = MAPPER.valueToTree(params); + _p.put("sessionId", this.sessionId); + return caller.invoke("session.connectors.continueConnection", _p, ConnectorConnectResult.class); + } + + /** + * Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + *

+ * Note: the {@code sessionId} field in the params record is overridden + * by the session-scoped wrapper; any value provided is ignored. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture disconnect(SessionConnectorsDisconnectParams params) { + com.fasterxml.jackson.databind.node.ObjectNode _p = MAPPER.valueToTree(params); + _p.put("sessionId", this.sessionId); + return caller.invoke("session.connectors.disconnect", _p, SessionConnectorsDisconnectResult.class); + } + + /** + * Requests authoritative Connector-to-MCP reconciliation for the pinned account. + *

+ * Note: the {@code sessionId} field in the params record is overridden + * by the session-scoped wrapper; any value provided is ignored. + * + * @apiNote This method is experimental and may change in a future version. + * @since 1.0.0 + */ + @CopilotExperimental + public CompletableFuture reconcile(SessionConnectorsReconcileParams params) { + com.fasterxml.jackson.databind.node.ObjectNode _p = MAPPER.valueToTree(params); + _p.put("sessionId", this.sessionId); + return caller.invoke("session.connectors.reconcile", _p, SessionConnectorsReconcileResult.class); + } + +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsConnectParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsConnectParams.java new file mode 100644 index 0000000000..6a3af85a4e --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsConnectParams.java @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + * + * @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 SessionConnectorsConnectParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId, + /** Opaque account selection ID. It must match the account already pinned to the session, if any. */ + @JsonProperty("accountId") String accountId, + /** Canonical Connector name from the current catalog. */ + @JsonProperty("connectorName") String connectorName +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsContinueConnectionParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsContinueConnectionParams.java new file mode 100644 index 0000000000..26eddc696a --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsContinueConnectionParams.java @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Explicitly bounded continuation of a pending Connector connection. + * + * @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 SessionConnectorsContinueConnectionParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId, + /** Opaque continuation ID returned by connect, reconnect, or an earlier continuation. */ + @JsonProperty("continuationId") String continuationId, + /** Maximum catalog requests made by this call. Must be between one and the capability limit. */ + @JsonProperty("maxAttempts") Long maxAttempts, + /** Delay in milliseconds between attempts. Must not exceed the capability limit. */ + @JsonProperty("pollIntervalMs") Long pollIntervalMs, + /** Maximum wall-clock duration in milliseconds for this call. Must be between one and the capability limit. */ + @JsonProperty("deadlineMs") Long deadlineMs +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsDisconnectParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsDisconnectParams.java new file mode 100644 index 0000000000..93ea746ed6 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsDisconnectParams.java @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + * + * @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 SessionConnectorsDisconnectParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId, + /** Opaque account selection ID. It must match the account already pinned to the session, if any. */ + @JsonProperty("accountId") String accountId, + /** Canonical Connector name from the current catalog. */ + @JsonProperty("connectorName") String connectorName +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsDisconnectResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsDisconnectResult.java new file mode 100644 index 0000000000..2e13cfbfb6 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsDisconnectResult.java @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Authoritative result after disconnect and MCP reconciliation. + * + * @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 SessionConnectorsDisconnectResult( + /** Whether the service accepted the idempotent disconnect. */ + @JsonProperty("disconnected") Boolean disconnected, + /** Fresh authoritative session state after removing Connector-owned MCP servers. */ + @JsonProperty("status") ConnectorStatus status +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetCapabilitiesParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetCapabilitiesParams.java new file mode 100644 index 0000000000..8eb2b1f917 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetCapabilitiesParams.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 SessionConnectorsGetCapabilitiesParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetCapabilitiesResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetCapabilitiesResult.java new file mode 100644 index 0000000000..65f41baece --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetCapabilitiesResult.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.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; + +/** + * Feature detection and hard polling limits for the EXPERIMENTAL session connector API. + * + * @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 SessionConnectorsGetCapabilitiesResult( + /** Connector API contract version. */ + @JsonProperty("apiVersion") Long apiVersion, + /** Current session availability. Disabled availability is reported without making a Connector request. */ + @JsonProperty("availability") ConnectorAvailability availability, + /** Whether connect and reconnect can return an opaque continuation for bounded consent polling. */ + @JsonProperty("consentContinuation") Boolean consentContinuation, + /** Whether callers select a host-owned GitHub account through an opaque selection ID rather than supplying a provider token. */ + @JsonProperty("opaqueAccountSelection") Boolean opaqueAccountSelection, + /** Maximum accepted polling attempts for one continuation call. */ + @JsonProperty("maxPollAttempts") Long maxPollAttempts, + /** Maximum accepted delay in milliseconds between polling attempts. */ + @JsonProperty("maxPollIntervalMs") Long maxPollIntervalMs, + /** Maximum accepted wall-clock deadline in milliseconds for one continuation call. */ + @JsonProperty("maxDeadlineMs") Long maxDeadlineMs +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetStatusParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetStatusParams.java new file mode 100644 index 0000000000..a658675fda --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetStatusParams.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 SessionConnectorsGetStatusParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetStatusResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetStatusResult.java new file mode 100644 index 0000000000..69fbd028e9 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsGetStatusResult.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 com.github.copilot.CopilotExperimental; +import java.util.List; +import javax.annotation.processing.Generated; + +/** + * Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + * + * @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 SessionConnectorsGetStatusResult( + /** Connector API contract version. */ + @JsonProperty("apiVersion") Long apiVersion, + /** Current feature and session availability. */ + @JsonProperty("availability") ConnectorAvailability availability, + /** Opaque account selection pinned to this session, when one has been selected. */ + @JsonProperty("accountId") String accountId, + /** Latest validated catalog snapshot, when available. */ + @JsonProperty("catalog") ConnectorCatalogResult catalog, + /** Live MCP status for every Connector-owned runtime server. */ + @JsonProperty("runtimeServers") List runtimeServers, + /** Number of active opaque connection continuations. */ + @JsonProperty("pendingConnections") Long pendingConnections +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsListParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsListParams.java new file mode 100644 index 0000000000..192edb85cb --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsListParams.java @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + * + * @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 SessionConnectorsListParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId, + /** Opaque account selection ID previously returned by an account discovery API. */ + @JsonProperty("accountId") String accountId +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsListResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsListResult.java new file mode 100644 index 0000000000..b074632671 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsListResult.java @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * 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 java.util.List; +import javax.annotation.processing.Generated; + +/** + * Validated Connector catalog snapshot cached by the 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 SessionConnectorsListResult( + /** Monotonically increasing session-local catalog revision. */ + @JsonProperty("revision") Long revision, + /** Unix epoch milliseconds when this snapshot was accepted. */ + @JsonProperty("refreshedAtMs") Long refreshedAtMs, + /** Validated catalog entries in service order. */ + @JsonProperty("connectors") List connectors +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconcileParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconcileParams.java new file mode 100644 index 0000000000..1a048d9ce0 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconcileParams.java @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Requests authoritative Connector-to-MCP reconciliation for the pinned account. + * + * @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 SessionConnectorsReconcileParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId, + /** Opaque account selection ID. It must match the account already pinned to the session, if any. */ + @JsonProperty("accountId") String accountId, + /** When true, refresh the catalog before reconciling. A disabled Connector API performs no service request. */ + @JsonProperty("refreshCatalog") Boolean refreshCatalog +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconcileResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconcileResult.java new file mode 100644 index 0000000000..e854207f2a --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconcileResult.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 com.github.copilot.CopilotExperimental; +import java.util.List; +import javax.annotation.processing.Generated; + +/** + * Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + * + * @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 SessionConnectorsReconcileResult( + /** Connector API contract version. */ + @JsonProperty("apiVersion") Long apiVersion, + /** Current feature and session availability. */ + @JsonProperty("availability") ConnectorAvailability availability, + /** Opaque account selection pinned to this session, when one has been selected. */ + @JsonProperty("accountId") String accountId, + /** Latest validated catalog snapshot, when available. */ + @JsonProperty("catalog") ConnectorCatalogResult catalog, + /** Live MCP status for every Connector-owned runtime server. */ + @JsonProperty("runtimeServers") List runtimeServers, + /** Number of active opaque connection continuations. */ + @JsonProperty("pendingConnections") Long pendingConnections +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconnectParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconnectParams.java new file mode 100644 index 0000000000..eebe0ea5ae --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsReconnectParams.java @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + * + * @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 SessionConnectorsReconnectParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId, + /** Opaque account selection ID. It must match the account already pinned to the session, if any. */ + @JsonProperty("accountId") String accountId, + /** Canonical Connector name from the current catalog. */ + @JsonProperty("connectorName") String connectorName +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsRefreshParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsRefreshParams.java new file mode 100644 index 0000000000..71be63308d --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsRefreshParams.java @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + * + * @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 SessionConnectorsRefreshParams( + /** Target session identifier */ + @JsonProperty("sessionId") String sessionId, + /** Opaque account selection ID previously returned by an account discovery API. */ + @JsonProperty("accountId") String accountId +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsRefreshResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsRefreshResult.java new file mode 100644 index 0000000000..840b861c4c --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionConnectorsRefreshResult.java @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * 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 java.util.List; +import javax.annotation.processing.Generated; + +/** + * Validated Connector catalog snapshot cached by the 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 SessionConnectorsRefreshResult( + /** Monotonically increasing session-local catalog revision. */ + @JsonProperty("revision") Long revision, + /** Unix epoch milliseconds when this snapshot was accepted. */ + @JsonProperty("refreshedAtMs") Long refreshedAtMs, + /** Validated catalog entries in service order. */ + @JsonProperty("connectors") List connectors +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionError.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionError.java index e25eaed867..6fb780a3aa 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionError.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionError.java @@ -10,13 +10,17 @@ 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; /** * Classified SQLite transaction failure. busyOrLocked guarantees rollback; postCommitAmbiguous must never be retried. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionStatement.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionStatement.java index f56f268ba1..2d21d0a52c 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionStatement.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionFsSqliteTransactionStatement.java @@ -10,14 +10,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.Map; import javax.annotation.processing.Generated; /** * One statement in an atomic SQLite transaction. * + * @apiNote This type 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) 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 cf89d37208..6c029e5de4 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 @@ -109,6 +109,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 connectors} namespace. */ + public final SessionConnectorsApi connectors; /** * Creates a new session RPC client. @@ -159,6 +161,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.connectors = new SessionConnectorsApi(caller, sessionId); } /** diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ShellCredentials.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ShellCredentials.java index 53567c98db..01251b5a13 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ShellCredentials.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ShellCredentials.java @@ -10,6 +10,7 @@ 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; /** @@ -30,9 +31,12 @@ retained between spawns, replacing the session credential (`session.gitHubAuth.s presents, not about what the agent may touch, and it works on every platform whether or not an OS sandboxing backend is available. `sandboxConfig.auth` remains the sandbox-scoped spelling and is additive with this one. + * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultExpanded.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultExpanded.java index 47527cfec8..db2160eecb 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultExpanded.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultExpanded.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.copilot.CopilotExperimental; import java.util.List; import java.util.Map; import javax.annotation.processing.Generated; @@ -17,8 +18,11 @@ /** * Expanded canonical result returned by a session tool. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultNewMessage.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultNewMessage.java index da203a0e98..59cc14d57a 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultNewMessage.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultNewMessage.java @@ -10,13 +10,17 @@ 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; /** * A message injected by a tool result. * + * @apiNote This type 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) diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultType.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultType.java index bc3b5ae2ac..5b045c5f56 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultType.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ToolResultType.java @@ -7,13 +7,17 @@ package com.github.copilot.generated.rpc; +import com.github.copilot.CopilotExperimental; import javax.annotation.processing.Generated; /** * Execution outcome classification. * + * @apiNote This type is experimental and may change in a future version. + * * @since 1.0.0 */ +@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") public enum ToolResultType { /** The {@code success} variant. */ diff --git a/java/sdk/src/test/java/com/github/copilot/CopilotExperimentalProcessorTest.java b/java/sdk/src/test/java/com/github/copilot/CopilotExperimentalProcessorTest.java index b7005c5d52..3715235bc1 100644 --- a/java/sdk/src/test/java/com/github/copilot/CopilotExperimentalProcessorTest.java +++ b/java/sdk/src/test/java/com/github/copilot/CopilotExperimentalProcessorTest.java @@ -114,6 +114,27 @@ void failsByDefault_whenExtendingExperimentalType() { "Expected compile error for extending experimental type, got: " + diagnostics.getDiagnostics()); } + @Test + void failsByDefault_whenUsingGeneratedExperimentalConnectorTypes() { + for (String type : List.of("ConnectorAvailability", "ConnectorStatus", "ConnectorConnectResult", + "ConnectorConnectResultConnected")) { + String source = """ + package consumer; + import com.github.copilot.generated.rpc.%s; + public class Consumer { + private %s value; + } + """.formatted(type, type); + DiagnosticCollector diagnostics = compile( + List.of(inMemorySource("consumer.Consumer", source)), Collections.emptyList()); + + boolean hasError = diagnostics.getDiagnostics().stream().anyMatch( + d -> d.getKind() == Diagnostic.Kind.ERROR && d.getMessage(null).contains("experimental API")); + assertTrue(hasError, "Expected compile error for generated experimental type " + type + ", got: " + + diagnostics.getDiagnostics()); + } + } + @Test void passes_whenAllowAnnotationIsOnType() { DiagnosticCollector diagnostics = compile( diff --git a/java/sdk/src/test/java/com/github/copilot/RpcWrappersTest.java b/java/sdk/src/test/java/com/github/copilot/RpcWrappersTest.java index f19cb77962..c8fefcec05 100644 --- a/java/sdk/src/test/java/com/github/copilot/RpcWrappersTest.java +++ b/java/sdk/src/test/java/com/github/copilot/RpcWrappersTest.java @@ -20,6 +20,19 @@ import com.github.copilot.generated.rpc.RpcCaller; import com.github.copilot.generated.rpc.ServerRpc; import com.github.copilot.generated.rpc.SessionAgentSelectParams; +import com.github.copilot.generated.rpc.SessionConnectorsConnectParams; +import com.github.copilot.generated.rpc.SessionConnectorsContinueConnectionParams; +import com.github.copilot.generated.rpc.SessionConnectorsDisconnectParams; +import com.github.copilot.generated.rpc.SessionConnectorsDisconnectResult; +import com.github.copilot.generated.rpc.SessionConnectorsGetCapabilitiesResult; +import com.github.copilot.generated.rpc.SessionConnectorsGetStatusResult; +import com.github.copilot.generated.rpc.SessionConnectorsListParams; +import com.github.copilot.generated.rpc.SessionConnectorsListResult; +import com.github.copilot.generated.rpc.SessionConnectorsReconcileParams; +import com.github.copilot.generated.rpc.SessionConnectorsReconcileResult; +import com.github.copilot.generated.rpc.SessionConnectorsReconnectParams; +import com.github.copilot.generated.rpc.SessionConnectorsRefreshParams; +import com.github.copilot.generated.rpc.SessionConnectorsRefreshResult; import com.github.copilot.generated.rpc.SessionModelSwitchToParams; import com.github.copilot.generated.rpc.SessionRpc; @@ -43,7 +56,7 @@ class RpcWrappersTest { */ private static final class StubCaller implements RpcCaller { - static record Call(String method, Object params) { + static record Call(String method, Object params, Class resultType) { } final List calls = new ArrayList<>(); @@ -52,7 +65,7 @@ static record Call(String method, Object params) { @Override @SuppressWarnings("unchecked") public CompletableFuture invoke(String method, Object params, Class resultType) { - calls.add(new Call(method, params)); + calls.add(new Call(method, params, resultType)); return CompletableFuture.completedFuture((T) nextResult); } } @@ -181,6 +194,61 @@ void sessionRpc_instantiates_with_all_namespace_fields() { assertNotNull(session.shell); assertNotNull(session.history); assertNotNull(session.usage); + assertNotNull(session.connectors); + } + + @Test + @AllowCopilotExperimental + void sessionRpc_connectors_exposes_all_generated_methods() { + var stub = new StubCaller(); + var session = new SessionRpc(stub, "sess-connectors"); + + session.connectors.getCapabilities(); + session.connectors.getStatus(); + session.connectors.list(new SessionConnectorsListParams("ignored-session", "account-1")); + session.connectors.refresh(new SessionConnectorsRefreshParams("ignored-session", "account-1")); + session.connectors.connect(new SessionConnectorsConnectParams("ignored-session", "account-1", "outlook")); + session.connectors.reconnect(new SessionConnectorsReconnectParams("ignored-session", "account-1", "outlook")); + session.connectors.continueConnection(new SessionConnectorsContinueConnectionParams("ignored-session", + "continuation-1", 3L, 1_000L, 30_000L)); + session.connectors.disconnect(new SessionConnectorsDisconnectParams("ignored-session", "account-1", "outlook")); + session.connectors.reconcile(new SessionConnectorsReconcileParams("ignored-session", "account-1", true)); + + assertEquals(9, stub.calls.size()); + assertConnectorCall(stub.calls.get(0), "session.connectors.getCapabilities", + SessionConnectorsGetCapabilitiesResult.class); + assertConnectorCall(stub.calls.get(1), "session.connectors.getStatus", SessionConnectorsGetStatusResult.class); + + var listParams = assertConnectorCall(stub.calls.get(2), "session.connectors.list", + SessionConnectorsListResult.class); + assertEquals("account-1", listParams.get("accountId").asText()); + + var refreshParams = assertConnectorCall(stub.calls.get(3), "session.connectors.refresh", + SessionConnectorsRefreshResult.class); + assertEquals("account-1", refreshParams.get("accountId").asText()); + + var connectParams = assertConnectorCall(stub.calls.get(4), "session.connectors.connect", + com.github.copilot.generated.rpc.ConnectorConnectResult.class); + assertEquals("outlook", connectParams.get("connectorName").asText()); + + var reconnectParams = assertConnectorCall(stub.calls.get(5), "session.connectors.reconnect", + com.github.copilot.generated.rpc.ConnectorConnectResult.class); + assertEquals("outlook", reconnectParams.get("connectorName").asText()); + + var continueParams = assertConnectorCall(stub.calls.get(6), "session.connectors.continueConnection", + com.github.copilot.generated.rpc.ConnectorConnectResult.class); + assertEquals("continuation-1", continueParams.get("continuationId").asText()); + assertEquals(3L, continueParams.get("maxAttempts").asLong()); + assertEquals(1_000L, continueParams.get("pollIntervalMs").asLong()); + assertEquals(30_000L, continueParams.get("deadlineMs").asLong()); + + var disconnectParams = assertConnectorCall(stub.calls.get(7), "session.connectors.disconnect", + SessionConnectorsDisconnectResult.class); + assertEquals("outlook", disconnectParams.get("connectorName").asText()); + + var reconcileParams = assertConnectorCall(stub.calls.get(8), "session.connectors.reconcile", + SessionConnectorsReconcileResult.class); + assertTrue(reconcileParams.get("refreshCatalog").asBoolean()); } @Test @@ -362,6 +430,7 @@ void copilotSession_getRpc_all_namespace_fields_present() throws Exception { assertNotNull(sessionRpc.permissions); assertNotNull(sessionRpc.commands); assertNotNull(sessionRpc.ui); + assertNotNull(sessionRpc.connectors); } } @@ -462,6 +531,15 @@ void sessionRpc_mcp_apps_callTool_returns_jsonNode_payload() throws Exception { assertEquals(false, result.get("isError").asBoolean()); } + private static com.fasterxml.jackson.databind.JsonNode assertConnectorCall(StubCaller.Call call, + String expectedMethod, Class expectedResultType) { + assertEquals(expectedMethod, call.method()); + assertEquals(expectedResultType, call.resultType()); + var params = new ObjectMapper().valueToTree(call.params()); + assertEquals("sess-connectors", params.get("sessionId").asText()); + return params; + } + /** * Helper that creates a loopback socket pair. The client side is used by * {@link JsonRpcClient}; the server side can be read to inspect outbound diff --git a/java/sdk/src/test/java/com/github/copilot/generated/rpc/ConnectorSerializationTest.java b/java/sdk/src/test/java/com/github/copilot/generated/rpc/ConnectorSerializationTest.java new file mode 100644 index 0000000000..281569b8f1 --- /dev/null +++ b/java/sdk/src/test/java/com/github/copilot/generated/rpc/ConnectorSerializationTest.java @@ -0,0 +1,94 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +package com.github.copilot.generated.rpc; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.copilot.AllowCopilotExperimental; + +@AllowCopilotExperimental +class ConnectorSerializationTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + void connectorConnectResult_roundTrips_all_variants() throws Exception { + var connected = roundTrip(""" + { + "kind": "connected", + "status": { + "apiVersion": 1, + "availability": "enabled", + "accountId": "account-1", + "catalog": { + "revision": 7, + "refreshedAtMs": 1000, + "connectors": [{ + "name": "outlook", + "displayName": "Outlook", + "description": "Mail and calendar", + "status": "connected", + "runtimeServerIds": ["connector-outlook"] + }] + }, + "runtimeServers": [{ + "runtimeServerId": "connector-outlook", + "connectorName": "outlook", + "status": "connected" + }], + "pendingConnections": 0 + } + } + """, ConnectorConnectResultConnected.class); + assertEquals(ConnectorAvailability.ENABLED, connected.getStatus().availability()); + assertEquals(ConnectorCatalogStatus.CONNECTED, connected.getStatus().catalog().connectors().get(0).status()); + assertEquals(ConnectorMcpStatus.CONNECTED, connected.getStatus().runtimeServers().get(0).status()); + + var consentRequired = roundTrip(""" + { + "kind": "consent_required", + "consentUrl": "https://example.com/consent", + "continuationId": "continuation-1" + } + """, ConnectorConnectResultConsentRequired.class); + assertEquals("https://example.com/consent", consentRequired.getConsentUrl()); + assertEquals("continuation-1", consentRequired.getContinuationId()); + + var pending = roundTrip(""" + { + "kind": "pending", + "continuationId": "continuation-2" + } + """, ConnectorConnectResultPending.class); + assertEquals("continuation-2", pending.getContinuationId()); + } + + @Test + void connectorGeneratedRecords_preserve_wire_names_and_null_omission() throws Exception { + var params = new SessionConnectorsContinueConnectionParams(null, "continuation-1", 4L, 500L, 10_000L); + + var json = MAPPER.readTree(MAPPER.writeValueAsString(params)); + + assertFalse(json.has("sessionId")); + assertEquals("continuation-1", json.get("continuationId").asText()); + assertEquals(4L, json.get("maxAttempts").asLong()); + assertEquals(500L, json.get("pollIntervalMs").asLong()); + assertEquals(10_000L, json.get("deadlineMs").asLong()); + assertEquals(params, MAPPER.treeToValue(json, SessionConnectorsContinueConnectionParams.class)); + } + + private static T roundTrip(String json, Class expectedType) throws Exception { + var result = MAPPER.readValue(json, ConnectorConnectResult.class); + var typedResult = assertInstanceOf(expectedType, result); + assertEquals(typedResult.getKind(), + MAPPER.readTree(MAPPER.writeValueAsString(typedResult)).get("kind").asText()); + + var serialized = MAPPER.writeValueAsString(typedResult); + return assertInstanceOf(expectedType, MAPPER.readValue(serialized, ConnectorConnectResult.class)); + } +} diff --git a/nodejs/README.md b/nodejs/README.md index 93b6160808..4c42e1efc8 100644 --- a/nodejs/README.md +++ b/nodejs/README.md @@ -474,6 +474,20 @@ Capabilities may update during the session. For example, when another client joi Interactive UI methods for showing dialogs to the user. Only available when the CLI host supports elicitation (`session.capabilities.ui?.elicitation === true`). See [UI Elicitation](#ui-elicitation) for full details. +##### `rpc.connectors` _(experimental)_ + +The generated Connector namespace exposes `getCapabilities`, `getStatus`, +`list`, `refresh`, `connect`, `reconnect`, `continueConnection`, `disconnect`, +and `reconcile`. The runtime owns Connector service calls, bounded polling, and +session MCP reconciliation. Your application chooses the opaque account ID, +opens returned consent URLs, confirms destructive actions, and renders UI. +Pass only the host-selected account ID; Connector methods do not accept or +return credentials or provider tokens. + +Check `getCapabilities()` before use. Connector support remains default-off +unless enabled by the connected runtime. See +[Using MCP servers](../docs/features/mcp.md#copilot-connectors). + ##### `destroy(): Promise` _(deprecated)_ Deprecated — use `disconnect()` instead. diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts index b0bbbb56e4..a7d0d2d328 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -4296,6 +4296,99 @@ export type WorkspacesWorkspaceDetailsHostType = | "github" /** Workspace repository is hosted on Azure DevOps. */ | "ado"; +/** + * Availability of the EXPERIMENTAL session connector API. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorAvailability". + */ +/** @experimental */ +export type ConnectorAvailability = + /** The resolved Connector feature is enabled and Connector requests are permitted. */ + | "enabled" + /** The resolved Connector feature is off. No Connector service request is made while disabled. */ + | "disabled" + /** The session has no eligible host-owned GitHub account or does not support local Connector projection. */ + | "unavailable"; +/** + * Authoritative service connection state for one Connector. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorCatalogStatus". + */ +/** @experimental */ +export type ConnectorCatalogStatus = + /** The Connector is available but not connected. */ + | "not_connected" + /** The Connector service is still completing connection or consent. */ + | "pending" + /** The Connector is connected and may contribute MCP servers. */ + | "connected" + /** The Connector service reports an unusable connection. */ + | "error" + /** The service returned a future or unrecognized state. */ + | "unknown"; +/** + * Typed result of initiating or continuing a Connector connection. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorConnectResult". + */ +/** @experimental */ +export type ConnectorConnectResult = + | { + /** + * The service is connected and the session MCP graph was reconciled. + */ + kind: "connected"; + status: ConnectorStatus; + } + | { + /** + * Host-owned consent is required before bounded continuation can complete. + */ + kind: "consent_required"; + /** + * Validated HTTPS consent URL. The runtime does not open it. + */ + consentUrl: string; + /** + * Opaque ID accepted by continueConnection. + */ + continuationId: string; + } + | { + /** + * The service is still completing the connection without a consent URL. + */ + kind: "pending"; + /** + * Opaque ID accepted by continueConnection. + */ + continuationId: string; + }; +/** + * Live MCP status of one Connector-owned runtime server. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorMcpStatus". + */ +/** @experimental */ +export type ConnectorMcpStatus = + /** The server is connected and its tools are available. */ + | "connected" + /** The server connection is still being established. */ + | "pending" + /** The server requires refreshed GitHub authorization. */ + | "needs_auth" + /** The server failed to connect or initialize. */ + | "failed" + /** The server is intentionally stopped, including when managed policy blocks it. */ + | "stopped" + /** The server is configured but explicitly disabled. */ + | "disabled" + /** The Connector currently has no live server configuration. */ + | "not_configured"; /** * List of all authenticated users * @@ -24484,6 +24577,218 @@ export interface WorkspacesWriteAutopilotObjectiveResult { */ operation: string; } +/** + * Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorAccountRequest". + */ +/** @experimental */ +export interface ConnectorAccountRequest { + /** + * Opaque account selection ID previously returned by an account discovery API. + */ + accountId: string; +} +/** + * Feature detection and hard polling limits for the EXPERIMENTAL session connector API. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorCapabilities". + */ +/** @experimental */ +export interface ConnectorCapabilities { + /** + * Connector API contract version. + */ + apiVersion: number; + availability: ConnectorAvailability; + /** + * Whether connect and reconnect can return an opaque continuation for bounded consent polling. + */ + consentContinuation: boolean; + /** + * Whether callers select a host-owned GitHub account through an opaque selection ID rather than supplying a provider token. + */ + opaqueAccountSelection: boolean; + /** + * Maximum accepted polling attempts for one continuation call. + */ + maxPollAttempts: number; + /** + * Maximum accepted delay in milliseconds between polling attempts. + */ + maxPollIntervalMs: number; + /** + * Maximum accepted wall-clock deadline in milliseconds for one continuation call. + */ + maxDeadlineMs: number; +} +/** + * Credential-free Connector catalog entry. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorCatalogEntry". + */ +/** @experimental */ +export interface ConnectorCatalogEntry { + /** + * Canonical Connector name used by lifecycle methods. + */ + name: string; + /** + * Untrusted display label from the service. + */ + displayName: string; + /** + * Untrusted service description, when present. + */ + description?: string; + status: ConnectorCatalogStatus; + /** + * Opaque stable runtime IDs currently projected into the session for this Connector. + */ + runtimeServerIds: string[]; +} +/** + * Validated Connector catalog snapshot cached by the session. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorCatalogResult". + */ +/** @experimental */ +export interface ConnectorCatalogResult { + /** + * Monotonically increasing session-local catalog revision. + */ + revision: number; + /** + * Unix epoch milliseconds when this snapshot was accepted. + */ + refreshedAtMs: number; + /** + * Validated catalog entries in service order. + */ + connectors: ConnectorCatalogEntry[]; +} +/** + * Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorConnectRequest". + */ +/** @experimental */ +export interface ConnectorConnectRequest { + /** + * Opaque account selection ID. It must match the account already pinned to the session, if any. + */ + accountId: string; + /** + * Canonical Connector name from the current catalog. + */ + connectorName: string; +} +/** + * Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorStatus". + */ +/** @experimental */ +export interface ConnectorStatus { + /** + * Connector API contract version. + */ + apiVersion: number; + availability: ConnectorAvailability; + /** + * Opaque account selection pinned to this session, when one has been selected. + */ + accountId?: string; + catalog?: ConnectorCatalogResult; + /** + * Live MCP status for every Connector-owned runtime server. + */ + runtimeServers: ConnectorRuntimeStatus[]; + /** + * Number of active opaque connection continuations. + */ + pendingConnections: number; +} +/** + * Live status of one session-owned MCP projection. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorRuntimeStatus". + */ +/** @experimental */ +export interface ConnectorRuntimeStatus { + /** + * Opaque runtime server ID. + */ + runtimeServerId: string; + /** + * Canonical Connector name that owns this server. + */ + connectorName: string; + status: ConnectorMcpStatus; +} +/** + * Explicitly bounded continuation of a pending Connector connection. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorContinueRequest". + */ +/** @experimental */ +export interface ConnectorContinueRequest { + /** + * Opaque continuation ID returned by connect, reconnect, or an earlier continuation. + */ + continuationId: string; + /** + * Maximum catalog requests made by this call. Must be between one and the capability limit. + */ + maxAttempts: number; + /** + * Delay in milliseconds between attempts. Must not exceed the capability limit. + */ + pollIntervalMs: number; + /** + * Maximum wall-clock duration in milliseconds for this call. Must be between one and the capability limit. + */ + deadlineMs: number; +} +/** + * Authoritative result after disconnect and MCP reconciliation. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorDisconnectResult". + */ +/** @experimental */ +export interface ConnectorDisconnectResult { + /** + * Whether the service accepted the idempotent disconnect. + */ + disconnected: boolean; + status: ConnectorStatus; +} +/** + * Requests authoritative Connector-to-MCP reconciliation for the pinned account. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ConnectorReconcileRequest". + */ +/** @experimental */ +export interface ConnectorReconcileRequest { + /** + * Opaque account selection ID. It must match the account already pinned to the session, if any. + */ + accountId: string; + /** + * When true, refresh the catalog before reconciling. A disabled Connector API performs no service request. + */ + refreshCatalog?: boolean; +} /** @experimental */ export interface SessionFactoryPauseAtCheckpointResult { @@ -27510,6 +27815,86 @@ export function createSessionRpc(connection: MessageConnection, sessionId: strin stop: async (params: ScheduleStopRequest): Promise => connection.sendRequest("session.schedule.stop", { sessionId, ...params }), }, + /** @experimental */ + connectors: { + /** + * Returns feature availability and bounded polling limits for the EXPERIMENTAL session connector API. This method never performs a Connector service request. + * + * @returns Feature detection and hard polling limits for the EXPERIMENTAL session connector API. + */ + getCapabilities: async (): Promise => + connection.sendRequest("session.connectors.getCapabilities", { sessionId }), + /** + * Returns authoritative session Connector state from current availability, pinned account selection, cached catalog, and live MCP projection without performing a Connector service request. + * + * @returns Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + */ + getStatus: async (): Promise => + connection.sendRequest("session.connectors.getStatus", { sessionId }), + /** + * Returns the cached Connector catalog for the pinned opaque account selection, fetching it only when this session has no cached catalog. + * + * @param params Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + * + * @returns Validated Connector catalog snapshot cached by the session. + */ + list: async (params: ConnectorAccountRequest): Promise => + connection.sendRequest("session.connectors.list", { sessionId, ...params }), + /** + * Refreshes and validates the Connector catalog for the pinned opaque account selection. + * + * @param params Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + * + * @returns Validated Connector catalog snapshot cached by the session. + */ + refresh: async (params: ConnectorAccountRequest): Promise => + connection.sendRequest("session.connectors.refresh", { sessionId, ...params }), + /** + * Initiates an idempotent Connector connection request without opening a browser. Returns connected when the service is immediately authoritative, consent_required with a validated URL, or pending with an opaque continuation ID. + * + * @param params Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + * + * @returns Typed result of initiating or continuing a Connector connection. + */ + connect: async (params: ConnectorConnectRequest): Promise => + connection.sendRequest("session.connectors.connect", { sessionId, ...params }), + /** + * Re-initiates an idempotent Connector connection request without browser or UI effects, with the same typed outcomes as connect. + * + * @param params Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + * + * @returns Typed result of initiating or continuing a Connector connection. + */ + reconnect: async (params: ConnectorConnectRequest): Promise => + connection.sendRequest("session.connectors.reconnect", { sessionId, ...params }), + /** + * Continues a pending Connector connection with caller-supplied attempt, interval, and deadline bounds. The runtime never opens the returned consent URL. + * + * @param params Explicitly bounded continuation of a pending Connector connection. + * + * @returns Typed result of initiating or continuing a Connector connection. + */ + continueConnection: async (params: ConnectorContinueRequest): Promise => + connection.sendRequest("session.connectors.continueConnection", { sessionId, ...params }), + /** + * Disconnects one Connector for the pinned opaque account selection, refreshes the authoritative catalog, and removes its session-owned MCP projection. + * + * @param params Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + * + * @returns Authoritative result after disconnect and MCP reconciliation. + */ + disconnect: async (params: ConnectorConnectRequest): Promise => + connection.sendRequest("session.connectors.disconnect", { sessionId, ...params }), + /** + * Reconciles the authoritative cached or freshly requested Connector catalog into the session Connector MCP projection and returns live status. + * + * @param params Requests authoritative Connector-to-MCP reconciliation for the pinned account. + * + * @returns Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + */ + reconcile: async (params: ConnectorReconcileRequest): Promise => + connection.sendRequest("session.connectors.reconcile", { sessionId, ...params }), + }, }; } diff --git a/nodejs/src/index.ts b/nodejs/src/index.ts index a9244e9e48..475acb4c9a 100644 --- a/nodejs/src/index.ts +++ b/nodejs/src/index.ts @@ -60,6 +60,20 @@ export type { CanvasProviderIdentity, CloudSessionOptions, CloudSessionRepository, + ConnectorAccountRequest, + ConnectorAvailability, + ConnectorCapabilities, + ConnectorCatalogEntry, + ConnectorCatalogResult, + ConnectorCatalogStatus, + ConnectorConnectRequest, + ConnectorConnectResult, + ConnectorContinueRequest, + ConnectorDisconnectResult, + ConnectorMcpStatus, + ConnectorReconcileRequest, + ConnectorRuntimeStatus, + ConnectorStatus, AutoModeSwitchHandler, AutoModeSwitchRequest, AutoModeSwitchResponse, diff --git a/nodejs/src/types.ts b/nodejs/src/types.ts index de332d4a3a..b6a66d39be 100644 --- a/nodejs/src/types.ts +++ b/nodejs/src/types.ts @@ -34,6 +34,20 @@ import type { ToolSet } from "./toolSet.js"; export type { RemoteSessionMode } from "./generated/rpc.js"; export type { CurrentToolMetadata } from "./generated/rpc.js"; export type { + ConnectorAccountRequest, + ConnectorAvailability, + ConnectorCapabilities, + ConnectorCatalogEntry, + ConnectorCatalogResult, + ConnectorCatalogStatus, + ConnectorConnectRequest, + ConnectorConnectResult, + ConnectorContinueRequest, + ConnectorDisconnectResult, + ConnectorMcpStatus, + ConnectorReconcileRequest, + ConnectorRuntimeStatus, + ConnectorStatus, GitHubTokenAcquireReason, GitHubTokenAcquireResult, GitHubTelemetryNotification, diff --git a/nodejs/test/connectors.test.ts b/nodejs/test/connectors.test.ts new file mode 100644 index 0000000000..fbda1b1c8c --- /dev/null +++ b/nodejs/test/connectors.test.ts @@ -0,0 +1,147 @@ +import { describe, expect, it, vi } from "vitest"; +import type { MessageConnection } from "vscode-jsonrpc"; + +import { CopilotSession } from "../src/session.js"; + +describe("session Connector RPC", () => { + it("exposes the complete experimental Connector lifecycle", async () => { + const sendRequest = vi.fn(async (method: string) => { + if (method === "session.connectors.getCapabilities") { + return { + apiVersion: 1, + availability: "enabled", + consentContinuation: true, + opaqueAccountSelection: true, + maxPollAttempts: 30, + maxPollIntervalMs: 2_000, + maxDeadlineMs: 60_000, + }; + } + if (method === "session.connectors.list" || method === "session.connectors.refresh") { + return { revision: 1, refreshedAtMs: 1, connectors: [] }; + } + if (method === "session.connectors.connect") { + return { + kind: "consent_required", + consentUrl: "https://example.com/consent", + continuationId: "continuation-1", + }; + } + if ( + method === "session.connectors.reconnect" || + method === "session.connectors.continueConnection" + ) { + return { kind: "pending", continuationId: "continuation-1" }; + } + if (method === "session.connectors.disconnect") { + return { disconnected: true, status: connectorStatus() }; + } + return connectorStatus(); + }); + const session = new CopilotSession("session-1", { + sendRequest, + } as unknown as MessageConnection); + + expect(await session.rpc.connectors.getCapabilities()).toMatchObject({ + apiVersion: 1, + availability: "enabled", + }); + expect(await session.rpc.connectors.getStatus()).toEqual(connectorStatus()); + expect(await session.rpc.connectors.list({ accountId: "account-1" })).toMatchObject({ + revision: 1, + }); + expect(await session.rpc.connectors.refresh({ accountId: "account-1" })).toMatchObject({ + revision: 1, + }); + expect( + await session.rpc.connectors.connect({ + accountId: "account-1", + connectorName: "calendar", + }) + ).toMatchObject({ kind: "consent_required" }); + expect( + await session.rpc.connectors.reconnect({ + accountId: "account-1", + connectorName: "calendar", + }) + ).toMatchObject({ kind: "pending" }); + expect( + await session.rpc.connectors.continueConnection({ + continuationId: "continuation-1", + maxAttempts: 3, + pollIntervalMs: 100, + deadlineMs: 1_000, + }) + ).toMatchObject({ kind: "pending" }); + expect( + await session.rpc.connectors.disconnect({ + accountId: "account-1", + connectorName: "calendar", + }) + ).toMatchObject({ disconnected: true }); + expect( + await session.rpc.connectors.reconcile({ + accountId: "account-1", + refreshCatalog: true, + }) + ).toEqual(connectorStatus()); + + expect(sendRequest.mock.calls).toEqual([ + ["session.connectors.getCapabilities", { sessionId: "session-1" }], + ["session.connectors.getStatus", { sessionId: "session-1" }], + ["session.connectors.list", { sessionId: "session-1", accountId: "account-1" }], + ["session.connectors.refresh", { sessionId: "session-1", accountId: "account-1" }], + [ + "session.connectors.connect", + { + sessionId: "session-1", + accountId: "account-1", + connectorName: "calendar", + }, + ], + [ + "session.connectors.reconnect", + { + sessionId: "session-1", + accountId: "account-1", + connectorName: "calendar", + }, + ], + [ + "session.connectors.continueConnection", + { + sessionId: "session-1", + continuationId: "continuation-1", + maxAttempts: 3, + pollIntervalMs: 100, + deadlineMs: 1_000, + }, + ], + [ + "session.connectors.disconnect", + { + sessionId: "session-1", + accountId: "account-1", + connectorName: "calendar", + }, + ], + [ + "session.connectors.reconcile", + { + sessionId: "session-1", + accountId: "account-1", + refreshCatalog: true, + }, + ], + ]); + }); +}); + +function connectorStatus() { + return { + apiVersion: 1, + availability: "enabled" as const, + runtimeServers: [], + pendingConnections: 0, + }; +} diff --git a/nodejs/test/shared-codegen.test.ts b/nodejs/test/shared-codegen.test.ts index 54f9d39e94..2bf97f7df4 100644 --- a/nodejs/test/shared-codegen.test.ts +++ b/nodejs/test/shared-codegen.test.ts @@ -1,6 +1,8 @@ +import { readFile } from "node:fs/promises"; import type { JSONSchema7 } from "json-schema"; import { describe, expect, it } from "vitest"; +import { applyConnectorSessionApiOverlay } from "../../scripts/codegen/connectorSessionApiOverlay.ts"; import { collectDefinitionCollections, collectExperimentalOnlyRpcReferencedDefinitionNames, @@ -60,6 +62,57 @@ describe("shared schema definition codegen utilities", () => { ).toBe(false); }); + describe("Connector session API overlay", () => { + async function loadOverlay(): Promise<{ + sessionConnectors: Record; + definitions: Record>; + }> { + return JSON.parse( + await readFile( + new URL( + "../../scripts/codegen/connector-session-api-overlay.json", + import.meta.url + ), + "utf8" + ) + ); + } + + it("installs the complete draft contract and is idempotent", async () => { + const schema = { session: {}, definitions: {} }; + const target = await loadOverlay(); + + expect(applyConnectorSessionApiOverlay(schema, "api.schema.json")).toBe(schema); + expect(schema.session).toEqual({ connectors: target.sessionConnectors }); + expect(schema.definitions).toEqual(target.definitions); + + const before = structuredClone(schema); + expect(applyConnectorSessionApiOverlay(schema, "api.schema.json")).toBe(schema); + expect(schema).toEqual(before); + }); + + it("rejects partial or changed upstream contracts without mutation", async () => { + const target = await loadOverlay(); + const schema = { + session: { connectors: target.sessionConnectors }, + definitions: {}, + }; + const before = structuredClone(schema); + + expect(() => applyConnectorSessionApiOverlay(schema, "api.schema.json")).toThrow( + "partial or unknown upstream contract" + ); + expect(schema).toEqual(before); + }); + + it("ignores non-API schemas", () => { + const schema = { definitions: {} }; + expect(applyConnectorSessionApiOverlay(schema, "session-events.schema.json")).toBe( + schema + ); + }); + }); + it("extracts non-empty enum value descriptions from schema extensions", () => { expect( getEnumValueDescriptions({ diff --git a/python/README.md b/python/README.md index 8debd30676..95eb5343f8 100644 --- a/python/README.md +++ b/python/README.md @@ -338,6 +338,20 @@ Initial acquisition runs during session creation or resume. Cancellation, provid - `available_tools` / `excluded_tools` / `default_agent.excluded_tools` / custom-agent `tools`: MCP tools registered from `mcp_servers` are exposed to the runtime as `-`. For `available_tools` and `excluded_tools`, prefer `ToolSet().add_mcp("-")` or the raw `mcp:-` form. For custom-agent `tools` and `default_agent.excluded_tools`, use `-` directly. +**Copilot Connectors (experimental):** + +`session.rpc.connectors` exposes `get_capabilities`, `get_status`, `list`, +`refresh`, `connect`, `reconnect`, `continue_connection`, `disconnect`, and +`reconcile`. The runtime owns Connector service calls, bounded polling, and MCP +reconciliation. Your application chooses the opaque account ID, opens returned +consent URLs, confirms destructive actions, and renders UI. +Pass only the host-selected account ID; Connector methods do not accept or +return credentials or provider tokens. + +Check `get_capabilities()` before use. Connector support remains default-off +unless enabled by the connected runtime. See +[Using MCP servers](../docs/features/mcp.md#copilot-connectors). + **Session Lifecycle Methods:** ```python diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py index bcf53a1495..e4893c205d 100644 --- a/python/copilot/generated/rpc.py +++ b/python/copilot/generated/rpc.py @@ -1997,6 +1997,159 @@ def to_dict(self) -> dict: result["owner"] = from_str(self.owner) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorAccountRequest: + """Pins a Connector operation to one host-owned GitHub account through its opaque selection + ID. Provider tokens are never accepted. + """ + account_id: str + """Opaque account selection ID previously returned by an account discovery API.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorAccountRequest': + assert isinstance(obj, dict) + account_id = from_str(obj.get("accountId")) + return ConnectorAccountRequest(account_id) + + def to_dict(self) -> dict: + result: dict = {} + result["accountId"] = from_str(self.account_id) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +class ConnectorAvailability(Enum): + """Availability of the EXPERIMENTAL session connector API. + + Current session availability. Disabled availability is reported without making a + Connector request. + + Current feature and session availability. + """ + DISABLED = "disabled" + ENABLED = "enabled" + UNAVAILABLE = "unavailable" + +# Experimental: this type is part of an experimental API and may change or be removed. +class ConnectorCatalogStatus(Enum): + """Current authoritative service connection state. + + Authoritative service connection state for one Connector. + """ + CONNECTED = "connected" + ERROR = "error" + NOT_CONNECTED = "not_connected" + PENDING = "pending" + UNKNOWN = "unknown" + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorConnectRequest: + """Selects one Connector and the pinned host-owned account used for its service and MCP + authorization. + """ + account_id: str + """Opaque account selection ID. It must match the account already pinned to the session, if + any. + """ + connector_name: str + """Canonical Connector name from the current catalog.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorConnectRequest': + assert isinstance(obj, dict) + account_id = from_str(obj.get("accountId")) + connector_name = from_str(obj.get("connectorName")) + return ConnectorConnectRequest(account_id, connector_name) + + def to_dict(self) -> dict: + result: dict = {} + result["accountId"] = from_str(self.account_id) + result["connectorName"] = from_str(self.connector_name) + return result + +class ConnectorConnectResultKind(Enum): + CONNECTED = "connected" + CONSENT_REQUIRED = "consent_required" + PENDING = "pending" + +# Experimental: this type is part of an experimental API and may change or be removed. +class ConnectorMCPStatus(Enum): + """Current live MCP host status. + + Live MCP status of one Connector-owned runtime server. + """ + CONNECTED = "connected" + DISABLED = "disabled" + FAILED = "failed" + NEEDS_AUTH = "needs_auth" + NOT_CONFIGURED = "not_configured" + PENDING = "pending" + STOPPED = "stopped" + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorContinueRequest: + """Explicitly bounded continuation of a pending Connector connection.""" + + continuation_id: str + """Opaque continuation ID returned by connect, reconnect, or an earlier continuation.""" + + deadline_ms: int + """Maximum wall-clock duration in milliseconds for this call. Must be between one and the + capability limit. + """ + max_attempts: int + """Maximum catalog requests made by this call. Must be between one and the capability limit.""" + + poll_interval_ms: int + """Delay in milliseconds between attempts. Must not exceed the capability limit.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorContinueRequest': + assert isinstance(obj, dict) + continuation_id = from_str(obj.get("continuationId")) + deadline_ms = from_int(obj.get("deadlineMs")) + max_attempts = from_int(obj.get("maxAttempts")) + poll_interval_ms = from_int(obj.get("pollIntervalMs")) + return ConnectorContinueRequest(continuation_id, deadline_ms, max_attempts, poll_interval_ms) + + def to_dict(self) -> dict: + result: dict = {} + result["continuationId"] = from_str(self.continuation_id) + result["deadlineMs"] = from_int(self.deadline_ms) + result["maxAttempts"] = from_int(self.max_attempts) + result["pollIntervalMs"] = from_int(self.poll_interval_ms) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorReconcileRequest: + """Requests authoritative Connector-to-MCP reconciliation for the pinned account.""" + + account_id: str + """Opaque account selection ID. It must match the account already pinned to the session, if + any. + """ + refresh_catalog: bool | None = None + """When true, refresh the catalog before reconciling. A disabled Connector API performs no + service request. + """ + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorReconcileRequest': + assert isinstance(obj, dict) + account_id = from_str(obj.get("accountId")) + refresh_catalog = from_union([from_bool, from_none], obj.get("refreshCatalog")) + return ConnectorReconcileRequest(account_id, refresh_catalog) + + def to_dict(self) -> dict: + result: dict = {} + result["accountId"] = from_str(self.account_id) + if self.refresh_catalog is not None: + result["refreshCatalog"] = from_union([from_bool, from_none], self.refresh_catalog) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ContentExclusionCheckPathsRequest: @@ -16945,6 +17098,128 @@ def to_dict(self) -> dict: result["summary"] = from_union([from_str, from_none], self.summary) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorCapabilities: + """Feature detection and hard polling limits for the EXPERIMENTAL session connector API.""" + + api_version: int + """Connector API contract version.""" + + availability: ConnectorAvailability + """Current session availability. Disabled availability is reported without making a + Connector request. + """ + consent_continuation: bool + """Whether connect and reconnect can return an opaque continuation for bounded consent + polling. + """ + max_deadline_ms: int + """Maximum accepted wall-clock deadline in milliseconds for one continuation call.""" + + max_poll_attempts: int + """Maximum accepted polling attempts for one continuation call.""" + + max_poll_interval_ms: int + """Maximum accepted delay in milliseconds between polling attempts.""" + + opaque_account_selection: bool + """Whether callers select a host-owned GitHub account through an opaque selection ID rather + than supplying a provider token. + """ + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorCapabilities': + assert isinstance(obj, dict) + api_version = from_int(obj.get("apiVersion")) + availability = ConnectorAvailability(obj.get("availability")) + consent_continuation = from_bool(obj.get("consentContinuation")) + max_deadline_ms = from_int(obj.get("maxDeadlineMs")) + max_poll_attempts = from_int(obj.get("maxPollAttempts")) + max_poll_interval_ms = from_int(obj.get("maxPollIntervalMs")) + opaque_account_selection = from_bool(obj.get("opaqueAccountSelection")) + return ConnectorCapabilities(api_version, availability, consent_continuation, max_deadline_ms, max_poll_attempts, max_poll_interval_ms, opaque_account_selection) + + def to_dict(self) -> dict: + result: dict = {} + result["apiVersion"] = from_int(self.api_version) + result["availability"] = to_enum(ConnectorAvailability, self.availability) + result["consentContinuation"] = from_bool(self.consent_continuation) + result["maxDeadlineMs"] = from_int(self.max_deadline_ms) + result["maxPollAttempts"] = from_int(self.max_poll_attempts) + result["maxPollIntervalMs"] = from_int(self.max_poll_interval_ms) + result["opaqueAccountSelection"] = from_bool(self.opaque_account_selection) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorCatalogEntry: + """Credential-free Connector catalog entry.""" + + display_name: str + """Untrusted display label from the service.""" + + name: str + """Canonical Connector name used by lifecycle methods.""" + + runtime_server_ids: list[str] + """Opaque stable runtime IDs currently projected into the session for this Connector.""" + + status: ConnectorCatalogStatus + """Current authoritative service connection state.""" + + description: str | None = None + """Untrusted service description, when present.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorCatalogEntry': + assert isinstance(obj, dict) + display_name = from_str(obj.get("displayName")) + name = from_str(obj.get("name")) + runtime_server_ids = from_list(from_str, obj.get("runtimeServerIds")) + status = ConnectorCatalogStatus(obj.get("status")) + description = from_union([from_str, from_none], obj.get("description")) + return ConnectorCatalogEntry(display_name, name, runtime_server_ids, status, description) + + def to_dict(self) -> dict: + result: dict = {} + result["displayName"] = from_str(self.display_name) + result["name"] = from_str(self.name) + result["runtimeServerIds"] = from_list(from_str, self.runtime_server_ids) + result["status"] = to_enum(ConnectorCatalogStatus, self.status) + if self.description is not None: + result["description"] = from_union([from_str, from_none], self.description) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorRuntimeStatus: + """Live status of one session-owned MCP projection.""" + + connector_name: str + """Canonical Connector name that owns this server.""" + + runtime_server_id: str + """Opaque runtime server ID.""" + + status: ConnectorMCPStatus + """Current live MCP host status.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorRuntimeStatus': + assert isinstance(obj, dict) + connector_name = from_str(obj.get("connectorName")) + runtime_server_id = from_str(obj.get("runtimeServerId")) + status = ConnectorMCPStatus(obj.get("status")) + return ConnectorRuntimeStatus(connector_name, runtime_server_id, status) + + def to_dict(self) -> dict: + result: dict = {} + result["connectorName"] = from_str(self.connector_name) + result["runtimeServerId"] = from_str(self.runtime_server_id) + result["status"] = to_enum(ConnectorMCPStatus, self.status) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ContentExclusionCheckPathsResult: @@ -27198,6 +27473,37 @@ def to_dict(self) -> dict: result["sessionId"] = from_str(self.session_id) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorCatalogResult: + """Validated Connector catalog snapshot cached by the session. + + Latest validated catalog snapshot, when available. + """ + connectors: list[ConnectorCatalogEntry] + """Validated catalog entries in service order.""" + + refreshed_at_ms: int + """Unix epoch milliseconds when this snapshot was accepted.""" + + revision: int + """Monotonically increasing session-local catalog revision.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorCatalogResult': + assert isinstance(obj, dict) + connectors = from_list(ConnectorCatalogEntry.from_dict, obj.get("connectors")) + refreshed_at_ms = from_int(obj.get("refreshedAtMs")) + revision = from_int(obj.get("revision")) + return ConnectorCatalogResult(connectors, refreshed_at_ms, revision) + + def to_dict(self) -> dict: + result: dict = {} + result["connectors"] = from_list(lambda x: to_class(ConnectorCatalogEntry, x), self.connectors) + result["refreshedAtMs"] = from_int(self.refreshed_at_ms) + result["revision"] = from_int(self.revision) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class CanvasHostContext: @@ -32022,6 +32328,57 @@ def to_dict(self) -> dict: result["commands"] = from_list(lambda x: to_class(SlashCommandInfo, x), self.commands) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorStatus: + """Fresh authoritative Connector state after MCP reconciliation. + + Authoritative session connector state. Account IDs are opaque routing identifiers and + credentials are never included. + + Fresh authoritative session state after removing Connector-owned MCP servers. + """ + api_version: int + """Connector API contract version.""" + + availability: ConnectorAvailability + """Current feature and session availability.""" + + pending_connections: int + """Number of active opaque connection continuations.""" + + runtime_servers: list[ConnectorRuntimeStatus] + """Live MCP status for every Connector-owned runtime server.""" + + account_id: str | None = None + """Opaque account selection pinned to this session, when one has been selected.""" + + catalog: ConnectorCatalogResult | None = None + """Latest validated catalog snapshot, when available.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorStatus': + assert isinstance(obj, dict) + api_version = from_int(obj.get("apiVersion")) + availability = ConnectorAvailability(obj.get("availability")) + pending_connections = from_int(obj.get("pendingConnections")) + runtime_servers = from_list(ConnectorRuntimeStatus.from_dict, obj.get("runtimeServers")) + account_id = from_union([from_str, from_none], obj.get("accountId")) + catalog = from_union([ConnectorCatalogResult.from_dict, from_none], obj.get("catalog")) + return ConnectorStatus(api_version, availability, pending_connections, runtime_servers, account_id, catalog) + + def to_dict(self) -> dict: + result: dict = {} + result["apiVersion"] = from_int(self.api_version) + result["availability"] = to_enum(ConnectorAvailability, self.availability) + result["pendingConnections"] = from_int(self.pending_connections) + result["runtimeServers"] = from_list(lambda x: to_class(ConnectorRuntimeStatus, x), self.runtime_servers) + if self.account_id is not None: + result["accountId"] = from_union([from_str, from_none], self.account_id) + if self.catalog is not None: + result["catalog"] = from_union([lambda x: to_class(ConnectorCatalogResult, x), from_none], self.catalog) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class CanvasProviderCloseRequest: @@ -33588,6 +33945,77 @@ def to_dict(self) -> dict: result["plan"] = to_class(MCPInstallPlan, self.plan) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorConnectResult: + """Typed result of initiating or continuing a Connector connection. + + The service is connected and the session MCP graph was reconciled. + + Host-owned consent is required before bounded continuation can complete. + + The service is still completing the connection without a consent URL. + """ + kind: ConnectorConnectResultKind + """The service is connected and the session MCP graph was reconciled. + + Host-owned consent is required before bounded continuation can complete. + + The service is still completing the connection without a consent URL. + """ + status: ConnectorStatus | None = None + """Fresh authoritative Connector state after MCP reconciliation.""" + + consent_url: str | None = None + """Validated HTTPS consent URL. The runtime does not open it.""" + + continuation_id: str | None = None + """Opaque ID accepted by continueConnection.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorConnectResult': + assert isinstance(obj, dict) + kind = ConnectorConnectResultKind(obj.get("kind")) + status = from_union([ConnectorStatus.from_dict, from_none], obj.get("status")) + consent_url = from_union([from_str, from_none], obj.get("consentUrl")) + continuation_id = from_union([from_str, from_none], obj.get("continuationId")) + return ConnectorConnectResult(kind, status, consent_url, continuation_id) + + def to_dict(self) -> dict: + result: dict = {} + result["kind"] = to_enum(ConnectorConnectResultKind, self.kind) + if self.status is not None: + result["status"] = from_union([lambda x: to_class(ConnectorStatus, x), from_none], self.status) + if self.consent_url is not None: + result["consentUrl"] = from_union([from_str, from_none], self.consent_url) + if self.continuation_id is not None: + result["continuationId"] = from_union([from_str, from_none], self.continuation_id) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ConnectorDisconnectResult: + """Authoritative result after disconnect and MCP reconciliation.""" + + disconnected: bool + """Whether the service accepted the idempotent disconnect.""" + + status: ConnectorStatus + """Fresh authoritative session state after removing Connector-owned MCP servers.""" + + @staticmethod + def from_dict(obj: Any) -> 'ConnectorDisconnectResult': + assert isinstance(obj, dict) + disconnected = from_bool(obj.get("disconnected")) + status = ConnectorStatus.from_dict(obj.get("status")) + return ConnectorDisconnectResult(disconnected, status) + + def to_dict(self) -> dict: + result: dict = {} + result["disconnected"] = from_bool(self.disconnected) + result["status"] = to_class(ConnectorStatus, self.status) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class FactoryListRunsResult: @@ -38291,6 +38719,20 @@ class RPC: connected_remote_session_metadata: ConnectedRemoteSessionMetadata connected_remote_session_metadata_kind: ConnectedRemoteSessionMetadataKind connected_remote_session_metadata_repository: ConnectedRemoteSessionMetadataRepository + connector_account_request: ConnectorAccountRequest + connector_availability: ConnectorAvailability + connector_capabilities: ConnectorCapabilities + connector_catalog_entry: ConnectorCatalogEntry + connector_catalog_result: ConnectorCatalogResult + connector_catalog_status: ConnectorCatalogStatus + connector_connect_request: ConnectorConnectRequest + connector_connect_result: ConnectorConnectResult + connector_continue_request: ConnectorContinueRequest + connector_disconnect_result: ConnectorDisconnectResult + connector_mcp_status: ConnectorMCPStatus + connector_reconcile_request: ConnectorReconcileRequest + connector_runtime_status: ConnectorRuntimeStatus + connector_status: ConnectorStatus connect_remote_session_params: ConnectRemoteSessionParams connect_request: _ConnectRequest connect_result: _ConnectResult @@ -39566,6 +40008,20 @@ def from_dict(obj: Any) -> 'RPC': connected_remote_session_metadata = ConnectedRemoteSessionMetadata.from_dict(obj.get("ConnectedRemoteSessionMetadata")) connected_remote_session_metadata_kind = ConnectedRemoteSessionMetadataKind(obj.get("ConnectedRemoteSessionMetadataKind")) connected_remote_session_metadata_repository = ConnectedRemoteSessionMetadataRepository.from_dict(obj.get("ConnectedRemoteSessionMetadataRepository")) + connector_account_request = ConnectorAccountRequest.from_dict(obj.get("ConnectorAccountRequest")) + connector_availability = ConnectorAvailability(obj.get("ConnectorAvailability")) + connector_capabilities = ConnectorCapabilities.from_dict(obj.get("ConnectorCapabilities")) + connector_catalog_entry = ConnectorCatalogEntry.from_dict(obj.get("ConnectorCatalogEntry")) + connector_catalog_result = ConnectorCatalogResult.from_dict(obj.get("ConnectorCatalogResult")) + connector_catalog_status = ConnectorCatalogStatus(obj.get("ConnectorCatalogStatus")) + connector_connect_request = ConnectorConnectRequest.from_dict(obj.get("ConnectorConnectRequest")) + connector_connect_result = ConnectorConnectResult.from_dict(obj.get("ConnectorConnectResult")) + connector_continue_request = ConnectorContinueRequest.from_dict(obj.get("ConnectorContinueRequest")) + connector_disconnect_result = ConnectorDisconnectResult.from_dict(obj.get("ConnectorDisconnectResult")) + connector_mcp_status = ConnectorMCPStatus(obj.get("ConnectorMcpStatus")) + connector_reconcile_request = ConnectorReconcileRequest.from_dict(obj.get("ConnectorReconcileRequest")) + connector_runtime_status = ConnectorRuntimeStatus.from_dict(obj.get("ConnectorRuntimeStatus")) + connector_status = ConnectorStatus.from_dict(obj.get("ConnectorStatus")) connect_remote_session_params = ConnectRemoteSessionParams.from_dict(obj.get("ConnectRemoteSessionParams")) connect_request = _ConnectRequest.from_dict(obj.get("ConnectRequest")) connect_result = _ConnectResult.from_dict(obj.get("ConnectResult")) @@ -40667,7 +41123,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, 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_trust_eligibility, catalog_trust_provenance, catalog_trust_snapshot, catalog_trust_snapshot_absent, catalog_trust_snapshot_absent_status, catalog_trust_snapshot_current, catalog_trust_snapshot_current_status, catalog_trust_snapshot_downgraded, catalog_trust_snapshot_downgraded_status, catalog_trust_snapshot_malformed, catalog_trust_snapshot_malformed_status, catalog_trust_snapshot_revoked, catalog_trust_snapshot_revoked_status, catalog_trust_snapshot_schema_version, catalog_trust_snapshot_stale, catalog_trust_snapshot_stale_status, catalog_trust_snapshot_unsupported, catalog_trust_snapshot_unsupported_status, catalog_trust_source, catalog_trust_tier, 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, client_metadata, client_task_cancel_reason, client_task_cancel_request, client_task_cancel_result, command_list, commands_finalize_invocation_effect_request, commands_finalize_invocation_effect_result, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invocation_effect_outcome, commands_invocation_origin, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, completions_get_trigger_characters_result, completions_request_request, completions_request_result, configure_session_extensions_params, connect_client_info, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_exclusion_check_paths_request, content_exclusion_check_paths_result, content_exclusion_path_check, content_filter_mode, context_heaviest_message, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, debug_collect_logs_collected_entry, debug_collect_logs_destination, debug_collect_logs_entry, debug_collect_logs_entry_kind, debug_collect_logs_include, debug_collect_logs_redaction, debug_collect_logs_request, debug_collect_logs_result, debug_collect_logs_result_kind, debug_collect_logs_skipped_entry, debug_collect_logs_source, discovered_canvas, discovered_extension, discovered_extension_mode, discovered_extension_plugin, discovered_extensions, discovered_extensions_disable_request, discovered_extensions_enable_request, discovered_extension_source, discovered_hook, 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_pause_checkpoint_action, factory_pause_checkpoint_request, factory_pause_checkpoint_result, factory_pause_info, factory_pause_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, factory_tool_resume_request, factory_tool_run_options, factory_tool_run_request, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, git_hub_telemetry_client_info, git_hub_telemetry_event, git_hub_telemetry_notification, git_hub_token_acquire_reason, git_hub_token_acquire_request, git_hub_token_acquire_result, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_clear_context_request, history_clear_context_result, history_compact_context_window, history_compact_request, history_compact_result, history_file_restore_skip_reason, history_list_rewind_points_result, history_preview_rewind_request, history_preview_rewind_result, history_rewind_change_type, history_rewind_file_preview, history_rewind_mode, history_rewind_outcome, history_rewind_point, history_rewind_request, history_rewind_result, history_rewind_unavailable_reason, history_skipped_file_restore, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, hook_invoke_request, hook_invoke_response, hook_origin, hooks_discover_request, hooks_discover_result, 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, json_schema_response_format, 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_mcp_server_config, 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_source_file, mcp_source_plugin, mcp_source_ref, 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, metadata_update_client_metadata_request, model, model_apply_startup_overlay_request, model_billing, model_billing_promo, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_message, model_picker_category, model_picker_persistence_request, model_picker_price_category, model_picker_settings_context, model_policy, model_policy_state, model_set_allowed_models_request, model_set_allowed_models_result, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_auto_tier_request, model_switch_auto_tier_result, model_switch_auto_tier_status, model_switch_confirmation, model_switch_to_request, model_switch_to_result, model_warning_text, mode_set_request, mode_set_result, move_mcp_loading_to_background_result, named_provider_config, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_env_access, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_factory, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_env_access, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_factory, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_context, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_outcome, permission_decision_reject, permission_decision_request, permission_decision_surface, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_mode_source, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_response_capability, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_mode_request, permissions_get_mode_result, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_env_access, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_factory, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_mode_request, permissions_set_mode_result, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_install_staging_mode, 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_append_mode, protocol_customize_mode, protocol_external_tool_defer, protocol_external_tool_definition, protocol_marker_section_override, protocol_replace_mode, protocol_section_override, protocol_static_section_action, protocol_static_section_override, protocol_system_message_append_config, protocol_system_message_config, protocol_system_message_customize_config, protocol_system_message_replace_config, 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, 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, response_format, run_options, sandbox_config, sandbox_config_auth, sandbox_config_source, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, sandbox_config_user_policy_network_proxy, sandbox_config_user_policy_seatbelt, sandbox_disable_for_session_request, sandbox_disable_for_session_result, sandbox_enforcement_status, sandbox_session_change, 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_factory_pause_at_checkpoint_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_client_metadata_entry, 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_client_metadata_request, sessions_get_client_metadata_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_read_persisted_events_request, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_visibility_status, session_working_directory_context, session_working_directory_context_host_type, settable_auth_info, settable_token_auth_info, shell_cancel_user_requested_request, shell_credentials, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_init_profile, shell_init_script, shell_init_script_shell, shell_kill_request, shell_kill_result, shell_kill_signal, shell_options, shutdown_request, skill, skill_discovery_path, skill_discovery_path_list, skill_discovery_scope, skill_list, skill_provider_descriptor, skill_provider_list_request, skill_provider_list_result, skill_provider_read_request, skill_provider_read_result, 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, system_message_block, task_agent_info, task_agent_progress, task_client_active_status, task_client_execution_mode, task_client_info, task_client_owner, task_client_owner_kind, task_client_owner_presence, task_client_progress, task_client_status, task_client_type, task_client_update, task_complete_data, task_completion_decision, task_execution_mode, task_info, task_kind, 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_register_request, tasks_register_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_update_request, tasks_update_result, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, token_provider_auth_info, tool, tool_list, tool_result, tool_result_expanded, tool_result_new_message, tool_result_type, tools_execute_request, tools_get_builtin_descriptors_request, tools_get_builtin_descriptors_result, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_set_request, tools_set_result, tools_shell_descriptor_config, tools_task_complete_event_data_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_session_limits_exhausted_request, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_session_limits_exhausted_response, ui_session_limits_exhausted_response_action, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_agent_metric, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, user_setting_metadata, user_settings_get_result, user_settings_set_request, user_settings_set_result, visibility_get_result, visibility_set_request, visibility_set_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_add_summary_request, workspaces_add_summary_result, workspaces_autopilot_objective_exists_result, workspaces_checkpoints, workspaces_create_directory_request, 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_remove_path_request, workspaces_rename_path_request, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspaces_stat_file_request, workspaces_stat_file_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_trust_eligibility, catalog_trust_provenance, catalog_trust_snapshot, catalog_trust_snapshot_absent, catalog_trust_snapshot_absent_status, catalog_trust_snapshot_current, catalog_trust_snapshot_current_status, catalog_trust_snapshot_downgraded, catalog_trust_snapshot_downgraded_status, catalog_trust_snapshot_malformed, catalog_trust_snapshot_malformed_status, catalog_trust_snapshot_revoked, catalog_trust_snapshot_revoked_status, catalog_trust_snapshot_schema_version, catalog_trust_snapshot_stale, catalog_trust_snapshot_stale_status, catalog_trust_snapshot_unsupported, catalog_trust_snapshot_unsupported_status, catalog_trust_source, catalog_trust_tier, 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, client_metadata, client_task_cancel_reason, client_task_cancel_request, client_task_cancel_result, command_list, commands_finalize_invocation_effect_request, commands_finalize_invocation_effect_result, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invocation_effect_outcome, commands_invocation_origin, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, completions_get_trigger_characters_result, completions_request_request, completions_request_result, configure_session_extensions_params, connect_client_info, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connector_account_request, connector_availability, connector_capabilities, connector_catalog_entry, connector_catalog_result, connector_catalog_status, connector_connect_request, connector_connect_result, connector_continue_request, connector_disconnect_result, connector_mcp_status, connector_reconcile_request, connector_runtime_status, connector_status, connect_remote_session_params, connect_request, connect_result, content_exclusion_check_paths_request, content_exclusion_check_paths_result, content_exclusion_path_check, content_filter_mode, context_heaviest_message, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, debug_collect_logs_collected_entry, debug_collect_logs_destination, debug_collect_logs_entry, debug_collect_logs_entry_kind, debug_collect_logs_include, debug_collect_logs_redaction, debug_collect_logs_request, debug_collect_logs_result, debug_collect_logs_result_kind, debug_collect_logs_skipped_entry, debug_collect_logs_source, discovered_canvas, discovered_extension, discovered_extension_mode, discovered_extension_plugin, discovered_extensions, discovered_extensions_disable_request, discovered_extensions_enable_request, discovered_extension_source, discovered_hook, 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_pause_checkpoint_action, factory_pause_checkpoint_request, factory_pause_checkpoint_result, factory_pause_info, factory_pause_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, factory_tool_resume_request, factory_tool_run_options, factory_tool_run_request, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, git_hub_telemetry_client_info, git_hub_telemetry_event, git_hub_telemetry_notification, git_hub_token_acquire_reason, git_hub_token_acquire_request, git_hub_token_acquire_result, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_clear_context_request, history_clear_context_result, history_compact_context_window, history_compact_request, history_compact_result, history_file_restore_skip_reason, history_list_rewind_points_result, history_preview_rewind_request, history_preview_rewind_result, history_rewind_change_type, history_rewind_file_preview, history_rewind_mode, history_rewind_outcome, history_rewind_point, history_rewind_request, history_rewind_result, history_rewind_unavailable_reason, history_skipped_file_restore, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, hook_invoke_request, hook_invoke_response, hook_origin, hooks_discover_request, hooks_discover_result, 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, json_schema_response_format, 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_mcp_server_config, 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_source_file, mcp_source_plugin, mcp_source_ref, 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, metadata_update_client_metadata_request, model, model_apply_startup_overlay_request, model_billing, model_billing_promo, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_message, model_picker_category, model_picker_persistence_request, model_picker_price_category, model_picker_settings_context, model_policy, model_policy_state, model_set_allowed_models_request, model_set_allowed_models_result, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_auto_tier_request, model_switch_auto_tier_result, model_switch_auto_tier_status, model_switch_confirmation, model_switch_to_request, model_switch_to_result, model_warning_text, mode_set_request, mode_set_result, move_mcp_loading_to_background_result, named_provider_config, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_env_access, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_factory, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_env_access, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_factory, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_context, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_outcome, permission_decision_reject, permission_decision_request, permission_decision_surface, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_mode_source, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_response_capability, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_mode_request, permissions_get_mode_result, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_env_access, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_factory, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_mode_request, permissions_set_mode_result, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_install_staging_mode, 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_append_mode, protocol_customize_mode, protocol_external_tool_defer, protocol_external_tool_definition, protocol_marker_section_override, protocol_replace_mode, protocol_section_override, protocol_static_section_action, protocol_static_section_override, protocol_system_message_append_config, protocol_system_message_config, protocol_system_message_customize_config, protocol_system_message_replace_config, 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, 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, response_format, run_options, sandbox_config, sandbox_config_auth, sandbox_config_source, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, sandbox_config_user_policy_network_proxy, sandbox_config_user_policy_seatbelt, sandbox_disable_for_session_request, sandbox_disable_for_session_result, sandbox_enforcement_status, sandbox_session_change, 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_factory_pause_at_checkpoint_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_client_metadata_entry, 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_client_metadata_request, sessions_get_client_metadata_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_read_persisted_events_request, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_visibility_status, session_working_directory_context, session_working_directory_context_host_type, settable_auth_info, settable_token_auth_info, shell_cancel_user_requested_request, shell_credentials, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_init_profile, shell_init_script, shell_init_script_shell, shell_kill_request, shell_kill_result, shell_kill_signal, shell_options, shutdown_request, skill, skill_discovery_path, skill_discovery_path_list, skill_discovery_scope, skill_list, skill_provider_descriptor, skill_provider_list_request, skill_provider_list_result, skill_provider_read_request, skill_provider_read_result, 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, system_message_block, task_agent_info, task_agent_progress, task_client_active_status, task_client_execution_mode, task_client_info, task_client_owner, task_client_owner_kind, task_client_owner_presence, task_client_progress, task_client_status, task_client_type, task_client_update, task_complete_data, task_completion_decision, task_execution_mode, task_info, task_kind, 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_register_request, tasks_register_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_update_request, tasks_update_result, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, token_provider_auth_info, tool, tool_list, tool_result, tool_result_expanded, tool_result_new_message, tool_result_type, tools_execute_request, tools_get_builtin_descriptors_request, tools_get_builtin_descriptors_result, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_set_request, tools_set_result, tools_shell_descriptor_config, tools_task_complete_event_data_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_session_limits_exhausted_request, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_session_limits_exhausted_response, ui_session_limits_exhausted_response_action, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_agent_metric, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, user_setting_metadata, user_settings_get_result, user_settings_set_request, user_settings_set_result, visibility_get_result, visibility_set_request, visibility_set_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_add_summary_request, workspaces_add_summary_result, workspaces_autopilot_objective_exists_result, workspaces_checkpoints, workspaces_create_directory_request, 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_remove_path_request, workspaces_rename_path_request, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspaces_stat_file_request, workspaces_stat_file_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 = {} @@ -40841,6 +41297,20 @@ def to_dict(self) -> dict: result["ConnectedRemoteSessionMetadata"] = to_class(ConnectedRemoteSessionMetadata, self.connected_remote_session_metadata) result["ConnectedRemoteSessionMetadataKind"] = to_enum(ConnectedRemoteSessionMetadataKind, self.connected_remote_session_metadata_kind) result["ConnectedRemoteSessionMetadataRepository"] = to_class(ConnectedRemoteSessionMetadataRepository, self.connected_remote_session_metadata_repository) + result["ConnectorAccountRequest"] = to_class(ConnectorAccountRequest, self.connector_account_request) + result["ConnectorAvailability"] = to_enum(ConnectorAvailability, self.connector_availability) + result["ConnectorCapabilities"] = to_class(ConnectorCapabilities, self.connector_capabilities) + result["ConnectorCatalogEntry"] = to_class(ConnectorCatalogEntry, self.connector_catalog_entry) + result["ConnectorCatalogResult"] = to_class(ConnectorCatalogResult, self.connector_catalog_result) + result["ConnectorCatalogStatus"] = to_enum(ConnectorCatalogStatus, self.connector_catalog_status) + result["ConnectorConnectRequest"] = to_class(ConnectorConnectRequest, self.connector_connect_request) + result["ConnectorConnectResult"] = to_class(ConnectorConnectResult, self.connector_connect_result) + result["ConnectorContinueRequest"] = to_class(ConnectorContinueRequest, self.connector_continue_request) + result["ConnectorDisconnectResult"] = to_class(ConnectorDisconnectResult, self.connector_disconnect_result) + result["ConnectorMcpStatus"] = to_enum(ConnectorMCPStatus, self.connector_mcp_status) + result["ConnectorReconcileRequest"] = to_class(ConnectorReconcileRequest, self.connector_reconcile_request) + result["ConnectorRuntimeStatus"] = to_class(ConnectorRuntimeStatus, self.connector_runtime_status) + result["ConnectorStatus"] = to_class(ConnectorStatus, self.connector_status) result["ConnectRemoteSessionParams"] = to_class(ConnectRemoteSessionParams, self.connect_remote_session_params) result["ConnectRequest"] = to_class(_ConnectRequest, self.connect_request) result["ConnectResult"] = to_class(_ConnectResult, self.connect_result) @@ -44613,6 +45083,63 @@ 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 ConnectorsApi: + def __init__(self, client: "JsonRpcClient", session_id: str): + self._client = client + self._session_id = session_id + + async def get_capabilities(self, *, timeout: float | None = None) -> ConnectorCapabilities: + "Returns feature availability and bounded polling limits for the EXPERIMENTAL session connector API. This method never performs a Connector service request.\n\nReturns:\n Feature detection and hard polling limits for the EXPERIMENTAL session connector API." + return ConnectorCapabilities.from_dict(await self._client.request("session.connectors.getCapabilities", {"sessionId": self._session_id}, **_timeout_kwargs(timeout))) + + async def get_status(self, *, timeout: float | None = None) -> ConnectorStatus: + "Returns authoritative session Connector state from current availability, pinned account selection, cached catalog, and live MCP projection without performing a Connector service request.\n\nReturns:\n Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included." + return ConnectorStatus.from_dict(await self._client.request("session.connectors.getStatus", {"sessionId": self._session_id}, **_timeout_kwargs(timeout))) + + async def list(self, params: ConnectorAccountRequest, *, timeout: float | None = None) -> ConnectorCatalogResult: + "Returns the cached Connector catalog for the pinned opaque account selection, fetching it only when this session has no cached catalog.\n\nArgs:\n params: Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted.\n\nReturns:\n Validated Connector catalog snapshot cached by the session." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ConnectorCatalogResult.from_dict(await self._client.request("session.connectors.list", params_dict, **_timeout_kwargs(timeout))) + + async def refresh(self, params: ConnectorAccountRequest, *, timeout: float | None = None) -> ConnectorCatalogResult: + "Refreshes and validates the Connector catalog for the pinned opaque account selection.\n\nArgs:\n params: Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted.\n\nReturns:\n Validated Connector catalog snapshot cached by the session." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ConnectorCatalogResult.from_dict(await self._client.request("session.connectors.refresh", params_dict, **_timeout_kwargs(timeout))) + + async def connect(self, params: ConnectorConnectRequest, *, timeout: float | None = None) -> ConnectorConnectResult: + "Initiates an idempotent Connector connection request without opening a browser. Returns connected when the service is immediately authoritative, consent_required with a validated URL, or pending with an opaque continuation ID.\n\nArgs:\n params: Selects one Connector and the pinned host-owned account used for its service and MCP authorization.\n\nReturns:\n Typed result of initiating or continuing a Connector connection." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ConnectorConnectResult.from_dict(await self._client.request("session.connectors.connect", params_dict, **_timeout_kwargs(timeout))) + + async def reconnect(self, params: ConnectorConnectRequest, *, timeout: float | None = None) -> ConnectorConnectResult: + "Re-initiates an idempotent Connector connection request without browser or UI effects, with the same typed outcomes as connect.\n\nArgs:\n params: Selects one Connector and the pinned host-owned account used for its service and MCP authorization.\n\nReturns:\n Typed result of initiating or continuing a Connector connection." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ConnectorConnectResult.from_dict(await self._client.request("session.connectors.reconnect", params_dict, **_timeout_kwargs(timeout))) + + async def continue_connection(self, params: ConnectorContinueRequest, *, timeout: float | None = None) -> ConnectorConnectResult: + "Continues a pending Connector connection with caller-supplied attempt, interval, and deadline bounds. The runtime never opens the returned consent URL.\n\nArgs:\n params: Explicitly bounded continuation of a pending Connector connection.\n\nReturns:\n Typed result of initiating or continuing a Connector connection." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ConnectorConnectResult.from_dict(await self._client.request("session.connectors.continueConnection", params_dict, **_timeout_kwargs(timeout))) + + async def disconnect(self, params: ConnectorConnectRequest, *, timeout: float | None = None) -> ConnectorDisconnectResult: + "Disconnects one Connector for the pinned opaque account selection, refreshes the authoritative catalog, and removes its session-owned MCP projection.\n\nArgs:\n params: Selects one Connector and the pinned host-owned account used for its service and MCP authorization.\n\nReturns:\n Authoritative result after disconnect and MCP reconciliation." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ConnectorDisconnectResult.from_dict(await self._client.request("session.connectors.disconnect", params_dict, **_timeout_kwargs(timeout))) + + async def reconcile(self, params: ConnectorReconcileRequest, *, timeout: float | None = None) -> ConnectorStatus: + "Reconciles the authoritative cached or freshly requested Connector catalog into the session Connector MCP projection and returns live status.\n\nArgs:\n params: Requests authoritative Connector-to-MCP reconciliation for the pinned account.\n\nReturns:\n Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ConnectorStatus.from_dict(await self._client.request("session.connectors.reconcile", params_dict, **_timeout_kwargs(timeout))) + + class SessionRpc: """Typed session-scoped RPC methods.""" def __init__(self, client: "JsonRpcClient", session_id: str): @@ -44657,6 +45184,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.connectors = ConnectorsApi(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." @@ -45526,6 +46054,22 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "ConnectedRemoteSessionMetadata", "ConnectedRemoteSessionMetadataKind", "ConnectedRemoteSessionMetadataRepository", + "ConnectorAccountRequest", + "ConnectorAvailability", + "ConnectorCapabilities", + "ConnectorCatalogEntry", + "ConnectorCatalogResult", + "ConnectorCatalogStatus", + "ConnectorConnectRequest", + "ConnectorConnectResult", + "ConnectorConnectResultKind", + "ConnectorContinueRequest", + "ConnectorDisconnectResult", + "ConnectorMCPStatus", + "ConnectorReconcileRequest", + "ConnectorRuntimeStatus", + "ConnectorStatus", + "ConnectorsApi", "ContentExclusionApi", "ContentExclusionCheckPathsRequest", "ContentExclusionCheckPathsResult", diff --git a/python/test_connectors.py b/python/test_connectors.py new file mode 100644 index 0000000000..b57dae426f --- /dev/null +++ b/python/test_connectors.py @@ -0,0 +1,148 @@ +from unittest.mock import AsyncMock, Mock + +import pytest + +from copilot.generated.rpc import ( + ConnectorAccountRequest, + ConnectorAvailability, + ConnectorConnectRequest, + ConnectorConnectResultKind, + ConnectorContinueRequest, + ConnectorReconcileRequest, +) +from copilot.session import CopilotSession + + +@pytest.mark.asyncio +async def test_session_connectors_exposes_complete_runtime_api(): + transport = Mock() + transport.request = AsyncMock(side_effect=connector_response) + session = CopilotSession("session-1", transport) + + capabilities = await session.rpc.connectors.get_capabilities() + assert capabilities.availability is ConnectorAvailability.ENABLED + assert (await session.rpc.connectors.get_status()).api_version == 1 + assert ( + await session.rpc.connectors.list(ConnectorAccountRequest(account_id="account-1")) + ).revision == 1 + assert ( + await session.rpc.connectors.refresh(ConnectorAccountRequest(account_id="account-1")) + ).revision == 1 + + request = ConnectorConnectRequest(account_id="account-1", connector_name="calendar") + consent = await session.rpc.connectors.connect(request) + assert consent.kind is ConnectorConnectResultKind.CONSENT_REQUIRED + assert consent.consent_url == "https://example.com/consent" + assert consent.continuation_id == "continuation-1" + + reconnect = await session.rpc.connectors.reconnect(request) + assert reconnect.kind is ConnectorConnectResultKind.PENDING + assert reconnect.continuation_id == "continuation-1" + + continued = await session.rpc.connectors.continue_connection( + ConnectorContinueRequest( + continuation_id="continuation-1", + max_attempts=3, + poll_interval_ms=100, + deadline_ms=1_000, + ) + ) + assert continued.kind is ConnectorConnectResultKind.PENDING + assert continued.continuation_id == "continuation-1" + + assert (await session.rpc.connectors.disconnect(request)).disconnected + assert ( + await session.rpc.connectors.reconcile( + ConnectorReconcileRequest(account_id="account-1", refresh_catalog=True) + ) + ).api_version == 1 + + assert [(call.args[0], call.args[1]) for call in transport.request.await_args_list] == [ + ("session.connectors.getCapabilities", {"sessionId": "session-1"}), + ("session.connectors.getStatus", {"sessionId": "session-1"}), + ( + "session.connectors.list", + {"accountId": "account-1", "sessionId": "session-1"}, + ), + ( + "session.connectors.refresh", + {"accountId": "account-1", "sessionId": "session-1"}, + ), + ( + "session.connectors.connect", + { + "accountId": "account-1", + "connectorName": "calendar", + "sessionId": "session-1", + }, + ), + ( + "session.connectors.reconnect", + { + "accountId": "account-1", + "connectorName": "calendar", + "sessionId": "session-1", + }, + ), + ( + "session.connectors.continueConnection", + { + "continuationId": "continuation-1", + "deadlineMs": 1_000, + "maxAttempts": 3, + "pollIntervalMs": 100, + "sessionId": "session-1", + }, + ), + ( + "session.connectors.disconnect", + { + "accountId": "account-1", + "connectorName": "calendar", + "sessionId": "session-1", + }, + ), + ( + "session.connectors.reconcile", + { + "accountId": "account-1", + "refreshCatalog": True, + "sessionId": "session-1", + }, + ), + ] + + +def connector_response(method, _params, **_kwargs): + if method == "session.connectors.getCapabilities": + return { + "apiVersion": 1, + "availability": "enabled", + "consentContinuation": True, + "opaqueAccountSelection": True, + "maxPollAttempts": 30, + "maxPollIntervalMs": 2_000, + "maxDeadlineMs": 60_000, + } + if method in ("session.connectors.list", "session.connectors.refresh"): + return {"revision": 1, "refreshedAtMs": 1, "connectors": []} + if method == "session.connectors.connect": + return { + "kind": "consent_required", + "consentUrl": "https://example.com/consent", + "continuationId": "continuation-1", + } + if method in ("session.connectors.reconnect", "session.connectors.continueConnection"): + return {"kind": "pending", "continuationId": "continuation-1"} + if method == "session.connectors.disconnect": + return {"disconnected": True, "status": connector_status()} + return connector_status() + + +def connector_status(): + return { + "apiVersion": 1, + "availability": "enabled", + "runtimeServers": [], + "pendingConnections": 0, + } diff --git a/rust/README.md b/rust/README.md index bde9c26215..2e1f291398 100644 --- a/rust/README.md +++ b/rust/README.md @@ -257,6 +257,53 @@ New RPCs land in the namespace immediately as the schema regenerates; helpers are added on top only when an ergonomic story is worth the maintenance. +#### Connectors (experimental) + +When the experimental runtime Connector API is available, use the generated +session-scoped namespace to discover and manage Connectors: + +```rust,ignore +use github_copilot_sdk::rpc::{ + ConnectorAccountRequest, ConnectorAvailability, ConnectorConnectRequest, + ConnectorReconcileRequest, +}; + +let capabilities = session.rpc().connectors().get_capabilities().await?; +if capabilities.availability == ConnectorAvailability::Enabled { + let account_id = "selected-account".to_string(); + let catalog = session + .rpc() + .connectors() + .list(ConnectorAccountRequest { + account_id: account_id.clone(), + }) + .await?; + session + .rpc() + .connectors() + .reconcile(ConnectorReconcileRequest { + account_id: account_id.clone(), + refresh_catalog: None, + }) + .await?; + let connection = session + .rpc() + .connectors() + .connect(ConnectorConnectRequest { + account_id, + connector_name: catalog.connectors[0].name.clone(), + }) + .await?; +} +``` + +The namespace also provides `get_status`, `refresh`, `reconnect`, +`continue_connection`, `disconnect`, and `reconcile`. Hosts select an opaque +GitHub account ID and own consent and browser UI. Connector methods accept only +that account ID, never credentials or provider tokens; the runtime returns +validated consent URLs and owns MCP reconciliation. This API is experimental, +so check its reported availability before use. + ### Handler Traits The SDK exposes five focused handler traits, one per CLI callback type. Implement only the traits you need and install each with the matching `SessionConfig` setter. Each trait has a single `async fn handle(...)` method: diff --git a/rust/src/generated/api_types.rs b/rust/src/generated/api_types.rs index 3e8b45a72b..b81e2e23ef 100644 --- a/rust/src/generated/api_types.rs +++ b/rust/src/generated/api_types.rs @@ -771,6 +771,24 @@ 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.connectors.getCapabilities` + pub const SESSION_CONNECTORS_GETCAPABILITIES: &str = "session.connectors.getCapabilities"; + /// `session.connectors.getStatus` + pub const SESSION_CONNECTORS_GETSTATUS: &str = "session.connectors.getStatus"; + /// `session.connectors.list` + pub const SESSION_CONNECTORS_LIST: &str = "session.connectors.list"; + /// `session.connectors.refresh` + pub const SESSION_CONNECTORS_REFRESH: &str = "session.connectors.refresh"; + /// `session.connectors.connect` + pub const SESSION_CONNECTORS_CONNECT: &str = "session.connectors.connect"; + /// `session.connectors.reconnect` + pub const SESSION_CONNECTORS_RECONNECT: &str = "session.connectors.reconnect"; + /// `session.connectors.continueConnection` + pub const SESSION_CONNECTORS_CONTINUECONNECTION: &str = "session.connectors.continueConnection"; + /// `session.connectors.disconnect` + pub const SESSION_CONNECTORS_DISCONNECT: &str = "session.connectors.disconnect"; + /// `session.connectors.reconcile` + pub const SESSION_CONNECTORS_RECONCILE: &str = "session.connectors.reconcile"; /// `skillProvider.list` pub const SKILLPROVIDER_LIST: &str = "skillProvider.list"; /// `skillProvider.read` @@ -22823,6 +22841,263 @@ pub struct WorkspacesWriteAutopilotObjectiveResult { pub operation: String, } +/// Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. +/// +///

+/// +/// **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 ConnectorAccountRequest { + /// Opaque account selection ID previously returned by an account discovery API. + pub account_id: String, +} + +/// Feature detection and hard polling limits for the EXPERIMENTAL session connector API. +/// +///
+/// +/// **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 ConnectorCapabilities { + /// Connector API contract version. + pub api_version: i64, + /// Current session availability. Disabled availability is reported without making a Connector request. + pub availability: ConnectorAvailability, + /// Whether connect and reconnect can return an opaque continuation for bounded consent polling. + pub consent_continuation: bool, + /// Maximum accepted wall-clock deadline in milliseconds for one continuation call. + pub max_deadline_ms: i64, + /// Maximum accepted polling attempts for one continuation call. + pub max_poll_attempts: i64, + /// Maximum accepted delay in milliseconds between polling attempts. + pub max_poll_interval_ms: i64, + /// Whether callers select a host-owned GitHub account through an opaque selection ID rather than supplying a provider token. + pub opaque_account_selection: bool, +} + +/// Credential-free Connector catalog entry. +/// +///
+/// +/// **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 ConnectorCatalogEntry { + /// Untrusted service description, when present. + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Untrusted display label from the service. + pub display_name: String, + /// Canonical Connector name used by lifecycle methods. + pub name: String, + /// Opaque stable runtime IDs currently projected into the session for this Connector. + pub runtime_server_ids: Vec, + /// Current authoritative service connection state. + pub status: ConnectorCatalogStatus, +} + +/// Validated Connector catalog snapshot cached by the 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 ConnectorCatalogResult { + /// Validated catalog entries in service order. + pub connectors: Vec, + /// Unix epoch milliseconds when this snapshot was accepted. + pub refreshed_at_ms: i64, + /// Monotonically increasing session-local catalog revision. + pub revision: i64, +} + +/// Selects one Connector and the pinned host-owned account used for its service and MCP authorization. +/// +///
+/// +/// **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 ConnectorConnectRequest { + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + pub account_id: String, + /// Canonical Connector name from the current catalog. + pub connector_name: String, +} + +/// Live status of one session-owned MCP projection. +/// +///
+/// +/// **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 ConnectorRuntimeStatus { + /// Canonical Connector name that owns this server. + pub connector_name: String, + /// Opaque runtime server ID. + pub runtime_server_id: String, + /// Current live MCP host status. + pub status: ConnectorMcpStatus, +} + +/// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. +/// +///
+/// +/// **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 ConnectorStatus { + /// Opaque account selection pinned to this session, when one has been selected. + #[serde(skip_serializing_if = "Option::is_none")] + pub account_id: Option, + /// Connector API contract version. + pub api_version: i64, + /// Current feature and session availability. + pub availability: ConnectorAvailability, + /// Latest validated catalog snapshot, when available. + #[serde(skip_serializing_if = "Option::is_none")] + pub catalog: Option, + /// Number of active opaque connection continuations. + pub pending_connections: i64, + /// Live MCP status for every Connector-owned runtime server. + pub runtime_servers: Vec, +} + +/// The service is connected and the session MCP graph was reconciled. +/// +///
+/// +/// **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 ConnectorConnectResultConnected { + /// The service is connected and the session MCP graph was reconciled. + pub kind: ConnectorConnectResultConnectedKind, + /// Fresh authoritative Connector state after MCP reconciliation. + pub status: ConnectorStatus, +} + +/// Host-owned consent is required before bounded continuation can complete. +/// +///
+/// +/// **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 ConnectorConnectResultConsentRequired { + /// Validated HTTPS consent URL. The runtime does not open it. + pub consent_url: String, + /// Opaque ID accepted by continueConnection. + pub continuation_id: String, + /// Host-owned consent is required before bounded continuation can complete. + pub kind: ConnectorConnectResultConsentRequiredKind, +} + +/// The service is still completing the connection without a consent URL. +/// +///
+/// +/// **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 ConnectorConnectResultPending { + /// Opaque ID accepted by continueConnection. + pub continuation_id: String, + /// The service is still completing the connection without a consent URL. + pub kind: ConnectorConnectResultPendingKind, +} + +/// Explicitly bounded continuation of a pending Connector connection. +/// +///
+/// +/// **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 ConnectorContinueRequest { + /// Opaque continuation ID returned by connect, reconnect, or an earlier continuation. + pub continuation_id: String, + /// Maximum wall-clock duration in milliseconds for this call. Must be between one and the capability limit. + pub deadline_ms: i32, + /// Maximum catalog requests made by this call. Must be between one and the capability limit. + pub max_attempts: i32, + /// Delay in milliseconds between attempts. Must not exceed the capability limit. + pub poll_interval_ms: i32, +} + +/// Authoritative result after disconnect and MCP reconciliation. +/// +///
+/// +/// **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 ConnectorDisconnectResult { + /// Whether the service accepted the idempotent disconnect. + pub disconnected: bool, + /// Fresh authoritative session state after removing Connector-owned MCP servers. + pub status: ConnectorStatus, +} + +/// Requests authoritative Connector-to-MCP reconciliation for the pinned account. +/// +///
+/// +/// **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 ConnectorReconcileRequest { + /// Opaque account selection ID. It must match the account already pinned to the session, if any. + pub account_id: String, + /// When true, refresh the catalog before reconciling. A disabled Connector API performs no service request. + #[serde(skip_serializing_if = "Option::is_none")] + pub refresh_catalog: Option, +} + /// List of Copilot models available to the resolved user, including capabilities and billing metadata. /// ///
@@ -28737,6 +29012,172 @@ 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 SessionConnectorsGetCapabilitiesParams { + /// Target session identifier + pub session_id: SessionId, +} + +/// Feature detection and hard polling limits for the EXPERIMENTAL session connector API. +/// +///
+/// +/// **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 SessionConnectorsGetCapabilitiesResult { + /// Connector API contract version. + pub api_version: i64, + /// Current session availability. Disabled availability is reported without making a Connector request. + pub availability: ConnectorAvailability, + /// Whether connect and reconnect can return an opaque continuation for bounded consent polling. + pub consent_continuation: bool, + /// Maximum accepted wall-clock deadline in milliseconds for one continuation call. + pub max_deadline_ms: i64, + /// Maximum accepted polling attempts for one continuation call. + pub max_poll_attempts: i64, + /// Maximum accepted delay in milliseconds between polling attempts. + pub max_poll_interval_ms: i64, + /// Whether callers select a host-owned GitHub account through an opaque selection ID rather than supplying a provider token. + pub opaque_account_selection: bool, +} + +/// 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 SessionConnectorsGetStatusParams { + /// Target session identifier + pub session_id: SessionId, +} + +/// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. +/// +///
+/// +/// **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 SessionConnectorsGetStatusResult { + /// Opaque account selection pinned to this session, when one has been selected. + #[serde(skip_serializing_if = "Option::is_none")] + pub account_id: Option, + /// Connector API contract version. + pub api_version: i64, + /// Current feature and session availability. + pub availability: ConnectorAvailability, + /// Latest validated catalog snapshot, when available. + #[serde(skip_serializing_if = "Option::is_none")] + pub catalog: Option, + /// Number of active opaque connection continuations. + pub pending_connections: i64, + /// Live MCP status for every Connector-owned runtime server. + pub runtime_servers: Vec, +} + +/// Validated Connector catalog snapshot cached by the 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 SessionConnectorsListResult { + /// Validated catalog entries in service order. + pub connectors: Vec, + /// Unix epoch milliseconds when this snapshot was accepted. + pub refreshed_at_ms: i64, + /// Monotonically increasing session-local catalog revision. + pub revision: i64, +} + +/// Validated Connector catalog snapshot cached by the 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 SessionConnectorsRefreshResult { + /// Validated catalog entries in service order. + pub connectors: Vec, + /// Unix epoch milliseconds when this snapshot was accepted. + pub refreshed_at_ms: i64, + /// Monotonically increasing session-local catalog revision. + pub revision: i64, +} + +/// Authoritative result after disconnect and MCP reconciliation. +/// +///
+/// +/// **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 SessionConnectorsDisconnectResult { + /// Whether the service accepted the idempotent disconnect. + pub disconnected: bool, + /// Fresh authoritative session state after removing Connector-owned MCP servers. + pub status: ConnectorStatus, +} + +/// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. +/// +///
+/// +/// **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 SessionConnectorsReconcileResult { + /// Opaque account selection pinned to this session, when one has been selected. + #[serde(skip_serializing_if = "Option::is_none")] + pub account_id: Option, + /// Connector API contract version. + pub api_version: i64, + /// Current feature and session availability. + pub availability: ConnectorAvailability, + /// Latest validated catalog snapshot, when available. + #[serde(skip_serializing_if = "Option::is_none")] + pub catalog: Option, + /// Number of active opaque connection continuations. + pub pending_connections: i64, + /// Live MCP status for every Connector-owned runtime server. + pub runtime_servers: Vec, +} + /// Identifies the target session. /// ///
@@ -36128,3 +36569,136 @@ pub enum WorkspacesWorkspaceDetailsHostType { #[serde(other)] Unknown, } + +/// Availability of the EXPERIMENTAL session connector API. +/// +///
+/// +/// **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 ConnectorAvailability { + /// The resolved Connector feature is enabled and Connector requests are permitted. + #[serde(rename = "enabled")] + Enabled, + /// The resolved Connector feature is off. No Connector service request is made while disabled. + #[serde(rename = "disabled")] + Disabled, + /// The session has no eligible host-owned GitHub account or does not support local Connector projection. + #[serde(rename = "unavailable")] + Unavailable, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + +/// Authoritative service connection state for one Connector. +/// +///
+/// +/// **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 ConnectorCatalogStatus { + /// The Connector is available but not connected. + #[serde(rename = "not_connected")] + NotConnected, + /// The Connector service is still completing connection or consent. + #[serde(rename = "pending")] + Pending, + /// The Connector is connected and may contribute MCP servers. + #[serde(rename = "connected")] + Connected, + /// The Connector service reports an unusable connection. + #[serde(rename = "error")] + Error, + /// The service returned a future or unrecognized state. + #[serde(rename = "unknown")] + UnknownValue, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + +/// The service is connected and the session MCP graph was reconciled. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ConnectorConnectResultConnectedKind { + #[serde(rename = "connected")] + #[default] + Connected, +} + +/// Live MCP status of one Connector-owned runtime server. +/// +///
+/// +/// **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 ConnectorMcpStatus { + /// The server is connected and its tools are available. + #[serde(rename = "connected")] + Connected, + /// The server connection is still being established. + #[serde(rename = "pending")] + Pending, + /// The server requires refreshed GitHub authorization. + #[serde(rename = "needs_auth")] + NeedsAuth, + /// The server failed to connect or initialize. + #[serde(rename = "failed")] + Failed, + /// The server is intentionally stopped, including when managed policy blocks it. + #[serde(rename = "stopped")] + Stopped, + /// The server is configured but explicitly disabled. + #[serde(rename = "disabled")] + Disabled, + /// The Connector currently has no live server configuration. + #[serde(rename = "not_configured")] + NotConfigured, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + +/// Host-owned consent is required before bounded continuation can complete. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ConnectorConnectResultConsentRequiredKind { + #[serde(rename = "consent_required")] + #[default] + ConsentRequired, +} + +/// The service is still completing the connection without a consent URL. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ConnectorConnectResultPendingKind { + #[serde(rename = "pending")] + #[default] + Pending, +} + +/// Typed result of initiating or continuing a Connector connection. +/// +///
+/// +/// **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, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ConnectorConnectResult { + Connected(ConnectorConnectResultConnected), + ConsentRequired(ConnectorConnectResultConsentRequired), + Pending(ConnectorConnectResultPending), +} diff --git a/rust/src/generated/rpc.rs b/rust/src/generated/rpc.rs index bbde719b6a..098049dfe0 100644 --- a/rust/src/generated/rpc.rs +++ b/rust/src/generated/rpc.rs @@ -3125,6 +3125,13 @@ impl<'a> SessionRpc<'a> { } } + /// `session.connectors.*` sub-namespace. + pub fn connectors(&self) -> SessionRpcConnectors<'a> { + SessionRpcConnectors { + session: self.session, + } + } + /// `session.contentExclusion.*` sub-namespace. pub fn content_exclusion(&self) -> SessionRpcContentExclusion<'a> { SessionRpcContentExclusion { @@ -4447,6 +4454,304 @@ impl<'a> SessionRpcCompletions<'a> { } } +/// `session.connectors.*` RPCs. +#[derive(Clone, Copy)] +pub struct SessionRpcConnectors<'a> { + pub(crate) session: &'a Session, +} + +impl<'a> SessionRpcConnectors<'a> { + /// Returns feature availability and bounded polling limits for the EXPERIMENTAL session connector API. This method never performs a Connector service request. + /// + /// Wire method: `session.connectors.getCapabilities`. + /// + /// # Returns + /// + /// Feature detection and hard polling limits for the EXPERIMENTAL session connector API. + /// + ///
+ /// + /// **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_capabilities(&self) -> Result { + let wire_params = serde_json::json!({ "sessionId": self.session.id() }); + let _value = self + .session + .client() + .call( + rpc_methods::SESSION_CONNECTORS_GETCAPABILITIES, + Some(wire_params), + ) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Returns authoritative session Connector state from current availability, pinned account selection, cached catalog, and live MCP projection without performing a Connector service request. + /// + /// Wire method: `session.connectors.getStatus`. + /// + /// # Returns + /// + /// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + /// + ///
+ /// + /// **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_status(&self) -> Result { + let wire_params = serde_json::json!({ "sessionId": self.session.id() }); + let _value = self + .session + .client() + .call(rpc_methods::SESSION_CONNECTORS_GETSTATUS, Some(wire_params)) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Returns the cached Connector catalog for the pinned opaque account selection, fetching it only when this session has no cached catalog. + /// + /// Wire method: `session.connectors.list`. + /// + /// # Parameters + /// + /// * `params` - Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + /// + /// # Returns + /// + /// Validated Connector catalog snapshot cached by the session. + /// + ///
+ /// + /// **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 list( + &self, + params: ConnectorAccountRequest, + ) -> Result { + let mut wire_params = serde_json::to_value(params)?; + wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string()); + let _value = self + .session + .client() + .call(rpc_methods::SESSION_CONNECTORS_LIST, Some(wire_params)) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Refreshes and validates the Connector catalog for the pinned opaque account selection. + /// + /// Wire method: `session.connectors.refresh`. + /// + /// # Parameters + /// + /// * `params` - Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted. + /// + /// # Returns + /// + /// Validated Connector catalog snapshot cached by the session. + /// + ///
+ /// + /// **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 refresh( + &self, + params: ConnectorAccountRequest, + ) -> Result { + let mut wire_params = serde_json::to_value(params)?; + wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string()); + let _value = self + .session + .client() + .call(rpc_methods::SESSION_CONNECTORS_REFRESH, Some(wire_params)) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Initiates an idempotent Connector connection request without opening a browser. Returns connected when the service is immediately authoritative, consent_required with a validated URL, or pending with an opaque continuation ID. + /// + /// Wire method: `session.connectors.connect`. + /// + /// # Parameters + /// + /// * `params` - Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + /// + /// # Returns + /// + /// Typed result of initiating or continuing a Connector connection. + /// + ///
+ /// + /// **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 connect( + &self, + params: ConnectorConnectRequest, + ) -> Result { + let mut wire_params = serde_json::to_value(params)?; + wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string()); + let _value = self + .session + .client() + .call(rpc_methods::SESSION_CONNECTORS_CONNECT, Some(wire_params)) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Re-initiates an idempotent Connector connection request without browser or UI effects, with the same typed outcomes as connect. + /// + /// Wire method: `session.connectors.reconnect`. + /// + /// # Parameters + /// + /// * `params` - Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + /// + /// # Returns + /// + /// Typed result of initiating or continuing a Connector connection. + /// + ///
+ /// + /// **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 reconnect( + &self, + params: ConnectorConnectRequest, + ) -> Result { + let mut wire_params = serde_json::to_value(params)?; + wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string()); + let _value = self + .session + .client() + .call(rpc_methods::SESSION_CONNECTORS_RECONNECT, Some(wire_params)) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Continues a pending Connector connection with caller-supplied attempt, interval, and deadline bounds. The runtime never opens the returned consent URL. + /// + /// Wire method: `session.connectors.continueConnection`. + /// + /// # Parameters + /// + /// * `params` - Explicitly bounded continuation of a pending Connector connection. + /// + /// # Returns + /// + /// Typed result of initiating or continuing a Connector connection. + /// + ///
+ /// + /// **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 continue_connection( + &self, + params: ConnectorContinueRequest, + ) -> Result { + let mut wire_params = serde_json::to_value(params)?; + wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string()); + let _value = self + .session + .client() + .call( + rpc_methods::SESSION_CONNECTORS_CONTINUECONNECTION, + Some(wire_params), + ) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Disconnects one Connector for the pinned opaque account selection, refreshes the authoritative catalog, and removes its session-owned MCP projection. + /// + /// Wire method: `session.connectors.disconnect`. + /// + /// # Parameters + /// + /// * `params` - Selects one Connector and the pinned host-owned account used for its service and MCP authorization. + /// + /// # Returns + /// + /// Authoritative result after disconnect and MCP reconciliation. + /// + ///
+ /// + /// **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 disconnect( + &self, + params: ConnectorConnectRequest, + ) -> Result { + let mut wire_params = serde_json::to_value(params)?; + wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string()); + let _value = self + .session + .client() + .call( + rpc_methods::SESSION_CONNECTORS_DISCONNECT, + Some(wire_params), + ) + .await?; + Ok(serde_json::from_value(_value)?) + } + + /// Reconciles the authoritative cached or freshly requested Connector catalog into the session Connector MCP projection and returns live status. + /// + /// Wire method: `session.connectors.reconcile`. + /// + /// # Parameters + /// + /// * `params` - Requests authoritative Connector-to-MCP reconciliation for the pinned account. + /// + /// # Returns + /// + /// Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included. + /// + ///
+ /// + /// **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 reconcile( + &self, + params: ConnectorReconcileRequest, + ) -> Result { + let mut wire_params = serde_json::to_value(params)?; + wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string()); + let _value = self + .session + .client() + .call(rpc_methods::SESSION_CONNECTORS_RECONCILE, Some(wire_params)) + .await?; + Ok(serde_json::from_value(_value)?) + } +} + /// `session.contentExclusion.*` RPCs. #[derive(Clone, Copy)] pub struct SessionRpcContentExclusion<'a> { diff --git a/rust/tests/api_types_test.rs b/rust/tests/api_types_test.rs index 94f233f19a..767837e96f 100644 --- a/rust/tests/api_types_test.rs +++ b/rust/tests/api_types_test.rs @@ -4,11 +4,12 @@ #![allow(clippy::unwrap_used)] use github_copilot_sdk::rpc::{ - Extension, ExtensionList, ExtensionSource, ExtensionStatus, ExtensionsDisableRequest, - ExtensionsEnableRequest, FleetStartRequest, FleetStartResult, ModelSetAllowedModelsRequest, - ModelSetAllowedModelsResult, ModelSwitchAutoTierRequest, ModelSwitchAutoTierResult, - ModelSwitchAutoTierStatus, QueuePendingItems, QueuePendingItemsKind, SandboxConfig, - SendAgentMode, TasksStartAgentRequest, + ConnectorAccountRequest, ConnectorCatalogStatus, ConnectorConnectRequest, + ConnectorContinueRequest, ConnectorReconcileRequest, Extension, ExtensionList, ExtensionSource, + ExtensionStatus, ExtensionsDisableRequest, ExtensionsEnableRequest, FleetStartRequest, + FleetStartResult, ModelSetAllowedModelsRequest, ModelSetAllowedModelsResult, + ModelSwitchAutoTierRequest, ModelSwitchAutoTierResult, ModelSwitchAutoTierStatus, + QueuePendingItems, QueuePendingItemsKind, SandboxConfig, SendAgentMode, TasksStartAgentRequest, }; use github_copilot_sdk::session_events::{ PermissionRequest, PermissionRequestedData, SessionEventData, TypedSessionEvent, @@ -130,6 +131,68 @@ fn tasks_start_agent_request_fields_are_accessible() { assert_eq!(request.description.as_deref(), Some("SDK task agent")); } +#[test] +fn connector_request_dtos_use_public_camel_case_wire_fields() { + let account = ConnectorAccountRequest { + account_id: "account-1".to_string(), + }; + assert_eq!( + serde_json::to_value(account).unwrap(), + serde_json::json!({ "accountId": "account-1" }) + ); + + let connector = ConnectorConnectRequest { + account_id: "account-1".to_string(), + connector_name: "github".to_string(), + }; + assert_eq!( + serde_json::to_value(connector).unwrap(), + serde_json::json!({ + "accountId": "account-1", + "connectorName": "github", + }) + ); + + let continuation = ConnectorContinueRequest { + continuation_id: "continuation-1".to_string(), + deadline_ms: 30_000, + max_attempts: 5, + poll_interval_ms: 1_000, + }; + assert_eq!( + serde_json::to_value(continuation).unwrap(), + serde_json::json!({ + "continuationId": "continuation-1", + "deadlineMs": 30_000, + "maxAttempts": 5, + "pollIntervalMs": 1_000, + }) + ); + + let reconcile = ConnectorReconcileRequest { + account_id: "account-1".to_string(), + refresh_catalog: Some(true), + }; + assert_eq!( + serde_json::to_value(reconcile).unwrap(), + serde_json::json!({ + "accountId": "account-1", + "refreshCatalog": true, + }) + ); +} + +#[test] +fn connector_catalog_unknown_wire_value_has_a_distinct_variant() { + let service_unknown: ConnectorCatalogStatus = + serde_json::from_value(serde_json::json!("unknown")).unwrap(); + let future_status: ConnectorCatalogStatus = + serde_json::from_value(serde_json::json!("future_status")).unwrap(); + + assert_eq!(service_unknown, ConnectorCatalogStatus::UnknownValue); + assert_eq!(future_status, ConnectorCatalogStatus::Unknown); +} + #[test] fn model_allowed_models_request_and_result_preserve_contract_fields() { let replace = ModelSetAllowedModelsRequest { diff --git a/rust/tests/session_test.rs b/rust/tests/session_test.rs index c04e9e53c8..972e9f48c2 100644 --- a/rust/tests/session_test.rs +++ b/rust/tests/session_test.rs @@ -19,7 +19,11 @@ use github_copilot_sdk::handler::{ }; use github_copilot_sdk::rpc::{ CanvasProviderInvokeActionRequest, CanvasProviderOpenRequest, CanvasProviderOpenResult, - ModelSetAllowedModelsRequest, OpenCanvasInstance, SendAgentMode, SendMode, SendRequest, + ConnectorAccountRequest, ConnectorAvailability, ConnectorCapabilities, ConnectorCatalogResult, + ConnectorCatalogStatus, ConnectorConnectRequest, ConnectorConnectResult, + ConnectorContinueRequest, ConnectorDisconnectResult, ConnectorMcpStatus, + ConnectorReconcileRequest, ConnectorStatus, ModelSetAllowedModelsRequest, OpenCanvasInstance, + SendAgentMode, SendMode, SendRequest, SessionRpcConnectors, }; use github_copilot_sdk::session_events::{ ManagedSettingsResolvedSource, McpOauthRequiredData, ReasoningSummary, SessionLimitsConfig, @@ -6113,6 +6117,235 @@ async fn rpc_namespace_session_tasks_list_dispatches_correctly() { assert!(result.tasks.is_empty()); } +#[tokio::test] +async fn rpc_namespace_session_connectors_dispatches_all_methods() { + let (session, mut server) = create_session_pair().await; + let session_id = server.session_id.clone(); + let catalog = serde_json::json!({ + "connectors": [{ + "description": "Source control", + "displayName": "GitHub", + "name": "github", + "runtimeServerIds": ["connector-github"], + "status": "connected" + }], + "refreshedAtMs": 1_726_668_000_000_i64, + "revision": 4 + }); + let status = serde_json::json!({ + "accountId": "account-1", + "apiVersion": 1, + "availability": "enabled", + "catalog": catalog.clone(), + "pendingConnections": 0, + "runtimeServers": [{ + "connectorName": "github", + "runtimeServerId": "connector-github", + "status": "connected" + }] + }); + let capabilities = serde_json::json!({ + "apiVersion": 1, + "availability": "enabled", + "consentContinuation": true, + "maxDeadlineMs": 60_000, + "maxPollAttempts": 10, + "maxPollIntervalMs": 5_000, + "opaqueAccountSelection": true + }); + + let server_handle = tokio::spawn(async move { + let expectations = [ + ( + "session.connectors.getCapabilities", + serde_json::json!({ "sessionId": session_id }), + capabilities, + ), + ( + "session.connectors.getStatus", + serde_json::json!({ "sessionId": session_id }), + status.clone(), + ), + ( + "session.connectors.list", + serde_json::json!({ + "accountId": "account-1", + "sessionId": session_id + }), + catalog.clone(), + ), + ( + "session.connectors.refresh", + serde_json::json!({ + "accountId": "account-1", + "sessionId": session_id + }), + catalog, + ), + ( + "session.connectors.connect", + serde_json::json!({ + "accountId": "account-1", + "connectorName": "github", + "sessionId": session_id + }), + serde_json::json!({ + "kind": "connected", + "status": status.clone() + }), + ), + ( + "session.connectors.reconnect", + serde_json::json!({ + "accountId": "account-1", + "connectorName": "github", + "sessionId": session_id + }), + serde_json::json!({ + "consentUrl": "https://example.test/consent", + "continuationId": "continuation-1", + "kind": "consent_required" + }), + ), + ( + "session.connectors.continueConnection", + serde_json::json!({ + "continuationId": "continuation-1", + "deadlineMs": 60_000, + "maxAttempts": 10, + "pollIntervalMs": 1_000, + "sessionId": session_id + }), + serde_json::json!({ + "continuationId": "continuation-2", + "kind": "pending" + }), + ), + ( + "session.connectors.disconnect", + serde_json::json!({ + "accountId": "account-1", + "connectorName": "github", + "sessionId": session_id + }), + serde_json::json!({ + "disconnected": true, + "status": status.clone() + }), + ), + ( + "session.connectors.reconcile", + serde_json::json!({ + "accountId": "account-1", + "refreshCatalog": true, + "sessionId": session_id + }), + status, + ), + ]; + + for (method, params, result) in expectations { + let request = server.read_request().await; + assert_eq!(request["method"], method); + assert_eq!(request["params"], params); + server.respond(&request, result).await; + } + }); + + let connectors: SessionRpcConnectors<'_> = session.rpc().connectors(); + + let capabilities: ConnectorCapabilities = connectors.get_capabilities().await.unwrap(); + assert_eq!(capabilities.availability, ConnectorAvailability::Enabled); + assert_eq!(capabilities.max_poll_attempts, 10); + + let status: ConnectorStatus = connectors.get_status().await.unwrap(); + assert_eq!(status.account_id.as_deref(), Some("account-1")); + assert_eq!( + status.runtime_servers[0].status, + ConnectorMcpStatus::Connected + ); + + let catalog: ConnectorCatalogResult = connectors + .list(ConnectorAccountRequest { + account_id: "account-1".to_string(), + }) + .await + .unwrap(); + assert_eq!( + catalog.connectors[0].status, + ConnectorCatalogStatus::Connected + ); + + let refreshed: ConnectorCatalogResult = connectors + .refresh(ConnectorAccountRequest { + account_id: "account-1".to_string(), + }) + .await + .unwrap(); + assert_eq!(refreshed.revision, 4); + + let connected: ConnectorConnectResult = connectors + .connect(ConnectorConnectRequest { + account_id: "account-1".to_string(), + connector_name: "github".to_string(), + }) + .await + .unwrap(); + let ConnectorConnectResult::Connected(connected) = connected else { + panic!("expected connected result"); + }; + assert_eq!( + connected.status.availability, + ConnectorAvailability::Enabled + ); + + let reconnect: ConnectorConnectResult = connectors + .reconnect(ConnectorConnectRequest { + account_id: "account-1".to_string(), + connector_name: "github".to_string(), + }) + .await + .unwrap(); + let ConnectorConnectResult::ConsentRequired(consent) = reconnect else { + panic!("expected consent-required result"); + }; + assert_eq!(consent.continuation_id, "continuation-1"); + + let continuation: ConnectorConnectResult = connectors + .continue_connection(ConnectorContinueRequest { + continuation_id: "continuation-1".to_string(), + deadline_ms: 60_000, + max_attempts: 10, + poll_interval_ms: 1_000, + }) + .await + .unwrap(); + let ConnectorConnectResult::Pending(pending) = continuation else { + panic!("expected pending result"); + }; + assert_eq!(pending.continuation_id, "continuation-2"); + + let disconnected: ConnectorDisconnectResult = connectors + .disconnect(ConnectorConnectRequest { + account_id: "account-1".to_string(), + connector_name: "github".to_string(), + }) + .await + .unwrap(); + assert!(disconnected.disconnected); + + let reconciled: ConnectorStatus = connectors + .reconcile(ConnectorReconcileRequest { + account_id: "account-1".to_string(), + refresh_catalog: Some(true), + }) + .await + .unwrap(); + assert_eq!(reconciled.catalog.unwrap().revision, 4); + + timeout(TIMEOUT, server_handle).await.unwrap().unwrap(); +} + #[tokio::test] async fn rpc_namespace_client_models_list_dispatches_correctly() { let (session, mut server) = create_session_pair().await; diff --git a/scripts/codegen/connector-session-api-overlay.json b/scripts/codegen/connector-session-api-overlay.json new file mode 100644 index 0000000000..f2c4efc827 --- /dev/null +++ b/scripts/codegen/connector-session-api-overlay.json @@ -0,0 +1,743 @@ +{ + "sessionConnectors": { + "getCapabilities": { + "rpcMethod": "session.connectors.getCapabilities", + "description": "Returns feature availability and bounded polling limits for the EXPERIMENTAL session connector API. This method never performs a Connector service request.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + } + }, + "required": [ + "sessionId" + ], + "additionalProperties": false, + "description": "Identifies the target session." + }, + "result": { + "$ref": "#/definitions/ConnectorCapabilities", + "description": "Feature detection and hard polling limits for the EXPERIMENTAL session connector API." + }, + "stability": "experimental" + }, + "getStatus": { + "rpcMethod": "session.connectors.getStatus", + "description": "Returns authoritative session Connector state from current availability, pinned account selection, cached catalog, and live MCP projection without performing a Connector service request.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + } + }, + "required": [ + "sessionId" + ], + "additionalProperties": false, + "description": "Identifies the target session." + }, + "result": { + "$ref": "#/definitions/ConnectorStatus", + "description": "Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included." + }, + "stability": "experimental" + }, + "list": { + "rpcMethod": "session.connectors.list", + "description": "Returns the cached Connector catalog for the pinned opaque account selection, fetching it only when this session has no cached catalog.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + }, + "accountId": { + "type": "string", + "description": "Opaque account selection ID previously returned by an account discovery API." + } + }, + "required": [ + "sessionId", + "accountId" + ], + "additionalProperties": false, + "description": "Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted.", + "title": "ConnectorAccountRequest", + "stability": "experimental" + }, + "result": { + "$ref": "#/definitions/ConnectorCatalogResult", + "description": "Validated Connector catalog snapshot cached by the session." + }, + "stability": "experimental" + }, + "refresh": { + "rpcMethod": "session.connectors.refresh", + "description": "Refreshes and validates the Connector catalog for the pinned opaque account selection.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + }, + "accountId": { + "type": "string", + "description": "Opaque account selection ID previously returned by an account discovery API." + } + }, + "required": [ + "sessionId", + "accountId" + ], + "additionalProperties": false, + "description": "Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted.", + "title": "ConnectorAccountRequest", + "stability": "experimental" + }, + "result": { + "$ref": "#/definitions/ConnectorCatalogResult", + "description": "Validated Connector catalog snapshot cached by the session." + }, + "stability": "experimental" + }, + "connect": { + "rpcMethod": "session.connectors.connect", + "description": "Initiates an idempotent Connector connection request without opening a browser. Returns connected when the service is immediately authoritative, consent_required with a validated URL, or pending with an opaque continuation ID.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + }, + "accountId": { + "type": "string", + "description": "Opaque account selection ID. It must match the account already pinned to the session, if any." + }, + "connectorName": { + "type": "string", + "description": "Canonical Connector name from the current catalog." + } + }, + "required": [ + "sessionId", + "accountId", + "connectorName" + ], + "additionalProperties": false, + "description": "Selects one Connector and the pinned host-owned account used for its service and MCP authorization.", + "title": "ConnectorConnectRequest", + "stability": "experimental" + }, + "result": { + "$ref": "#/definitions/ConnectorConnectResult", + "description": "Typed result of initiating or continuing a Connector connection." + }, + "stability": "experimental" + }, + "reconnect": { + "rpcMethod": "session.connectors.reconnect", + "description": "Re-initiates an idempotent Connector connection request without browser or UI effects, with the same typed outcomes as connect.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + }, + "accountId": { + "type": "string", + "description": "Opaque account selection ID. It must match the account already pinned to the session, if any." + }, + "connectorName": { + "type": "string", + "description": "Canonical Connector name from the current catalog." + } + }, + "required": [ + "sessionId", + "accountId", + "connectorName" + ], + "additionalProperties": false, + "description": "Selects one Connector and the pinned host-owned account used for its service and MCP authorization.", + "title": "ConnectorConnectRequest", + "stability": "experimental" + }, + "result": { + "$ref": "#/definitions/ConnectorConnectResult", + "description": "Typed result of initiating or continuing a Connector connection." + }, + "stability": "experimental" + }, + "continueConnection": { + "rpcMethod": "session.connectors.continueConnection", + "description": "Continues a pending Connector connection with caller-supplied attempt, interval, and deadline bounds. The runtime never opens the returned consent URL.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + }, + "continuationId": { + "type": "string", + "description": "Opaque continuation ID returned by connect, reconnect, or an earlier continuation." + }, + "maxAttempts": { + "type": "integer", + "minimum": 1, + "maximum": 60, + "description": "Maximum catalog requests made by this call. Must be between one and the capability limit." + }, + "pollIntervalMs": { + "type": "integer", + "minimum": 0, + "maximum": 30000, + "description": "Delay in milliseconds between attempts. Must not exceed the capability limit." + }, + "deadlineMs": { + "type": "integer", + "minimum": 1, + "maximum": 300000, + "description": "Maximum wall-clock duration in milliseconds for this call. Must be between one and the capability limit." + } + }, + "required": [ + "sessionId", + "continuationId", + "maxAttempts", + "pollIntervalMs", + "deadlineMs" + ], + "additionalProperties": false, + "description": "Explicitly bounded continuation of a pending Connector connection.", + "title": "ConnectorContinueRequest", + "stability": "experimental" + }, + "result": { + "$ref": "#/definitions/ConnectorConnectResult", + "description": "Typed result of initiating or continuing a Connector connection." + }, + "stability": "experimental" + }, + "disconnect": { + "rpcMethod": "session.connectors.disconnect", + "description": "Disconnects one Connector for the pinned opaque account selection, refreshes the authoritative catalog, and removes its session-owned MCP projection.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + }, + "accountId": { + "type": "string", + "description": "Opaque account selection ID. It must match the account already pinned to the session, if any." + }, + "connectorName": { + "type": "string", + "description": "Canonical Connector name from the current catalog." + } + }, + "required": [ + "sessionId", + "accountId", + "connectorName" + ], + "additionalProperties": false, + "description": "Selects one Connector and the pinned host-owned account used for its service and MCP authorization.", + "title": "ConnectorConnectRequest", + "stability": "experimental" + }, + "result": { + "$ref": "#/definitions/ConnectorDisconnectResult", + "description": "Authoritative result after disconnect and MCP reconciliation." + }, + "stability": "experimental" + }, + "reconcile": { + "rpcMethod": "session.connectors.reconcile", + "description": "Reconciles the authoritative cached or freshly requested Connector catalog into the session Connector MCP projection and returns live status.", + "params": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Target session identifier" + }, + "accountId": { + "type": "string", + "description": "Opaque account selection ID. It must match the account already pinned to the session, if any." + }, + "refreshCatalog": { + "type": "boolean", + "description": "When true, refresh the catalog before reconciling. A disabled Connector API performs no service request." + } + }, + "required": [ + "sessionId", + "accountId" + ], + "additionalProperties": false, + "description": "Requests authoritative Connector-to-MCP reconciliation for the pinned account.", + "title": "ConnectorReconcileRequest", + "stability": "experimental" + }, + "result": { + "$ref": "#/definitions/ConnectorStatus", + "description": "Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included." + }, + "stability": "experimental" + } + }, + "definitions": { + "ConnectorAccountRequest": { + "type": "object", + "properties": { + "accountId": { + "type": "string", + "description": "Opaque account selection ID previously returned by an account discovery API." + } + }, + "required": [ + "accountId" + ], + "additionalProperties": false, + "description": "Pins a Connector operation to one host-owned GitHub account through its opaque selection ID. Provider tokens are never accepted.", + "title": "ConnectorAccountRequest", + "stability": "experimental" + }, + "ConnectorAvailability": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "unavailable" + ], + "description": "Availability of the EXPERIMENTAL session connector API.", + "title": "ConnectorAvailability", + "x-enumDescriptions": { + "enabled": "The resolved Connector feature is enabled and Connector requests are permitted.", + "disabled": "The resolved Connector feature is off. No Connector service request is made while disabled.", + "unavailable": "The session has no eligible host-owned GitHub account or does not support local Connector projection." + }, + "stability": "experimental" + }, + "ConnectorCapabilities": { + "type": "object", + "properties": { + "apiVersion": { + "type": "integer", + "minimum": 0, + "description": "Connector API contract version." + }, + "availability": { + "$ref": "#/definitions/ConnectorAvailability", + "description": "Current session availability. Disabled availability is reported without making a Connector request." + }, + "consentContinuation": { + "type": "boolean", + "description": "Whether connect and reconnect can return an opaque continuation for bounded consent polling." + }, + "opaqueAccountSelection": { + "type": "boolean", + "description": "Whether callers select a host-owned GitHub account through an opaque selection ID rather than supplying a provider token." + }, + "maxPollAttempts": { + "type": "integer", + "minimum": 0, + "description": "Maximum accepted polling attempts for one continuation call." + }, + "maxPollIntervalMs": { + "type": "integer", + "minimum": 0, + "description": "Maximum accepted delay in milliseconds between polling attempts." + }, + "maxDeadlineMs": { + "type": "integer", + "minimum": 0, + "description": "Maximum accepted wall-clock deadline in milliseconds for one continuation call." + } + }, + "required": [ + "apiVersion", + "availability", + "consentContinuation", + "opaqueAccountSelection", + "maxPollAttempts", + "maxPollIntervalMs", + "maxDeadlineMs" + ], + "additionalProperties": false, + "description": "Feature detection and hard polling limits for the EXPERIMENTAL session connector API.", + "title": "ConnectorCapabilities", + "stability": "experimental" + }, + "ConnectorCatalogEntry": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Canonical Connector name used by lifecycle methods." + }, + "displayName": { + "type": "string", + "description": "Untrusted display label from the service." + }, + "description": { + "type": "string", + "description": "Untrusted service description, when present." + }, + "status": { + "$ref": "#/definitions/ConnectorCatalogStatus", + "description": "Current authoritative service connection state." + }, + "runtimeServerIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Opaque stable runtime IDs currently projected into the session for this Connector." + } + }, + "required": [ + "name", + "displayName", + "status", + "runtimeServerIds" + ], + "additionalProperties": false, + "description": "Credential-free Connector catalog entry.", + "title": "ConnectorCatalogEntry", + "stability": "experimental" + }, + "ConnectorCatalogResult": { + "type": "object", + "properties": { + "revision": { + "type": "integer", + "minimum": 0, + "description": "Monotonically increasing session-local catalog revision." + }, + "refreshedAtMs": { + "type": "integer", + "minimum": 0, + "description": "Unix epoch milliseconds when this snapshot was accepted." + }, + "connectors": { + "type": "array", + "items": { + "$ref": "#/definitions/ConnectorCatalogEntry", + "description": "Credential-free Connector catalog entry." + }, + "description": "Validated catalog entries in service order." + } + }, + "required": [ + "revision", + "refreshedAtMs", + "connectors" + ], + "additionalProperties": false, + "description": "Validated Connector catalog snapshot cached by the session.", + "title": "ConnectorCatalogResult", + "stability": "experimental" + }, + "ConnectorCatalogStatus": { + "type": "string", + "enum": [ + "not_connected", + "pending", + "connected", + "error", + "unknown" + ], + "description": "Authoritative service connection state for one Connector.", + "title": "ConnectorCatalogStatus", + "x-enumDescriptions": { + "not_connected": "The Connector is available but not connected.", + "pending": "The Connector service is still completing connection or consent.", + "connected": "The Connector is connected and may contribute MCP servers.", + "error": "The Connector service reports an unusable connection.", + "unknown": "The service returned a future or unrecognized state." + }, + "stability": "experimental" + }, + "ConnectorConnectRequest": { + "type": "object", + "properties": { + "accountId": { + "type": "string", + "description": "Opaque account selection ID. It must match the account already pinned to the session, if any." + }, + "connectorName": { + "type": "string", + "description": "Canonical Connector name from the current catalog." + } + }, + "required": [ + "accountId", + "connectorName" + ], + "additionalProperties": false, + "description": "Selects one Connector and the pinned host-owned account used for its service and MCP authorization.", + "title": "ConnectorConnectRequest", + "stability": "experimental" + }, + "ConnectorConnectResult": { + "anyOf": [ + { + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "connected", + "description": "The service is connected and the session MCP graph was reconciled." + }, + "status": { + "$ref": "#/definitions/ConnectorStatus", + "description": "Fresh authoritative Connector state after MCP reconciliation." + } + }, + "required": [ + "kind", + "status" + ], + "additionalProperties": false, + "description": "The service is connected and the session MCP graph was reconciled.", + "stability": "experimental" + }, + { + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "consent_required", + "description": "Host-owned consent is required before bounded continuation can complete." + }, + "consentUrl": { + "type": "string", + "description": "Validated HTTPS consent URL. The runtime does not open it." + }, + "continuationId": { + "type": "string", + "description": "Opaque ID accepted by continueConnection." + } + }, + "required": [ + "kind", + "consentUrl", + "continuationId" + ], + "additionalProperties": false, + "description": "Host-owned consent is required before bounded continuation can complete.", + "stability": "experimental" + }, + { + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "pending", + "description": "The service is still completing the connection without a consent URL." + }, + "continuationId": { + "type": "string", + "description": "Opaque ID accepted by continueConnection." + } + }, + "required": [ + "kind", + "continuationId" + ], + "additionalProperties": false, + "description": "The service is still completing the connection without a consent URL.", + "stability": "experimental" + } + ], + "description": "Typed result of initiating or continuing a Connector connection.", + "title": "ConnectorConnectResult", + "stability": "experimental" + }, + "ConnectorContinueRequest": { + "type": "object", + "properties": { + "continuationId": { + "type": "string", + "description": "Opaque continuation ID returned by connect, reconnect, or an earlier continuation." + }, + "maxAttempts": { + "type": "integer", + "minimum": 1, + "maximum": 60, + "description": "Maximum catalog requests made by this call. Must be between one and the capability limit." + }, + "pollIntervalMs": { + "type": "integer", + "minimum": 0, + "maximum": 30000, + "description": "Delay in milliseconds between attempts. Must not exceed the capability limit." + }, + "deadlineMs": { + "type": "integer", + "minimum": 1, + "maximum": 300000, + "description": "Maximum wall-clock duration in milliseconds for this call. Must be between one and the capability limit." + } + }, + "required": [ + "continuationId", + "maxAttempts", + "pollIntervalMs", + "deadlineMs" + ], + "additionalProperties": false, + "description": "Explicitly bounded continuation of a pending Connector connection.", + "title": "ConnectorContinueRequest", + "stability": "experimental" + }, + "ConnectorDisconnectResult": { + "type": "object", + "properties": { + "disconnected": { + "type": "boolean", + "description": "Whether the service accepted the idempotent disconnect." + }, + "status": { + "$ref": "#/definitions/ConnectorStatus", + "description": "Fresh authoritative session state after removing Connector-owned MCP servers." + } + }, + "required": [ + "disconnected", + "status" + ], + "additionalProperties": false, + "description": "Authoritative result after disconnect and MCP reconciliation.", + "title": "ConnectorDisconnectResult", + "stability": "experimental" + }, + "ConnectorMcpStatus": { + "type": "string", + "enum": [ + "connected", + "pending", + "needs_auth", + "failed", + "stopped", + "disabled", + "not_configured" + ], + "description": "Live MCP status of one Connector-owned runtime server.", + "title": "ConnectorMcpStatus", + "x-enumDescriptions": { + "connected": "The server is connected and its tools are available.", + "pending": "The server connection is still being established.", + "needs_auth": "The server requires refreshed GitHub authorization.", + "failed": "The server failed to connect or initialize.", + "stopped": "The server is intentionally stopped, including when managed policy blocks it.", + "disabled": "The server is configured but explicitly disabled.", + "not_configured": "The Connector currently has no live server configuration." + }, + "stability": "experimental" + }, + "ConnectorReconcileRequest": { + "type": "object", + "properties": { + "accountId": { + "type": "string", + "description": "Opaque account selection ID. It must match the account already pinned to the session, if any." + }, + "refreshCatalog": { + "type": "boolean", + "description": "When true, refresh the catalog before reconciling. A disabled Connector API performs no service request." + } + }, + "required": [ + "accountId" + ], + "additionalProperties": false, + "description": "Requests authoritative Connector-to-MCP reconciliation for the pinned account.", + "title": "ConnectorReconcileRequest", + "stability": "experimental" + }, + "ConnectorRuntimeStatus": { + "type": "object", + "properties": { + "runtimeServerId": { + "type": "string", + "description": "Opaque runtime server ID." + }, + "connectorName": { + "type": "string", + "description": "Canonical Connector name that owns this server." + }, + "status": { + "$ref": "#/definitions/ConnectorMcpStatus", + "description": "Current live MCP host status." + } + }, + "required": [ + "runtimeServerId", + "connectorName", + "status" + ], + "additionalProperties": false, + "description": "Live status of one session-owned MCP projection.", + "title": "ConnectorRuntimeStatus", + "stability": "experimental" + }, + "ConnectorStatus": { + "type": "object", + "properties": { + "apiVersion": { + "type": "integer", + "minimum": 0, + "description": "Connector API contract version." + }, + "availability": { + "$ref": "#/definitions/ConnectorAvailability", + "description": "Current feature and session availability." + }, + "accountId": { + "type": "string", + "description": "Opaque account selection pinned to this session, when one has been selected." + }, + "catalog": { + "$ref": "#/definitions/ConnectorCatalogResult", + "description": "Latest validated catalog snapshot, when available." + }, + "runtimeServers": { + "type": "array", + "items": { + "$ref": "#/definitions/ConnectorRuntimeStatus", + "description": "Live status of one session-owned MCP projection." + }, + "description": "Live MCP status for every Connector-owned runtime server." + }, + "pendingConnections": { + "type": "integer", + "minimum": 0, + "description": "Number of active opaque connection continuations." + } + }, + "required": [ + "apiVersion", + "availability", + "runtimeServers", + "pendingConnections" + ], + "additionalProperties": false, + "description": "Authoritative session connector state. Account IDs are opaque routing identifiers and credentials are never included.", + "title": "ConnectorStatus", + "stability": "experimental" + } + } +} diff --git a/scripts/codegen/connectorSessionApiOverlay.ts b/scripts/codegen/connectorSessionApiOverlay.ts new file mode 100644 index 0000000000..879aba0a0b --- /dev/null +++ b/scripts/codegen/connectorSessionApiOverlay.ts @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +import fs from "fs"; + +type SchemaNode = Record; + +interface ConnectorSessionApiOverlay { + sessionConnectors: SchemaNode; + definitions: Record; +} + +const overlay = JSON.parse( + fs.readFileSync( + new URL("./connector-session-api-overlay.json", import.meta.url), + "utf8", + ), +) as ConnectorSessionApiOverlay; + +function stableStringify(value: unknown): string { + if (Array.isArray(value)) { + return `[${value.map(stableStringify).join(",")}]`; + } + if (value !== null && typeof value === "object") { + return `{${Object.entries(value as SchemaNode) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`) + .join(",")}}`; + } + return JSON.stringify(value) ?? "undefined"; +} + +function clone(value: T): T { + return JSON.parse(JSON.stringify(value)) as T; +} + +function requireObject(parent: SchemaNode, key: string): SchemaNode { + const value = parent[key]; + if (value === null || typeof value !== "object" || Array.isArray(value)) { + throw new Error( + `Connector session API overlay requires ${key} to be an object.`, + ); + } + return value as SchemaNode; +} + +/** + * Applies the public Connector session contract pending schema publication. + * + * Remove this overlay after the pinned runtime release publishes the contract. + * Only the complete pre-contract or exact target shape is accepted. + */ +export function applyConnectorSessionApiOverlay( + schema: T, + fileName: string, +): T { + if (fileName !== "api.schema.json") { + return schema; + } + if (schema === null || typeof schema !== "object" || Array.isArray(schema)) { + throw new Error( + `Connector session API overlay cannot process ${fileName}.`, + ); + } + + const root = schema as SchemaNode; + const session = requireObject(root, "session"); + const definitions = requireObject(root, "definitions"); + const nodes = [ + { + parent: session, + key: "connectors", + desired: overlay.sessionConnectors, + }, + ...Object.entries(overlay.definitions).map(([key, desired]) => ({ + parent: definitions, + key, + desired, + })), + ]; + + const isLegacy = nodes.every(({ parent, key }) => parent[key] === undefined); + const isTarget = nodes.every( + ({ parent, key, desired }) => + stableStringify(parent[key]) === stableStringify(desired), + ); + if (!isLegacy && !isTarget) { + throw new Error( + "Connector session API overlay found a partial or unknown upstream contract. " + + "Update or remove scripts/codegen/connector-session-api-overlay.json.", + ); + } + if (isLegacy) { + for (const { parent, key, desired } of nodes) { + parent[key] = clone(desired); + } + } + return schema; +} diff --git a/scripts/codegen/rust.ts b/scripts/codegen/rust.ts index 714988cb05..3e12cd554d 100644 --- a/scripts/codegen/rust.ts +++ b/scripts/codegen/rust.ts @@ -16,6 +16,8 @@ import path from "path"; import { fileURLToPath } from "url"; import { promisify } from "util"; import type { JSONSchema7, JSONSchema7Definition } from "json-schema"; + +import { applyConnectorSessionApiOverlay } from "./connectorSessionApiOverlay.js"; import { addManagedApprovalRequiredToPermissionRequests, type ApiSchema, @@ -89,6 +91,9 @@ const STRING_ENUM_VARIANT_OVERRIDES: Record> = { CatalogTrustEligibility: { unknown: "UnknownValue", }, + ConnectorCatalogStatus: { + unknown: "UnknownValue", + }, }; // ── Naming helpers ────────────────────────────────────────────────────────── @@ -2240,7 +2245,10 @@ async function generate(): Promise { JSON.parse(await fs.readFile(sessionEventsSchemaPath, "utf-8")), ); const apiRaw = normalizeSchemaBrandCasing( - JSON.parse(await fs.readFile(apiSchemaPath, "utf-8")) as ApiSchema, + applyConnectorSessionApiOverlay( + JSON.parse(await fs.readFile(apiSchemaPath, "utf-8")) as ApiSchema, + path.basename(apiSchemaPath), + ), ); const sessionEventsSchema = propagateInternalVisibility( diff --git a/scripts/codegen/utils.ts b/scripts/codegen/utils.ts index bad31a7675..207729b750 100644 --- a/scripts/codegen/utils.ts +++ b/scripts/codegen/utils.ts @@ -15,6 +15,8 @@ import { promisify } from "util"; import { COPILOT_CLI_VERSION } from "../../nodejs/src/cliVersion.js"; import { ensureCopilotPackage } from "../../nodejs/scripts/releaseArtifacts.js"; +import { applyConnectorSessionApiOverlay } from "./connectorSessionApiOverlay.js"; + export const execFileAsync = promisify(execFile); const __filename = fileURLToPath(import.meta.url); @@ -151,7 +153,9 @@ function renameBrandDefinitionKeys(defs: Record): void { /** Load a JSON schema file and normalize GitHub brand casing in titles, refs, and definition keys. */ export async function loadSchemaJson(filePath: string): Promise { const parsed = JSON.parse(await fs.readFile(filePath, "utf-8")) as T; - return normalizeSchemaBrandCasing(parsed); + return normalizeSchemaBrandCasing( + applyConnectorSessionApiOverlay(parsed, path.basename(filePath)) + ); } // ── Schema processing ───────────────────────────────────────────────────────