diff --git a/dotnet/src/Generated/Rpc.cs b/dotnet/src/Generated/Rpc.cs
index 97f9b52762..3b9445f726 100644
--- a/dotnet/src/Generated/Rpc.cs
+++ b/dotnet/src/Generated/Rpc.cs
@@ -61,10 +61,35 @@ internal sealed class ConnectResult
public string Version { get; set; } = string.Empty;
}
+/// Identity of the integrating host, declared once on the `server.connect` handshake so telemetry from this connection is attributed to a single, consistent surface. All fields are optional; omit them to keep the default attribution.
+[Experimental(Diagnostics.Experimental)]
+internal sealed class ConnectClientInfo
+{
+ /// Name of the host editor, e.g. `"vscode"`.
+ [JsonPropertyName("editorName")]
+ public string? EditorName { get; set; }
+
+ /// Version of the host editor, e.g. `"1.124.2"`. Ignored unless it looks like a version string.
+ [JsonPropertyName("editorVersion")]
+ public string? EditorVersion { get; set; }
+
+ /// Name of the Copilot extension within the host, e.g. `"copilot-chat"`.
+ [JsonPropertyName("extensionName")]
+ public string? ExtensionName { get; set; }
+
+ /// Version of the Copilot extension within the host, e.g. `"0.54.0"`. Ignored unless it looks like a version string.
+ [JsonPropertyName("extensionVersion")]
+ public string? ExtensionVersion { get; set; }
+}
+
/// Connection-level opt-ins for the `server.connect` handshake. Transport authentication is consumed by the native protocol boundary before dispatch.
[Experimental(Diagnostics.Experimental)]
internal sealed class ConnectRequest
{
+ /// Identity of the integrating host. Optional; omit it to keep the default attribution.
+ [JsonPropertyName("clientInfo")]
+ public ConnectClientInfo? ClientInfo { get; set; }
+
/// Opt this connection in to GitHub telemetry forwarding for its lifetime. When set, the runtime forwards every internal telemetry event it emits — across all sessions, plus sessionless events — to this connection over the `gitHubTelemetry.event` notification. Regular events are also written to the runtime's normal GitHub/CTS path (dual-write); host-only compatibility events are forward-only and intentionally skip that path. Intended for first-party hosts that re-emit the events into their own telemetry stores. Both unrestricted and restricted events are forwarded, each tagged with a `restricted` discriminator; a backstop drops restricted events when restricted telemetry is disabled — using the process-global gate for ordinary events and an explicit session-scoped decision for host-only events.
[JsonPropertyName("enableGitHubTelemetryForwarding")]
public bool? EnableGitHubTelemetryForwarding { get; set; }
@@ -282,6 +307,19 @@ public sealed class ModelCapabilities
public ModelCapabilitiesSupports? Supports { get; set; }
}
+/// A service-published message about a model, carrying a stable machine-readable code alongside human-readable text.
+[Experimental(Diagnostics.Experimental)]
+public sealed class ModelMessage
+{
+ /// Stable machine-readable identifier for the message, such as `client_version_deprecated`. Hosts can key custom presentation off this; unrecognized codes should fall back to displaying `message`.
+ [JsonPropertyName("code")]
+ public string Code { get; set; } = string.Empty;
+
+ /// Human-readable message text intended for display to the user.
+ [JsonPropertyName("message")]
+ public string Message { get; set; } = string.Empty;
+}
+
/// Policy state (if applicable).
[Experimental(Diagnostics.Experimental)]
public sealed class ModelPolicy
@@ -295,6 +333,15 @@ public sealed class ModelPolicy
public string? Terms { get; set; }
}
+/// Service-published warning text that hosts should display when presenting a model.
+[Experimental(Diagnostics.Experimental)]
+public sealed class ModelWarningText
+{
+ /// Data-retention warning for the model. The text may contain Markdown links and should be rendered as Markdown when supported.
+ [JsonPropertyName("dataRetention")]
+ public string? DataRetention { get; set; }
+}
+
/// Copilot model metadata, including identifier, display name, capabilities, policy, billing, reasoning efforts, and picker categories.
[Experimental(Diagnostics.Experimental)]
public sealed class Model
@@ -315,6 +362,10 @@ public sealed class Model
[JsonPropertyName("id")]
public string Id { get; set; } = string.Empty;
+ /// Informational notices the service published for this model, such as an upcoming change or a recommended alternative. Present only when the service published at least one notice. Hosts should surface these without implying anything is wrong with the model.
+ [JsonPropertyName("infoMessages")]
+ public IList? InfoMessages { get; set; }
+
/// Model capability category for grouping in the model picker.
[JsonPropertyName("modelPickerCategory")]
public ModelPickerCategory? ModelPickerCategory { get; set; }
@@ -338,6 +389,14 @@ public sealed class Model
/// Supported reasoning effort levels (only present if model supports reasoning effort).
[JsonPropertyName("supportedReasoningEfforts")]
public IList? SupportedReasoningEfforts { get; set; }
+
+ /// Warnings the service published for this model, such as a deprecated client version. Present only when the service published at least one warning. The model remains usable; hosts should surface these as advisory rather than blocking.
+ [JsonPropertyName("warningMessages")]
+ public IList? WarningMessages { get; set; }
+
+ /// Warning text the service requires hosts to surface for this model. Present only when the service published at least one warning.
+ [JsonPropertyName("warningText")]
+ public ModelWarningText? WarningText { get; set; }
}
/// List of Copilot models available to the resolved user, including capabilities and billing metadata.
@@ -491,6 +550,7 @@ internal sealed class AccountGetQuotaRequest
[JsonDerivedType(typeof(AuthInfoHmac), "hmac")]
[JsonDerivedType(typeof(AuthInfoEnv), "env")]
[JsonDerivedType(typeof(AuthInfoToken), "token")]
+[JsonDerivedType(typeof(AuthInfoTokenProvider), "token-provider")]
[JsonDerivedType(typeof(AuthInfoCopilotApiToken), "copilot-api-token")]
[JsonDerivedType(typeof(AuthInfoUser), "user")]
[JsonDerivedType(typeof(AuthInfoGhCli), "gh-cli")]
@@ -898,11 +958,39 @@ public partial class AuthInfoToken : AuthInfo
[JsonPropertyName("host")]
public required string Host { get; set; }
+ /// Opaque native GitHub credential registration backing this token identity, when applicable.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("registrationId")]
+ public string? RegistrationId { get; set; }
+
/// The token value itself. Treat as a secret.
[JsonPropertyName("token")]
public required string Token { get; set; }
}
+/// Authentication-info variant backed by an SDK GitHub token callback. It carries routing metadata but never a plaintext token.
+/// The token-provider variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class AuthInfoTokenProvider : AuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "token-provider";
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// Authentication host.
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+
+ /// Opaque SDK callback registration identifier.
+ [JsonPropertyName("registrationId")]
+ public required string RegistrationId { get; set; }
+}
+
/// Authentication-info variant for direct Copilot API token auth sourced from environment variables, with public GitHub host.
/// The copilot-api-token variant of .
[Experimental(Diagnostics.Experimental)]
@@ -2695,6 +2783,10 @@ public sealed class InstalledPluginInfo
[JsonPropertyName("enabled")]
public bool Enabled { get; set; }
+ /// Absolute path of the marketplace directory a live plugin was resolved from. Present only on live, never-persisted records — a plugin belonging to a directory/local marketplace, which is loaded from its real directory on every pass instead of a copy under the installed-plugins cache. Its presence is what marks a listed plugin as live: such a plugin is always present on disk, so `enabled` is its only meaningful state and it is never "not installed".
+ [JsonPropertyName("installedFrom")]
+ public string? InstalledFrom { get; set; }
+
/// Marketplace the plugin came from. Empty string ("") for direct repo / URL / local installs.
[JsonPropertyName("marketplace")]
public string Marketplace { get; set; } = string.Empty;
@@ -4462,6 +4554,10 @@ public sealed class InstalledPlugin
[JsonPropertyName("installed_at")]
public string InstalledAt { get; set; } = string.Empty;
+ /// Absolute path of the marketplace directory a live plugin was resolved from. Present only on live, never-persisted records — those synthesized at session start for a directory/local marketplace, whose cache_path points at the real plugin directory on disk rather than a copy under the installed-plugins cache. Its presence is what marks a record as live, and no record carrying it is ever written to the persisted installedPlugins key.
+ [JsonPropertyName("installed_from")]
+ public string? InstalledFrom { get; set; }
+
/// Marketplace the plugin came from (empty string for direct repo installs).
[JsonPropertyName("marketplace")]
public string Marketplace { get; set; } = string.Empty;
@@ -5350,13 +5446,204 @@ public sealed class SessionSetCredentialsResult
public bool Success { get; set; }
}
+/// Authentication credentials accepted by session.gitHubAuth.setCredentials. Session-owned token-provider identities cannot be installed through this method.
+/// Polymorphic base type discriminated by type.
+[Experimental(Diagnostics.Experimental)]
+[JsonPolymorphic(
+ TypeDiscriminatorPropertyName = "type",
+ UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
+[JsonDerivedType(typeof(SettableAuthInfoHmac), "hmac")]
+[JsonDerivedType(typeof(SettableAuthInfoEnv), "env")]
+[JsonDerivedType(typeof(SettableAuthInfoToken), "token")]
+[JsonDerivedType(typeof(SettableAuthInfoCopilotApiToken), "copilot-api-token")]
+[JsonDerivedType(typeof(SettableAuthInfoUser), "user")]
+[JsonDerivedType(typeof(SettableAuthInfoGhCli), "gh-cli")]
+[JsonDerivedType(typeof(SettableAuthInfoApiKey), "api-key")]
+public partial class SettableAuthInfo
+{
+ /// The type discriminator.
+ [JsonPropertyName("type")]
+ public virtual string Type { get; set; } = string.Empty;
+}
+
+
+/// Authentication-info input variant for GitHub-internal HMAC auth, carrying the public GitHub host and HMAC secret.
+/// The hmac variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class SettableAuthInfoHmac : SettableAuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "hmac";
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this verbatim and does not re-fetch when set.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// HMAC secret used to sign requests.
+ [JsonPropertyName("hmac")]
+ public required string Hmac { get; set; }
+
+ /// Authentication host. HMAC auth always targets the public GitHub host.
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+}
+
+/// Authentication-info input variant for a token sourced from an environment variable, with host, optional login, token, and env var name.
+/// The env variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class SettableAuthInfoEnv : SettableAuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "env";
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this verbatim and does not re-fetch when set.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// Name of the environment variable the token was sourced from.
+ [JsonPropertyName("envVar")]
+ public required string EnvVar { get; set; }
+
+ /// Authentication host (e.g. https://github.com or a GHES host).
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+
+ /// User login associated with the token. Undefined for server-to-server tokens (those starting with `ghs_`).
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("login")]
+ public string? Login { get; set; }
+
+ /// The token value itself. Treat as a secret.
+ [JsonPropertyName("token")]
+ public required string Token { get; set; }
+}
+
+/// Token authentication accepted by session.gitHubAuth.setCredentials.
+/// The token variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class SettableAuthInfoToken : SettableAuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "token";
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this verbatim and does not re-fetch when set.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// Authentication host.
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+
+ /// The token value itself. Treat as a secret.
+ [JsonPropertyName("token")]
+ public required string Token { get; set; }
+}
+
+/// Authentication-info variant for direct Copilot API token auth sourced from environment variables, with public GitHub host.
+/// The copilot-api-token variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class SettableAuthInfoCopilotApiToken : SettableAuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "copilot-api-token";
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this verbatim and does not re-fetch when set.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// Authentication host (always the public GitHub host).
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+}
+
+/// Authentication-info variant for OAuth user auth, with host and login; the token remains in the runtime secret store.
+/// The user variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class SettableAuthInfoUser : SettableAuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "user";
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this verbatim and does not re-fetch when set.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// Authentication host.
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+
+ /// OAuth user login.
+ [JsonPropertyName("login")]
+ public required string Login { get; set; }
+}
+
+/// Authentication-info input variant for GitHub CLI credentials, carrying host, login, and the `gh auth token` value.
+/// The gh-cli variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class SettableAuthInfoGhCli : SettableAuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "gh-cli";
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this verbatim and does not re-fetch when set.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// Authentication host.
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+
+ /// User login as reported by `gh auth status`.
+ [JsonPropertyName("login")]
+ public required string Login { get; set; }
+
+ /// The token returned by `gh auth token`. Treat as a secret.
+ [JsonPropertyName("token")]
+ public required string Token { get; set; }
+}
+
+/// Authentication-info input variant for API-key authentication to a non-GitHub LLM provider, carrying the secret `apiKey` and host.
+/// The api-key variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class SettableAuthInfoApiKey : SettableAuthInfo
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "api-key";
+
+ /// The API key. Treat as a secret.
+ [JsonPropertyName("apiKey")]
+ public required string ApiKey { get; set; }
+
+ /// Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this verbatim and does not re-fetch when set.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("copilotUser")]
+ public CopilotUserResponse? CopilotUser { get; set; }
+
+ /// Authentication host.
+ [JsonPropertyName("host")]
+ public required string Host { get; set; }
+}
+
/// New auth credentials to install on the session. Omit to leave credentials unchanged.
[Experimental(Diagnostics.Experimental)]
internal sealed class SessionSetCredentialsParams
{
/// The new auth credentials to install on the session. When omitted or `undefined`, the call is a no-op and the session's existing credentials are preserved. The runtime installs the supplied value immediately for outbound model/API requests. When the credential carries a raw token (`token`, `env`, or `gh-cli`) but no `copilotUser`, the runtime additionally re-resolves `copilotUser` server-side (best-effort, asynchronously, after the synchronous install) so plan/quota/billing metadata regains fidelity; on resolution failure the verbatim credential remains installed. It does NOT otherwise validate the credential. Several variants carry secret material; treat this method's params as containing secrets at rest and in transit.
[JsonPropertyName("credentials")]
- public AuthInfo? Credentials { get; set; }
+ public SettableAuthInfo? Credentials { get; set; }
/// Target session identifier.
[JsonPropertyName("sessionId")]
@@ -5383,6 +5670,10 @@ public sealed class AuthIdentity
[JsonPropertyName("login")]
public string? Login { get; set; }
+ /// Opaque SDK GitHub credential registration backing this identity. Routing metadata only; never a credential.
+ [JsonPropertyName("registrationId")]
+ public string? RegistrationId { get; set; }
+
/// Authentication type.
[JsonPropertyName("type")]
public AuthInfoType Type { get; set; }
@@ -9384,7 +9675,7 @@ public partial class McpOauthPendingRequestResponseToken : McpOauthPendingReques
[JsonPropertyName("expiresIn")]
public long? ExpiresIn { get; set; }
- /// OAuth token type. Defaults to Bearer when omitted.
+ /// OAuth token type. Defaults to bearer when omitted.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("tokenType")]
public string? TokenType { get; set; }
@@ -10588,6 +10879,10 @@ public sealed class SessionInstalledPlugin
[JsonPropertyName("installed_at")]
public string InstalledAt { get; set; } = string.Empty;
+ /// Absolute path of the marketplace directory a live plugin was resolved from. Present only on live, never-persisted records — those synthesized at session start for a directory/local marketplace, whose cache_path points at the real plugin directory on disk rather than a copy under the installed-plugins cache. Its presence is what marks a record as live, and no record carrying it is ever written to the persisted installedPlugins key.
+ [JsonPropertyName("installed_from")]
+ public string? InstalledFrom { get; set; }
+
/// Marketplace the plugin came from (empty string for direct repo installs).
[JsonPropertyName("marketplace")]
public string Marketplace { get; set; } = string.Empty;
@@ -10802,7 +11097,7 @@ public sealed class SandboxConfig
[JsonPropertyName("addCurrentWorkingDirectory")]
public bool? AddCurrentWorkingDirectory { get; set; }
- /// Whether to auto-grant read access to the tool directories discovered on PATH and in toolchain environment variables (GOROOT, CARGO_HOME, JAVA_HOME, VIRTUAL_ENV, and similar), and to common developer-tool caches, registries, and toolchains in their default home locations (cargo, go, npm, Maven, and more), plus read-write access to (and, on Unix, up-front creation of) the scratch caches builds write on every run (go-build, ccache, sccache, Gradle caches, Cargo lock/tracker files), so builds work without extra configuration; a relocated CARGO_HOME additionally gets its Cargo lock files granted read-write. Set to false to disable every grant listed above: user-installed toolchains (rustup, nvm, pyenv, conda, pipx) then need explicit userPolicy.filesystem entries — readonlyPaths to read them, plus readwriteFiles for a relocated CARGO_HOME's .package-cache and .global-cache, which Cargo locks on every build. Only these developer-tool grants are affected: the working directory (see addCurrentWorkingDirectory), temporary storage, session log paths, and system locations follow their own rules and stay granted, so commands still run. Default: true (enabled by default; set to false to opt out).
+ /// Whether to auto-grant read access to the tool directories discovered on PATH and in toolchain environment variables (GOROOT, CARGO_HOME, JAVA_HOME, VIRTUAL_ENV, and similar), and to common developer-tool caches, registries, and toolchains in their default home locations (cargo, go, npm, Maven, and more), plus read-write access to (and up-front creation of) the scratch caches builds write on every run (go-build, ccache, sccache, Gradle caches, Cargo lock/tracker files), so builds work without extra configuration; a relocated CARGO_HOME additionally gets its Cargo lock files granted read-write. Set to false to disable every grant listed above: user-installed toolchains (rustup, nvm, pyenv, conda, pipx) then need explicit userPolicy.filesystem entries — readonlyPaths to read them, plus readwriteFiles for a relocated CARGO_HOME's .package-cache and .global-cache, which Cargo locks on every build. Only these developer-tool grants are affected: the working directory (see addCurrentWorkingDirectory), temporary storage, session log paths, and system locations follow their own rules and stay granted, so commands still run. Default: true (enabled by default; set to false to opt out).
[JsonPropertyName("allowDevToolAccess")]
public bool? AllowDevToolAccess { get; set; }
@@ -11035,6 +11330,10 @@ internal sealed class SessionUpdateOptionsParams
[JsonPropertyName("includedBuiltinAgents")]
public IList? IncludedBuiltinAgents { get; set; }
+ /// Built-in skill names to include in this session. When specified, only these runtime-bundled skills are available. Skills from other sources with the same name remain available. Set to null to remove the allowlist restriction.
+ [JsonPropertyName("includedBuiltinSkills")]
+ public IList? IncludedBuiltinSkills { get; set; }
+
/// Full set of installed plugins for the session. Replaces the existing list; the runtime invalidates the skills cache only when the list materially changes.
[JsonPropertyName("installedPlugins")]
public IList? InstalledPlugins { get; set; }
@@ -11095,6 +11394,11 @@ internal sealed class SessionUpdateOptionsParams
[JsonPropertyName("sandboxConfig")]
public SandboxConfig? SandboxConfig { get; set; }
+ /// Origin of the sandbox choice. The runtime uses this only for internal telemetry provenance; managed policy is derived independently.
+ [JsonInclude]
+ [JsonPropertyName("sandboxConfigSource")]
+ internal SandboxConfigSource? SandboxConfigSource { get; set; }
+
/// Replaces the session's capability set with the given list. Use to enable or disable capabilities mid-session (e.g., remove `memory` for reproducible scripted runs). Omit the field to leave the existing capability set unchanged.
[JsonPropertyName("sessionCapabilities")]
public IList? SessionCapabilities { get; set; }
@@ -13485,7 +13789,7 @@ public sealed class PermissionsConfigureAdditionalContentExclusionPolicy
[Experimental(Diagnostics.Experimental)]
public sealed class PermissionPathsConfig
{
- /// Additional directories to allow tool access to (in addition to the session's working directory). When `unrestricted` is true, these are still pre-populated on the UnrestrictedPathManager so they remain visible via getDirectories() (e.g. for @-mention completion).
+ /// Additional directories to allow tool access to (in addition to the session's working directory). Conventional `.github/skills/` and `.github/agents/` definitions under them also join the session catalogs when their subsystem gates are enabled, so supplying a directory is a trust decision for configuration stored there. When `unrestricted` is true, these are still pre-populated on the UnrestrictedPathManager so they remain visible via getDirectories() (e.g. for @-mention completion).
[JsonPropertyName("additionalDirectories")]
public IList? AdditionalDirectories { get; set; }
@@ -14466,7 +14770,7 @@ public sealed class PermissionsPathsAddResult
[Experimental(Diagnostics.Experimental)]
internal sealed class PermissionPathsAddParams
{
- /// Directory to add to the allow-list. The runtime resolves and validates the path before adding.
+ /// Directory to add to the allow-list. The runtime resolves and validates the path before adding, then loads conventional `.github/skills/` and `.github/agents/` definitions under it when their subsystem gates are enabled. Adding the directory is therefore also a trust decision for configuration stored there.
[JsonPropertyName("path")]
public string Path { get; set; } = string.Empty;
@@ -16233,6 +16537,10 @@ public sealed class QueuePendingItems
[Experimental(Diagnostics.Experimental)]
public sealed class QueuePendingItemsResult
{
+ /// How many leading entries of `steeringMessages` have already been folded into the running turn (and so have an emitted `user.message`), as opposed to still waiting for one. Absent for hosts that do not distinguish the two.
+ [JsonPropertyName("inFlightSteeringCount")]
+ public long? InFlightSteeringCount { get; set; }
+
/// Pending queued items in submission order. Includes user messages, queued slash commands, and queued model changes; omits internal system items.
[JsonPropertyName("items")]
public IList Items { get => field ??= []; set; }
@@ -18301,6 +18609,74 @@ public sealed class GitHubTelemetryNotification
public string? SessionId { get; set; }
}
+/// SDK host response to a GitHub credential request.
+/// Polymorphic base type discriminated by kind.
+[Experimental(Diagnostics.Experimental)]
+[JsonPolymorphic(
+ TypeDiscriminatorPropertyName = "kind",
+ UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
+[JsonDerivedType(typeof(GitHubTokenAcquireResultToken), "token")]
+[JsonDerivedType(typeof(GitHubTokenAcquireResultCancelled), "cancelled")]
+public partial class GitHubTokenAcquireResult
+{
+ /// The type discriminator.
+ [JsonPropertyName("kind")]
+ public virtual string Kind { get; set; } = string.Empty;
+}
+
+
+/// The token variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class GitHubTokenAcquireResultToken : GitHubTokenAcquireResult
+{
+ ///
+ [JsonIgnore]
+ public override string Kind => "token";
+
+ /// GitHub access token acquired by the SDK host.
+ [JsonPropertyName("accessToken")]
+ public required string AccessToken { get; set; }
+
+ /// Remaining token lifetime in seconds when callback execution completes. It must exceed the one-hour preflight refresh threshold.
+ [JsonPropertyName("expiresIn")]
+ public required long ExpiresIn { get; set; }
+
+ /// OAuth token type. Defaults to bearer when omitted.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("tokenType")]
+ public string? TokenType { get; set; }
+}
+
+/// The cancelled variant of .
+[Experimental(Diagnostics.Experimental)]
+public partial class GitHubTokenAcquireResultCancelled : GitHubTokenAcquireResult
+{
+ ///
+ [JsonIgnore]
+ public override string Kind => "cancelled";
+}
+
+/// Asks the SDK client to acquire a GitHub access token from an opaque callback registration.
+[Experimental(Diagnostics.Experimental)]
+public sealed class GitHubTokenAcquireRequest
+{
+ /// Effective GitHub host for which the callback must return a token.
+ [JsonPropertyName("host")]
+ public string Host { get; set; } = string.Empty;
+
+ /// Why the runtime is requesting a GitHub credential.
+ [JsonPropertyName("reason")]
+ public GitHubTokenAcquireReason Reason { get; set; }
+
+ /// Opaque identifier generated by the SDK for this callback registration.
+ [JsonPropertyName("registrationId")]
+ public string RegistrationId { get; set; } = string.Empty;
+
+ /// Session receiving the token. Absent only before a cloud session has been assigned its id.
+ [JsonPropertyName("sessionId")]
+ public string? SessionId { get; set; }
+}
+
/// Resolved Anthropic adaptive-thinking capability for a model.
[Experimental(Diagnostics.Experimental)]
[JsonConverter(typeof(Converter))]
@@ -22563,6 +22939,9 @@ public AuthInfoType(string value)
/// Authentication from a GitHub token.
public static AuthInfoType Token { get; } = new("token");
+ /// Authentication from an SDK GitHub token callback.
+ public static AuthInfoType TokenProvider { get; } = new("token-provider");
+
/// Authentication from a Copilot API token.
public static AuthInfoType CopilotApiToken { get; } = new("copilot-api-token");
@@ -25168,6 +25547,84 @@ public override void Write(Utf8JsonWriter writer, OptionsUpdateReasoningSummary
}
+/// Origin of the sandbox choice supplied by an internal client.
+[Experimental(Diagnostics.Experimental)]
+[JsonConverter(typeof(Converter))]
+[DebuggerDisplay("{Value,nq}")]
+public readonly struct SandboxConfigSource : IEquatable
+{
+ private readonly string? _value;
+
+ /// Initializes a new instance of the struct.
+ /// The value to associate with this .
+ [JsonConstructor]
+ public SandboxConfigSource(string value)
+ {
+ ArgumentException.ThrowIfNullOrWhiteSpace(value);
+ _value = value;
+ }
+
+ /// Gets the value associated with this .
+ public string Value => _value ?? string.Empty;
+
+ /// The client applied the default because no sandbox preference was configured.
+ public static SandboxConfigSource NeverConfigured { get; } = new("never_configured");
+
+ /// The user's persisted settings enabled the sandbox.
+ public static SandboxConfigSource UserEnabled { get; } = new("user_enabled");
+
+ /// The user's persisted settings disabled the sandbox.
+ public static SandboxConfigSource UserDisabled { get; } = new("user_disabled");
+
+ /// A command-line flag selected the sandbox state for this session.
+ public static SandboxConfigSource SessionFlag { get; } = new("session_flag");
+
+ /// The user disabled the sandbox for the current session.
+ public static SandboxConfigSource SessionDisabled { get; } = new("session_disabled");
+
+ /// The client disabled the sandbox because the host cannot enforce it.
+ public static SandboxConfigSource UnsupportedHost { get; } = new("unsupported_host");
+
+ /// A repository policy selected the sandbox state.
+ public static SandboxConfigSource RepositoryPolicy { get; } = new("repository_policy");
+
+ /// Returns a value indicating whether two instances are equivalent.
+ public static bool operator ==(SandboxConfigSource left, SandboxConfigSource right) => left.Equals(right);
+
+ /// Returns a value indicating whether two instances are not equivalent.
+ public static bool operator !=(SandboxConfigSource left, SandboxConfigSource right) => !(left == right);
+
+ ///
+ public override bool Equals(object? obj) => obj is SandboxConfigSource other && Equals(other);
+
+ ///
+ public bool Equals(SandboxConfigSource 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 SandboxConfigSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert));
+ }
+
+ ///
+ public override void Write(Utf8JsonWriter writer, SandboxConfigSource value, JsonSerializerOptions options)
+ {
+ GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SandboxConfigSource));
+ }
+ }
+}
+
+
/// Session capability enabled for this session.
[Experimental(Diagnostics.Experimental)]
[JsonConverter(typeof(Converter))]
@@ -28824,6 +29281,69 @@ public override void Write(Utf8JsonWriter writer, LlmInferenceHttpRequestStartTr
}
+/// Why the runtime is requesting a GitHub credential.
+[Experimental(Diagnostics.Experimental)]
+[JsonConverter(typeof(Converter))]
+[DebuggerDisplay("{Value,nq}")]
+public readonly struct GitHubTokenAcquireReason : IEquatable
+{
+ private readonly string? _value;
+
+ /// Initializes a new instance of the struct.
+ /// The value to associate with this .
+ [JsonConstructor]
+ public GitHubTokenAcquireReason(string value)
+ {
+ ArgumentException.ThrowIfNullOrWhiteSpace(value);
+ _value = value;
+ }
+
+ /// Gets the value associated with this .
+ public string Value => _value ?? string.Empty;
+
+ /// The runtime is acquiring the registration's first credential.
+ public static GitHubTokenAcquireReason Initial { get; } = new("initial");
+
+ /// The runtime is replacing a credential that is approaching expiry.
+ public static GitHubTokenAcquireReason Refresh { get; } = new("refresh");
+
+ /// Returns a value indicating whether two instances are equivalent.
+ public static bool operator ==(GitHubTokenAcquireReason left, GitHubTokenAcquireReason right) => left.Equals(right);
+
+ /// Returns a value indicating whether two instances are not equivalent.
+ public static bool operator !=(GitHubTokenAcquireReason left, GitHubTokenAcquireReason right) => !(left == right);
+
+ ///
+ public override bool Equals(object? obj) => obj is GitHubTokenAcquireReason other && Equals(other);
+
+ ///
+ public bool Equals(GitHubTokenAcquireReason 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 GitHubTokenAcquireReason Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert));
+ }
+
+ ///
+ public override void Write(Utf8JsonWriter writer, GitHubTokenAcquireReason value, JsonSerializerOptions options)
+ {
+ GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(GitHubTokenAcquireReason));
+ }
+ }
+}
+
+
/// Provides server-scoped RPC methods (no session required).
public sealed class ServerRpc
{
@@ -28847,13 +29367,14 @@ public async Task PingAsync(string? message = null, CancellationToke
/// Performs the SDK server connection handshake and validates the optional connection token. Marked internal because this is JSON-RPC transport plumbing invoked automatically by an SDK client's own `connect()` wrapper, not a user-facing method. Stays internal as long as the SDK client owns the handshake; would only become public if the SDK ever exposed the raw schema surface to consumers without a connection wrapper.
/// Opt this connection in to GitHub telemetry forwarding for its lifetime. When set, the runtime forwards every internal telemetry event it emits — across all sessions, plus sessionless events — to this connection over the `gitHubTelemetry.event` notification. Regular events are also written to the runtime's normal GitHub/CTS path (dual-write); host-only compatibility events are forward-only and intentionally skip that path. Intended for first-party hosts that re-emit the events into their own telemetry stores. Both unrestricted and restricted events are forwarded, each tagged with a `restricted` discriminator; a backstop drops restricted events when restricted telemetry is disabled — using the process-global gate for ordinary events and an explicit session-scoped decision for host-only events.
+ /// Identity of the integrating host. Optional; omit it to keep the default attribution.
/// Connection token; required when the server was started with COPILOT_CONNECTION_TOKEN.
/// The to monitor for cancellation requests. The default is .
/// Handshake result reporting the server's protocol version and package version on success.
[Experimental(Diagnostics.Experimental)]
- internal async Task ConnectAsync(bool? enableGitHubTelemetryForwarding = null, string? token = null, CancellationToken cancellationToken = default)
+ internal async Task ConnectAsync(bool? enableGitHubTelemetryForwarding = null, ConnectClientInfo? clientInfo = null, string? token = null, CancellationToken cancellationToken = default)
{
- var request = new ConnectRequest { EnableGitHubTelemetryForwarding = enableGitHubTelemetryForwarding, Token = token };
+ var request = new ConnectRequest { EnableGitHubTelemetryForwarding = enableGitHubTelemetryForwarding, ClientInfo = clientInfo, Token = token };
return await CopilotClient.InvokeRpcAsync(_rpc, "connect", [request], cancellationToken);
}
@@ -30665,7 +31186,7 @@ public async Task GetStatusAsync(CancellationToken cancellati
/// The new auth credentials to install on the session. When omitted or `undefined`, the call is a no-op and the session's existing credentials are preserved. The runtime installs the supplied value immediately for outbound model/API requests. When the credential carries a raw token (`token`, `env`, or `gh-cli`) but no `copilotUser`, the runtime additionally re-resolves `copilotUser` server-side (best-effort, asynchronously, after the synchronous install) so plan/quota/billing metadata regains fidelity; on resolution failure the verbatim credential remains installed. It does NOT otherwise validate the credential. Several variants carry secret material; treat this method's params as containing secrets at rest and in transit.
/// The to monitor for cancellation requests. The default is .
/// Indicates whether the credential update succeeded.
- public async Task SetCredentialsAsync(AuthInfo? credentials = null, CancellationToken cancellationToken = default)
+ public async Task SetCredentialsAsync(SettableAuthInfo? credentials = null, CancellationToken cancellationToken = default)
{
_session.ThrowIfDisposed();
@@ -32631,10 +33152,12 @@ internal OptionsApi(CopilotSession session)
/// Use shell.initProfile instead. Shell init profile (`None` or `NonInteractive`).
/// PowerShell process flags applied to built-in and user-requested shell commands.
/// Resolved sandbox configuration.
+ /// Origin of the sandbox choice. The runtime uses this only for internal telemetry provenance; managed policy is derived independently.
/// Whether interactive shell sessions are logged.
/// How env values are passed to MCP servers (`direct` inlines literal values; `indirect` resolves at launch).
/// Whether to include instructions from every MCP server in the system prompt instead of only allowlisted servers.
/// Additional directories to search for skills.
+ /// Built-in skill names to include in this session. When specified, only these runtime-bundled skills are available. Skills from other sources with the same name remain available. Set to null to remove the allowlist restriction.
/// Skill IDs that should be excluded from this session.
/// Whether to discover custom instructions on demand after successful file views (AGENTS.md / CLAUDE.md / .github/copilot-instructions.md surfacing). Combined with `skipCustomInstructions`.
/// Maximum decoded byte size of a single model-facing binary tool result (e.g. an image) persisted inline in session events and re-presented to the model on later turns / resume. Larger results are persisted as a metadata-only marker and shown to the model as a short text note. Defaults to 10 MB.
@@ -32667,11 +33190,11 @@ internal OptionsApi(CopilotSession session)
/// Optional session limits. Pass null to clear the session limits.
/// The to monitor for cancellation requests. The default is .
/// Indicates whether the session options patch was applied successfully.
- public async Task UpdateAsync(string? model = null, ModelCapabilitiesOverride? modelCapabilitiesOverrides = null, string? reasoningEffort = null, OptionsUpdateReasoningSummary? reasoningSummary = null, Verbosity? verbosity = null, string? clientName = null, string? lspClientName = null, string? integrationId = null, IDictionary? featureFlags = null, bool? isExperimentalMode = null, ProviderConfig? provider = null, CapiSessionOptions? capi = null, string? workingDirectory = null, IList? availableTools = null, IList? excludedTools = null, IList? includedBuiltinAgents = null, IList? excludedBuiltinAgents = null, OptionsUpdateToolFilterPrecedence? toolFilterPrecedence = null, bool? enableScriptSafety = null, ShellOptions? shell = null, string? shellInitProfile = null, IList? shellProcessFlags = null, SandboxConfig? sandboxConfig = null, bool? logInteractiveShells = null, OptionsUpdateEnvValueMode? envValueMode = null, bool? allowAllMcpServerInstructions = null, IList? skillDirectories = null, IList? disabledSkills = null, bool? enableOnDemandInstructionDiscovery = null, long? maxInlineBinaryBytes = null, IList? installedPlugins = null, bool? customAgentsLocalOnly = null, bool? suppressCustomAgentPrompt = null, bool? skipCustomInstructions = null, IList? disabledInstructionSources = null, bool? coauthorEnabled = null, string? trajectoryFile = null, bool? enableStreaming = null, string? copilotUrl = null, bool? askUserDisabled = null, bool? continueOnAutoMode = null, bool? runningInInteractiveMode = null, bool? enableReasoningSummaries = null, string? agentContext = null, string? eventsLogDirectory = null, bool? eventsLogIncludesSubagents = null, IList? additionalContentExclusionPolicies = null, bool? manageScheduleEnabled = null, IList? sessionCapabilities = null, bool? skipEmbeddingRetrieval = null, string? organizationCustomInstructions = null, bool? enableFileHooks = null, bool? enableHostGitOperations = null, bool? enableSessionStore = null, bool? enableSkills = null, OptionsUpdateContextTier? contextTier = null, SessionLimitsConfig? sessionLimits = null, CancellationToken cancellationToken = default)
+ public async Task UpdateAsync(string? model = null, ModelCapabilitiesOverride? modelCapabilitiesOverrides = null, string? reasoningEffort = null, OptionsUpdateReasoningSummary? reasoningSummary = null, Verbosity? verbosity = null, string? clientName = null, string? lspClientName = null, string? integrationId = null, IDictionary? featureFlags = null, bool? isExperimentalMode = null, ProviderConfig? provider = null, CapiSessionOptions? capi = null, string? workingDirectory = null, IList? availableTools = null, IList? excludedTools = null, IList? includedBuiltinAgents = null, IList? excludedBuiltinAgents = null, OptionsUpdateToolFilterPrecedence? toolFilterPrecedence = null, bool? enableScriptSafety = null, ShellOptions? shell = null, string? shellInitProfile = null, IList? shellProcessFlags = null, SandboxConfig? sandboxConfig = null, SandboxConfigSource? sandboxConfigSource = null, bool? logInteractiveShells = null, OptionsUpdateEnvValueMode? envValueMode = null, bool? allowAllMcpServerInstructions = null, IList? skillDirectories = null, IList? includedBuiltinSkills = null, IList? disabledSkills = null, bool? enableOnDemandInstructionDiscovery = null, long? maxInlineBinaryBytes = null, IList? installedPlugins = null, bool? customAgentsLocalOnly = null, bool? suppressCustomAgentPrompt = null, bool? skipCustomInstructions = null, IList? disabledInstructionSources = null, bool? coauthorEnabled = null, string? trajectoryFile = null, bool? enableStreaming = null, string? copilotUrl = null, bool? askUserDisabled = null, bool? continueOnAutoMode = null, bool? runningInInteractiveMode = null, bool? enableReasoningSummaries = null, string? agentContext = null, string? eventsLogDirectory = null, bool? eventsLogIncludesSubagents = null, IList? additionalContentExclusionPolicies = null, bool? manageScheduleEnabled = null, IList? sessionCapabilities = null, bool? skipEmbeddingRetrieval = null, string? organizationCustomInstructions = null, bool? enableFileHooks = null, bool? enableHostGitOperations = null, bool? enableSessionStore = null, bool? enableSkills = null, OptionsUpdateContextTier? contextTier = null, SessionLimitsConfig? sessionLimits = null, CancellationToken cancellationToken = default)
{
_session.ThrowIfDisposed();
- var request = new SessionUpdateOptionsParams { SessionId = _session.SessionId, Model = model, ModelCapabilitiesOverrides = modelCapabilitiesOverrides, ReasoningEffort = reasoningEffort, ReasoningSummary = reasoningSummary, Verbosity = verbosity, ClientName = clientName, LspClientName = lspClientName, IntegrationId = integrationId, FeatureFlags = featureFlags, IsExperimentalMode = isExperimentalMode, Provider = provider, Capi = capi, WorkingDirectory = workingDirectory, AvailableTools = availableTools, ExcludedTools = excludedTools, IncludedBuiltinAgents = includedBuiltinAgents, ExcludedBuiltinAgents = excludedBuiltinAgents, ToolFilterPrecedence = toolFilterPrecedence, EnableScriptSafety = enableScriptSafety, Shell = shell, ShellInitProfile = shellInitProfile, ShellProcessFlags = shellProcessFlags, SandboxConfig = sandboxConfig, LogInteractiveShells = logInteractiveShells, EnvValueMode = envValueMode, AllowAllMcpServerInstructions = allowAllMcpServerInstructions, SkillDirectories = skillDirectories, DisabledSkills = disabledSkills, EnableOnDemandInstructionDiscovery = enableOnDemandInstructionDiscovery, MaxInlineBinaryBytes = maxInlineBinaryBytes, InstalledPlugins = installedPlugins, CustomAgentsLocalOnly = customAgentsLocalOnly, SuppressCustomAgentPrompt = suppressCustomAgentPrompt, SkipCustomInstructions = skipCustomInstructions, DisabledInstructionSources = disabledInstructionSources, CoauthorEnabled = coauthorEnabled, TrajectoryFile = trajectoryFile, EnableStreaming = enableStreaming, CopilotUrl = copilotUrl, AskUserDisabled = askUserDisabled, ContinueOnAutoMode = continueOnAutoMode, RunningInInteractiveMode = runningInInteractiveMode, EnableReasoningSummaries = enableReasoningSummaries, AgentContext = agentContext, EventsLogDirectory = eventsLogDirectory, EventsLogIncludesSubagents = eventsLogIncludesSubagents, AdditionalContentExclusionPolicies = additionalContentExclusionPolicies, ManageScheduleEnabled = manageScheduleEnabled, SessionCapabilities = sessionCapabilities, SkipEmbeddingRetrieval = skipEmbeddingRetrieval, OrganizationCustomInstructions = organizationCustomInstructions, EnableFileHooks = enableFileHooks, EnableHostGitOperations = enableHostGitOperations, EnableSessionStore = enableSessionStore, EnableSkills = enableSkills, ContextTier = contextTier, SessionLimits = sessionLimits };
+ var request = new SessionUpdateOptionsParams { SessionId = _session.SessionId, Model = model, ModelCapabilitiesOverrides = modelCapabilitiesOverrides, ReasoningEffort = reasoningEffort, ReasoningSummary = reasoningSummary, Verbosity = verbosity, ClientName = clientName, LspClientName = lspClientName, IntegrationId = integrationId, FeatureFlags = featureFlags, IsExperimentalMode = isExperimentalMode, Provider = provider, Capi = capi, WorkingDirectory = workingDirectory, AvailableTools = availableTools, ExcludedTools = excludedTools, IncludedBuiltinAgents = includedBuiltinAgents, ExcludedBuiltinAgents = excludedBuiltinAgents, ToolFilterPrecedence = toolFilterPrecedence, EnableScriptSafety = enableScriptSafety, Shell = shell, ShellInitProfile = shellInitProfile, ShellProcessFlags = shellProcessFlags, SandboxConfig = sandboxConfig, SandboxConfigSource = sandboxConfigSource, LogInteractiveShells = logInteractiveShells, EnvValueMode = envValueMode, AllowAllMcpServerInstructions = allowAllMcpServerInstructions, SkillDirectories = skillDirectories, IncludedBuiltinSkills = includedBuiltinSkills, DisabledSkills = disabledSkills, EnableOnDemandInstructionDiscovery = enableOnDemandInstructionDiscovery, MaxInlineBinaryBytes = maxInlineBinaryBytes, InstalledPlugins = installedPlugins, CustomAgentsLocalOnly = customAgentsLocalOnly, SuppressCustomAgentPrompt = suppressCustomAgentPrompt, SkipCustomInstructions = skipCustomInstructions, DisabledInstructionSources = disabledInstructionSources, CoauthorEnabled = coauthorEnabled, TrajectoryFile = trajectoryFile, EnableStreaming = enableStreaming, CopilotUrl = copilotUrl, AskUserDisabled = askUserDisabled, ContinueOnAutoMode = continueOnAutoMode, RunningInInteractiveMode = runningInInteractiveMode, EnableReasoningSummaries = enableReasoningSummaries, AgentContext = agentContext, EventsLogDirectory = eventsLogDirectory, EventsLogIncludesSubagents = eventsLogIncludesSubagents, AdditionalContentExclusionPolicies = additionalContentExclusionPolicies, ManageScheduleEnabled = manageScheduleEnabled, SessionCapabilities = sessionCapabilities, SkipEmbeddingRetrieval = skipEmbeddingRetrieval, OrganizationCustomInstructions = organizationCustomInstructions, EnableFileHooks = enableFileHooks, EnableHostGitOperations = enableHostGitOperations, EnableSessionStore = enableSessionStore, EnableSkills = enableSkills, ContextTier = contextTier, SessionLimits = sessionLimits };
return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.options.update", [request], cancellationToken);
}
}
@@ -33388,8 +33911,8 @@ public async Task ListAsync(CancellationToken cancellationT
return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.permissions.paths.list", [request], cancellationToken);
}
- /// Adds a directory to the session's allow-list.
- /// Directory to add to the allow-list. The runtime resolves and validates the path before adding.
+ /// Adds a directory to the session's allow-list and activates conventional skill and agent definitions under it.
+ /// Directory to add to the allow-list. The runtime resolves and validates the path before adding, then loads conventional `.github/skills/` and `.github/agents/` definitions under it when their subsystem gates are enabled. Adding the directory is therefore also a trust decision for configuration stored there.
/// The to monitor for cancellation requests. The default is .
/// Indicates whether the operation succeeded.
public async Task AddAsync(string path, CancellationToken cancellationToken = default)
@@ -34786,6 +35309,17 @@ public interface IGitHubTelemetryHandler
Task EventAsync(GitHubTelemetryNotification request, CancellationToken cancellationToken = default);
}
+/// Handles `gitHubToken` client global API methods.
+[Experimental(Diagnostics.Experimental)]
+public interface IGitHubTokenHandler
+{
+ /// Asks the SDK client to mint a GitHub access token for a session whose configuration supplied a GitHub token provider. The runtime acquires the initial token during bootstrap and refreshes it during expiry preflight when one hour or less remains.
+ /// Asks the SDK client to acquire a GitHub access token from an opaque callback registration.
+ /// The to monitor for cancellation requests. The default is .
+ /// SDK host response to a GitHub credential request.
+ Task GetTokenAsync(GitHubTokenAcquireRequest request, CancellationToken cancellationToken = default);
+}
+
/// Provides all client global API handler groups for a connection.
public sealed class ClientGlobalApiHandlers
{
@@ -34797,6 +35331,9 @@ public sealed class ClientGlobalApiHandlers
/// Optional handler for GitHubTelemetry client global API methods.
public IGitHubTelemetryHandler? GitHubTelemetry { get; set; }
+
+ /// Optional handler for GitHubToken client global API methods.
+ public IGitHubTokenHandler? GitHubToken { get; set; }
}
/// Registers client global API handlers on a JSON-RPC connection.
@@ -34830,6 +35367,11 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
var handler = handlers.GitHubTelemetry ?? throw new InvalidOperationException("No gitHubTelemetry client-global handler registered");
await handler.EventAsync(request, cancellationToken);
}), singleObjectParam: true);
+ rpc.SetLocalRpcMethod("gitHubToken.getToken", (Func>)(async (request, cancellationToken) =>
+ {
+ var handler = handlers.GitHubToken ?? throw new InvalidOperationException("No gitHubToken client-global handler registered");
+ return await handler.GetTokenAsync(request, cancellationToken);
+ }), singleObjectParam: true);
}
}
@@ -34857,6 +35399,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(GitHub.Copilot.AssistantMessageDeltaData), TypeInfoPropertyName = "SessionEventsAssistantMessageDeltaData")]
[JsonSerializable(typeof(GitHub.Copilot.AssistantMessageDeltaEvent), TypeInfoPropertyName = "SessionEventsAssistantMessageDeltaEvent")]
[JsonSerializable(typeof(GitHub.Copilot.AssistantMessageEvent), TypeInfoPropertyName = "SessionEventsAssistantMessageEvent")]
+[JsonSerializable(typeof(GitHub.Copilot.AssistantMessageReasoningBlocks), TypeInfoPropertyName = "SessionEventsAssistantMessageReasoningBlocks")]
[JsonSerializable(typeof(GitHub.Copilot.AssistantMessageServerTools), TypeInfoPropertyName = "SessionEventsAssistantMessageServerTools")]
[JsonSerializable(typeof(GitHub.Copilot.AssistantMessageStartData), TypeInfoPropertyName = "SessionEventsAssistantMessageStartData")]
[JsonSerializable(typeof(GitHub.Copilot.AssistantMessageStartEvent), TypeInfoPropertyName = "SessionEventsAssistantMessageStartEvent")]
@@ -35028,6 +35571,9 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureRequestFingerprint), TypeInfoPropertyName = "SessionEventsModelCallFailureRequestFingerprint")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureSource), TypeInfoPropertyName = "SessionEventsModelCallFailureSource")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallFailureTransport), TypeInfoPropertyName = "SessionEventsModelCallFailureTransport")]
+[JsonSerializable(typeof(GitHub.Copilot.ModelCallFinishedData), TypeInfoPropertyName = "SessionEventsModelCallFinishedData")]
+[JsonSerializable(typeof(GitHub.Copilot.ModelCallFinishedEvent), TypeInfoPropertyName = "SessionEventsModelCallFinishedEvent")]
+[JsonSerializable(typeof(GitHub.Copilot.ModelCallFinishedOutcome), TypeInfoPropertyName = "SessionEventsModelCallFinishedOutcome")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallStartData), TypeInfoPropertyName = "SessionEventsModelCallStartData")]
[JsonSerializable(typeof(GitHub.Copilot.ModelCallStartEvent), TypeInfoPropertyName = "SessionEventsModelCallStartEvent")]
[JsonSerializable(typeof(GitHub.Copilot.ModelChangeSource), TypeInfoPropertyName = "SessionEventsModelChangeSource")]
@@ -35283,6 +35829,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(CompletionsRequestRequest))]
[JsonSerializable(typeof(CompletionsRequestResult))]
[JsonSerializable(typeof(ConfigureSessionExtensionsParams))]
+[JsonSerializable(typeof(ConnectClientInfo))]
[JsonSerializable(typeof(ConnectRemoteSessionParams))]
[JsonSerializable(typeof(ConnectRequest))]
[JsonSerializable(typeof(ConnectResult))]
@@ -35374,6 +35921,8 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(GitHubTelemetryClientInfo))]
[JsonSerializable(typeof(GitHubTelemetryEvent))]
[JsonSerializable(typeof(GitHubTelemetryNotification))]
+[JsonSerializable(typeof(GitHubTokenAcquireRequest))]
+[JsonSerializable(typeof(GitHubTokenAcquireResult))]
[JsonSerializable(typeof(HandlePendingToolCallRequest))]
[JsonSerializable(typeof(HandlePendingToolCallResult))]
[JsonSerializable(typeof(HistoryAbortManualCompactionResult))]
@@ -35560,6 +36109,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(ModelCapabilitiesOverrideSupports))]
[JsonSerializable(typeof(ModelCapabilitiesSupports))]
[JsonSerializable(typeof(ModelList))]
+[JsonSerializable(typeof(ModelMessage))]
[JsonSerializable(typeof(ModelPickerPersistenceRequest))]
[JsonSerializable(typeof(ModelPickerSettingsContext))]
[JsonSerializable(typeof(ModelPickerSettingsContextEnvironment))]
@@ -35569,6 +36119,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(ModelSwitchConfirmation))]
[JsonSerializable(typeof(ModelSwitchToRequest))]
[JsonSerializable(typeof(ModelSwitchToResult))]
+[JsonSerializable(typeof(ModelWarningText))]
[JsonSerializable(typeof(ModelsListRequest))]
[JsonSerializable(typeof(MoveMcpLoadingToBackgroundResult))]
[JsonSerializable(typeof(NameGetResult))]
@@ -35949,6 +36500,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH
[JsonSerializable(typeof(SessionsStartRemoteControlRequest))]
[JsonSerializable(typeof(SessionsStopRemoteControlRequest))]
[JsonSerializable(typeof(SessionsTransferRemoteControlRequest))]
+[JsonSerializable(typeof(SettableAuthInfo))]
[JsonSerializable(typeof(ShellCancelUserRequestedRequest))]
[JsonSerializable(typeof(ShellCredentials))]
[JsonSerializable(typeof(ShellExecRequest))]
diff --git a/dotnet/src/Generated/SessionEvents.cs b/dotnet/src/Generated/SessionEvents.cs
index fa0563a8e4..ccfda24fa3 100644
--- a/dotnet/src/Generated/SessionEvents.cs
+++ b/dotnet/src/Generated/SessionEvents.cs
@@ -68,6 +68,7 @@ namespace GitHub.Copilot;
[JsonDerivedType(typeof(McpResourcesListChangedEvent), "mcp.resources.list_changed")]
[JsonDerivedType(typeof(McpToolsListChangedEvent), "mcp.tools.list_changed")]
[JsonDerivedType(typeof(ModelCallFailureEvent), "model.call_failure")]
+[JsonDerivedType(typeof(ModelCallFinishedEvent), "model.call_finished")]
[JsonDerivedType(typeof(ModelCallStartEvent), "model.call_start")]
[JsonDerivedType(typeof(PendingMessagesModifiedEvent), "pending_messages.modified")]
[JsonDerivedType(typeof(PermissionCompletedEvent), "permission.completed")]
@@ -825,6 +826,19 @@ public sealed partial class ModelCallFailureEvent : SessionEvent
public required ModelCallFailureData Data { get; set; }
}
+/// Final lifecycle outcome for one logical model dispatch. A logical dispatch may include internal reconnect or fallback work, so event count is not provider HTTP-request count.
+/// Represents the model.call_finished event.
+public sealed partial class ModelCallFinishedEvent : SessionEvent
+{
+ ///
+ [JsonIgnore]
+ public override string Type => "model.call_finished";
+
+ /// The model.call_finished event payload.
+ [JsonPropertyName("data")]
+ public required ModelCallFinishedData Data { get; set; }
+}
+
/// Model API dispatch metadata for internal telemetry.
/// Represents the model.call_start event.
public sealed partial class ModelCallStartEvent : SessionEvent
@@ -3039,6 +3053,11 @@ public sealed partial class AssistantMessageData
[JsonPropertyName("phase")]
public string? Phase { get; set; }
+ /// Neutral provider-tagged reasoning content blocks preserved verbatim for round-tripping. `reasoningText` and `reasoningOpaque` are a lossy derived view of these blocks, retained for display.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("reasoningBlocks")]
+ public AssistantMessageReasoningBlocks? ReasoningBlocks { get; set; }
+
/// Opaque/encrypted extended thinking data from Anthropic models. Session-bound and stripped on resume.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("reasoningOpaque")]
@@ -3281,6 +3300,12 @@ public sealed partial class AssistantUsageData
[JsonPropertyName("outputTokens")]
public long? OutputTokens { get; set; }
+ /// Time to first observable model output in milliseconds. Includes text, reasoning, and tool-call output; only available for streaming requests that produce observable output.
+ [JsonConverter(typeof(MillisecondsTimeSpanConverter))]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("outputTtftMs")]
+ public TimeSpan? OutputTtft { get; set; }
+
/// Parent tool call ID when this usage originates from a sub-agent.
[EditorBrowsable(EditorBrowsableState.Never)]
#if NET5_0_OR_GREATER
@@ -3610,6 +3635,37 @@ public sealed partial class ModelCallFailureData
public ModelCallFailureTransport? Transport { get; set; }
}
+/// Final lifecycle outcome for one logical model dispatch. A logical dispatch may include internal reconnect or fallback work, so event count is not provider HTTP-request count.
+public sealed partial class ModelCallFinishedData
+{
+ /// Whether an accepted successful response requested the exact name and command semantics of a built-in file edit tool, including an external tool explicitly replacing that built-in name. Absent when the logical dispatch did not produce an accepted response.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("containsBuiltInFileEditRequest")]
+ public bool? ContainsBuiltInFileEditRequest { get; set; }
+
+ /// Monotonic elapsed time spent in the logical model dispatch, including any internal transport reconnect or fallback and excluding orchestrator retry backoff, tool execution, confirmations, and post-response processing.
+ [JsonConverter(typeof(MillisecondsTimeSpanConverter))]
+ [JsonPropertyName("dispatchDurationMs")]
+ public required TimeSpan DispatchDuration { get; set; }
+
+ /// Version of the built-in file-edit semantic classifier used for this event.
+ [JsonPropertyName("editClassifierVersion")]
+ public required long EditClassifierVersion { get; set; }
+
+ /// Identifier of the user interaction that owns the model dispatch, matching assistant.turn_start.interactionId when available.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("interactionId")]
+ public string? InteractionId { get; set; }
+
+ /// Final outcome after post-response acceptance processing.
+ [JsonPropertyName("outcome")]
+ public required ModelCallFinishedOutcome Outcome { get; set; }
+
+ /// Agent-loop iteration within the interaction that initiated the model dispatch.
+ [JsonPropertyName("turnId")]
+ public required string TurnId { get; set; }
+}
+
/// Model API dispatch metadata for internal telemetry.
public sealed partial class ModelCallStartData
{
@@ -3933,12 +3989,37 @@ public sealed partial class SubagentCompletedData
[JsonPropertyName("cancelled")]
public bool? Cancelled { get; set; }
+ /// Whether the first model actually dispatched matched the user's configured preference.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("configuredModelMatchesActual")]
+ public bool? ConfiguredModelMatchesActual { get; set; }
+
+ /// Concrete model the user configured for this sub-agent via `/subagents`, when present.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("configuredModelPreference")]
+ public string? ConfiguredModelPreference { get; set; }
+
/// Wall-clock duration of the sub-agent execution in milliseconds.
[JsonConverter(typeof(MillisecondsTimeSpanConverter))]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("durationMs")]
public TimeSpan? Duration { get; set; }
+ /// Whether the explicit task-call model matched the user's configured preference.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("explicitModelMatchesPreference")]
+ public bool? ExplicitModelMatchesPreference { get; set; }
+
+ /// Explicit model supplied by the parent agent on the task call, when present.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("explicitModelOverride")]
+ public string? ExplicitModelOverride { get; set; }
+
+ /// First model for which the sub-agent started an inference request, when one was dispatched.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("firstDispatchedModel")]
+ public string? FirstDispatchedModel { get; set; }
+
/// Model used by the sub-agent.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("model")]
@@ -3970,6 +4051,16 @@ public sealed partial class SubagentFailedData
[JsonPropertyName("agentName")]
public required string AgentName { get; set; }
+ /// Whether the first model actually dispatched matched the user's configured preference.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("configuredModelMatchesActual")]
+ public bool? ConfiguredModelMatchesActual { get; set; }
+
+ /// Concrete model the user configured for this sub-agent via `/subagents`, when present.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("configuredModelPreference")]
+ public string? ConfiguredModelPreference { get; set; }
+
/// Wall-clock duration of the sub-agent execution in milliseconds.
[JsonConverter(typeof(MillisecondsTimeSpanConverter))]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
@@ -3980,6 +4071,21 @@ public sealed partial class SubagentFailedData
[JsonPropertyName("error")]
public required string Error { get; set; }
+ /// Whether the explicit task-call model matched the user's configured preference.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("explicitModelMatchesPreference")]
+ public bool? ExplicitModelMatchesPreference { get; set; }
+
+ /// Explicit model supplied by the parent agent on the task call, when present.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("explicitModelOverride")]
+ public string? ExplicitModelOverride { get; set; }
+
+ /// First model for which the sub-agent started an inference request, when one was dispatched.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("firstDispatchedModel")]
+ public string? FirstDispatchedModel { get; set; }
+
/// Model selected for the sub-agent, when known.
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("model")]
@@ -4721,6 +4827,11 @@ public sealed partial class SessionManagedSettingsResolvedData
[JsonPropertyName("permissionsAllowIntersected")]
public bool? PermissionsAllowIntersected { get; set; }
+ /// Whether the effective sandbox policy forces the sandbox on *only* because managed policy could not be determined, rather than because the policy requires it. Lets clients tell a user whose `--no-sandbox` was overridden that the sandbox stayed on as a fail-closed fallback, instead of attributing it to an administrator who set no such policy.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("sandboxEnabledByUndeterminedPolicy")]
+ public bool? SandboxEnabledByUndeterminedPolicy { get; set; }
+
/// Whether the server (account/org) managed-settings layer was present.
[JsonPropertyName("serverManaged")]
public required bool ServerManaged { get; set; }
@@ -6189,6 +6300,21 @@ public sealed partial class Citations
public required CitationSpan[] Spans { get; set; }
}
+/// Neutral provider-tagged reasoning content blocks preserved verbatim for round-tripping.
+/// Nested data type for AssistantMessageReasoningBlocks.
+[Experimental(Diagnostics.Experimental)]
+public sealed partial class AssistantMessageReasoningBlocks
+{
+ /// Provider-native reasoning content blocks (e.g. Anthropic `thinking` / `redacted_thinking`) preserved verbatim, in order. A single response can carry several, each signed over the content preceding it, so dropping or reordering any of them invalidates the rest.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("blocks")]
+ public JsonElement[]? Blocks { get; set; }
+
+ /// Model provider that produced these reasoning blocks.
+ [JsonPropertyName("provider")]
+ public required string Provider { get; set; }
+}
+
/// Neutral provider-tagged server-side tool-use payload (tool search, advisor) for verbatim round-tripping.
/// Nested data type for AssistantMessageServerTools.
[Experimental(Diagnostics.Experimental)]
@@ -8288,6 +8414,11 @@ public sealed partial class PermissionPromptRequestMcp : PermissionPromptRequest
[JsonPropertyName("assistedApproval")]
public PermissionAssistedApproval? AssistedApproval { get; set; }
+ /// Whether the host may offer a server-wide "approve all tools from this server" blanket. Absent is treated as true; the runtime sends false when managed policy disables bypass-permissions mode, which forbids the server-wide escalation while still allowing per-tool approval.
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonPropertyName("canOfferServerWideApproval")]
+ public bool? CanOfferServerWideApproval { get; set; }
+
/// Advisory runtime permission recommendation. The host remains responsible for deciding the request and may reject it.
[Experimental(Diagnostics.Experimental)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
@@ -11341,6 +11472,73 @@ public override void Write(Utf8JsonWriter writer, ModelCallFailureSource value,
}
}
+/// Final outcome of one logical model dispatch after response acceptance processing.
+[JsonConverter(typeof(Converter))]
+[DebuggerDisplay("{Value,nq}")]
+public readonly struct ModelCallFinishedOutcome : IEquatable
+{
+ private readonly string? _value;
+
+ /// Initializes a new instance of the struct.
+ /// The value to associate with this .
+ [JsonConstructor]
+ public ModelCallFinishedOutcome(string value)
+ {
+ ArgumentException.ThrowIfNullOrWhiteSpace(value);
+ _value = value;
+ }
+
+ /// Gets the value associated with this .
+ public string Value => _value ?? string.Empty;
+
+ /// The provider response was accepted for continued agent processing.
+ public static ModelCallFinishedOutcome Success { get; } = new("success");
+
+ /// The dispatch ended with a provider or transport error.
+ public static ModelCallFinishedOutcome Error { get; } = new("error");
+
+ /// The dispatch was cancelled before an accepted response was produced.
+ public static ModelCallFinishedOutcome Cancelled { get; } = new("cancelled");
+
+ /// The provider response was rejected during post-response acceptance processing.
+ public static ModelCallFinishedOutcome Rejected { get; } = new("rejected");
+
+ /// Returns a value indicating whether two instances are equivalent.
+ public static bool operator ==(ModelCallFinishedOutcome left, ModelCallFinishedOutcome right) => left.Equals(right);
+
+ /// Returns a value indicating whether two instances are not equivalent.
+ public static bool operator !=(ModelCallFinishedOutcome left, ModelCallFinishedOutcome right) => !(left == right);
+
+ ///
+ public override bool Equals(object? obj) => obj is ModelCallFinishedOutcome other && Equals(other);
+
+ ///
+ public bool Equals(ModelCallFinishedOutcome 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 ModelCallFinishedOutcome Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert));
+ }
+
+ ///
+ public override void Write(Utf8JsonWriter writer, ModelCallFinishedOutcome value, JsonSerializerOptions options)
+ {
+ GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ModelCallFinishedOutcome));
+ }
+ }
+}
+
/// Finite reason code describing why the current turn was aborted.
[JsonConverter(typeof(Converter))]
[DebuggerDisplay("{Value,nq}")]
@@ -13403,6 +13601,9 @@ public ManagedSettingsEnforcedEscalation(string value)
/// Unrestricted URL fetch access.
public static ManagedSettingsEnforcedEscalation UnrestrictedUrls { get; } = new("unrestricted_urls");
+ /// A server-wide MCP "Always Allow" (or `--allow-tool <server>`) blanket that would auto-approve every tool from an MCP server. Capped to per-tool approval; each tool still prompts.
+ public static ManagedSettingsEnforcedEscalation ServerWideMcpApproval { get; } = new("server_wide_mcp_approval");
+
/// Returns a value indicating whether two instances are equivalent.
public static bool operator ==(ManagedSettingsEnforcedEscalation left, ManagedSettingsEnforcedEscalation right) => left.Equals(right);
@@ -14010,6 +14211,7 @@ public override void Write(Utf8JsonWriter writer, ExtensionsLoadedExtensionStatu
[JsonSerializable(typeof(AssistantMessageDeltaData))]
[JsonSerializable(typeof(AssistantMessageDeltaEvent))]
[JsonSerializable(typeof(AssistantMessageEvent))]
+[JsonSerializable(typeof(AssistantMessageReasoningBlocks))]
[JsonSerializable(typeof(AssistantMessageServerTools))]
[JsonSerializable(typeof(AssistantMessageStartData))]
[JsonSerializable(typeof(AssistantMessageStartEvent))]
@@ -14149,6 +14351,8 @@ public override void Write(Utf8JsonWriter writer, ExtensionsLoadedExtensionStatu
[JsonSerializable(typeof(ModelCallFailureData))]
[JsonSerializable(typeof(ModelCallFailureEvent))]
[JsonSerializable(typeof(ModelCallFailureRequestFingerprint))]
+[JsonSerializable(typeof(ModelCallFinishedData))]
+[JsonSerializable(typeof(ModelCallFinishedEvent))]
[JsonSerializable(typeof(ModelCallStartData))]
[JsonSerializable(typeof(ModelCallStartEvent))]
[JsonSerializable(typeof(OmittedBinaryResult))]
diff --git a/dotnet/src/Types.cs b/dotnet/src/Types.cs
index c0810b3870..54595bfed7 100644
--- a/dotnet/src/Types.cs
+++ b/dotnet/src/Types.cs
@@ -3052,15 +3052,14 @@ public sealed class GitHubMcpToolConfig
public bool? DisableFormDeferral { get; set; }
}
-///
-/// Controls whether bypass-permissions mode is available in a managed session.
-///
-[JsonConverter(typeof(JsonStringEnumConverter))]
-public enum DisableBypassPermissionsMode
+/// Well-known managed bypass-permissions policies.
+public static class DisableBypassPermissionsModes
{
- /// Turn off bypass-permissions mode.
- [JsonStringEnumMemberName("disable")]
- Disable
+ /// Turns off bypass-permissions mode entirely.
+ public const string Disable = "disable";
+
+ /// Permits automatic bypass but blocks full allow-all.
+ public const string AllowAutoOnly = "allow-auto-only";
}
///
@@ -3071,18 +3070,19 @@ public enum DisableBypassPermissionsMode
/// This layer composes restrictively with any server- or device-level managed
/// settings: and rules are unioned across
/// layers, every present list must admit a tool for it to be
-/// allowed, and is honored if any
-/// layer sets it (deny-wins).
+/// allowed, and policies compose to
+/// the most restrictive setting.
///
public sealed class ManagedSettingsPermissions
{
///
- /// When set to "disable", bypass-permissions mode is turned off for the
- /// session regardless of other layers. Serialized as
- /// disableBypassPermissionsMode.
+ /// Restricts bypass-permissions mode for the session regardless of other
+ /// layers. See for well-known
+ /// values. Unknown values are forwarded so newer runtime policies fail closed.
+ /// Serialized as disableBypassPermissionsMode.
///
[JsonPropertyName("disableBypassPermissionsMode")]
- public DisableBypassPermissionsMode? DisableBypassPermissionsMode { get; set; }
+ public string? DisableBypassPermissionsMode { get; set; }
/// Tool-permission patterns that are always denied.
[JsonPropertyName("deny")]
diff --git a/dotnet/test/E2E/RpcSessionStateE2ETests.cs b/dotnet/test/E2E/RpcSessionStateE2ETests.cs
index 6dce3c250f..803c1c602b 100644
--- a/dotnet/test/E2E/RpcSessionStateE2ETests.cs
+++ b/dotnet/test/E2E/RpcSessionStateE2ETests.cs
@@ -451,7 +451,7 @@ public async Task Should_Set_Auth_Credentials()
});
var login = $"sdk-rpc-{Guid.NewGuid():N}";
- var setCredentials = await session.Rpc.GitHubAuth.SetCredentialsAsync(new AuthInfoUser
+ var setCredentials = await session.Rpc.GitHubAuth.SetCredentialsAsync(new SettableAuthInfoUser
{
CopilotUser = new CopilotUserResponse
{
diff --git a/dotnet/test/Unit/ClientSessionLifetimeTests.cs b/dotnet/test/Unit/ClientSessionLifetimeTests.cs
index a561ee44b2..47ee14bb69 100644
--- a/dotnet/test/Unit/ClientSessionLifetimeTests.cs
+++ b/dotnet/test/Unit/ClientSessionLifetimeTests.cs
@@ -552,7 +552,7 @@ public async Task CreateSessionAsync_Serializes_ManagedSettings_Permissions()
{
Permissions = new ManagedSettingsPermissions
{
- DisableBypassPermissionsMode = DisableBypassPermissionsMode.Disable,
+ DisableBypassPermissionsMode = DisableBypassPermissionsModes.Disable,
Deny = ["shell(rm*)"],
Ask = ["write"],
Allow = []
@@ -585,6 +585,32 @@ public async Task CreateSessionAsync_Serializes_ManagedSettings_Permissions()
Assert.True(invocation.ManagedSettingsEnabled);
}
+ [Fact]
+ public async Task CreateSessionAsync_Serializes_Future_ManagedSettings_Bypass_Mode()
+ {
+ await using var server = await FakeCopilotServer.StartAsync();
+ await using var client = new CopilotClient(new CopilotClientOptions { Connection = RuntimeConnection.ForUri(server.Url) });
+ await client.StartAsync();
+
+ await using var session = await client.CreateSessionAsync(new SessionConfig
+ {
+ ManagedSettings = new ManagedSettings
+ {
+ Permissions = new ManagedSettingsPermissions
+ {
+ DisableBypassPermissionsMode = "future-fail-closed-mode"
+ }
+ },
+ OnPermissionRequest = PermissionHandler.ApproveAll
+ });
+
+ var request = Assert.Single(server.Requests, request => request.Method == "session.create");
+ var permissions = request.Params.GetProperty("managedSettings").GetProperty("permissions");
+ Assert.Equal(
+ "future-fail-closed-mode",
+ permissions.GetProperty("disableBypassPermissionsMode").GetString());
+ }
+
[Fact]
public async Task PermissionResponse_Forwards_DecisionContext_As_Sibling_Of_Result()
{
diff --git a/go/client_test.go b/go/client_test.go
index d0139eb11a..2332a77011 100644
--- a/go/client_test.go
+++ b/go/client_test.go
@@ -3834,6 +3834,26 @@ func TestSessionRequests_ManagedSettings(t *testing.T) {
}
})
+ t.Run("accepts future bypass-permissions modes", func(t *testing.T) {
+ req := createSessionRequest{ManagedSettings: &ManagedSettings{
+ Permissions: &ManagedSettingsPermissions{
+ DisableBypassPermissionsMode: DisableBypassPermissionsMode("future-fail-closed-mode"),
+ },
+ }}
+ data, err := json.Marshal(req)
+ if err != nil {
+ t.Fatalf("Failed to marshal: %v", err)
+ }
+ var m map[string]any
+ if err := json.Unmarshal(data, &m); err != nil {
+ t.Fatalf("Failed to unmarshal: %v", err)
+ }
+ perms := m["managedSettings"].(map[string]any)["permissions"].(map[string]any)
+ if perms["disableBypassPermissionsMode"] != "future-fail-closed-mode" {
+ t.Errorf("Expected future mode preserved, got %v", perms["disableBypassPermissionsMode"])
+ }
+ })
+
t.Run("omits managedSettings when nil", func(t *testing.T) {
req := createSessionRequest{}
data, _ := json.Marshal(req)
diff --git a/go/internal/e2e/rpc_tasks_and_handlers_e2e_test.go b/go/internal/e2e/rpc_tasks_and_handlers_e2e_test.go
index 0267f8d042..648855e5a3 100644
--- a/go/internal/e2e/rpc_tasks_and_handlers_e2e_test.go
+++ b/go/internal/e2e/rpc_tasks_and_handlers_e2e_test.go
@@ -127,6 +127,7 @@ func TestRPCTasksAndHandlersE2E(t *testing.T) {
})
t.Run("should report implemented error for invalid task agent model", func(t *testing.T) {
+ ctx.ConfigureForTest(t)
session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{
OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
})
diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go
index 69b44cef4c..ad82a27823 100644
--- a/go/rpc/zrpc.go
+++ b/go/rpc/zrpc.go
@@ -866,6 +866,9 @@ type AuthIdentity struct {
Host string `json:"host"`
// Authenticated login, when available
Login *string `json:"login,omitempty"`
+ // Opaque SDK GitHub credential registration backing this identity. Routing metadata only;
+ // never a credential.
+ RegistrationID *string `json:"registrationId,omitempty"`
// Authentication type
Type AuthInfoType `json:"type"`
}
@@ -999,6 +1002,8 @@ type TokenAuthInfo struct {
CopilotUser *CopilotUserResponse `json:"copilotUser,omitempty"`
// Authentication host.
Host string `json:"host"`
+ // Opaque native GitHub credential registration backing this token identity, when applicable.
+ RegistrationID *string `json:"registrationId,omitempty"`
// The token value itself. Treat as a secret.
Token string `json:"token"`
}
@@ -1008,6 +1013,24 @@ func (TokenAuthInfo) Type() AuthInfoType {
return AuthInfoTypeToken
}
+// Authentication-info variant backed by an SDK GitHub token callback. It carries routing
+// metadata but never a plaintext token.
+// Experimental: TokenProviderAuthInfo is part of an experimental API and may change or be
+// removed.
+type TokenProviderAuthInfo struct {
+ // Snapshot of the authenticated user's Copilot subscription info, if known.
+ CopilotUser *CopilotUserResponse `json:"copilotUser,omitempty"`
+ // Authentication host.
+ Host string `json:"host"`
+ // Opaque SDK callback registration identifier.
+ RegistrationID string `json:"registrationId"`
+}
+
+func (TokenProviderAuthInfo) authInfo() {}
+func (TokenProviderAuthInfo) Type() AuthInfoType {
+ return AuthInfoTypeTokenProvider
+}
+
// Authentication-info variant for OAuth user auth, with host and login; the token remains
// in the runtime secret store.
// Experimental: UserAuthInfo is part of an experimental API and may change or be removed.
@@ -1949,6 +1972,25 @@ type ConfigureSessionExtensionsParams struct {
SessionID string `json:"sessionId"`
}
+// Identity of the integrating host, declared once on the `server.connect` handshake so
+// telemetry from this connection is attributed to a single, consistent surface. All fields
+// are optional; omit them to keep the default attribution.
+// Experimental: ConnectClientInfo is part of an experimental API and may change or be
+// removed.
+// Internal: ConnectClientInfo is an internal SDK API and is not part of the public surface.
+type ConnectClientInfo struct {
+ // Name of the host editor, e.g. `"vscode"`.
+ EditorName *string `json:"editorName,omitempty"`
+ // Version of the host editor, e.g. `"1.124.2"`. Ignored unless it looks like a version
+ // string.
+ EditorVersion *string `json:"editorVersion,omitempty"`
+ // Name of the Copilot extension within the host, e.g. `"copilot-chat"`.
+ ExtensionName *string `json:"extensionName,omitempty"`
+ // Version of the Copilot extension within the host, e.g. `"0.54.0"`. Ignored unless it
+ // looks like a version string.
+ ExtensionVersion *string `json:"extensionVersion,omitempty"`
+}
+
// Metadata for a connected remote session.
// Experimental: ConnectedRemoteSessionMetadata is part of an experimental API and may
// change or be removed.
@@ -2002,6 +2044,10 @@ type ConnectRemoteSessionParams struct {
// Experimental: ConnectRequest is part of an experimental API and may change or be removed.
// Internal: ConnectRequest is an internal SDK API and is not part of the public surface.
type ConnectRequest struct {
+ // Identity of the integrating host. Optional; omit it to keep the default attribution.
+ // Internal: ClientInfo is part of the SDK's internal API surface and is not intended for
+ // external use.
+ ClientInfo *ConnectClientInfo `json:"clientInfo,omitempty"`
// Opt this connection in to GitHub telemetry forwarding for its lifetime. When set, the
// runtime forwards every internal telemetry event it emits — across all sessions, plus
// sessionless events — to this connection over the `gitHubTelemetry.event` notification.
@@ -3765,6 +3811,61 @@ type GitHubTelemetryNotification struct {
SessionID *string `json:"sessionId,omitempty"`
}
+// Asks the SDK client to acquire a GitHub access token from an opaque callback registration.
+// Experimental: GitHubTokenAcquireRequest is part of an experimental API and may change or
+// be removed.
+type GitHubTokenAcquireRequest struct {
+ // Effective GitHub host for which the callback must return a token.
+ Host string `json:"host"`
+ // Why the runtime is requesting a GitHub credential.
+ Reason GitHubTokenAcquireReason `json:"reason"`
+ // Opaque identifier generated by the SDK for this callback registration.
+ RegistrationID string `json:"registrationId"`
+ // Session receiving the token. Absent only before a cloud session has been assigned its id.
+ SessionID *string `json:"sessionId,omitempty"`
+}
+
+// SDK host response to a GitHub credential request.
+// Experimental: GitHubTokenAcquireResult is part of an experimental API and may change or
+// be removed.
+type GitHubTokenAcquireResult interface {
+ githubTokenAcquireResult()
+ Kind() GitHubTokenAcquireResultKind
+}
+
+type RawGitHubTokenAcquireResultData struct {
+ Discriminator GitHubTokenAcquireResultKind
+ Raw json.RawMessage
+}
+
+func (RawGitHubTokenAcquireResultData) githubTokenAcquireResult() {}
+func (r RawGitHubTokenAcquireResultData) Kind() GitHubTokenAcquireResultKind {
+ return r.Discriminator
+}
+
+type GitHubTokenAcquireResultCancelled struct {
+}
+
+func (GitHubTokenAcquireResultCancelled) githubTokenAcquireResult() {}
+func (GitHubTokenAcquireResultCancelled) Kind() GitHubTokenAcquireResultKind {
+ return GitHubTokenAcquireResultKindCancelled
+}
+
+type GitHubTokenAcquireResultToken struct {
+ // GitHub access token acquired by the SDK host.
+ AccessToken string `json:"accessToken"`
+ // Remaining token lifetime in seconds when callback execution completes. It must exceed the
+ // one-hour preflight refresh threshold.
+ ExpiresIn int64 `json:"expiresIn"`
+ // OAuth token type. Defaults to bearer when omitted.
+ TokenType *string `json:"tokenType,omitempty"`
+}
+
+func (GitHubTokenAcquireResultToken) githubTokenAcquireResult() {}
+func (GitHubTokenAcquireResultToken) Kind() GitHubTokenAcquireResultKind {
+ return GitHubTokenAcquireResultKindToken
+}
+
// Pending external tool call request ID, with the tool result or an error describing why it
// failed.
// Experimental: HandlePendingToolCallRequest is part of an experimental API and may change
@@ -4074,6 +4175,12 @@ type InstalledPlugin struct {
Enabled bool `json:"enabled"`
// Installation timestamp
InstalledAt string `json:"installed_at"`
+ // Absolute path of the marketplace directory a live plugin was resolved from. Present only
+ // on live, never-persisted records — those synthesized at session start for a
+ // directory/local marketplace, whose cache_path points at the real plugin directory on disk
+ // rather than a copy under the installed-plugins cache. Its presence is what marks a record
+ // as live, and no record carrying it is ever written to the persisted installedPlugins key.
+ InstalledFrom *string `json:"installed_from,omitempty"`
// Marketplace the plugin came from (empty string for direct repo installs)
Marketplace string `json:"marketplace"`
// Plugin name
@@ -4100,6 +4207,13 @@ type InstalledPluginInfo struct {
DirectSourceID *string `json:"directSourceId,omitempty"`
// Whether the plugin is currently enabled for new sessions
Enabled bool `json:"enabled"`
+ // Absolute path of the marketplace directory a live plugin was resolved from. Present only
+ // on live, never-persisted records — a plugin belonging to a directory/local marketplace,
+ // which is loaded from its real directory on every pass instead of a copy under the
+ // installed-plugins cache. Its presence is what marks a listed plugin as live: such a
+ // plugin is always present on disk, so `enabled` is its only meaningful state and it is
+ // never "not installed".
+ InstalledFrom *string `json:"installedFrom,omitempty"`
// Marketplace the plugin came from. Empty string ("") for direct repo / URL / local
// installs.
Marketplace string `json:"marketplace"`
@@ -5257,7 +5371,7 @@ type MCPOauthPendingRequestResponseToken struct {
AccessToken string `json:"accessToken"`
// Token lifetime in seconds, if known.
ExpiresIn *int64 `json:"expiresIn,omitempty"`
- // OAuth token type. Defaults to Bearer when omitted.
+ // OAuth token type. Defaults to bearer when omitted.
TokenType *string `json:"tokenType,omitempty"`
}
@@ -6669,6 +6783,10 @@ type Model struct {
DefaultReasoningEffort *string `json:"defaultReasoningEffort,omitempty"`
// Model identifier (e.g., "claude-sonnet-4.5")
ID string `json:"id"`
+ // Informational notices the service published for this model, such as an upcoming change or
+ // a recommended alternative. Present only when the service published at least one notice.
+ // Hosts should surface these without implying anything is wrong with the model.
+ InfoMessages []ModelMessage `json:"infoMessages,omitzero"`
// Model capability category for grouping in the model picker
ModelPickerCategory *ModelPickerCategory `json:"modelPickerCategory,omitempty"`
// Relative cost tier for token-based billing users
@@ -6684,6 +6802,13 @@ type Model struct {
SupportedContextTiers []string `json:"supportedContextTiers,omitzero"`
// Supported reasoning effort levels (only present if model supports reasoning effort)
SupportedReasoningEfforts []string `json:"supportedReasoningEfforts,omitzero"`
+ // Warnings the service published for this model, such as a deprecated client version.
+ // Present only when the service published at least one warning. The model remains usable;
+ // hosts should surface these as advisory rather than blocking.
+ WarningMessages []ModelMessage `json:"warningMessages,omitzero"`
+ // Warning text the service requires hosts to surface for this model. Present only when the
+ // service published at least one warning.
+ WarningText *ModelWarningText `json:"warningText,omitempty"`
}
// Managed, repository, and CLI model overrides to overlay onto the session at startup.
@@ -6906,6 +7031,18 @@ type ModelListRequest struct {
SkipCache *bool `json:"skipCache,omitempty"`
}
+// A service-published message about a model, carrying a stable machine-readable code
+// alongside human-readable text.
+// Experimental: ModelMessage is part of an experimental API and may change or be removed.
+type ModelMessage struct {
+ // Stable machine-readable identifier for the message, such as `client_version_deprecated`.
+ // Hosts can key custom presentation off this; unrecognized codes should fall back to
+ // displaying `message`.
+ Code string `json:"code"`
+ // Human-readable message text intended for display to the user.
+ Message string `json:"message"`
+}
+
// Experimental: ModelPickerPersistenceRequest is part of an experimental API and may change
// or be removed.
type ModelPickerPersistenceRequest struct {
@@ -7050,6 +7187,15 @@ type ModelSwitchToResult struct {
Warning *string `json:"warning,omitempty"`
}
+// Service-published warning text that hosts should display when presenting a model.
+// Experimental: ModelWarningText is part of an experimental API and may change or be
+// removed.
+type ModelWarningText struct {
+ // Data-retention warning for the model. The text may contain Markdown links and should be
+ // rendered as Markdown when supported.
+ DataRetention *string `json:"dataRetention,omitempty"`
+}
+
// Agent interaction mode to apply to the session.
// Experimental: ModeSetRequest is part of an experimental API and may change or be removed.
type ModeSetRequest struct {
@@ -7926,7 +8072,9 @@ type PermissionLocationResolveResult struct {
// be removed.
type PermissionPathsAddParams struct {
// Directory to add to the allow-list. The runtime resolves and validates the path before
- // adding.
+ // adding, then loads conventional `.github/skills/` and `.github/agents/` definitions under
+ // it when their subsystem gates are enabled. Adding the directory is therefore also a trust
+ // decision for configuration stored there.
Path string `json:"path"`
}
@@ -7953,9 +8101,11 @@ type PermissionPathsAllowedCheckResult struct {
// removed.
type PermissionPathsConfig struct {
// Additional directories to allow tool access to (in addition to the session's working
- // directory). When `unrestricted` is true, these are still pre-populated on the
- // UnrestrictedPathManager so they remain visible via getDirectories() (e.g. for @-mention
- // completion).
+ // directory). Conventional `.github/skills/` and `.github/agents/` definitions under them
+ // also join the session catalogs when their subsystem gates are enabled, so supplying a
+ // directory is a trust decision for configuration stored there. When `unrestricted` is
+ // true, these are still pre-populated on the UnrestrictedPathManager so they remain visible
+ // via getDirectories() (e.g. for @-mention completion).
AdditionalDirectories []string `json:"additionalDirectories,omitzero"`
// Whether to include the system temp directory in the allowed list (defaults to true).
// Ignored when `unrestricted` is true.
@@ -9589,6 +9739,10 @@ type QueuePendingItems struct {
// Experimental: QueuePendingItemsResult is part of an experimental API and may change or be
// removed.
type QueuePendingItemsResult struct {
+ // How many leading entries of `steeringMessages` have already been folded into the running
+ // turn (and so have an emitted `user.message`), as opposed to still waiting for one. Absent
+ // for hosts that do not distinguish the two.
+ InFlightSteeringCount *int64 `json:"inFlightSteeringCount,omitempty"`
// Pending queued items in submission order. Includes user messages, queued slash commands,
// and queued model changes; omits internal system items.
Items []QueuePendingItems `json:"items"`
@@ -10002,9 +10156,9 @@ type SandboxConfig struct {
// Whether to auto-grant read access to the tool directories discovered on PATH and in
// toolchain environment variables (GOROOT, CARGO_HOME, JAVA_HOME, VIRTUAL_ENV, and
// similar), and to common developer-tool caches, registries, and toolchains in their
- // default home locations (cargo, go, npm, Maven, and more), plus read-write access to (and,
- // on Unix, up-front creation of) the scratch caches builds write on every run (go-build,
- // ccache, sccache, Gradle caches, Cargo lock/tracker files), so builds work without extra
+ // default home locations (cargo, go, npm, Maven, and more), plus read-write access to (and
+ // up-front creation of) the scratch caches builds write on every run (go-build, ccache,
+ // sccache, Gradle caches, Cargo lock/tracker files), so builds work without extra
// configuration; a relocated CARGO_HOME additionally gets its Cargo lock files granted
// read-write. Set to false to disable every grant listed above: user-installed toolchains
// (rustup, nvm, pyenv, conda, pipx) then need explicit userPolicy.filesystem entries —
@@ -10533,6 +10687,9 @@ type SessionAuthInfoResult struct {
Host string `json:"host"`
// Authenticated login, when available
Login *string `json:"login,omitempty"`
+ // Opaque SDK GitHub credential registration backing this identity. Routing metadata only;
+ // never a credential.
+ RegistrationID *string `json:"registrationId,omitempty"`
// Authentication type
Type AuthInfoType `json:"type"`
}
@@ -11187,6 +11344,12 @@ type SessionInstalledPlugin struct {
Enabled bool `json:"enabled"`
// Installation timestamp (ISO-8601)
InstalledAt string `json:"installed_at"`
+ // Absolute path of the marketplace directory a live plugin was resolved from. Present only
+ // on live, never-persisted records — those synthesized at session start for a
+ // directory/local marketplace, whose cache_path points at the real plugin directory on disk
+ // rather than a copy under the installed-plugins cache. Its presence is what marks a record
+ // as live, and no record carrying it is ever written to the persisted installedPlugins key.
+ InstalledFrom *string `json:"installed_from,omitempty"`
// Marketplace the plugin came from (empty string for direct repo installs)
Marketplace string `json:"marketplace"`
// Plugin name
@@ -11474,8 +11637,12 @@ type SessionManagedPermissions struct {
Ask []string `json:"ask,omitzero"`
// Permission rules that block matching operations. Deny has highest precedence.
Deny []string `json:"deny,omitzero"`
- // When set to `disable`, prevents bypass/allow-all permission modes.
- DisableBypassPermissionsMode *DisableBypassPermissionsMode `json:"disableBypassPermissionsMode,omitempty"`
+ // When set to `disable`, prevents bypass/allow-all permission modes. `allow-auto-only`
+ // blocks full allow-all but permits advisory auto-approval. Any other value is accepted
+ // rather than failing the session, but is enforced as `disable`: the key is only present to
+ // restrict something, so a mode this runtime cannot interpret fails closed to the most
+ // restrictive one it knows. Omit the key entirely to impose no restriction.
+ DisableBypassPermissionsMode *string `json:"disableBypassPermissionsMode,omitempty"`
}
// Managed settings an SDK host may inject at session startup. Only permissions are accepted
@@ -11636,11 +11803,15 @@ type SessionOpenOptions struct {
AdditionalContentExclusionPolicies []SessionOpenOptionsAdditionalContentExclusionPolicy `json:"additionalContentExclusionPolicies,omitzero"`
// Additional directories the agent may access beyond the working directory. Each entry is
// granted to the session's file-access allow-list and surfaced to the model (system prompt
- // context and `@`-mention completion). Absolute paths are recommended; a relative path is
- // resolved against the session's working directory. Nonexistent or unresolvable entries are
- // skipped with a warning. This is applied on both session creation and resume, and is not
- // persisted: a resumed session that omits this option does not retain previously supplied
- // directories (re-supply them, exactly as the CLI re-passes `--add-dir`).
+ // context and `@`-mention completion). Conventional `.github/skills/` and `.github/agents/`
+ // definitions under each directory also join the session's project catalogs when their
+ // existing subsystem gates are enabled: added-root skills require both
+ // `enableConfigDiscovery` and effective `enableSkills`; added-root agents require
+ // `enableConfigDiscovery`. Supplying a directory therefore activates configuration from it
+ // and should be treated as a trust decision. Absolute paths are recommended; a relative
+ // path is resolved against the session's working directory. Nonexistent or unresolvable
+ // entries are skipped with a warning. This is applied during session creation and cold
+ // resume and is not persisted, so a cold resume must re-supply the directories.
AdditionalDirectories []string `json:"additionalDirectories,omitzero"`
// Runtime context discriminator for agent filtering.
AgentContext *string `json:"agentContext,omitempty"`
@@ -11739,6 +11910,10 @@ type SessionOpenOptions struct {
// are available, subject to runtime availability and exclusions. Custom agents with the
// same name remain available.
IncludedBuiltinAgents []string `json:"includedBuiltinAgents,omitzero"`
+ // Built-in skill names to include in this session. When specified, only these
+ // runtime-bundled skills are available. Skills from other sources with the same name remain
+ // available.
+ IncludedBuiltinSkills []string `json:"includedBuiltinSkills,omitzero"`
// Installed plugins visible to the session.
InstalledPlugins []InstalledPlugin `json:"installedPlugins,omitzero"`
// Stable integration identifier for analytics.
@@ -11789,6 +11964,11 @@ type SessionOpenOptions struct {
RunningInInteractiveMode *bool `json:"runningInInteractiveMode,omitempty"`
// Resolved sandbox configuration.
SandboxConfig *SandboxConfig `json:"sandboxConfig,omitempty"`
+ // Origin of the sandbox choice. The runtime uses this only for internal telemetry
+ // provenance; managed policy is derived independently.
+ // Internal: SandboxConfigSource is part of the SDK's internal API surface and is not
+ // intended for external use.
+ SandboxConfigSource *SandboxConfigSource `json:"sandboxConfigSource,omitempty"`
// Capabilities enabled for this session.
SessionCapabilities []SessionCapability `json:"sessionCapabilities,omitzero"`
// Optional stable session identifier to use for a new session.
@@ -12219,7 +12399,7 @@ type SessionSetCredentialsParams struct {
// verbatim credential remains installed. It does NOT otherwise validate the credential.
// Several variants carry secret material; treat this method's params as containing secrets
// at rest and in transit.
- Credentials AuthInfo `json:"credentials,omitempty"`
+ Credentials SettableAuthInfo `json:"credentials,omitempty"`
}
// Indicates whether the credential update succeeded.
@@ -12837,6 +13017,10 @@ type SessionUpdateOptionsParams struct {
// are available, subject to runtime availability and exclusions. Custom agents with the
// same name remain available. Set to null to remove the allowlist restriction.
IncludedBuiltinAgents []string `json:"includedBuiltinAgents,omitzero"`
+ // Built-in skill names to include in this session. When specified, only these
+ // runtime-bundled skills are available. Skills from other sources with the same name remain
+ // available. Set to null to remove the allowlist restriction.
+ IncludedBuiltinSkills []string `json:"includedBuiltinSkills,omitzero"`
// Full set of installed plugins for the session. Replaces the existing list; the runtime
// invalidates the skills cache only when the list materially changes.
InstalledPlugins []SessionInstalledPlugin `json:"installedPlugins,omitzero"`
@@ -12875,6 +13059,11 @@ type SessionUpdateOptionsParams struct {
RunningInInteractiveMode *bool `json:"runningInInteractiveMode,omitempty"`
// Resolved sandbox configuration.
SandboxConfig *SandboxConfig `json:"sandboxConfig,omitempty"`
+ // Origin of the sandbox choice. The runtime uses this only for internal telemetry
+ // provenance; managed policy is derived independently.
+ // Internal: SandboxConfigSource is part of the SDK's internal API surface and is not
+ // intended for external use.
+ SandboxConfigSource *SandboxConfigSource `json:"sandboxConfigSource,omitempty"`
// Replaces the session's capability set with the given list. Use to enable or disable
// capabilities mid-session (e.g., remove `memory` for reproducible scripted runs). Omit the
// field to leave the existing capability set unchanged.
@@ -12948,6 +13137,68 @@ type SessionWorkingDirectoryContext struct {
type SessionWorkspacesCreateFileResult struct {
}
+// Authentication credentials accepted by session.gitHubAuth.setCredentials. Session-owned
+// token-provider identities cannot be installed through this method.
+// Experimental: SettableAuthInfo is part of an experimental API and may change or be
+// removed.
+type SettableAuthInfo interface {
+ settableAuthInfo()
+ settableAuthInfoType() SettableAuthInfoType
+}
+
+type RawSettableAuthInfoData struct {
+ Discriminator SettableAuthInfoType
+ Raw json.RawMessage
+}
+
+func (RawSettableAuthInfoData) settableAuthInfo() {}
+func (r RawSettableAuthInfoData) settableAuthInfoType() SettableAuthInfoType {
+ return r.Discriminator
+}
+func (APIKeyAuthInfo) settableAuthInfo() {}
+func (APIKeyAuthInfo) settableAuthInfoType() SettableAuthInfoType {
+ return SettableAuthInfoTypeAPIKey
+}
+func (CopilotAPITokenAuthInfo) settableAuthInfo() {}
+func (CopilotAPITokenAuthInfo) settableAuthInfoType() SettableAuthInfoType {
+ return SettableAuthInfoTypeCopilotAPIToken
+}
+func (EnvAuthInfo) settableAuthInfo() {}
+func (EnvAuthInfo) settableAuthInfoType() SettableAuthInfoType {
+ return SettableAuthInfoTypeEnv
+}
+func (GhCLIAuthInfo) settableAuthInfo() {}
+func (GhCLIAuthInfo) settableAuthInfoType() SettableAuthInfoType {
+ return SettableAuthInfoTypeGhCLI
+}
+func (HMACAuthInfo) settableAuthInfo() {}
+func (HMACAuthInfo) settableAuthInfoType() SettableAuthInfoType {
+ return SettableAuthInfoTypeHMAC
+}
+
+// Token authentication accepted by session.gitHubAuth.setCredentials.
+// Experimental: SettableTokenAuthInfo is part of an experimental API and may change or be
+// removed.
+type SettableTokenAuthInfo struct {
+ // Snapshot of the authenticated user's Copilot subscription info, if known. Mirrors the
+ // GitHub API `/copilot_internal/v2/token` user response shape — the runtime trusts this
+ // verbatim and does not re-fetch when set.
+ CopilotUser *CopilotUserResponse `json:"copilotUser,omitempty"`
+ // Authentication host.
+ Host string `json:"host"`
+ // The token value itself. Treat as a secret.
+ Token string `json:"token"`
+}
+
+func (SettableTokenAuthInfo) settableAuthInfo() {}
+func (SettableTokenAuthInfo) settableAuthInfoType() SettableAuthInfoType {
+ return SettableAuthInfoTypeToken
+}
+func (UserAuthInfo) settableAuthInfo() {}
+func (UserAuthInfo) settableAuthInfoType() SettableAuthInfoType {
+ return SettableAuthInfoTypeUser
+}
+
// User-requested shell execution cancellation handle.
// Experimental: ShellCancelUserRequestedRequest is part of an experimental API and may
// change or be removed.
@@ -15551,6 +15802,7 @@ const (
AuthInfoTypeGhCLI AuthInfoType = "gh-cli"
AuthInfoTypeHMAC AuthInfoType = "hmac"
AuthInfoTypeToken AuthInfoType = "token"
+ AuthInfoTypeTokenProvider AuthInfoType = "token-provider"
AuthInfoTypeUser AuthInfoType = "user"
)
@@ -16018,14 +16270,6 @@ const (
DebugCollectLogsSourceShellLog DebugCollectLogsSource = "shell-log"
)
-// Experimental: DisableBypassPermissionsMode is part of an experimental API and may change
-// or be removed.
-type DisableBypassPermissionsMode string
-
-const (
- DisableBypassPermissionsModeDisable DisableBypassPermissionsMode = "disable"
-)
-
// Effective extension loading and agent-management mode
// Experimental: DiscoveredExtensionMode is part of an experimental API and may change or be
// removed.
@@ -16296,6 +16540,28 @@ const (
FactoryRunStatusRunning FactoryRunStatus = "running"
)
+// Why the runtime is requesting a GitHub credential.
+// Experimental: GitHubTokenAcquireReason is part of an experimental API and may change or
+// be removed.
+type GitHubTokenAcquireReason string
+
+const (
+ // The runtime is acquiring the registration's first credential.
+ GitHubTokenAcquireReasonInitial GitHubTokenAcquireReason = "initial"
+ // The runtime is replacing a credential that is approaching expiry.
+ GitHubTokenAcquireReasonRefresh GitHubTokenAcquireReason = "refresh"
+)
+
+// Kind discriminator for GitHubTokenAcquireResult.
+// Experimental: GitHubTokenAcquireResultKind is part of an experimental API and may change
+// or be removed.
+type GitHubTokenAcquireResultKind string
+
+const (
+ GitHubTokenAcquireResultKindCancelled GitHubTokenAcquireResultKind = "cancelled"
+ GitHubTokenAcquireResultKindToken GitHubTokenAcquireResultKind = "token"
+)
+
// What initiated this compaction request, recorded as the `trigger` on the persisted
// `session.compaction_start` / `session.compaction_complete` events. When absent, the
// compaction is persisted without trigger attribution (initiator unknown).
@@ -16692,6 +16958,8 @@ const (
)
// Kind discriminator for MCPOauthPendingRequestResponse.
+// Experimental: MCPOauthPendingRequestResponseKind is part of an experimental API and may
+// change or be removed.
type MCPOauthPendingRequestResponseKind string
const (
@@ -17729,6 +17997,28 @@ const (
RemoteSessionModeOn RemoteSessionMode = "on"
)
+// Origin of the sandbox choice supplied by an internal client.
+// Experimental: SandboxConfigSource is part of an experimental API and may change or be
+// removed.
+type SandboxConfigSource string
+
+const (
+ // The client applied the default because no sandbox preference was configured.
+ SandboxConfigSourceNeverConfigured SandboxConfigSource = "never_configured"
+ // A repository policy selected the sandbox state.
+ SandboxConfigSourceRepositoryPolicy SandboxConfigSource = "repository_policy"
+ // The user disabled the sandbox for the current session.
+ SandboxConfigSourceSessionDisabled SandboxConfigSource = "session_disabled"
+ // A command-line flag selected the sandbox state for this session.
+ SandboxConfigSourceSessionFlag SandboxConfigSource = "session_flag"
+ // The client disabled the sandbox because the host cannot enforce it.
+ SandboxConfigSourceUnsupportedHost SandboxConfigSource = "unsupported_host"
+ // The user's persisted settings disabled the sandbox.
+ SandboxConfigSourceUserDisabled SandboxConfigSource = "user_disabled"
+ // The user's persisted settings enabled the sandbox.
+ SandboxConfigSourceUserEnabled SandboxConfigSource = "user_enabled"
+)
+
// The UI mode the agent was in when this message was sent. Defaults to the session's
// current mode.
// Experimental: SendAgentMode is part of an experimental API and may change or be removed.
@@ -18190,6 +18480,19 @@ const (
SessionWorkingDirectoryContextHostTypeGitHub SessionWorkingDirectoryContextHostType = "github"
)
+// Type discriminator for SettableAuthInfo.
+type SettableAuthInfoType string
+
+const (
+ SettableAuthInfoTypeAPIKey SettableAuthInfoType = "api-key"
+ SettableAuthInfoTypeCopilotAPIToken SettableAuthInfoType = "copilot-api-token"
+ SettableAuthInfoTypeEnv SettableAuthInfoType = "env"
+ SettableAuthInfoTypeGhCLI SettableAuthInfoType = "gh-cli"
+ SettableAuthInfoTypeHMAC SettableAuthInfoType = "hmac"
+ SettableAuthInfoTypeToken SettableAuthInfoType = "token"
+ SettableAuthInfoTypeUser SettableAuthInfoType = "user"
+)
+
// Controls automatic non-interactive profile loading where supported. Explicit initScripts
// are unaffected.
// Experimental: ShellInitProfile is part of an experimental API and may change or be
@@ -23456,6 +23759,9 @@ func (a *OptionsAPI) Update(ctx context.Context, params *SessionUpdateOptionsPar
if params.IncludedBuiltinAgents != nil {
req["includedBuiltinAgents"] = params.IncludedBuiltinAgents
}
+ if params.IncludedBuiltinSkills != nil {
+ req["includedBuiltinSkills"] = params.IncludedBuiltinSkills
+ }
if params.InstalledPlugins != nil {
req["installedPlugins"] = params.InstalledPlugins
}
@@ -23501,6 +23807,9 @@ func (a *OptionsAPI) Update(ctx context.Context, params *SessionUpdateOptionsPar
if params.SandboxConfig != nil {
req["sandboxConfig"] = *params.SandboxConfig
}
+ if params.SandboxConfigSource != nil {
+ req["sandboxConfigSource"] = *params.SandboxConfigSource
+ }
if params.SessionCapabilities != nil {
req["sessionCapabilities"] = params.SessionCapabilities
}
@@ -23973,7 +24282,8 @@ func (s *PermissionsAPI) Locations() *PermissionsLocationsAPI {
// removed.
type PermissionsPathsAPI sessionAPI
-// Adds a directory to the session's allow-list.
+// Adds a directory to the session's allow-list and activates conventional skill and agent
+// definitions under it.
//
// RPC method: session.permissions.paths.add.
//
@@ -28107,6 +28417,21 @@ type GitHubTelemetryHandler interface {
Event(request *GitHubTelemetryNotification) error
}
+// Experimental: GitHubTokenHandler contains experimental APIs that may change or be removed.
+type GitHubTokenHandler interface {
+ // GetToken asks the SDK client to mint a GitHub access token for a session whose
+ // configuration supplied a GitHub token provider. The runtime acquires the initial token
+ // during bootstrap and refreshes it during expiry preflight when one hour or less remains.
+ //
+ // RPC method: gitHubToken.getToken.
+ //
+ // Parameters: Asks the SDK client to acquire a GitHub access token from an opaque callback
+ // registration.
+ //
+ // Returns: SDK host response to a GitHub credential request.
+ GetToken(request *GitHubTokenAcquireRequest) (GitHubTokenAcquireResult, error)
+}
+
// Experimental: HooksHandler contains experimental APIs that may change or be removed.
type HooksHandler interface {
// Invoke dispatches one SDK callback hook from the runtime to the connection that
@@ -28159,6 +28484,7 @@ type LlmInferenceHandler interface {
type ClientGlobalAPIHandlers struct {
ExtensionLaunchProvider ExtensionLaunchProviderHandler
GitHubTelemetry GitHubTelemetryHandler
+ GitHubToken GitHubTokenHandler
Hooks HooksHandler
LlmInference LlmInferenceHandler
}
@@ -28208,6 +28534,24 @@ func RegisterClientGlobalAPIHandlers(client *jsonrpc2.Client, handlers *ClientGl
}
return nil, nil
})
+ client.SetRequestHandler("gitHubToken.getToken", func(params json.RawMessage) (json.RawMessage, *jsonrpc2.Error) {
+ var request GitHubTokenAcquireRequest
+ if err := json.Unmarshal(params, &request); err != nil {
+ return nil, &jsonrpc2.Error{Code: -32602, Message: fmt.Sprintf("Invalid params: %v", err)}
+ }
+ if handlers == nil || handlers.GitHubToken == nil {
+ return nil, &jsonrpc2.Error{Code: -32603, Message: "No gitHubToken client-global handler registered"}
+ }
+ result, err := handlers.GitHubToken.GetToken(&request)
+ if err != nil {
+ return nil, clientGlobalHandlerError(err)
+ }
+ raw, err := json.Marshal(result)
+ if err != nil {
+ return nil, &jsonrpc2.Error{Code: -32603, Message: fmt.Sprintf("Failed to marshal response: %v", err)}
+ }
+ return raw, nil
+ })
client.SetRequestHandler("hooks.invoke", func(params json.RawMessage) (json.RawMessage, *jsonrpc2.Error) {
var request HookInvokeRequest
if err := json.Unmarshal(params, &request); err != nil {
diff --git a/go/rpc/zrpc_encoding.go b/go/rpc/zrpc_encoding.go
index fadbc5da1b..78788660f5 100644
--- a/go/rpc/zrpc_encoding.go
+++ b/go/rpc/zrpc_encoding.go
@@ -57,6 +57,12 @@ func unmarshalAuthInfo(data []byte) (AuthInfo, error) {
return nil, err
}
return &d, nil
+ case AuthInfoTypeTokenProvider:
+ var d TokenProviderAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
case AuthInfoTypeUser:
var d UserAuthInfo
if err := json.Unmarshal(data, &d); err != nil {
@@ -145,6 +151,17 @@ func (r TokenAuthInfo) MarshalJSON() ([]byte, error) {
})
}
+func (r TokenProviderAuthInfo) MarshalJSON() ([]byte, error) {
+ type alias TokenProviderAuthInfo
+ return json.Marshal(struct {
+ Type AuthInfoType `json:"type"`
+ alias
+ }{
+ Type: r.Type(),
+ alias: alias(r),
+ })
+}
+
func (r UserAuthInfo) MarshalJSON() ([]byte, error) {
type alias UserAuthInfo
return json.Marshal(struct {
@@ -1728,6 +1745,69 @@ func unmarshalFilterMapping(data []byte) (FilterMapping, error) {
return nil, errors.New("data did not match any union variant for FilterMapping")
}
+func unmarshalGitHubTokenAcquireResult(data []byte) (GitHubTokenAcquireResult, error) {
+ if string(data) == "null" {
+ return nil, nil
+ }
+ type rawUnion struct {
+ Kind GitHubTokenAcquireResultKind `json:"kind"`
+ }
+ var raw rawUnion
+ if err := json.Unmarshal(data, &raw); err != nil {
+ return nil, err
+ }
+
+ switch raw.Kind {
+ case GitHubTokenAcquireResultKindCancelled:
+ var d GitHubTokenAcquireResultCancelled
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ case GitHubTokenAcquireResultKindToken:
+ var d GitHubTokenAcquireResultToken
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ default:
+ return &RawGitHubTokenAcquireResultData{Discriminator: raw.Kind, Raw: data}, nil
+ }
+}
+
+func (r RawGitHubTokenAcquireResultData) MarshalJSON() ([]byte, error) {
+ if r.Raw != nil {
+ return r.Raw, nil
+ }
+ return json.Marshal(struct {
+ Kind GitHubTokenAcquireResultKind `json:"kind"`
+ }{
+ Kind: r.Discriminator,
+ })
+}
+
+func (r GitHubTokenAcquireResultCancelled) MarshalJSON() ([]byte, error) {
+ type alias GitHubTokenAcquireResultCancelled
+ return json.Marshal(struct {
+ Kind GitHubTokenAcquireResultKind `json:"kind"`
+ alias
+ }{
+ Kind: r.Kind(),
+ alias: alias(r),
+ })
+}
+
+func (r GitHubTokenAcquireResultToken) MarshalJSON() ([]byte, error) {
+ type alias GitHubTokenAcquireResultToken
+ return json.Marshal(struct {
+ Kind GitHubTokenAcquireResultKind `json:"kind"`
+ alias
+ }{
+ Kind: r.Kind(),
+ alias: alias(r),
+ })
+}
+
func (r *HandlePendingToolCallRequest) UnmarshalJSON(data []byte) error {
type rawHandlePendingToolCallRequest struct {
Error *string `json:"error,omitempty"`
@@ -5311,6 +5391,7 @@ func (r *SessionOpenOptions) UnmarshalJSON(data []byte) error {
ExpAssignments any `json:"expAssignments,omitempty"`
FeatureFlags map[string]bool `json:"featureFlags,omitzero"`
IncludedBuiltinAgents []string `json:"includedBuiltinAgents,omitzero"`
+ IncludedBuiltinSkills []string `json:"includedBuiltinSkills,omitzero"`
InstalledPlugins []InstalledPlugin `json:"installedPlugins,omitzero"`
IntegrationID *string `json:"integrationId,omitempty"`
IsExperimentalMode *bool `json:"isExperimentalMode,omitempty"`
@@ -5332,6 +5413,7 @@ func (r *SessionOpenOptions) UnmarshalJSON(data []byte) error {
RemoteSteerable *bool `json:"remoteSteerable,omitempty"`
RunningInInteractiveMode *bool `json:"runningInInteractiveMode,omitempty"`
SandboxConfig *SandboxConfig `json:"sandboxConfig,omitempty"`
+ SandboxConfigSource *SandboxConfigSource `json:"sandboxConfigSource,omitempty"`
SessionCapabilities []SessionCapability `json:"sessionCapabilities,omitzero"`
SessionID *string `json:"sessionId,omitempty"`
SessionLimits *SessionLimitsConfig `json:"sessionLimits,omitempty"`
@@ -5389,6 +5471,7 @@ func (r *SessionOpenOptions) UnmarshalJSON(data []byte) error {
r.ExpAssignments = raw.ExpAssignments
r.FeatureFlags = raw.FeatureFlags
r.IncludedBuiltinAgents = raw.IncludedBuiltinAgents
+ r.IncludedBuiltinSkills = raw.IncludedBuiltinSkills
r.InstalledPlugins = raw.InstalledPlugins
r.IntegrationID = raw.IntegrationID
r.IsExperimentalMode = raw.IsExperimentalMode
@@ -5410,6 +5493,7 @@ func (r *SessionOpenOptions) UnmarshalJSON(data []byte) error {
r.RemoteSteerable = raw.RemoteSteerable
r.RunningInInteractiveMode = raw.RunningInInteractiveMode
r.SandboxConfig = raw.SandboxConfig
+ r.SandboxConfigSource = raw.SandboxConfigSource
r.SessionCapabilities = raw.SessionCapabilities
r.SessionID = raw.SessionID
r.SessionLimits = raw.SessionLimits
@@ -5573,6 +5657,88 @@ func (r SessionsOpenResumeLast) MarshalJSON() ([]byte, error) {
})
}
+func unmarshalSettableAuthInfo(data []byte) (SettableAuthInfo, error) {
+ if string(data) == "null" {
+ return nil, nil
+ }
+ type rawUnion struct {
+ Type SettableAuthInfoType `json:"type"`
+ }
+ var raw rawUnion
+ if err := json.Unmarshal(data, &raw); err != nil {
+ return nil, err
+ }
+
+ switch raw.Type {
+ case SettableAuthInfoTypeAPIKey:
+ var d APIKeyAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ case SettableAuthInfoTypeCopilotAPIToken:
+ var d CopilotAPITokenAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ case SettableAuthInfoTypeEnv:
+ var d EnvAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ case SettableAuthInfoTypeGhCLI:
+ var d GhCLIAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ case SettableAuthInfoTypeHMAC:
+ var d HMACAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ case SettableAuthInfoTypeToken:
+ var d SettableTokenAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ case SettableAuthInfoTypeUser:
+ var d UserAuthInfo
+ if err := json.Unmarshal(data, &d); err != nil {
+ return nil, err
+ }
+ return &d, nil
+ default:
+ return &RawSettableAuthInfoData{Discriminator: raw.Type, Raw: data}, nil
+ }
+}
+
+func (r RawSettableAuthInfoData) MarshalJSON() ([]byte, error) {
+ if r.Raw != nil {
+ return r.Raw, nil
+ }
+ return json.Marshal(struct {
+ Type SettableAuthInfoType `json:"type"`
+ }{
+ Type: r.Discriminator,
+ })
+}
+
+func (r SettableTokenAuthInfo) MarshalJSON() ([]byte, error) {
+ type alias SettableTokenAuthInfo
+ return json.Marshal(struct {
+ Type SettableAuthInfoType `json:"type"`
+ alias
+ }{
+ Type: r.settableAuthInfoType(),
+ alias: alias(r),
+ })
+}
+
func (r *SessionSetCredentialsParams) UnmarshalJSON(data []byte) error {
type rawSessionSetCredentialsParams struct {
Credentials json.RawMessage `json:"credentials,omitempty"`
@@ -5582,7 +5748,7 @@ func (r *SessionSetCredentialsParams) UnmarshalJSON(data []byte) error {
return err
}
if raw.Credentials != nil {
- value, err := unmarshalAuthInfo(raw.Credentials)
+ value, err := unmarshalSettableAuthInfo(raw.Credentials)
if err != nil {
return err
}
diff --git a/go/rpc/zsession_encoding.go b/go/rpc/zsession_encoding.go
index fb7412d396..5c5d3bca27 100644
--- a/go/rpc/zsession_encoding.go
+++ b/go/rpc/zsession_encoding.go
@@ -299,6 +299,12 @@ func (e *SessionEvent) UnmarshalJSON(data []byte) error {
return err
}
e.Data = &d
+ case SessionEventTypeModelCallFinished:
+ var d ModelCallFinishedData
+ if err := json.Unmarshal(raw.Data, &d); err != nil {
+ return err
+ }
+ e.Data = &d
case SessionEventTypeModelCallStart:
var d ModelCallStartData
if err := json.Unmarshal(raw.Data, &d); err != nil {
diff --git a/go/rpc/zsession_events.go b/go/rpc/zsession_events.go
index 82b0470dbf..282d616be0 100644
--- a/go/rpc/zsession_events.go
+++ b/go/rpc/zsession_events.go
@@ -103,6 +103,7 @@ const (
SessionEventTypeMCPResourcesListChanged SessionEventType = "mcp.resources.list_changed"
SessionEventTypeMCPToolsListChanged SessionEventType = "mcp.tools.list_changed"
SessionEventTypeModelCallFailure SessionEventType = "model.call_failure"
+ SessionEventTypeModelCallFinished SessionEventType = "model.call_finished"
SessionEventTypeModelCallStart SessionEventType = "model.call_start"
SessionEventTypePendingMessagesModified SessionEventType = "pending_messages.modified"
SessionEventTypePermissionCompleted SessionEventType = "permission.completed"
@@ -339,6 +340,8 @@ type AssistantMessageData struct {
ParentToolCallID *string `json:"parentToolCallId,omitempty"`
// Generation phase for phased-output models (e.g., thinking vs. response phases)
Phase *string `json:"phase,omitempty"`
+ // Neutral provider-tagged reasoning content blocks preserved verbatim for round-tripping. `reasoningText` and `reasoningOpaque` are a lossy derived view of these blocks, retained for display.
+ ReasoningBlocks *AssistantMessageReasoningBlocks `json:"reasoningBlocks,omitempty"`
// Opaque/encrypted extended thinking data from Anthropic models. Session-bound and stripped on resume.
ReasoningOpaque *string `json:"reasoningOpaque,omitempty"`
// Readable reasoning text from the model's extended thinking
@@ -753,6 +756,8 @@ type SessionManagedSettingsResolvedData struct {
ManagedKeys []string `json:"managedKeys"`
// Whether at least two managed sources supplied permission allowlists, so enforcement intersects them and the flattened settings payload omits `permissions.allow`.
PermissionsAllowIntersected *bool `json:"permissionsAllowIntersected,omitempty"`
+ // Whether the effective sandbox policy forces the sandbox on *only* because managed policy could not be determined, rather than because the policy requires it. Lets clients tell a user whose `--no-sandbox` was overridden that the sandbox stayed on as a fail-closed fallback, instead of attributing it to an administrator who set no such policy.
+ SandboxEnabledByUndeterminedPolicy *bool `json:"sandboxEnabledByUndeterminedPolicy,omitempty"`
// Whether the server (account/org) managed-settings layer was present
ServerManaged bool `json:"serverManaged"`
// The effective (resolved) managed settings values, so clients can render exactly what is enforced. Absent when no managed policy is in force.
@@ -942,6 +947,25 @@ type ModelCallFailureData struct {
func (*ModelCallFailureData) sessionEventData() {}
func (*ModelCallFailureData) Type() SessionEventType { return SessionEventTypeModelCallFailure }
+// Final lifecycle outcome for one logical model dispatch. A logical dispatch may include internal reconnect or fallback work, so event count is not provider HTTP-request count.
+type ModelCallFinishedData struct {
+ // Whether an accepted successful response requested the exact name and command semantics of a built-in file edit tool, including an external tool explicitly replacing that built-in name. Absent when the logical dispatch did not produce an accepted response.
+ ContainsBuiltInFileEditRequest *bool `json:"containsBuiltInFileEditRequest,omitempty"`
+ // Monotonic elapsed time spent in the logical model dispatch, including any internal transport reconnect or fallback and excluding orchestrator retry backoff, tool execution, confirmations, and post-response processing
+ DispatchDurationMs float64 `json:"dispatchDurationMs"`
+ // Version of the built-in file-edit semantic classifier used for this event
+ EditClassifierVersion int64 `json:"editClassifierVersion"`
+ // Identifier of the user interaction that owns the model dispatch, matching assistant.turn_start.interactionId when available
+ InteractionID *string `json:"interactionId,omitempty"`
+ // Final outcome after post-response acceptance processing
+ Outcome ModelCallFinishedOutcome `json:"outcome"`
+ // Agent-loop iteration within the interaction that initiated the model dispatch
+ TurnID string `json:"turnId"`
+}
+
+func (*ModelCallFinishedData) sessionEventData() {}
+func (*ModelCallFinishedData) Type() SessionEventType { return SessionEventTypeModelCallFinished }
+
// Hook invocation completion details including output, success status, and error information
type HookEndData struct {
// Error details when the hook failed
@@ -1047,6 +1071,8 @@ type AssistantUsageData struct {
NumToolCalls *int64 `json:"numToolCalls,omitempty"`
// Number of output tokens produced
OutputTokens *int64 `json:"outputTokens,omitempty"`
+ // Time to first observable model output in milliseconds. Includes text, reasoning, and tool-call output; only available for streaming requests that produce observable output.
+ OutputTtftMs *float64 `json:"outputTtftMs,omitempty"`
// Parent tool call ID when this usage originates from a sub-agent
// Deprecated: ParentToolCallID is deprecated.
ParentToolCallID *string `json:"parentToolCallId,omitempty"`
@@ -2105,8 +2131,18 @@ type SubagentCompletedData struct {
AgentName string `json:"agentName"`
// Whether the sub-agent was torn down by cancellation - its own abort, or an ancestor being killed - instead of finishing its work. Cancellation is not a failure, so the run still reports completion; this distinguishes a torn-down sub-agent from one that ran to the end.
Cancelled *bool `json:"cancelled,omitempty"`
+ // Whether the first model actually dispatched matched the user's configured preference
+ ConfiguredModelMatchesActual *bool `json:"configuredModelMatchesActual,omitempty"`
+ // Concrete model the user configured for this sub-agent via `/subagents`, when present
+ ConfiguredModelPreference *string `json:"configuredModelPreference,omitempty"`
// Wall-clock duration of the sub-agent execution in milliseconds
DurationMs *int64 `json:"durationMs,omitempty"`
+ // Whether the explicit task-call model matched the user's configured preference
+ ExplicitModelMatchesPreference *bool `json:"explicitModelMatchesPreference,omitempty"`
+ // Explicit model supplied by the parent agent on the task call, when present
+ ExplicitModelOverride *string `json:"explicitModelOverride,omitempty"`
+ // First model for which the sub-agent started an inference request, when one was dispatched
+ FirstDispatchedModel *string `json:"firstDispatchedModel,omitempty"`
// Model used by the sub-agent
Model *string `json:"model,omitempty"`
// Tool call ID of the parent tool invocation that spawned this sub-agent
@@ -2126,10 +2162,20 @@ type SubagentFailedData struct {
AgentDisplayName string `json:"agentDisplayName"`
// Internal name of the sub-agent
AgentName string `json:"agentName"`
+ // Whether the first model actually dispatched matched the user's configured preference
+ ConfiguredModelMatchesActual *bool `json:"configuredModelMatchesActual,omitempty"`
+ // Concrete model the user configured for this sub-agent via `/subagents`, when present
+ ConfiguredModelPreference *string `json:"configuredModelPreference,omitempty"`
// Wall-clock duration of the sub-agent execution in milliseconds
DurationMs *int64 `json:"durationMs,omitempty"`
// Error message describing why the sub-agent failed
Error string `json:"error"`
+ // Whether the explicit task-call model matched the user's configured preference
+ ExplicitModelMatchesPreference *bool `json:"explicitModelMatchesPreference,omitempty"`
+ // Explicit model supplied by the parent agent on the task call, when present
+ ExplicitModelOverride *string `json:"explicitModelOverride,omitempty"`
+ // First model for which the sub-agent started an inference request, when one was dispatched
+ FirstDispatchedModel *string `json:"firstDispatchedModel,omitempty"`
// Model selected for the sub-agent, when known
Model *string `json:"model,omitempty"`
// Tool call ID of the parent tool invocation that spawned this sub-agent
@@ -2426,6 +2472,15 @@ func (*SessionWorkspaceFileChangedData) Type() SessionEventType {
return SessionEventTypeSessionWorkspaceFileChanged
}
+// Neutral provider-tagged reasoning content blocks preserved verbatim for round-tripping
+// Experimental: AssistantMessageReasoningBlocks is part of an experimental API and may change or be removed.
+type AssistantMessageReasoningBlocks struct {
+ // Provider-native reasoning content blocks (e.g. Anthropic `thinking` / `redacted_thinking`) preserved verbatim, in order. A single response can carry several, each signed over the content preceding it, so dropping or reordering any of them invalidates the rest.
+ Blocks []any `json:"blocks,omitzero"`
+ // Model provider that produced these reasoning blocks.
+ Provider string `json:"provider"`
+}
+
// Neutral provider-tagged server-side tool-use payload (tool search, advisor) for verbatim round-tripping
// Experimental: AssistantMessageServerTools is part of an experimental API and may change or be removed.
type AssistantMessageServerTools struct {
@@ -3108,6 +3163,8 @@ type PermissionPromptRequestMCP struct {
// Assisted-approval judge information for this request; present only in assisted mode.
// Experimental: AssistedApproval is part of an experimental API and may change or be removed.
AssistedApproval *PermissionAssistedApproval `json:"assistedApproval,omitempty"`
+ // Whether the host may offer a server-wide "approve all tools from this server" blanket. Absent is treated as true; the runtime sends false when managed policy disables bypass-permissions mode, which forbids the server-wide escalation while still allowing per-tool approval.
+ CanOfferServerWideApproval *bool `json:"canOfferServerWideApproval,omitempty"`
// Advisory runtime permission recommendation. The host remains responsible for deciding the request and may reject it.
// Experimental: PermissionRecommendation is part of an experimental API and may change or be removed.
PermissionRecommendation *PermissionRecommendation `json:"permissionRecommendation,omitempty"`
@@ -4710,6 +4767,8 @@ const (
ManagedSettingsEnforcedEscalationApproveAll ManagedSettingsEnforcedEscalation = "approve_all"
// Assisted mode — keeps normal prompt paths and adds an LLM recommendation, distinct from allow-all.
ManagedSettingsEnforcedEscalationAssistedApproval ManagedSettingsEnforcedEscalation = "assisted_approval"
+ // A server-wide MCP "Always Allow" (or `--allow-tool `) blanket that would auto-approve every tool from an MCP server. Capped to per-tool approval; each tool still prompts.
+ ManagedSettingsEnforcedEscalationServerWideMCPApproval ManagedSettingsEnforcedEscalation = "server_wide_mcp_approval"
// Unrestricted filesystem access outside the session's allowed directories.
ManagedSettingsEnforcedEscalationUnrestrictedPaths ManagedSettingsEnforcedEscalation = "unrestricted_paths"
// Unrestricted URL fetch access.
@@ -4843,6 +4902,20 @@ const (
ModelCallFailureTransportWebsocket ModelCallFailureTransport = "websocket"
)
+// Final outcome of one logical model dispatch after response acceptance processing
+type ModelCallFinishedOutcome string
+
+const (
+ // The dispatch was cancelled before an accepted response was produced.
+ ModelCallFinishedOutcomeCancelled ModelCallFinishedOutcome = "cancelled"
+ // The dispatch ended with a provider or transport error.
+ ModelCallFinishedOutcomeError ModelCallFinishedOutcome = "error"
+ // The provider response was rejected during post-response acceptance processing.
+ ModelCallFinishedOutcomeRejected ModelCallFinishedOutcome = "rejected"
+ // The provider response was accepted for continued agent processing.
+ ModelCallFinishedOutcomeSuccess ModelCallFinishedOutcome = "success"
+)
+
// Binary result type discriminator. Use "image" for images and "resource" for other binary data.
type OmittedBinaryType string
diff --git a/go/types.go b/go/types.go
index 60781d1da8..ff77c9e0c7 100644
--- a/go/types.go
+++ b/go/types.go
@@ -1569,11 +1569,16 @@ type ManagedSettings struct {
}
// DisableBypassPermissionsMode is the managed bypass-permissions policy.
-type DisableBypassPermissionsMode = rpc.DisableBypassPermissionsMode
+//
+// The runtime may introduce additional fail-closed modes. Values are serialized
+// as strings so callers can use newer modes without waiting for an SDK release.
+type DisableBypassPermissionsMode string
const (
// DisableBypassPermissionsModeDisable turns off bypass-permissions mode.
- DisableBypassPermissionsModeDisable = rpc.DisableBypassPermissionsModeDisable
+ DisableBypassPermissionsModeDisable DisableBypassPermissionsMode = "disable"
+ // DisableBypassPermissionsModeAllowAutoOnly permits only automatic bypass.
+ DisableBypassPermissionsModeAllowAutoOnly DisableBypassPermissionsMode = "allow-auto-only"
)
// ManagedSettingsPermissions is the permissions-only managed policy injected
@@ -1581,9 +1586,9 @@ const (
// accepts for fetched managed policy (e.g. "Read(**)", "Shell(git push *)");
// malformed rules are rejected by the runtime at session creation.
type ManagedSettingsPermissions struct {
- // DisableBypassPermissionsMode, when set to "disable", turns off
- // bypass-permissions ("yolo") mode for the session. Deny-wins: no other
- // layer can re-enable it.
+ // DisableBypassPermissionsMode restricts bypass-permissions mode for the
+ // session. See the DisableBypassPermissionsMode constants for known values.
+ // Newer values are forwarded unchanged so runtime policies remain fail-closed.
DisableBypassPermissionsMode DisableBypassPermissionsMode `json:"disableBypassPermissionsMode,omitempty"`
// Deny lists operations that must always be denied. Unioned across layers.
Deny []string `json:"deny,omitzero"`
diff --git a/go/zsession_events.go b/go/zsession_events.go
index 711943b45d..11a1bd666f 100644
--- a/go/zsession_events.go
+++ b/go/zsession_events.go
@@ -16,6 +16,7 @@ type (
AssistantIntentData = rpc.AssistantIntentData
AssistantMessageData = rpc.AssistantMessageData
AssistantMessageDeltaData = rpc.AssistantMessageDeltaData
+ AssistantMessageReasoningBlocks = rpc.AssistantMessageReasoningBlocks
AssistantMessageServerTools = rpc.AssistantMessageServerTools
AssistantMessageStartData = rpc.AssistantMessageStartData
AssistantMessageToolRequest = rpc.AssistantMessageToolRequest
@@ -155,6 +156,8 @@ type (
ModelCallFailureRequestFingerprint = rpc.ModelCallFailureRequestFingerprint
ModelCallFailureSource = rpc.ModelCallFailureSource
ModelCallFailureTransport = rpc.ModelCallFailureTransport
+ ModelCallFinishedData = rpc.ModelCallFinishedData
+ ModelCallFinishedOutcome = rpc.ModelCallFinishedOutcome
ModelCallStartData = rpc.ModelCallStartData
ModelChangeSource = rpc.ModelChangeSource
OmittedBinaryOmittedReason = rpc.OmittedBinaryOmittedReason
@@ -498,6 +501,7 @@ const (
ManagedSettingsEnforcedEscalationAllowAll = rpc.ManagedSettingsEnforcedEscalationAllowAll
ManagedSettingsEnforcedEscalationApproveAll = rpc.ManagedSettingsEnforcedEscalationApproveAll
ManagedSettingsEnforcedEscalationAssistedApproval = rpc.ManagedSettingsEnforcedEscalationAssistedApproval
+ ManagedSettingsEnforcedEscalationServerWideMCPApproval = rpc.ManagedSettingsEnforcedEscalationServerWideMCPApproval
ManagedSettingsEnforcedEscalationUnrestrictedPaths = rpc.ManagedSettingsEnforcedEscalationUnrestrictedPaths
ManagedSettingsEnforcedEscalationUnrestrictedURLs = rpc.ManagedSettingsEnforcedEscalationUnrestrictedURLs
ManagedSettingsResolvedSourceClient = rpc.ManagedSettingsResolvedSourceClient
@@ -542,6 +546,10 @@ const (
ModelCallFailureSourceTopLevel = rpc.ModelCallFailureSourceTopLevel
ModelCallFailureTransportHTTP = rpc.ModelCallFailureTransportHTTP
ModelCallFailureTransportWebsocket = rpc.ModelCallFailureTransportWebsocket
+ ModelCallFinishedOutcomeCancelled = rpc.ModelCallFinishedOutcomeCancelled
+ ModelCallFinishedOutcomeError = rpc.ModelCallFinishedOutcomeError
+ ModelCallFinishedOutcomeRejected = rpc.ModelCallFinishedOutcomeRejected
+ ModelCallFinishedOutcomeSuccess = rpc.ModelCallFinishedOutcomeSuccess
ModelChangeSourceAgent = rpc.ModelChangeSourceAgent
ModelChangeSourceAutomatic = rpc.ModelChangeSourceAutomatic
ModelChangeSourceConfigCommand = rpc.ModelChangeSourceConfigCommand
@@ -660,6 +668,7 @@ const (
SessionEventTypeMCPResourcesListChanged = rpc.SessionEventTypeMCPResourcesListChanged
SessionEventTypeMCPToolsListChanged = rpc.SessionEventTypeMCPToolsListChanged
SessionEventTypeModelCallFailure = rpc.SessionEventTypeModelCallFailure
+ SessionEventTypeModelCallFinished = rpc.SessionEventTypeModelCallFinished
SessionEventTypeModelCallStart = rpc.SessionEventTypeModelCallStart
SessionEventTypePendingMessagesModified = rpc.SessionEventTypePendingMessagesModified
SessionEventTypePermissionCompleted = rpc.SessionEventTypePermissionCompleted
diff --git a/java/pom.xml b/java/pom.xml
index d6b0ee3d33..366756ca28 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -63,7 +63,7 @@
DO NOT EDIT MANUALLY. Updated by the update-copilot-dependency
workflow.
-->
- ^1.0.81-6
+ ^1.0.81-10true
diff --git a/java/scripts/codegen/package-lock.json b/java/scripts/codegen/package-lock.json
index be096fe130..a81af6e0d1 100644
--- a/java/scripts/codegen/package-lock.json
+++ b/java/scripts/codegen/package-lock.json
@@ -6,7 +6,7 @@
"": {
"name": "copilot-sdk-java-codegen",
"dependencies": {
- "@github/copilot": "^1.0.81-6",
+ "@github/copilot": "^1.0.81-10",
"json-schema": "^0.4.0",
"tsx": "^4.23.12"
}
@@ -428,9 +428,9 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.81-6.tgz",
- "integrity": "sha512-hT29nRkf0EJE3N6lqeLOPszbdEyALZ+fjYG9zKX5a3L5r+o+m4/KF+8l2gn2yORNqOzwUYNj2vnVzKqeYYNLGg==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.81-10.tgz",
+ "integrity": "sha512-Ac99EvN16s4hKRhJLSEn1HMNaZ6MD8BzIey1zzJNBQy1/yP4PQDZ2CWitEq+XQQEi+6SsqeJRqXOKiWk1EyK7g==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
"detect-libc": "^2.1.2"
@@ -439,20 +439,20 @@
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.81-6",
- "@github/copilot-darwin-x64": "1.0.81-6",
- "@github/copilot-linux-arm64": "1.0.81-6",
- "@github/copilot-linux-x64": "1.0.81-6",
- "@github/copilot-linuxmusl-arm64": "1.0.81-6",
- "@github/copilot-linuxmusl-x64": "1.0.81-6",
- "@github/copilot-win32-arm64": "1.0.81-6",
- "@github/copilot-win32-x64": "1.0.81-6"
+ "@github/copilot-darwin-arm64": "1.0.81-10",
+ "@github/copilot-darwin-x64": "1.0.81-10",
+ "@github/copilot-linux-arm64": "1.0.81-10",
+ "@github/copilot-linux-x64": "1.0.81-10",
+ "@github/copilot-linuxmusl-arm64": "1.0.81-10",
+ "@github/copilot-linuxmusl-x64": "1.0.81-10",
+ "@github/copilot-win32-arm64": "1.0.81-10",
+ "@github/copilot-win32-x64": "1.0.81-10"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.81-6.tgz",
- "integrity": "sha512-nALa4e8Jc/g5ltIHrpHBHByJ5rlgzoZFylZIrkQY+B9vr3L57d5F6fOiTbf/OF9blFQX7artWRE1K0TmowGNCA==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.81-10.tgz",
+ "integrity": "sha512-s90Av0iwjTSU6Gky8T9wI1PJdlfbdUcPAVgKDtimaOiAwcdLG4fKTpGxrk96KJrnOHHK3x9SiXsw/pW0ThAH/A==",
"cpu": [
"arm64"
],
@@ -466,9 +466,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.81-6.tgz",
- "integrity": "sha512-K+bp799DejrsmxMNyaFAmKo4xnLJXBb8hkv9N8OCQukmTSoRpfqhv2oTDfgVFadwllt+py/FIdxKTZQYvPGGGw==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.81-10.tgz",
+ "integrity": "sha512-8RnPI4J311oJQ0GPB6JxuLJq4JNY/KF9ZIIQm8KpxXBY6d+6fmmAsMDEk7OiF/Asl2I7+LTi+qU2ZVhP7FYhbg==",
"cpu": [
"x64"
],
@@ -482,9 +482,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.81-6.tgz",
- "integrity": "sha512-aEpnfTTjOxpesFo9jqk/phZUivOhNHbdBRfBrS2NiCPrQZFBYUC4wRVo/Xo2PMMQ4J07b6fU7JJQPoUUkKy5Wg==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.81-10.tgz",
+ "integrity": "sha512-2UtK5CBrE6ZVSIzU2KHeIgO8N7056axjbF2lE6WuK+H+oJJ4v3w5eQkalqGzRHhkaPfCW4kT1lDMhZFW+XbLjA==",
"cpu": [
"arm64"
],
@@ -498,9 +498,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.81-6.tgz",
- "integrity": "sha512-NFqonFfJCyA7d3bNoYeLWUQ69zelPr9TTnLpAHCi3scFZqbEvMBDFxW2XsKWwfYuuR9XzfU7/tgOUgq3gmL5aA==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.81-10.tgz",
+ "integrity": "sha512-61+KAfo1TBARrBfss3w4dfmRVSf0PiFg0c9JNuT9HjoNnytl7maJBPEgUvI4YBcxScNEAlCMXaUUG3Tuuh1g+w==",
"cpu": [
"x64"
],
@@ -514,9 +514,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-arm64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.81-6.tgz",
- "integrity": "sha512-EE99DFTAgTq6eOFDiiv+OUROD2pDQIrzyyJEfUS9K8JanwNc+Py8vTxrJ0yK0slpJ+Fue5uDRno6c9ys8OM59g==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.81-10.tgz",
+ "integrity": "sha512-CR6KRPCFoGkaD8I2an1FyrT5avF1U5aTbwW2sYCP7w1KExYFknxEL8ES6BkFuPEA7YcjmLa0SOq26Z+TgIVHSg==",
"cpu": [
"arm64"
],
@@ -530,9 +530,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-x64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.81-6.tgz",
- "integrity": "sha512-90HRKx25EjhlQNOCCdbiC0Ck0fSKyp8XUxUoCvuNdoigdUP54ZGS07dkyJiJq9KZaKilxZBSpXiNt8t5ETA2Sg==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.81-10.tgz",
+ "integrity": "sha512-fvZfyEOfRkvUDPXY6UUjAqV8Mkf08PQV+jgtiAFUryuas5VP9cYaAmQSmNpzNMNi3kSX/ycUJe7oc3zXZ8ylog==",
"cpu": [
"x64"
],
@@ -546,9 +546,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.81-6.tgz",
- "integrity": "sha512-1dRSHF/7PFzB+AGORg8BJh2n1+N7+sIJDLqozrC9INWFp1t6ercptIXgJTF/V7UZVGQLO4LBBK1HH/QhzUmrfA==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.81-10.tgz",
+ "integrity": "sha512-n30PPBgCT4Iq9MgH6is6L3eUEE+sF6xB2fb+dGsclj5j/hCkT7+ef0j8YcAGipsvGfzGAuywIsWlvF7fzYsOKQ==",
"cpu": [
"arm64"
],
@@ -562,9 +562,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.81-6",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.81-6.tgz",
- "integrity": "sha512-lIbN1mk6Rm9bWrWU4/UfrC5OCga7XcBi2LBz5roDnNcuG8mKEevDcNOtbEYz/TaJg+WBMoTbGfXBVd1hGy2DTA==",
+ "version": "1.0.81-10",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.81-10.tgz",
+ "integrity": "sha512-lb8kvhrXwGCN3LeRDQfLHsUp+F43XvPYznaYK1sPtK1kFGa4/kL690tasoSEvzu8ZKoTY6kZ6YmDbUZgqOislw==",
"cpu": [
"x64"
],
diff --git a/java/scripts/codegen/package.json b/java/scripts/codegen/package.json
index 18bdca9bcd..f619ebd627 100644
--- a/java/scripts/codegen/package.json
+++ b/java/scripts/codegen/package.json
@@ -7,7 +7,7 @@
"generate:java": "tsx java.ts"
},
"dependencies": {
- "@github/copilot": "^1.0.81-6",
+ "@github/copilot": "^1.0.81-10",
"json-schema": "^0.4.0",
"tsx": "^4.23.12"
}
diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageEvent.java
index 785e3b49d1..41147f3c55 100644
--- a/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageEvent.java
+++ b/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageEvent.java
@@ -73,6 +73,8 @@ public record AssistantMessageEventData(
@JsonProperty("apiCallId") String apiCallId,
/** Neutral provider-tagged server-side tool-use payload (tool search, advisor) for verbatim round-tripping */
@JsonProperty("serverTools") AssistantMessageServerTools serverTools,
+ /** Neutral provider-tagged reasoning content blocks preserved verbatim for round-tripping. `reasoningText` and `reasoningOpaque` are a lossy derived view of these blocks, retained for display. */
+ @JsonProperty("reasoningBlocks") AssistantMessageReasoningBlocks reasoningBlocks,
/** Identifier for the agent loop turn that produced this message, matching the corresponding assistant.turn_start event */
@JsonProperty("turnId") String turnId,
/** Tool call ID of the parent tool invocation when this event originates from a sub-agent */
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
new file mode 100644
index 0000000000..d2ad87f7c4
--- /dev/null
+++ b/java/sdk/src/generated/java/com/github/copilot/generated/AssistantMessageReasoningBlocks.java
@@ -0,0 +1,30 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------------------------------------------*/
+
+// AUTO-GENERATED FILE - DO NOT EDIT
+// Generated from: session-events.schema.json
+
+package com.github.copilot.generated;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+import javax.annotation.processing.Generated;
+
+/**
+ * Neutral provider-tagged reasoning content blocks preserved verbatim for round-tripping
+ *
+ * @since 1.0.0
+ */
+@javax.annotation.processing.Generated("copilot-sdk-codegen")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public record AssistantMessageReasoningBlocks(
+ /** Model provider that produced these reasoning blocks. */
+ @JsonProperty("provider") String provider,
+ /** Provider-native reasoning content blocks (e.g. Anthropic `thinking` / `redacted_thinking`) preserved verbatim, in order. A single response can carry several, each signed over the content preceding it, so dropping or reordering any of them invalidates the rest. */
+ @JsonProperty("blocks") List