diff --git a/dotnet/src/Generated/Rpc.cs b/dotnet/src/Generated/Rpc.cs index 7e3c233c4d..d11aef4be6 100644 --- a/dotnet/src/Generated/Rpc.cs +++ b/dotnet/src/Generated/Rpc.cs @@ -3174,6 +3174,10 @@ public sealed class InstalledPluginInfo [JsonPropertyName("name")] public string Name { get; set; } = string.Empty; + /// Runtime-reported plugin provenance. Currently set to "builtin" only for plugins registered through the trusted host built-in boundary; absent for installed, marketplace, direct, and live plugins. + [JsonPropertyName("source")] + public string? Source { get; set; } + /// Installed version (when reported by the plugin manifest). [JsonPropertyName("version")] public string? Version { get; set; } @@ -5375,31 +5379,6 @@ internal sealed class SessionsStopRemoteControlRequest public bool? Force { get; set; } } -/// Handle for releasing the extension tool registration. -[Experimental(Diagnostics.Experimental)] -internal sealed class RegisterExtensionToolsResult -{ -} - -/// Optional registration options. -[Experimental(Diagnostics.Experimental)] -public sealed class SessionsRegisterExtensionToolsOnSessionOptions -{ -} - -/// Params to attach an extension loader's tools to a session. -[Experimental(Diagnostics.Experimental)] -internal sealed class RegisterExtensionToolsParams -{ - /// Optional registration options. - [JsonPropertyName("options")] - public SessionsRegisterExtensionToolsOnSessionOptions? Options { get; set; } - - /// Session to register extension tools on. - [JsonPropertyName("sessionId")] - public string SessionId { get; set; } = string.Empty; -} - /// Params to attach or detach an in-process ExtensionController delegate. [Experimental(Diagnostics.Experimental)] internal sealed class ConfigureSessionExtensionsParams @@ -5663,6 +5642,55 @@ public sealed class SendResult public string MessageId { get; set; } = string.Empty; } +/// Provider-native structured output format. JSON Schema is forwarded without rewriting or validating the schema or the generated output. +/// Polymorphic base type discriminated by type. +[Experimental(Diagnostics.Experimental)] +[JsonPolymorphic( + TypeDiscriminatorPropertyName = "type", + UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)] +[JsonDerivedType(typeof(ResponseFormatJsonSchema), "json_schema")] +public partial class ResponseFormat +{ + /// The type discriminator. + [JsonPropertyName("type")] + public virtual string Type { get; set; } = string.Empty; +} + + +/// A JSON Schema output contract. OpenAI receives the name, description, schema and strict setting; Anthropic receives the schema in output_config.format and always uses its native strict enforcement. +[Experimental(Diagnostics.Experimental)] +public sealed class JsonSchemaResponseFormat +{ + /// Optional description passed to OpenAI providers. + [JsonPropertyName("description")] + public string? Description { get; set; } + + /// Name of the output schema, subject to the provider's naming restrictions. + [JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// JSON Schema passed unchanged to the inference provider. Schemas larger than 32 MiB when JSON-encoded are rejected before admission, using the runtime's existing request-size ceiling. This is not a guarantee that the entire model request fits. Supported keywords and schema restrictions are determined by the provider. + [JsonPropertyName("schema")] + public JsonElement Schema { get; set; } + + /// Optional strict enforcement setting for OpenAI providers. Omitted uses the provider default. Anthropic always enforces its supported schema subset. + [JsonPropertyName("strict")] + public bool? Strict { get; set; } +} + +/// The json_schema variant of . +[Experimental(Diagnostics.Experimental)] +public partial class ResponseFormatJsonSchema : ResponseFormat +{ + /// + [JsonIgnore] + public override string Type => "json_schema"; + + /// JSON Schema and provider options for the turn's output. + [JsonPropertyName("jsonSchema")] + public required JsonSchemaResponseFormat JsonSchema { get; set; } +} + /// Parameters for sending a user message to the session. [Experimental(Diagnostics.Experimental)] internal sealed class SendRequest @@ -5703,6 +5731,10 @@ internal sealed class SendRequest [JsonPropertyName("requiredTool")] public string? RequiredTool { get; set; } + /// Provider-native output format for this turn, including all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. + [JsonPropertyName("responseFormat")] + public ResponseFormat? ResponseFormat { get; set; } + /// Target session identifier. [JsonPropertyName("sessionId")] public string SessionId { get; set; } = string.Empty; @@ -5730,7 +5762,7 @@ internal sealed class SendRequest [Experimental(Diagnostics.Experimental)] public sealed class SendMessagesResult { - /// Unique identifiers assigned to the messages, one per provided message in order. Empty when no messages were provided. + /// Unique identifiers assigned to the messages, one per provided message in order. For a batch that starts a run, assistant messages use the final ID as originatingMessageId throughout that run, including tool iterations and stop-hook corrections. Immediate steering does not replace the active run's origin. Empty when no messages were provided; that run has no originatingMessageId. [JsonPropertyName("messageIds")] public IList MessageIds { get => field ??= []; set; } } @@ -5775,7 +5807,7 @@ internal sealed class SendMessagesRequest [JsonPropertyName("agentMode")] public SendAgentMode? AgentMode { get; set; } - /// The user messages to append to the conversation, in order. May be empty, in which case a single turn runs over the existing history with no new user message. + /// The user messages to append to the conversation, in order, before running one agent loop. When the batch starts a run, its final message is the primary initiating message; earlier messages provide context, not separate runs or replies. May be empty, in which case a single turn runs over the existing history with no new user message or originatingMessageId. [JsonPropertyName("messages")] public IList Messages { get => field ??= []; set; } @@ -5791,6 +5823,10 @@ internal sealed class SendMessagesRequest [JsonPropertyName("requestHeaders")] public IDictionary? RequestHeaders { get; set; } + /// Provider-native output format for the whole turn, including an empty message batch and all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. + [JsonPropertyName("responseFormat")] + public ResponseFormat? ResponseFormat { get; set; } + /// Target session identifier. [JsonPropertyName("sessionId")] public string SessionId { get; set; } = string.Empty; @@ -6423,7 +6459,7 @@ internal sealed class SessionGitHubAuthLastAuthErrorsRequest public string SessionId { get; set; } = string.Empty; } -/// A file included in the redacted debug bundle. +/// A file included in the session debug bundle. [Experimental(Diagnostics.Experimental)] public sealed class DebugCollectLogsCollectedEntry { @@ -6457,11 +6493,11 @@ public sealed class DebugCollectLogsSkippedEntry public string Reason { get; set; } = string.Empty; } -/// Result of collecting a redacted debug bundle. +/// Result of collecting a session debug bundle. [Experimental(Diagnostics.Experimental)] public sealed class DebugCollectLogsResult { - /// Files included in the redacted bundle. + /// Files included in the bundle. [JsonPropertyName("entries")] public IList Entries { get => field ??= []; set; } @@ -6494,7 +6530,7 @@ public sealed class DebugCollectLogsEntry [JsonPropertyName("path")] public string Path { get; set; } = string.Empty; - /// How text content from this entry should be redacted. Defaults to plain-text. + /// How text content from this entry should be redacted. Defaults to plain-text. With none, no redaction is applied; the caller must ensure any necessary redaction is performed before this call. [JsonPropertyName("redaction")] public DebugCollectLogsRedaction? Redaction { get; set; } @@ -6503,7 +6539,7 @@ public sealed class DebugCollectLogsEntry public bool? Required { get; set; } } -/// Destination for the redacted debug bundle. +/// Destination for the session debug bundle. /// Polymorphic base type discriminated by kind. [Experimental(Diagnostics.Experimental)] [JsonPolymorphic( @@ -6545,7 +6581,7 @@ public partial class DebugCollectLogsDestinationDirectory : DebugCollectLogsDest [JsonIgnore] public override string Kind => "directory"; - /// Directory where redacted files should be staged. The directory is created if needed. + /// Directory where files should be staged. The directory is created if needed. [JsonPropertyName("outputDirectory")] public required string OutputDirectory { get; set; } } @@ -6583,7 +6619,7 @@ public sealed class DebugCollectLogsInclude public bool? ShellLogs { get; set; } } -/// Options for collecting a redacted session debug bundle. +/// Options for collecting a session debug bundle with configurable redaction. [Experimental(Diagnostics.Experimental)] internal sealed class DebugCollectLogsRequest { @@ -6591,7 +6627,7 @@ internal sealed class DebugCollectLogsRequest [JsonPropertyName("additionalEntries")] public IList? AdditionalEntries { get; set; } - /// Where the redacted bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage redacted files for caller-managed upload/post-processing. + /// Where the bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage files for caller-managed upload/post-processing. [JsonPropertyName("destination")] public DebugCollectLogsDestination Destination { get => field ??= new(); set; } @@ -10671,6 +10707,10 @@ public sealed class McpHostState [Experimental(Diagnostics.Experimental)] public sealed class McpServer { + /// Human-readable display name supplied by a managed server catalog. + [JsonPropertyName("displayName")] + public string? DisplayName { get; set; } + /// Error message if the server failed to connect. [JsonPropertyName("error")] public string? Error { get; set; } @@ -10686,7 +10726,7 @@ public sealed class McpServer [JsonPropertyName("serverMetadata")] public McpServerMetadata? ServerMetadata { get; set; } - /// Configuration source: user, workspace, plugin, or builtin. + /// Configuration source: user, workspace, plugin, builtin, or managed. [JsonPropertyName("source")] public McpServerSource? Source { get; set; } @@ -11430,6 +11470,7 @@ public sealed class McpHeadersHandlePendingHeadersRefreshRequestResult UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)] [JsonDerivedType(typeof(McpHeadersHandlePendingHeadersRefreshRequestHeaders), "headers")] [JsonDerivedType(typeof(McpHeadersHandlePendingHeadersRefreshRequestNone), "none")] +[JsonDerivedType(typeof(McpHeadersHandlePendingHeadersRefreshRequestError), "error")] public partial class McpHeadersHandlePendingHeadersRefreshRequest { /// The type discriminator. @@ -11449,6 +11490,11 @@ public partial class McpHeadersHandlePendingHeadersRefreshRequestHeaders : McpHe /// Headers to overlay onto the MCP request. Dynamic headers override static config headers but do not replace SDK-managed request headers. [JsonPropertyName("headers")] public required IDictionary Headers { get; set; } + + /// Optional lifetime in milliseconds for these returned headers. The runtime clamps its configured cache lifetime to this value. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("ttlMs")] + public long? TtlMs { get; set; } } /// The none variant of . @@ -11460,6 +11506,19 @@ public partial class McpHeadersHandlePendingHeadersRefreshRequestNone : McpHeade public override string Kind => "none"; } +/// The error variant of . +[Experimental(Diagnostics.Experimental)] +public partial class McpHeadersHandlePendingHeadersRefreshRequestError : McpHeadersHandlePendingHeadersRefreshRequest +{ + /// + [JsonIgnore] + public override string Kind => "error"; + + /// Host credential broker failure, denial, or revocation reason. + [JsonPropertyName("message")] + public required string Message { get; set; } +} + /// MCP headers refresh request id and the host response. [Experimental(Diagnostics.Experimental)] internal sealed class McpHeadersHandlePendingHeadersRefreshRequestRequest @@ -12190,6 +12249,291 @@ public sealed class ProviderAddResult public IList Models { get => field ??= []; set; } } +/// RPC data type for ProtocolSystemMessageAppendConfig operations. +[Experimental(Diagnostics.Experimental)] +public sealed class ProtocolSystemMessageAppendConfig +{ + /// Text appended to the standard system prompt. + [JsonPropertyName("content")] + public string? Content { get; set; } + + /// Append-mode discriminator. Omission also selects append mode. + [JsonPropertyName("mode")] + public ProtocolAppendMode? Mode { get; set; } +} + +/// RPC data type for SystemMessageBlock operations. +[Experimental(Diagnostics.Experimental)] +public sealed class SystemMessageBlock +{ + /// Text content for this system-message block. + [JsonPropertyName("content")] + public string Content { get; set; } = string.Empty; + + /// Whether the block is static and may be cached independently of dynamic prompt content. + [JsonPropertyName("isStatic")] + public bool? IsStatic { get; set; } +} + +/// RPC data type for ProtocolSystemMessageReplaceConfig operations. +[Experimental(Diagnostics.Experimental)] +public sealed class ProtocolSystemMessageReplaceConfig +{ + /// Complete replacement system-message text. + [JsonPropertyName("content")] + public string Content { get; set; } = string.Empty; + + /// Optional structured blocks corresponding to the replacement content. + [JsonPropertyName("contentBlocks")] + public IList? ContentBlocks { get; set; } + + /// Replace-mode discriminator. + [JsonPropertyName("mode")] + public ProtocolReplaceMode Mode { get; set; } +} + +/// RPC data type for ProtocolStaticSectionOverride operations. +[Experimental(Diagnostics.Experimental)] +public sealed class ProtocolStaticSectionOverride +{ + /// Declarative operation applied to the section. + [JsonPropertyName("action")] + public ProtocolStaticSectionAction Action { get; set; } + + /// Optional content used by replace, append, and prepend operations. + [JsonPropertyName("content")] + public string? Content { get; set; } +} + +/// Polymorphic base type discriminated by action. +[Experimental(Diagnostics.Experimental)] +[JsonPolymorphic( + TypeDiscriminatorPropertyName = "action", + UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)] +[JsonDerivedType(typeof(ProtocolMarkerSectionOverrideTransform), "transform")] +[JsonDerivedType(typeof(ProtocolMarkerSectionOverridePreserve), "preserve")] +public partial class ProtocolMarkerSectionOverride +{ + /// The type discriminator. + [JsonPropertyName("action")] + public virtual string Action { get; set; } = string.Empty; +} + + +/// The transform variant of . +[Experimental(Diagnostics.Experimental)] +public partial class ProtocolMarkerSectionOverrideTransform : ProtocolMarkerSectionOverride +{ + /// + [JsonIgnore] + public override string Action => "transform"; +} + +/// The preserve variant of . +[Experimental(Diagnostics.Experimental)] +public partial class ProtocolMarkerSectionOverridePreserve : ProtocolMarkerSectionOverride +{ + /// + [JsonIgnore] + public override string Action => "preserve"; +} + +/// JSON union data type for ProtocolSectionOverride. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +public sealed partial class ProtocolSectionOverride +{ + /// Gets the value when this instance contains . + public ProtocolStaticSectionOverride? ProtocolStaticSectionOverride { get; } + + /// Gets the value when this instance contains . + public ProtocolMarkerSectionOverride? ProtocolMarkerSectionOverride { get; } + + /// Initializes a new instance of the class from . + public ProtocolSectionOverride(ProtocolStaticSectionOverride value) + { + ArgumentNullException.ThrowIfNull(value); + ProtocolStaticSectionOverride = value; + } + + /// Converts to . + public static implicit operator ProtocolSectionOverride(ProtocolStaticSectionOverride value) => new(value); + + /// Initializes a new instance of the class from . + public ProtocolSectionOverride(ProtocolMarkerSectionOverride value) + { + ArgumentNullException.ThrowIfNull(value); + ProtocolMarkerSectionOverride = value; + } + + /// Converts to . + public static implicit operator ProtocolSectionOverride(ProtocolMarkerSectionOverride value) => new(value); + + /// Provides a for serializing instances. + [EditorBrowsable(EditorBrowsableState.Never)] + public sealed class Converter : JsonConverter + { + /// + public override ProtocolSectionOverride Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + throw new JsonException("Expected JSON object for ProtocolSectionOverride."); + } + + using var document = JsonDocument.ParseValue(ref reader); + var element = document.RootElement; + if (element.ValueKind == JsonValueKind.Object && (element.TryGetProperty("action", out _) && element.GetProperty("action").ValueKind == JsonValueKind.String && (element.GetProperty("action").GetString() == "replace" || element.GetProperty("action").GetString() == "remove" || element.GetProperty("action").GetString() == "append" || element.GetProperty("action").GetString() == "prepend"))) + { + var protocolStaticSectionOverride = JsonSerializer.Deserialize(element, RpcJsonContext.Default.ProtocolStaticSectionOverride); + return protocolStaticSectionOverride is null ? throw new JsonException("Expected ProtocolStaticSectionOverride value.") : new ProtocolSectionOverride(protocolStaticSectionOverride); + } + if ((element.ValueKind == JsonValueKind.Object && (element.TryGetProperty("action", out _) && element.GetProperty("action").ValueKind == JsonValueKind.String && (element.GetProperty("action").GetString() == "transform")) || element.ValueKind == JsonValueKind.Object && (element.TryGetProperty("action", out _) && element.GetProperty("action").ValueKind == JsonValueKind.String && (element.GetProperty("action").GetString() == "preserve")))) + { + var protocolMarkerSectionOverride = JsonSerializer.Deserialize(element, RpcJsonContext.Default.ProtocolMarkerSectionOverride); + return protocolMarkerSectionOverride is null ? throw new JsonException("Expected ProtocolMarkerSectionOverride value.") : new ProtocolSectionOverride(protocolMarkerSectionOverride); + } + + throw new JsonException("JSON value did not match any ProtocolSectionOverride variant."); + } + + /// + public override void Write(Utf8JsonWriter writer, ProtocolSectionOverride value, JsonSerializerOptions options) + { + if (value.ProtocolStaticSectionOverride is { } protocolStaticSectionOverride) + { + JsonSerializer.Serialize(writer, protocolStaticSectionOverride, RpcJsonContext.Default.ProtocolStaticSectionOverride); + return; + } + if (value.ProtocolMarkerSectionOverride is { } protocolMarkerSectionOverride) + { + JsonSerializer.Serialize(writer, protocolMarkerSectionOverride, RpcJsonContext.Default.ProtocolMarkerSectionOverride); + return; + } + + throw new JsonException("No ProtocolSectionOverride variant value is set."); + } + } +} + +/// RPC data type for ProtocolSystemMessageCustomizeConfig operations. +[Experimental(Diagnostics.Experimental)] +public sealed class ProtocolSystemMessageCustomizeConfig +{ + /// Text appended after the customized sections. + [JsonPropertyName("content")] + public string? Content { get; set; } + + /// Customize-mode discriminator. + [JsonPropertyName("mode")] + public ProtocolCustomizeMode Mode { get; set; } + + /// Named standard-prompt section overrides. + [JsonPropertyName("sections")] + public IDictionary? Sections { get; set; } +} + +/// JSON union data type for ProtocolSystemMessageConfig. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +public sealed partial class ProtocolSystemMessageConfig +{ + /// Gets the value when this instance contains . + public ProtocolSystemMessageAppendConfig? ProtocolSystemMessageAppendConfig { get; } + + /// Gets the value when this instance contains . + public ProtocolSystemMessageReplaceConfig? ProtocolSystemMessageReplaceConfig { get; } + + /// Gets the value when this instance contains . + public ProtocolSystemMessageCustomizeConfig? ProtocolSystemMessageCustomizeConfig { get; } + + /// Initializes a new instance of the class from . + public ProtocolSystemMessageConfig(ProtocolSystemMessageAppendConfig value) + { + ArgumentNullException.ThrowIfNull(value); + ProtocolSystemMessageAppendConfig = value; + } + + /// Converts to . + public static implicit operator ProtocolSystemMessageConfig(ProtocolSystemMessageAppendConfig value) => new(value); + + /// Initializes a new instance of the class from . + public ProtocolSystemMessageConfig(ProtocolSystemMessageReplaceConfig value) + { + ArgumentNullException.ThrowIfNull(value); + ProtocolSystemMessageReplaceConfig = value; + } + + /// Converts to . + public static implicit operator ProtocolSystemMessageConfig(ProtocolSystemMessageReplaceConfig value) => new(value); + + /// Initializes a new instance of the class from . + public ProtocolSystemMessageConfig(ProtocolSystemMessageCustomizeConfig value) + { + ArgumentNullException.ThrowIfNull(value); + ProtocolSystemMessageCustomizeConfig = value; + } + + /// Converts to . + public static implicit operator ProtocolSystemMessageConfig(ProtocolSystemMessageCustomizeConfig value) => new(value); + + /// Provides a for serializing instances. + [EditorBrowsable(EditorBrowsableState.Never)] + public sealed class Converter : JsonConverter + { + /// + public override ProtocolSystemMessageConfig Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + throw new JsonException("Expected JSON object for ProtocolSystemMessageConfig."); + } + + using var document = JsonDocument.ParseValue(ref reader); + var element = document.RootElement; + if (element.ValueKind == JsonValueKind.Object && (!element.TryGetProperty("mode", out _) || (element.TryGetProperty("mode", out _) && element.GetProperty("mode").ValueKind == JsonValueKind.String && (element.GetProperty("mode").GetString() == "append")))) + { + var protocolSystemMessageAppendConfig = JsonSerializer.Deserialize(element, RpcJsonContext.Default.ProtocolSystemMessageAppendConfig); + return protocolSystemMessageAppendConfig is null ? throw new JsonException("Expected ProtocolSystemMessageAppendConfig value.") : new ProtocolSystemMessageConfig(protocolSystemMessageAppendConfig); + } + if (element.ValueKind == JsonValueKind.Object && (element.TryGetProperty("mode", out _) && element.GetProperty("mode").ValueKind == JsonValueKind.String && (element.GetProperty("mode").GetString() == "replace"))) + { + var protocolSystemMessageReplaceConfig = JsonSerializer.Deserialize(element, RpcJsonContext.Default.ProtocolSystemMessageReplaceConfig); + return protocolSystemMessageReplaceConfig is null ? throw new JsonException("Expected ProtocolSystemMessageReplaceConfig value.") : new ProtocolSystemMessageConfig(protocolSystemMessageReplaceConfig); + } + if (element.ValueKind == JsonValueKind.Object && (element.TryGetProperty("mode", out _) && element.GetProperty("mode").ValueKind == JsonValueKind.String && (element.GetProperty("mode").GetString() == "customize"))) + { + var protocolSystemMessageCustomizeConfig = JsonSerializer.Deserialize(element, RpcJsonContext.Default.ProtocolSystemMessageCustomizeConfig); + return protocolSystemMessageCustomizeConfig is null ? throw new JsonException("Expected ProtocolSystemMessageCustomizeConfig value.") : new ProtocolSystemMessageConfig(protocolSystemMessageCustomizeConfig); + } + + throw new JsonException("JSON value did not match any ProtocolSystemMessageConfig variant."); + } + + /// + public override void Write(Utf8JsonWriter writer, ProtocolSystemMessageConfig value, JsonSerializerOptions options) + { + if (value.ProtocolSystemMessageAppendConfig is { } protocolSystemMessageAppendConfig) + { + JsonSerializer.Serialize(writer, protocolSystemMessageAppendConfig, RpcJsonContext.Default.ProtocolSystemMessageAppendConfig); + return; + } + if (value.ProtocolSystemMessageReplaceConfig is { } protocolSystemMessageReplaceConfig) + { + JsonSerializer.Serialize(writer, protocolSystemMessageReplaceConfig, RpcJsonContext.Default.ProtocolSystemMessageReplaceConfig); + return; + } + if (value.ProtocolSystemMessageCustomizeConfig is { } protocolSystemMessageCustomizeConfig) + { + JsonSerializer.Serialize(writer, protocolSystemMessageCustomizeConfig, RpcJsonContext.Default.ProtocolSystemMessageCustomizeConfig); + return; + } + + throw new JsonException("No ProtocolSystemMessageConfig variant value is set."); + } + } +} + /// A BYOK model definition referencing a named provider. [Experimental(Diagnostics.Experimental)] public sealed class ProviderModelConfig @@ -12226,6 +12570,10 @@ public sealed class ProviderModelConfig [JsonPropertyName("provider")] public string Provider { get; set; } = string.Empty; + /// System-message configuration used when the runtime builds the standard prompt for this provider-qualified model, including general-purpose subagents. It uses the same object hierarchy as session-level systemMessage configuration, except transform actions are rejected because the current callback protocol is not model-scoped. When present, it overrides the session-wide configuration on those prompt paths. Selected custom-agent and specialized-subagent prompts remain authoritative. + [JsonPropertyName("systemMessage")] + public ProtocolSystemMessageConfig? SystemMessage { get; set; } + /// The model name sent to the provider API for inference. Defaults to `id`. [JsonPropertyName("wireModel")] public string? WireModel { get; set; } @@ -12562,6 +12910,10 @@ public sealed class SandboxConfigUserPolicyNetworkProxy [Experimental(Diagnostics.Experimental)] public sealed class SandboxConfigUserPolicyNetwork { + /// Hosts allowed through the built-in sandbox proxy. A non-empty list denies unmatched hosts; an absent or empty list allows all hosts not blocked. Supports exact hostnames, IP addresses, and *.example.com for strict subdomains. Host rules do not override the outbound or local-network toggles. + [JsonPropertyName("allowedHosts")] + public IList? AllowedHosts { get; set; } + /// Whether traffic to local/loopback addresses is allowed. [JsonPropertyName("allowLocalNetwork")] public bool? AllowLocalNetwork { get; set; } @@ -12570,7 +12922,11 @@ public sealed class SandboxConfigUserPolicyNetwork [JsonPropertyName("allowOutbound")] public bool? AllowOutbound { get; set; } - /// HTTP proxy for sandboxed process traffic. Linux restricts egress to the proxy endpoint, requires that endpoint to be reachable over IPv4 (the [::] dual-stack wildcard is accepted and routed through the IPv4 gateway), and does not support proxy credentials. macOS relies on applications honoring proxy environment variables. Windows also configures a per-AppContainer WinHTTP proxy, but enforcement depends on the application's networking stack. Configure supported credentials in the separate `username` and `password` fields. A credential-free http:// loopback URL uses the localhost proxy form, while an https:// or authenticated loopback URL uses the URL form. + /// Hosts denied by the built-in sandbox proxy. Deny rules take precedence over allowedHosts. A domain also denies all its subdomains. IP addresses match exactly; *.example.com matches strict subdomains, and * denies every host. + [JsonPropertyName("blockedHosts")] + public IList? BlockedHosts { get; set; } + + /// HTTP(S) proxy for sandboxed traffic. With host rules, this is the built-in local proxy's upstream; credentials stay in the runtime, and Linux and macOS restrict the child to the local listener. Without host rules, Linux restricts egress to this endpoint but rejects credentials, and macOS proxying is cooperative. Windows enforcement depends on the application's networking stack. Configure credentials in the separate username/password fields. The transient local listener URL is never persisted. [JsonPropertyName("proxy")] public SandboxConfigUserPolicyNetworkProxy? Proxy { get; set; } } @@ -14489,6 +14845,11 @@ public partial class SlashCommandInvocationResultText : SlashCommandInvocationRe [JsonPropertyName("runtimeSettingsChanged")] public bool? RuntimeSettingsChanged { get; set; } + /// Present when the invocation changed the sandbox for this session only. Nothing was persisted, so consumers must mirror the change onto the live session rather than reloading settings, and must not treat it as a settings change. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("sandboxSessionChange")] + public SandboxSessionChange? SandboxSessionChange { get; set; } + /// Text output for the client to render. [JsonPropertyName("text")] public required string Text { get; set; } @@ -25572,7 +25933,7 @@ public DebugCollectLogsResultKind(string value) /// A .tgz archive was written. public static DebugCollectLogsResultKind Archive { get; } = new("archive"); - /// A directory containing redacted files was written. + /// A directory containing the collected files was written. public static DebugCollectLogsResultKind Directory { get; } = new("directory"); /// Returns a value indicating whether two instances are equivalent. @@ -25701,6 +26062,9 @@ public DebugCollectLogsRedaction(string value) /// Redact each non-empty line as a session event JSON object, falling back to plain-text redaction for malformed lines. public static DebugCollectLogsRedaction EventsJsonl { get; } = new("events-jsonl"); + /// No redaction is applied. The caller must ensure any necessary redaction is performed before this call. + public static DebugCollectLogsRedaction None { get; } = new("none"); + /// Returns a value indicating whether two instances are equivalent. public static bool operator ==(DebugCollectLogsRedaction left, DebugCollectLogsRedaction right) => left.Equals(right); @@ -28177,6 +28541,255 @@ public override void Write(Utf8JsonWriter writer, ProviderEndpointWireApi value, } +/// Defines the allowed values. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct ProtocolAppendMode : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public ProtocolAppendMode(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// Gets the append value. + public static ProtocolAppendMode Append { get; } = new("append"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(ProtocolAppendMode left, ProtocolAppendMode right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(ProtocolAppendMode left, ProtocolAppendMode right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is ProtocolAppendMode other && Equals(other); + + /// + public bool Equals(ProtocolAppendMode 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 ProtocolAppendMode Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, ProtocolAppendMode value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ProtocolAppendMode)); + } + } +} + + +/// Defines the allowed values. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct ProtocolReplaceMode : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public ProtocolReplaceMode(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// Gets the replace value. + public static ProtocolReplaceMode Replace { get; } = new("replace"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(ProtocolReplaceMode left, ProtocolReplaceMode right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(ProtocolReplaceMode left, ProtocolReplaceMode right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is ProtocolReplaceMode other && Equals(other); + + /// + public bool Equals(ProtocolReplaceMode 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 ProtocolReplaceMode Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, ProtocolReplaceMode value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ProtocolReplaceMode)); + } + } +} + + +/// Defines the allowed values. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct ProtocolCustomizeMode : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public ProtocolCustomizeMode(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// Gets the customize value. + public static ProtocolCustomizeMode Customize { get; } = new("customize"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(ProtocolCustomizeMode left, ProtocolCustomizeMode right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(ProtocolCustomizeMode left, ProtocolCustomizeMode right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is ProtocolCustomizeMode other && Equals(other); + + /// + public bool Equals(ProtocolCustomizeMode 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 ProtocolCustomizeMode Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, ProtocolCustomizeMode value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ProtocolCustomizeMode)); + } + } +} + + +/// Defines the allowed values. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct ProtocolStaticSectionAction : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public ProtocolStaticSectionAction(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// Replace the section content. + public static ProtocolStaticSectionAction Replace { get; } = new("replace"); + + /// Remove the section content. + public static ProtocolStaticSectionAction Remove { get; } = new("remove"); + + /// Append content to the section. + public static ProtocolStaticSectionAction Append { get; } = new("append"); + + /// Prepend content to the section. + public static ProtocolStaticSectionAction Prepend { get; } = new("prepend"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(ProtocolStaticSectionAction left, ProtocolStaticSectionAction right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(ProtocolStaticSectionAction left, ProtocolStaticSectionAction right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is ProtocolStaticSectionAction other && Equals(other); + + /// + public bool Equals(ProtocolStaticSectionAction 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 ProtocolStaticSectionAction Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, ProtocolStaticSectionAction value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(ProtocolStaticSectionAction)); + } + } +} + + /// Provider transport. Defaults to "http". [Experimental(Diagnostics.Experimental)] [JsonConverter(typeof(Converter))] @@ -29632,6 +30245,69 @@ public override void Write(Utf8JsonWriter writer, SubagentSettingsEntryContextTi } +/// A session-scoped sandbox transition applied while handling a slash command. +[Experimental(Diagnostics.Experimental)] +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct SandboxSessionChange : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public SandboxSessionChange(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// The sandbox is off for the rest of this session; nothing was persisted and a new session starts from managed policy. + public static SandboxSessionChange Disabled { get; } = new("disabled"); + + /// A previous session-scoped opt-out was cleared and the sandbox is enforced again. + public static SandboxSessionChange Restored { get; } = new("restored"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(SandboxSessionChange left, SandboxSessionChange right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(SandboxSessionChange left, SandboxSessionChange right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is SandboxSessionChange other && Equals(other); + + /// + public bool Equals(SandboxSessionChange 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 SandboxSessionChange Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, SandboxSessionChange value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SandboxSessionChange)); + } + } +} + + /// Defines the allowed values. [Experimental(Diagnostics.Experimental)] [JsonConverter(typeof(Converter))] @@ -33601,20 +34277,7 @@ public async Task GetRemoteControlStatusAsync(Cancell return await CopilotClient.InvokeRpcAsync(_rpc, "sessions.getRemoteControlStatus", [], cancellationToken); } - /// Registers extension-provided tools on the given session, gated by an optional `enabled` callback. Returns an opaque unsubscribe function the caller must invoke to deregister the tools when the extension is torn down. Marked internal because `loader`, `enabled`, and the returned `unsubscribe` are in-process handles that cannot cross the JSON-RPC boundary. Disappears once extension discovery / launch / tool registration are owned by the runtime: SDK consumers will pass pure config (search paths, disabled ids) via `SessionOptions` and the runtime will resolve, launch, register, and tear down extensions itself. - /// Session to register extension tools on. - /// Optional registration options. - /// The to monitor for cancellation requests. The default is . - /// Handle for releasing the extension tool registration. - internal async Task RegisterExtensionToolsOnSessionAsync(string sessionId, SessionsRegisterExtensionToolsOnSessionOptions? options = null, CancellationToken cancellationToken = default) - { - ArgumentNullException.ThrowIfNull(sessionId); - - var request = new RegisterExtensionToolsParams { SessionId = sessionId, Options = options }; - return await CopilotClient.InvokeRpcAsync(_rpc, "sessions.registerExtensionToolsOnSession", [request], cancellationToken); - } - - /// Attaches (or detaches) an in-process ExtensionController delegate for the given session, used by shared-API surfaces that need to query or modify the session's extension state. Pass `controller: undefined` to detach. Marked internal because the controller is an in-process object that cannot cross the JSON-RPC boundary. Disappears alongside `registerExtensionToolsOnSession`: once the runtime owns extension management, the public surface exposes list/enable/disable/reload as dedicated RPCs served by the runtime. + /// Attaches (or detaches) an in-process ExtensionController delegate for the given session in a local host adapter. Pass `controller: undefined` to detach. Internal because the controller cannot cross the JSON-RPC boundary; the runtime manages its own session extension service. /// Session to attach the extension controller delegate to. /// The to monitor for cancellation requests. The default is . internal async Task ConfigureSessionExtensionsAsync(string sessionId, CancellationToken cancellationToken = default) @@ -33929,39 +34592,41 @@ public async Task SuspendAsync(CancellationToken cancellationToken = default) /// Optional provenance tag copied to the resulting user.message event. Must be `user`, `system`, `command-<command-id>` for command-originated messages, `schedule-<numeric-id>` for scheduled prompts, or `agent-<agent-id>` for prompts sent by another agent. /// The UI mode the agent was in when this message was sent. Defaults to the session's current mode. /// Custom HTTP headers to include in outbound model requests for this turn. Merged with session-level provider headers; per-turn headers augment and overwrite session-level headers with the same key. + /// Provider-native output format for this turn, including all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. /// W3C Trace Context traceparent header for distributed tracing of this agent turn. /// W3C Trace Context tracestate header for distributed tracing. /// If true, await completion of the agentic loop for this message before returning. Defaults to false (fire-and-forget). When true, the result still contains the same `messageId`; the caller can rely on the agent having processed the message before the call resolves. Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally blocks until the completed turn's event tail has been dispatched to this session's in-process subscribers, so a subsequent read of subscriber state already reflects the turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery follows over the wire. Callers that need the stronger local guarantee on remote sessions should await the event stream explicitly. /// The to monitor for cancellation requests. The default is . /// Result of sending a user message. [Experimental(Diagnostics.Experimental)] - public async Task SendAsync(string prompt, string? displayPrompt = null, IList? attachments = null, SendMode? mode = null, bool? prepend = null, bool? billable = null, string? requiredTool = null, string? source = null, SendAgentMode? agentMode = null, IDictionary? requestHeaders = null, string? traceparent = null, string? tracestate = null, bool? wait = null, CancellationToken cancellationToken = default) + public async Task SendAsync(string prompt, string? displayPrompt = null, IList? attachments = null, SendMode? mode = null, bool? prepend = null, bool? billable = null, string? requiredTool = null, string? source = null, SendAgentMode? agentMode = null, IDictionary? requestHeaders = null, ResponseFormat? responseFormat = null, string? traceparent = null, string? tracestate = null, bool? wait = null, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(prompt); _session.ThrowIfDisposed(); - var request = new SendRequest { SessionId = _session.SessionId, Prompt = prompt, DisplayPrompt = displayPrompt, Attachments = attachments, Mode = mode, Prepend = prepend, Billable = billable, RequiredTool = requiredTool, Source = source, AgentMode = agentMode, RequestHeaders = requestHeaders, Traceparent = traceparent, Tracestate = tracestate, Wait = wait }; + var request = new SendRequest { SessionId = _session.SessionId, Prompt = prompt, DisplayPrompt = displayPrompt, Attachments = attachments, Mode = mode, Prepend = prepend, Billable = billable, RequiredTool = requiredTool, Source = source, AgentMode = agentMode, RequestHeaders = requestHeaders, ResponseFormat = responseFormat, Traceparent = traceparent, Tracestate = tracestate, Wait = wait }; return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.send", [request], cancellationToken); } /// Sends zero or more user messages to the session in a single turn and returns their message IDs. All provided messages are appended to the conversation in order, then exactly one agent turn runs over the resulting history. When the list is empty, one turn runs over the existing history with no new user message. Remote-backed (Mission Control) sessions do not support this method and will return an error. - /// The user messages to append to the conversation, in order. May be empty, in which case a single turn runs over the existing history with no new user message. + /// The user messages to append to the conversation, in order, before running one agent loop. When the batch starts a run, its final message is the primary initiating message; earlier messages provide context, not separate runs or replies. May be empty, in which case a single turn runs over the existing history with no new user message or originatingMessageId. /// How to deliver the messages. `enqueue` (default) appends to the message queue. `immediate` interjects during an in-progress turn. /// If true, adds the messages to the front of the queue instead of the end. /// The UI mode the agent was in when these messages were sent. Defaults to the session's current mode. /// Custom HTTP headers to include in outbound model requests for this turn. Merged with session-level provider headers; per-turn headers augment and overwrite session-level headers with the same key. + /// Provider-native output format for the whole turn, including an empty message batch and all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. /// W3C Trace Context traceparent header for distributed tracing of this agent turn. /// W3C Trace Context tracestate header for distributed tracing. /// If true, await completion of the agentic loop for this turn before returning. Defaults to false (fire-and-forget). When true, the result still contains the same `messageIds`; the caller can rely on the agent having processed the messages before the call resolves. Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally blocks until the completed turn's event tail has been dispatched to this session's in-process subscribers, so a subsequent read of subscriber state already reflects the turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery follows over the wire. Callers that need the stronger local guarantee on remote sessions should await the event stream explicitly. /// The to monitor for cancellation requests. The default is . /// Result of sending zero or more user messages. [Experimental(Diagnostics.Experimental)] - public async Task SendMessagesAsync(IList messages, SendMode? mode = null, bool? prepend = null, SendAgentMode? agentMode = null, IDictionary? requestHeaders = null, string? traceparent = null, string? tracestate = null, bool? wait = null, CancellationToken cancellationToken = default) + public async Task SendMessagesAsync(IList messages, SendMode? mode = null, bool? prepend = null, SendAgentMode? agentMode = null, IDictionary? requestHeaders = null, ResponseFormat? responseFormat = null, string? traceparent = null, string? tracestate = null, bool? wait = null, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(messages); _session.ThrowIfDisposed(); - var request = new SendMessagesRequest { SessionId = _session.SessionId, Messages = messages, Mode = mode, Prepend = prepend, AgentMode = agentMode, RequestHeaders = requestHeaders, Traceparent = traceparent, Tracestate = tracestate, Wait = wait }; + var request = new SendMessagesRequest { SessionId = _session.SessionId, Messages = messages, Mode = mode, Prepend = prepend, AgentMode = agentMode, RequestHeaders = requestHeaders, ResponseFormat = responseFormat, Traceparent = traceparent, Tracestate = tracestate, Wait = wait }; return await CopilotClient.InvokeRpcAsync(_session.Rpc, "session.sendMessages", [request], cancellationToken); } @@ -34233,12 +34898,12 @@ internal DebugApi(CopilotSession session) _session = session; } - /// Collects a redacted session debug log bundle into a local archive or staging directory. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape. - /// Where the redacted bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage redacted files for caller-managed upload/post-processing. + /// Collects a session debug log bundle into a local archive or staging directory. Logs are redacted by default; redaction can be configured per caller-provided diagnostic entry. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape. + /// Where the bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage files for caller-managed upload/post-processing. /// Which built-in session diagnostics to include. Omitted fields default to true. /// Caller-provided server-local files or directories to include in addition to the runtime's built-in session diagnostics. This lets host applications add their own diagnostics without changing the API shape. /// The to monitor for cancellation requests. The default is . - /// Result of collecting a redacted debug bundle. + /// Result of collecting a session debug bundle. public async Task CollectLogsAsync(DebugCollectLogsDestination destination, DebugCollectLogsInclude? include = null, IList? additionalEntries = null, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(destination); @@ -38820,8 +39485,14 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(GitHub.Copilot.ShutdownModelMetricUsage), TypeInfoPropertyName = "SessionEventsShutdownModelMetricUsage")] [JsonSerializable(typeof(GitHub.Copilot.ShutdownTokenDetail), TypeInfoPropertyName = "SessionEventsShutdownTokenDetail")] [JsonSerializable(typeof(GitHub.Copilot.ShutdownType), TypeInfoPropertyName = "SessionEventsShutdownType")] +[JsonSerializable(typeof(GitHub.Copilot.SkillContextDeliveredData), TypeInfoPropertyName = "SessionEventsSkillContextDeliveredData")] +[JsonSerializable(typeof(GitHub.Copilot.SkillContextDeliveredEvent), TypeInfoPropertyName = "SessionEventsSkillContextDeliveredEvent")] +[JsonSerializable(typeof(GitHub.Copilot.SkillContextDeliveredRefData), TypeInfoPropertyName = "SessionEventsSkillContextDeliveredRefData")] +[JsonSerializable(typeof(GitHub.Copilot.SkillContextDeliveredRefEvent), TypeInfoPropertyName = "SessionEventsSkillContextDeliveredRefEvent")] [JsonSerializable(typeof(GitHub.Copilot.SkillInvokedData), TypeInfoPropertyName = "SessionEventsSkillInvokedData")] [JsonSerializable(typeof(GitHub.Copilot.SkillInvokedEvent), TypeInfoPropertyName = "SessionEventsSkillInvokedEvent")] +[JsonSerializable(typeof(GitHub.Copilot.SkillInvokedRefData), TypeInfoPropertyName = "SessionEventsSkillInvokedRefData")] +[JsonSerializable(typeof(GitHub.Copilot.SkillInvokedRefEvent), TypeInfoPropertyName = "SessionEventsSkillInvokedRefEvent")] [JsonSerializable(typeof(GitHub.Copilot.SkillInvokedTrigger), TypeInfoPropertyName = "SessionEventsSkillInvokedTrigger")] [JsonSerializable(typeof(GitHub.Copilot.SkillSource), TypeInfoPropertyName = "SessionEventsSkillSource")] [JsonSerializable(typeof(GitHub.Copilot.SkillsLoadedSkill), TypeInfoPropertyName = "SessionEventsSkillsLoadedSkill")] @@ -39143,6 +39814,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(InstructionsGetSourcesResult))] [JsonSerializable(typeof(InterruptMainTurnRequest))] [JsonSerializable(typeof(InterruptMainTurnResult))] +[JsonSerializable(typeof(JsonSchemaResponseFormat))] [JsonSerializable(typeof(LlmInferenceHttpRequestChunkRequest))] [JsonSerializable(typeof(LlmInferenceHttpRequestChunkResult))] [JsonSerializable(typeof(LlmInferenceHttpRequestStartRequest))] @@ -39403,6 +40075,13 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(PluginsUninstallRequest))] [JsonSerializable(typeof(PluginsUpdateRequest))] [JsonSerializable(typeof(ProtocolExternalToolDefinition))] +[JsonSerializable(typeof(ProtocolMarkerSectionOverride))] +[JsonSerializable(typeof(ProtocolSectionOverride))] +[JsonSerializable(typeof(ProtocolStaticSectionOverride))] +[JsonSerializable(typeof(ProtocolSystemMessageAppendConfig))] +[JsonSerializable(typeof(ProtocolSystemMessageConfig))] +[JsonSerializable(typeof(ProtocolSystemMessageCustomizeConfig))] +[JsonSerializable(typeof(ProtocolSystemMessageReplaceConfig))] [JsonSerializable(typeof(ProviderAddRequest))] [JsonSerializable(typeof(ProviderAddResult))] [JsonSerializable(typeof(ProviderConfig))] @@ -39449,8 +40128,6 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(QueuedCommandResult))] [JsonSerializable(typeof(RegisterEventInterestParams))] [JsonSerializable(typeof(RegisterEventInterestResult))] -[JsonSerializable(typeof(RegisterExtensionToolsParams))] -[JsonSerializable(typeof(RegisterExtensionToolsResult))] [JsonSerializable(typeof(ReleaseEventInterestParams))] [JsonSerializable(typeof(RemoteControlConfig))] [JsonSerializable(typeof(RemoteControlConfigExistingMcSession))] @@ -39465,6 +40142,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(RemoteSessionConnectionResult))] [JsonSerializable(typeof(RemoteSessionMetadataRepository))] [JsonSerializable(typeof(RemoteSessionMetadataValue))] +[JsonSerializable(typeof(ResponseFormat))] [JsonSerializable(typeof(RunOptions))] [JsonSerializable(typeof(SandboxConfig))] [JsonSerializable(typeof(SandboxConfigAuth))] @@ -39692,7 +40370,6 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(SessionsOpenProgress))] [JsonSerializable(typeof(SessionsPruneOldRequest))] [JsonSerializable(typeof(SessionsReadPersistedEventsRequest))] -[JsonSerializable(typeof(SessionsRegisterExtensionToolsOnSessionOptions))] [JsonSerializable(typeof(SessionsReleaseLockRequest))] [JsonSerializable(typeof(SessionsReleaseLockResult))] [JsonSerializable(typeof(SessionsReloadPluginHooksRequest))] @@ -39738,6 +40415,7 @@ public static void RegisterClientGlobalApiHandlers(JsonRpc rpc, ClientGlobalApiH [JsonSerializable(typeof(SlashCommandSelectSubcommandOption))] [JsonSerializable(typeof(SlashCommandTimelineEntry))] [JsonSerializable(typeof(SubagentSettingsEntry))] +[JsonSerializable(typeof(SystemMessageBlock))] [JsonSerializable(typeof(TaskClientInfo))] [JsonSerializable(typeof(TaskClientOwner))] [JsonSerializable(typeof(TaskClientUpdate))] diff --git a/dotnet/src/Generated/SessionEvents.cs b/dotnet/src/Generated/SessionEvents.cs index a58dae10ec..26a4ec9493 100644 --- a/dotnet/src/Generated/SessionEvents.cs +++ b/dotnet/src/Generated/SessionEvents.cs @@ -146,7 +146,10 @@ namespace GitHub.Copilot; [JsonDerivedType(typeof(SessionUsageInfoEvent), "session.usage_info")] [JsonDerivedType(typeof(SessionWarningEvent), "session.warning")] [JsonDerivedType(typeof(SessionWorkspaceFileChangedEvent), "session.workspace_file_changed")] +[JsonDerivedType(typeof(SkillContextDeliveredEvent), "skill.context_delivered")] +[JsonDerivedType(typeof(SkillContextDeliveredRefEvent), "skill.context_delivered_ref")] [JsonDerivedType(typeof(SkillInvokedEvent), "skill.invoked")] +[JsonDerivedType(typeof(SkillInvokedRefEvent), "skill.invoked_ref")] [JsonDerivedType(typeof(SubagentCompletedEvent), "subagent.completed")] [JsonDerivedType(typeof(SubagentConfiguredEvent), "subagent.configured")] [JsonDerivedType(typeof(SubagentDeselectedEvent), "subagent.deselected")] @@ -1141,6 +1144,48 @@ public sealed partial class SkillInvokedEvent : SessionEvent public required SkillInvokedData Data { get; set; } } +/// Internal durable skill invocation receipt whose content resolves from an earlier inline skill event in the same session. +/// Represents the skill.invoked_ref event. +[Experimental(Diagnostics.Experimental)] +public sealed partial class SkillInvokedRefEvent : SessionEvent +{ + /// + [JsonIgnore] + public override string Type => "skill.invoked_ref"; + + /// The skill.invoked_ref event payload. + [JsonPropertyName("data")] + public required SkillInvokedRefData Data { get; set; } +} + +/// Exact skill context delivered to the model during a tool phase. This is not a user submission or another skill invocation. +/// Represents the skill.context_delivered event. +[Experimental(Diagnostics.Experimental)] +public sealed partial class SkillContextDeliveredEvent : SessionEvent +{ + /// + [JsonIgnore] + public override string Type => "skill.context_delivered"; + + /// The skill.context_delivered event payload. + [JsonPropertyName("data")] + public required SkillContextDeliveredData Data { get; set; } +} + +/// Internal durable receipt that reconstructs exact model-visible skill context from earlier session content. +/// Represents the skill.context_delivered_ref event. +[Experimental(Diagnostics.Experimental)] +public sealed partial class SkillContextDeliveredRefEvent : SessionEvent +{ + /// + [JsonIgnore] + public override string Type => "skill.context_delivered_ref"; + + /// The skill.context_delivered_ref event payload. + [JsonPropertyName("data")] + public required SkillContextDeliveredRefData Data { get; set; } +} + /// Payload of `sandbox.decision`, a bounded governance record of what the process sandbox was configured to do and whether it took effect. Discriminated by `kind`. /// Represents the sandbox.decision event. public sealed partial class SandboxDecisionEvent : SessionEvent @@ -3885,6 +3930,11 @@ public sealed partial class AssistantMessageData [JsonPropertyName("model")] public string? Model { get; set; } + /// Logical ID of the primary user message that initiated this run, matching the messageId returned by session.send (or the last messageId of session.sendMessages). Stable across model/tool iterations, steering messages, and stop-hook corrections. Subagent runs use their own initiating message ID, not the parent's. Absent for runs without an associated initiating message, such as empty batches. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("originatingMessageId")] + public string? OriginatingMessageId { get; set; } + /// Actual output token count from the API response (completion_tokens), used for accurate token accounting. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("outputTokens")] @@ -4598,6 +4648,16 @@ public sealed partial class ToolExecutionStartData [JsonPropertyName("fusion")] public FusionAttribution? Fusion { get; set; } + /// Preferred lookup name for the MCP server hosting this tool: the configured (namespaced) config-map key when the tool carries one, otherwise the display name from `mcpServerName`. Present when the tool is an MCP tool; this is the name unrestricted provenance telemetry hashes so it joins with `mcp_server_setup`, which keys off the configured name too. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("mcpConfigServerName")] + public string? McpConfigServerName { get; set; } + + /// Where the MCP server's configuration came from (`user`, `workspace`, `plugin`, or `builtin`), when the tool is an MCP tool and the server is configured. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("mcpConfigSource")] + public McpServerSource? McpConfigSource { get; set; } + /// Name of the MCP server hosting this tool, when the tool is an MCP tool. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("mcpServerName")] @@ -4831,6 +4891,110 @@ public sealed partial class SkillInvokedData public SkillInvokedTrigger? Trigger { get; set; } } +/// Internal durable skill invocation receipt whose content resolves from an earlier inline skill event in the same session. +public sealed partial class SkillInvokedRefData +{ + /// Tool names that should be auto-approved when this skill is active. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("allowedTools")] + public string[]? AllowedTools { get; set; } + + /// Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:<lowercase hex digest>` over the UTF-8 bytes of that event's `content`. + [JsonPropertyName("contentId")] + public required string ContentId { get; set; } + + /// UTF-16 code unit length of the referenced skill content. Derived from the referenced body and validated against it when the reference is expanded; a reference whose length disagrees with the body it names is rejected instead of expanded. + [JsonPropertyName("contentLength")] + public required long ContentLength { get; set; } + + /// Description of the skill from its SKILL.md frontmatter. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("description")] + public string? Description { get; set; } + + /// Whether model invocation is disabled for this skill. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("disableModelInvocation")] + public bool? DisableModelInvocation { get; set; } + + /// Model identifier active when the skill was invoked, when known. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("model")] + public string? Model { get; set; } + + /// Name of the invoked skill. + [JsonPropertyName("name")] + public required string Name { get; set; } + + /// File path to the SKILL.md definition, or an empty string for an SDK-provided skill without a filesystem identity. + [JsonPropertyName("path")] + public required string Path { get; set; } + + /// Name of the plugin this skill originated from, when applicable. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("pluginName")] + public string? PluginName { get; set; } + + /// Version of the plugin this skill originated from, when applicable. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("pluginVersion")] + public string? PluginVersion { get; set; } + + /// Source identifier for where the skill was discovered. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("source")] + public string? Source { get; set; } + + /// What triggered the skill invocation. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("trigger")] + public SkillInvokedTrigger? Trigger { get; set; } +} + +/// Exact skill context delivered to the model during a tool phase. This is not a user submission or another skill invocation. +public sealed partial class SkillContextDeliveredData +{ + /// Exact model-facing skill wrapper, including its invocation-time file context. + [JsonPropertyName("content")] + public required string Content { get; set; } + + /// Interaction that delivered this context, when known. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("interactionId")] + public string? InteractionId { get; set; } + + /// Unmodified injection provenance, in the form skill-<invocation-name>. + [JsonPropertyName("source")] + public required string Source { get; set; } +} + +/// Internal durable receipt that reconstructs exact model-visible skill context from earlier session content. +public sealed partial class SkillContextDeliveredRefData +{ + /// Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:<lowercase hex digest>` over the UTF-8 bytes of that event's `content`. + [JsonPropertyName("contentId")] + public required string ContentId { get; set; } + + /// Interaction that delivered this context, when known. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("interactionId")] + public string? InteractionId { get; set; } + + /// Exact text preceding the referenced content in the delivered wrapper. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("prefix")] + public string? Prefix { get; set; } + + /// Unmodified injection provenance, in the form skill-<invocation-name>. + [JsonPropertyName("source")] + public required string Source { get; set; } + + /// Exact text following the referenced content in the delivered wrapper. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("suffix")] + public string? Suffix { get; set; } +} + /// Payload of `sandbox.decision`, a bounded governance record of what the process sandbox was configured to do and whether it took effect. Discriminated by `kind`. public sealed partial class SandboxDecisionData { } @@ -4869,6 +5033,11 @@ public sealed partial class SubagentStartedData [JsonPropertyName("model")] public string? Model { get; set; } + /// Authority or runtime mechanism responsible for sub-agent model selection, when known at start. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("modelSelectionSource")] + public SubagentModelSelectionSource? ModelSelectionSource { get; set; } + /// Task-registry ID of the spawning sub-agent. Absent when the root session spawned this child. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("parentId")] @@ -5096,7 +5265,7 @@ public sealed partial class HookStartData [JsonPropertyName("hookType")] public required string HookType { get; set; } - /// Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) elides the tool result's inline `contents`/`uiResource` and replaces an over-long `textResultForLlm` with a `[copilot:elided ...]` marker, to keep a multi-megabyte payload out of the durable event log; the live subscription stream still delivers the full value. Read the adjacent tool.execution_complete event for the tool result itself. + /// Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) drops the tool result's inline `contents`/`uiResource`/`skillInvocation` and replaces duplicated text result fields with a `[copilot:elided ...]` marker; the live subscription stream still delivers the full value. Canonical tool output remains in the adjacent tool.execution_complete event, while an invoked skill's authoritative body remains in its skill invocation event. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("input")] public JsonElement? Input { get; set; } @@ -5123,7 +5292,7 @@ public sealed partial class HookEndData [JsonPropertyName("hookType")] public required string HookType { get; set; } - /// Output data produced by the hook. + /// Output data produced by the hook. Durable and resumed postToolUse receipts may omit messages owned by a successful skill invocation and replace an unchanged skill sessionLog copy with an elision marker; hook-modified or re-sourced values are preserved, and the authoritative body remains in the skill invocation event. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("output")] public JsonElement? Output { get; set; } @@ -8660,7 +8829,7 @@ public sealed partial class ToolExecutionCompleteResult [JsonPropertyName("contents")] public ToolExecutionCompleteContent[]? Contents { get; set; } - /// Full detailed tool result for UI/timeline display, preserving complete content such as diffs. Falls back to content when absent. + /// Detailed tool result for UI/timeline display, preserving complete content such as diffs for most tools. Successful skill invocations intentionally use the concise model-facing content here; the authoritative skill body is carried by the corresponding skill invocation event. Falls back to content when absent. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("detailedContent")] public string? DetailedContent { get; set; } @@ -10869,6 +11038,11 @@ public sealed partial class McpServerMetadata /// Nested data type for McpServersLoadedServer. public sealed partial class McpServersLoadedServer { + /// Human-readable display name supplied by a managed server catalog. + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("displayName")] + public string? DisplayName { get; set; } + /// Error message if the server failed to connect. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("error")] @@ -10893,7 +11067,7 @@ public sealed partial class McpServersLoadedServer [JsonPropertyName("serverMetadata")] public McpServerMetadata? ServerMetadata { get; set; } - /// Configuration source: user, workspace, plugin, or builtin. + /// Configuration source: user, workspace, plugin, builtin, or managed. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("source")] public McpServerSource? Source { get; set; } @@ -14069,6 +14243,76 @@ public override void Write(Utf8JsonWriter writer, AbortReason value, JsonSeriali } } +/// Configuration source: user, workspace, plugin, builtin, or managed. +[JsonConverter(typeof(Converter))] +[DebuggerDisplay("{Value,nq}")] +public readonly struct McpServerSource : IEquatable +{ + private readonly string? _value; + + /// Initializes a new instance of the struct. + /// The value to associate with this . + [JsonConstructor] + public McpServerSource(string value) + { + ArgumentException.ThrowIfNullOrWhiteSpace(value); + _value = value; + } + + /// Gets the value associated with this . + public string Value => _value ?? string.Empty; + + /// Server configured in the user's global MCP configuration. + public static McpServerSource User { get; } = new("user"); + + /// Server configured by the current workspace. + public static McpServerSource Workspace { get; } = new("workspace"); + + /// Server contributed by an installed plugin. + public static McpServerSource Plugin { get; } = new("plugin"); + + /// Server bundled with the runtime. + public static McpServerSource Builtin { get; } = new("builtin"); + + /// Server supplied by a trusted host-managed catalog. + public static McpServerSource Managed { get; } = new("managed"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(McpServerSource left, McpServerSource right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(McpServerSource left, McpServerSource right) => !(left == right); + + /// + public override bool Equals(object? obj) => obj is McpServerSource other && Equals(other); + + /// + public bool Equals(McpServerSource 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 McpServerSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); + } + + /// + public override void Write(Utf8JsonWriter writer, McpServerSource value, JsonSerializerOptions options) + { + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(McpServerSource)); + } + } +} + /// Transport mechanism: stdio, http, sse (deprecated), or memory (in-process MCP server). [JsonConverter(typeof(Converter))] [DebuggerDisplay("{Value,nq}")] @@ -14566,48 +14810,57 @@ public override void Write(Utf8JsonWriter writer, SkillInvokedTrigger value, Jso } } -/// Where the model input for a task-tool sub-agent came from. +/// Authority or runtime mechanism responsible for sub-agent model selection. [JsonConverter(typeof(Converter))] [DebuggerDisplay("{Value,nq}")] -public readonly struct SubagentTaskModelSource : IEquatable +public readonly struct SubagentModelSelectionSource : IEquatable { private readonly string? _value; - /// Initializes a new instance of the struct. - /// The value to associate with this . + /// Initializes a new instance of the struct. + /// The value to associate with this . [JsonConstructor] - public SubagentTaskModelSource(string value) + public SubagentModelSelectionSource(string value) { ArgumentException.ThrowIfNullOrWhiteSpace(value); _value = value; } - /// Gets the value associated with this . + /// Gets the value associated with this . public string Value => _value ?? string.Empty; - /// The spawning agent supplied the task tool's model argument. - public static SubagentTaskModelSource TaskArgument { get; } = new("task_argument"); + /// Explicit model supplied by the parent agent on the task call and selected for dispatch. + public static SubagentModelSelectionSource ExplicitOverride { get; } = new("explicit_override"); - /// The task omitted a model and the per-sub-agent settings entry supplied a concrete one. - public static SubagentTaskModelSource SubagentConfiguration { get; } = new("subagent_configuration"); + /// Required model policy configured for the sub-agent. + public static SubagentModelSelectionSource ConfiguredRequired { get; } = new("configured_required"); - /// The task omitted a model and the user-defined custom agent's definition supplied one. - public static SubagentTaskModelSource CustomAgentDefinition { get; } = new("custom_agent_definition"); + /// Non-required model preference configured for the sub-agent. + public static SubagentModelSelectionSource ConfiguredPreference { get; } = new("configured_preference"); - /// Neither the task call, the per-sub-agent settings entry, nor a custom agent definition supplied a model. - public static SubagentTaskModelSource Unset { get; } = new("unset"); + /// Complementary-model default selected for the sub-agent. + public static SubagentModelSelectionSource ComplementaryDefault { get; } = new("complementary_default"); - /// Returns a value indicating whether two instances are equivalent. - public static bool operator ==(SubagentTaskModelSource left, SubagentTaskModelSource right) => left.Equals(right); + /// Model inherited from the parent session. + public static SubagentModelSelectionSource SessionInheritance { get; } = new("session_inheritance"); - /// Returns a value indicating whether two instances are not equivalent. - public static bool operator !=(SubagentTaskModelSource left, SubagentTaskModelSource right) => !(left == right); + /// Default model declared by the agent definition. + public static SubagentModelSelectionSource AgentDefinitionDefault { get; } = new("agent_definition_default"); + + /// Runtime policy, Auto mode, or an experiment selected the model. + public static SubagentModelSelectionSource RuntimePolicy { get; } = new("runtime_policy"); + + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(SubagentModelSelectionSource left, SubagentModelSelectionSource right) => left.Equals(right); + + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(SubagentModelSelectionSource left, SubagentModelSelectionSource right) => !(left == right); /// - public override bool Equals(object? obj) => obj is SubagentTaskModelSource other && Equals(other); + public override bool Equals(object? obj) => obj is SubagentModelSelectionSource other && Equals(other); /// - public bool Equals(SubagentTaskModelSource other) => string.Equals(Value, other.Value, StringComparison.OrdinalIgnoreCase); + public bool Equals(SubagentModelSelectionSource other) => string.Equals(Value, other.Value, StringComparison.OrdinalIgnoreCase); /// public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(Value); @@ -14615,75 +14868,66 @@ public SubagentTaskModelSource(string value) /// public override string ToString() => Value; - /// Provides a for serializing instances. + /// Provides a for serializing instances. [EditorBrowsable(EditorBrowsableState.Never)] - public sealed class Converter : JsonConverter + public sealed class Converter : JsonConverter { /// - public override SubagentTaskModelSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override SubagentModelSelectionSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); } /// - public override void Write(Utf8JsonWriter writer, SubagentTaskModelSource value, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, SubagentModelSelectionSource value, JsonSerializerOptions options) { - GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SubagentTaskModelSource)); + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SubagentModelSelectionSource)); } } } -/// Authority or runtime mechanism responsible for sub-agent model selection. +/// Where the model input for a task-tool sub-agent came from. [JsonConverter(typeof(Converter))] [DebuggerDisplay("{Value,nq}")] -public readonly struct SubagentModelSelectionSource : IEquatable +public readonly struct SubagentTaskModelSource : IEquatable { private readonly string? _value; - /// Initializes a new instance of the struct. - /// The value to associate with this . + /// Initializes a new instance of the struct. + /// The value to associate with this . [JsonConstructor] - public SubagentModelSelectionSource(string value) + public SubagentTaskModelSource(string value) { ArgumentException.ThrowIfNullOrWhiteSpace(value); _value = value; } - /// Gets the value associated with this . + /// Gets the value associated with this . public string Value => _value ?? string.Empty; - /// Explicit model supplied by the parent agent on the task call and selected for dispatch. - public static SubagentModelSelectionSource ExplicitOverride { get; } = new("explicit_override"); - - /// Required model policy configured for the sub-agent. - public static SubagentModelSelectionSource ConfiguredRequired { get; } = new("configured_required"); - - /// Non-required model preference configured for the sub-agent. - public static SubagentModelSelectionSource ConfiguredPreference { get; } = new("configured_preference"); - - /// Complementary-model default selected for the sub-agent. - public static SubagentModelSelectionSource ComplementaryDefault { get; } = new("complementary_default"); + /// The spawning agent supplied the task tool's model argument. + public static SubagentTaskModelSource TaskArgument { get; } = new("task_argument"); - /// Model inherited from the parent session. - public static SubagentModelSelectionSource SessionInheritance { get; } = new("session_inheritance"); + /// The task omitted a model and the per-sub-agent settings entry supplied a concrete one. + public static SubagentTaskModelSource SubagentConfiguration { get; } = new("subagent_configuration"); - /// Default model declared by the agent definition. - public static SubagentModelSelectionSource AgentDefinitionDefault { get; } = new("agent_definition_default"); + /// The task omitted a model and the user-defined custom agent's definition supplied one. + public static SubagentTaskModelSource CustomAgentDefinition { get; } = new("custom_agent_definition"); - /// Runtime policy, Auto mode, or an experiment selected the model. - public static SubagentModelSelectionSource RuntimePolicy { get; } = new("runtime_policy"); + /// Neither the task call, the per-sub-agent settings entry, nor a custom agent definition supplied a model. + public static SubagentTaskModelSource Unset { get; } = new("unset"); - /// Returns a value indicating whether two instances are equivalent. - public static bool operator ==(SubagentModelSelectionSource left, SubagentModelSelectionSource right) => left.Equals(right); + /// Returns a value indicating whether two instances are equivalent. + public static bool operator ==(SubagentTaskModelSource left, SubagentTaskModelSource right) => left.Equals(right); - /// Returns a value indicating whether two instances are not equivalent. - public static bool operator !=(SubagentModelSelectionSource left, SubagentModelSelectionSource right) => !(left == right); + /// Returns a value indicating whether two instances are not equivalent. + public static bool operator !=(SubagentTaskModelSource left, SubagentTaskModelSource right) => !(left == right); /// - public override bool Equals(object? obj) => obj is SubagentModelSelectionSource other && Equals(other); + public override bool Equals(object? obj) => obj is SubagentTaskModelSource other && Equals(other); /// - public bool Equals(SubagentModelSelectionSource other) => string.Equals(Value, other.Value, StringComparison.OrdinalIgnoreCase); + public bool Equals(SubagentTaskModelSource other) => string.Equals(Value, other.Value, StringComparison.OrdinalIgnoreCase); /// public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(Value); @@ -14691,20 +14935,20 @@ public SubagentModelSelectionSource(string value) /// public override string ToString() => Value; - /// Provides a for serializing instances. + /// Provides a for serializing instances. [EditorBrowsable(EditorBrowsableState.Never)] - public sealed class Converter : JsonConverter + public sealed class Converter : JsonConverter { /// - public override SubagentModelSelectionSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override SubagentTaskModelSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); } /// - public override void Write(Utf8JsonWriter writer, SubagentModelSelectionSource value, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, SubagentTaskModelSource value, JsonSerializerOptions options) { - GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SubagentModelSelectionSource)); + GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(SubagentTaskModelSource)); } } } @@ -15942,6 +16186,9 @@ public McpHeadersRefreshCompletedOutcome(string value) /// The host responded with no dynamic headers. public static McpHeadersRefreshCompletedOutcome None { get; } = new("none"); + /// The host credential broker rejected or failed the refresh. + public static McpHeadersRefreshCompletedOutcome Error { get; } = new("error"); + /// No response arrived within the bounded window. public static McpHeadersRefreshCompletedOutcome Timeout { get; } = new("timeout"); @@ -16728,73 +16975,6 @@ public override void Write(Utf8JsonWriter writer, AgentModelPolicy value, JsonSe } } -/// Configuration source: user, workspace, plugin, or builtin. -[JsonConverter(typeof(Converter))] -[DebuggerDisplay("{Value,nq}")] -public readonly struct McpServerSource : IEquatable -{ - private readonly string? _value; - - /// Initializes a new instance of the struct. - /// The value to associate with this . - [JsonConstructor] - public McpServerSource(string value) - { - ArgumentException.ThrowIfNullOrWhiteSpace(value); - _value = value; - } - - /// Gets the value associated with this . - public string Value => _value ?? string.Empty; - - /// Server configured in the user's global MCP configuration. - public static McpServerSource User { get; } = new("user"); - - /// Server configured by the current workspace. - public static McpServerSource Workspace { get; } = new("workspace"); - - /// Server contributed by an installed plugin. - public static McpServerSource Plugin { get; } = new("plugin"); - - /// Server bundled with the runtime. - public static McpServerSource Builtin { get; } = new("builtin"); - - /// Returns a value indicating whether two instances are equivalent. - public static bool operator ==(McpServerSource left, McpServerSource right) => left.Equals(right); - - /// Returns a value indicating whether two instances are not equivalent. - public static bool operator !=(McpServerSource left, McpServerSource right) => !(left == right); - - /// - public override bool Equals(object? obj) => obj is McpServerSource other && Equals(other); - - /// - public bool Equals(McpServerSource 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 McpServerSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return new(GeneratedStringEnumJson.ReadValue(ref reader, typeToConvert)); - } - - /// - public override void Write(Utf8JsonWriter writer, McpServerSource value, JsonSerializerOptions options) - { - GeneratedStringEnumJson.WriteValue(writer, value.Value, typeof(McpServerSource)); - } - } -} - /// Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured. [JsonConverter(typeof(Converter))] [DebuggerDisplay("{Value,nq}")] @@ -17383,8 +17563,14 @@ public override void Write(Utf8JsonWriter writer, ExtensionsLoadedExtensionStatu [JsonSerializable(typeof(ShutdownModelMetricTokenDetail))] [JsonSerializable(typeof(ShutdownModelMetricUsage))] [JsonSerializable(typeof(ShutdownTokenDetail))] +[JsonSerializable(typeof(SkillContextDeliveredData))] +[JsonSerializable(typeof(SkillContextDeliveredEvent))] +[JsonSerializable(typeof(SkillContextDeliveredRefData))] +[JsonSerializable(typeof(SkillContextDeliveredRefEvent))] [JsonSerializable(typeof(SkillInvokedData))] [JsonSerializable(typeof(SkillInvokedEvent))] +[JsonSerializable(typeof(SkillInvokedRefData))] +[JsonSerializable(typeof(SkillInvokedRefEvent))] [JsonSerializable(typeof(SkillsLoadedSkill))] [JsonSerializable(typeof(SubagentCompletedData))] [JsonSerializable(typeof(SubagentCompletedEvent))] diff --git a/dotnet/test/E2E/McpOAuthE2ETests.cs b/dotnet/test/E2E/McpOAuthE2ETests.cs index 17d3162805..90f2913f9c 100644 --- a/dotnet/test/E2E/McpOAuthE2ETests.cs +++ b/dotnet/test/E2E/McpOAuthE2ETests.cs @@ -187,7 +187,7 @@ public async Task Should_Request_Replacement_Tokens_Across_MCP_OAuth_Lifecycle() { Assert.NotNull(request.WwwAuthenticateParams); Assert.Equal($"{oauthServer.Url}/.well-known/oauth-protected-resource", request.WwwAuthenticateParams!.ResourceMetadataUrl); - Assert.Equal("mcp.write", request.WwwAuthenticateParams.Scope); + Assert.Equal("mcp.read mcp.write", request.WwwAuthenticateParams.Scope); Assert.Equal("insufficient_scope", request.WwwAuthenticateParams.Error); } diff --git a/go/internal/e2e/mcp_oauth_e2e_test.go b/go/internal/e2e/mcp_oauth_e2e_test.go index 62e141b119..9e10fbbda9 100644 --- a/go/internal/e2e/mcp_oauth_e2e_test.go +++ b/go/internal/e2e/mcp_oauth_e2e_test.go @@ -178,7 +178,7 @@ func TestMCPOAuthE2E(t *testing.T) { if request.WwwAuthenticateParams == nil || request.WwwAuthenticateParams.ResourceMetadataURL == nil || *request.WwwAuthenticateParams.ResourceMetadataURL != baseURL+"/.well-known/oauth-protected-resource" || - stringValue(request.WwwAuthenticateParams.Scope) != "mcp.write" || + stringValue(request.WwwAuthenticateParams.Scope) != "mcp.read mcp.write" || stringValue(request.WwwAuthenticateParams.Error) != "insufficient_scope" { t.Fatalf("Unexpected upscope WWW-Authenticate params: %#v", request.WwwAuthenticateParams) } diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go index fe6665e4e1..f9eb4dc124 100644 --- a/go/rpc/zrpc.go +++ b/go/rpc/zrpc.go @@ -2655,7 +2655,7 @@ type CurrentToolMetadata struct { NamespacedName *string `json:"namespacedName,omitempty"` } -// A file included in the redacted debug bundle. +// A file included in the session debug bundle. // Experimental: DebugCollectLogsCollectedEntry is part of an experimental API and may // change or be removed. type DebugCollectLogsCollectedEntry struct { @@ -2667,7 +2667,7 @@ type DebugCollectLogsCollectedEntry struct { Source DebugCollectLogsSource `json:"source"` } -// Destination for the redacted debug bundle. +// Destination for the session debug bundle. // Experimental: DebugCollectLogsDestination is part of an experimental API and may change // or be removed. type DebugCollectLogsDestination interface { @@ -2699,7 +2699,7 @@ func (DebugCollectLogsDestinationArchive) Kind() DebugCollectLogsDestinationKind } type DebugCollectLogsDestinationDirectory struct { - // Directory where redacted files should be staged. The directory is created if needed. + // Directory where files should be staged. The directory is created if needed. OutputDirectory string `json:"outputDirectory"` } @@ -2718,7 +2718,9 @@ type DebugCollectLogsEntry struct { Kind DebugCollectLogsEntryKind `json:"kind"` // Server-local source path to read. Path string `json:"path"` - // How text content from this entry should be redacted. Defaults to plain-text. + // How text content from this entry should be redacted. Defaults to plain-text. With none, + // no redaction is applied; the caller must ensure any necessary redaction is performed + // before this call. Redaction *DebugCollectLogsRedaction `json:"redaction,omitempty"` // When true, collection fails if this entry cannot be read. Defaults to false, which // records the entry in `skippedEntries`. @@ -2749,7 +2751,7 @@ type DebugCollectLogsInclude struct { ShellLogs *bool `json:"shellLogs,omitempty"` } -// Options for collecting a redacted session debug bundle. +// Options for collecting a session debug bundle with configurable redaction. // Experimental: DebugCollectLogsRequest is part of an experimental API and may change or be // removed. type DebugCollectLogsRequest struct { @@ -2757,18 +2759,18 @@ type DebugCollectLogsRequest struct { // built-in session diagnostics. This lets host applications add their own diagnostics // without changing the API shape. AdditionalEntries []DebugCollectLogsEntry `json:"additionalEntries,omitzero"` - // Where the redacted bundle should be written. Use `archive` to produce a .tgz, or - // `directory` to stage redacted files for caller-managed upload/post-processing. + // Where the bundle should be written. Use `archive` to produce a .tgz, or `directory` to + // stage files for caller-managed upload/post-processing. Destination DebugCollectLogsDestination `json:"destination"` // Which built-in session diagnostics to include. Omitted fields default to true. Include *DebugCollectLogsInclude `json:"include,omitempty"` } -// Result of collecting a redacted debug bundle. +// Result of collecting a session debug bundle. // Experimental: DebugCollectLogsResult is part of an experimental API and may change or be // removed. type DebugCollectLogsResult struct { - // Files included in the redacted bundle. + // Files included in the bundle. Entries []DebugCollectLogsCollectedEntry `json:"entries"` // Destination kind that was written. Kind DebugCollectLogsResultKind `json:"kind"` @@ -4732,6 +4734,10 @@ type InstalledPluginInfo struct { Marketplace string `json:"marketplace"` // Plugin name Name string `json:"name"` + // Runtime-reported plugin provenance. Currently set to "builtin" only for plugins + // registered through the trusted host built-in boundary; absent for installed, marketplace, + // direct, and live plugins. + Source *string `json:"source,omitempty"` // Installed version (when reported by the plugin manifest) Version *string `json:"version,omitempty"` } @@ -4899,6 +4905,26 @@ type InterruptMainTurnResult struct { Interrupted bool `json:"interrupted"` } +// A JSON Schema output contract. OpenAI receives the name, description, schema and strict +// setting; Anthropic receives the schema in output_config.format and always uses its native +// strict enforcement. +// Experimental: JSONSchemaResponseFormat is part of an experimental API and may change or +// be removed. +type JSONSchemaResponseFormat struct { + // Optional description passed to OpenAI providers. + Description *string `json:"description,omitempty"` + // Name of the output schema, subject to the provider's naming restrictions. + Name string `json:"name"` + // JSON Schema passed unchanged to the inference provider. Schemas larger than 32 MiB when + // JSON-encoded are rejected before admission, using the runtime's existing request-size + // ceiling. This is not a guarantee that the entire model request fits. Supported keywords + // and schema restrictions are determined by the provider. + Schema any `json:"schema"` + // Optional strict enforcement setting for OpenAI providers. Omitted uses the provider + // default. Anthropic always enforces its supported schema subset. + Strict *bool `json:"strict,omitempty"` +} + // HTTP headers as a map from lowercased header name to a list of values. Multi-valued // headers (e.g. Set-Cookie) preserve all values. // Experimental: LlmInferenceHeaders is part of an experimental API and may change or be @@ -5139,6 +5165,23 @@ type LspInitializeRequest struct { WorkingDirectory *string `json:"workingDirectory,omitempty"` } +// Non-secret host-managed HTTP MCP server configuration. The containing map key is the +// stable managed identity; credentials are supplied dynamically by the host. +// Experimental: ManagedMCPServerConfig is part of an experimental API and may change or be +// removed. +type ManagedMCPServerConfig struct { + // Human-readable catalog display name. + DisplayName string `json:"displayName"` + // Maximum dynamic-header cache lifetime in milliseconds. + HeadersRefreshTtlMs *int64 `json:"headersRefreshTtlMs,omitempty"` + // Timeout in milliseconds for tool discovery and tool calls. + Timeout *int64 `json:"timeout,omitempty"` + // Tools to include. Defaults to all tools when omitted. + Tools []string `json:"tools,omitzero"` + // Hosted MCP streamable HTTP endpoint. + URL string `json:"url"` +} + // Experimental: ManagedSettingsClearCacheResult is part of an experimental API and may // change or be removed. type ManagedSettingsClearCacheResult struct { @@ -5653,10 +5696,24 @@ func (r RawMCPHeadersHandlePendingHeadersRefreshRequestData) Kind() MCPHeadersHa return r.Discriminator } +type MCPHeadersHandlePendingHeadersRefreshRequestError struct { + // Host credential broker failure, denial, or revocation reason. + Message string `json:"message"` +} + +func (MCPHeadersHandlePendingHeadersRefreshRequestError) mcpHeadersHandlePendingHeadersRefreshRequest() { +} +func (MCPHeadersHandlePendingHeadersRefreshRequestError) Kind() MCPHeadersHandlePendingHeadersRefreshRequestKind { + return MCPHeadersHandlePendingHeadersRefreshRequestKindError +} + type MCPHeadersHandlePendingHeadersRefreshRequestHeaders struct { // Headers to overlay onto the MCP request. Dynamic headers override static config headers // but do not replace SDK-managed request headers. Headers map[string]string `json:"headers"` + // Optional lifetime in milliseconds for these returned headers. The runtime clamps its + // configured cache lifetime to this value. + TtlMs *int64 `json:"ttlMs,omitempty"` } func (MCPHeadersHandlePendingHeadersRefreshRequestHeaders) mcpHeadersHandlePendingHeadersRefreshRequest() { @@ -6847,6 +6904,8 @@ func (MCPServerConfigStdio) mcpSerializableServerConfig() {} // MCP server status entry, including config source/plugin source and any connection error. // Experimental: MCPServer is part of an experimental API and may change or be removed. type MCPServer struct { + // Human-readable display name supplied by a managed server catalog. + DisplayName *string `json:"displayName,omitempty"` // Error message if the server failed to connect Error *string `json:"error,omitempty"` // Server name (config key) @@ -6855,7 +6914,7 @@ type MCPServer struct { // metadata is available, including while pending or when failed, disabled, stopped, or not // configured. ServerMetadata *MCPServerMetadata `json:"serverMetadata,omitempty"` - // Configuration source: user, workspace, plugin, or builtin + // Configuration source: user, workspace, plugin, builtin, or managed Source *MCPServerSource `json:"source,omitempty"` // Plugin name that provided this server, when source is plugin. SourcePlugin *string `json:"sourcePlugin,omitempty"` @@ -9689,6 +9748,99 @@ type ProtocolExternalToolDefinition struct { Title *string `json:"title,omitempty"` } +// Experimental: ProtocolMarkerSectionOverride is part of an experimental API and may change +// or be removed. +type ProtocolMarkerSectionOverride interface { + protocolMarkerSectionOverride() + Action() ProtocolMarkerSectionOverrideAction +} + +type RawProtocolMarkerSectionOverrideData struct { + Discriminator ProtocolMarkerSectionOverrideAction + Raw json.RawMessage +} + +func (RawProtocolMarkerSectionOverrideData) protocolMarkerSectionOverride() {} +func (r RawProtocolMarkerSectionOverrideData) Action() ProtocolMarkerSectionOverrideAction { + return r.Discriminator +} + +type ProtocolMarkerSectionOverridePreserve struct { +} + +func (ProtocolMarkerSectionOverridePreserve) protocolMarkerSectionOverride() {} +func (ProtocolMarkerSectionOverridePreserve) Action() ProtocolMarkerSectionOverrideAction { + return ProtocolMarkerSectionOverrideActionPreserve +} + +type ProtocolMarkerSectionOverrideTransform struct { +} + +func (ProtocolMarkerSectionOverrideTransform) protocolMarkerSectionOverride() {} +func (ProtocolMarkerSectionOverrideTransform) Action() ProtocolMarkerSectionOverrideAction { + return ProtocolMarkerSectionOverrideActionTransform +} + +// Experimental: ProtocolSectionOverride is part of an experimental API and may change or be +// removed. +type ProtocolSectionOverride struct { + ProtocolMarkerSectionOverride ProtocolMarkerSectionOverride + ProtocolStaticSectionOverride *ProtocolStaticSectionOverride +} + +// Experimental: ProtocolStaticSectionOverride is part of an experimental API and may change +// or be removed. +type ProtocolStaticSectionOverride struct { + // Declarative operation applied to the section. + Action ProtocolStaticSectionAction `json:"action"` + // Optional content used by replace, append, and prepend operations. + Content *string `json:"content,omitempty"` +} + +// Experimental: ProtocolSystemMessageAppendConfig is part of an experimental API and may +// change or be removed. +type ProtocolSystemMessageAppendConfig struct { + // Text appended to the standard system prompt. + Content *string `json:"content,omitempty"` + // Append-mode discriminator. Omission also selects append mode. + Mode *ProtocolAppendMode `json:"mode,omitempty"` +} + +// Experimental: ProtocolSystemMessageConfig is part of an experimental API and may change +// or be removed. +type ProtocolSystemMessageConfig struct { + // Text appended to the standard system prompt. + Content *string `json:"content,omitempty"` + // Optional structured blocks corresponding to the replacement content. + ContentBlocks []SystemMessageBlock `json:"contentBlocks,omitzero"` + // Append-mode discriminator. Omission also selects append mode. + Mode *ProtocolSystemMessageConfigMode `json:"mode,omitempty"` + // Named standard-prompt section overrides. + Sections map[string]*ProtocolSectionOverride `json:"sections,omitzero"` +} + +// Experimental: ProtocolSystemMessageCustomizeConfig is part of an experimental API and may +// change or be removed. +type ProtocolSystemMessageCustomizeConfig struct { + // Text appended after the customized sections. + Content *string `json:"content,omitempty"` + // Customize-mode discriminator. + Mode ProtocolCustomizeMode `json:"mode"` + // Named standard-prompt section overrides. + Sections map[string]*ProtocolSectionOverride `json:"sections,omitzero"` +} + +// Experimental: ProtocolSystemMessageReplaceConfig is part of an experimental API and may +// change or be removed. +type ProtocolSystemMessageReplaceConfig struct { + // Complete replacement system-message text. + Content string `json:"content"` + // Optional structured blocks corresponding to the replacement content. + ContentBlocks []SystemMessageBlock `json:"contentBlocks,omitzero"` + // Replace-mode discriminator. + Mode ProtocolReplaceMode `json:"mode"` +} + // BYOK providers and/or models to add to the session's registry at runtime. Both fields are // optional; provide providers, models, or both. // Experimental: ProviderAddRequest is part of an experimental API and may change or be @@ -9820,6 +9972,13 @@ type ProviderModelConfig struct { Name *string `json:"name,omitempty"` // Name of the configured provider that serves this model. Provider string `json:"provider"` + // System-message configuration used when the runtime builds the standard prompt for this + // provider-qualified model, including general-purpose subagents. It uses the same object + // hierarchy as session-level systemMessage configuration, except transform actions are + // rejected because the current callback protocol is not model-scoped. When present, it + // overrides the session-wide configuration on those prompt paths. Selected custom-agent and + // specialized-subagent prompts remain authoritative. + SystemMessage *ProtocolSystemMessageConfig `json:"systemMessage,omitempty"` // The model name sent to the provider API for inference. Defaults to `id`. WireModel *string `json:"wireModel,omitempty"` } @@ -10583,35 +10742,6 @@ type RegisterEventInterestResult struct { type RegisterExtensionLaunchProviderResult struct { } -// Params to attach an extension loader's tools to a session. -// Experimental: RegisterExtensionToolsParams is part of an experimental API and may change -// or be removed. -// Internal: RegisterExtensionToolsParams is an internal SDK API and is not part of the -// public surface. -type RegisterExtensionToolsParams struct { - // In-process ExtensionLoader handle used only by the CLI and excluded from the public SDK - // surface. - // Internal: Loader is part of the SDK's internal API surface and is not intended for - // external use. - Loader any `json:"loader"` - // Optional registration options. - Options *SessionsRegisterExtensionToolsOnSessionOptions `json:"options,omitempty"` - // Session to register extension tools on. - SessionID string `json:"sessionId"` -} - -// Handle for releasing the extension tool registration. -// Experimental: RegisterExtensionToolsResult is part of an experimental API and may change -// or be removed. -// Internal: RegisterExtensionToolsResult is an internal SDK API and is not part of the -// public surface. -type RegisterExtensionToolsResult struct { - // In-process unsubscribe function used only by the CLI. - // Internal: Unsubscribe is part of the SDK's internal API surface and is not intended for - // external use. - Unsubscribe any `json:"unsubscribe"` -} - // Opaque handle previously returned by `registerInterest` to release. // Experimental: ReleaseEventInterestParams is part of an experimental API and may change or // be removed. @@ -10838,6 +10968,14 @@ type RemoteSessionRepository struct { Owner string `json:"owner"` } +// Experimental: ResponseFormat is part of an experimental API and may change or be removed. +type ResponseFormat struct { + // JSON Schema and provider options for the turn's output. + JSONSchema JSONSchemaResponseFormat `json:"jsonSchema"` + // Output format discriminator. Currently only json_schema is supported. + Type ResponseFormatType `json:"type"` +} + // Options controlling factory invocation. // Experimental: RunOptions is part of an experimental API and may change or be removed. type RunOptions struct { @@ -10974,18 +11112,25 @@ type SandboxConfigUserPolicyFilesystem struct { // Experimental: SandboxConfigUserPolicyNetwork is part of an experimental API and may // change or be removed. type SandboxConfigUserPolicyNetwork struct { + // Hosts allowed through the built-in sandbox proxy. A non-empty list denies unmatched + // hosts; an absent or empty list allows all hosts not blocked. Supports exact hostnames, IP + // addresses, and *.example.com for strict subdomains. Host rules do not override the + // outbound or local-network toggles. + AllowedHosts []string `json:"allowedHosts,omitzero"` // Whether traffic to local/loopback addresses is allowed. AllowLocalNetwork *bool `json:"allowLocalNetwork,omitempty"` // Whether outbound network traffic is allowed at all. AllowOutbound *bool `json:"allowOutbound,omitempty"` - // HTTP proxy for sandboxed process traffic. Linux restricts egress to the proxy endpoint, - // requires that endpoint to be reachable over IPv4 (the [::] dual-stack wildcard is - // accepted and routed through the IPv4 gateway), and does not support proxy credentials. - // macOS relies on applications honoring proxy environment variables. Windows also - // configures a per-AppContainer WinHTTP proxy, but enforcement depends on the application's - // networking stack. Configure supported credentials in the separate `username` and - // `password` fields. A credential-free http:// loopback URL uses the localhost proxy form, - // while an https:// or authenticated loopback URL uses the URL form. + // Hosts denied by the built-in sandbox proxy. Deny rules take precedence over allowedHosts. + // A domain also denies all its subdomains. IP addresses match exactly; *.example.com + // matches strict subdomains, and * denies every host. + BlockedHosts []string `json:"blockedHosts,omitzero"` + // HTTP(S) proxy for sandboxed traffic. With host rules, this is the built-in local proxy's + // upstream; credentials stay in the runtime, and Linux and macOS restrict the child to the + // local listener. Without host rules, Linux restricts egress to this endpoint but rejects + // credentials, and macOS proxying is cooperative. Windows enforcement depends on the + // application's networking stack. Configure credentials in the separate username/password + // fields. The transient local listener URL is never persisted. Proxy *SandboxConfigUserPolicyNetworkProxy `json:"proxy,omitempty"` } @@ -11254,8 +11399,11 @@ type SendMessagesRequest struct { // The UI mode the agent was in when these messages were sent. Defaults to the session's // current mode. AgentMode *SendAgentMode `json:"agentMode,omitempty"` - // The user messages to append to the conversation, in order. May be empty, in which case a - // single turn runs over the existing history with no new user message. + // The user messages to append to the conversation, in order, before running one agent loop. + // When the batch starts a run, its final message is the primary initiating message; earlier + // messages provide context, not separate runs or replies. May be empty, in which case a + // single turn runs over the existing history with no new user message or + // originatingMessageId. Messages []SendMessageItem `json:"messages"` // How to deliver the messages. `enqueue` (default) appends to the message queue. // `immediate` interjects during an in-progress turn. @@ -11266,6 +11414,12 @@ type SendMessagesRequest struct { // session-level provider headers; per-turn headers augment and overwrite session-level // headers with the same key. RequestHeaders map[string]string `json:"requestHeaders,omitzero"` + // Provider-native output format for the whole turn, including an empty message batch and + // all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering + // inherits the active format; specifying responseFormat with mode: immediate is an error, + // even while idle. Returned assistant content remains text; the runtime does not parse or + // validate it. Unsupported models or schemas produce provider errors. + ResponseFormat *ResponseFormat `json:"responseFormat,omitempty"` // W3C Trace Context traceparent header for distributed tracing of this agent turn Traceparent *string `json:"traceparent,omitempty"` // W3C Trace Context tracestate header for distributed tracing @@ -11286,8 +11440,11 @@ type SendMessagesRequest struct { // Experimental: SendMessagesResult is part of an experimental API and may change or be // removed. type SendMessagesResult struct { - // Unique identifiers assigned to the messages, one per provided message in order. Empty - // when no messages were provided. + // Unique identifiers assigned to the messages, one per provided message in order. For a + // batch that starts a run, assistant messages use the final ID as originatingMessageId + // throughout that run, including tool iterations and stop-hook corrections. Immediate + // steering does not replace the active run's origin. Empty when no messages were provided; + // that run has no originatingMessageId. MessageIDs []string `json:"messageIds"` } @@ -11319,6 +11476,12 @@ type SendRequest struct { // If set, the request will fail if the named tool is not available when this message is // among the user messages at the start of the current exchange RequiredTool *string `json:"requiredTool,omitempty"` + // Provider-native output format for this turn, including all tool-call iterations. Not + // inherited by later turns or subagents. Ordinary steering inherits the active format; + // specifying responseFormat with mode: immediate is an error, even while idle. Returned + // assistant content remains text; the runtime does not parse or validate it. Unsupported + // models or schemas produce provider errors. + ResponseFormat *ResponseFormat `json:"responseFormat,omitempty"` // Optional provenance tag copied to the resulting user.message event. Must be `user`, // `system`, `command-` for command-originated messages, `schedule-` // for scheduled prompts, or `agent-` for prompts sent by another agent. @@ -12654,7 +12817,8 @@ type SessionOpenOptions struct { // narrow which rewinds revert it, because a rewind restores every capture from the selected // turn onward, so the earlier spawning turn reverts it as well. EnableFileChangeTracking *bool `json:"enableFileChangeTracking,omitempty"` - // Opt-in: self-fetch and enforce enterprise managed settings at session bootstrap. + // Opt-in: self-fetch and enforce enterprise managed settings, including managed hook + // policies, at session bootstrap. EnableManagedSettings *bool `json:"enableManagedSettings,omitempty"` // Whether on-demand custom instruction discovery is enabled. EnableOnDemandInstructionDiscovery *bool `json:"enableOnDemandInstructionDiscovery,omitempty"` @@ -12714,6 +12878,12 @@ type SessionOpenOptions struct { LogInteractiveShells *bool `json:"logInteractiveShells,omitempty"` // Identifier sent to LSP-style integrations. LspClientName *string `json:"lspClientName,omitempty"` + // Non-secret host-managed HTTP MCP servers keyed by stable managed identity. Managed + // provenance is runtime-established from this separate field and credentials are supplied + // through dynamic-header refresh. + // Experimental: ManagedMCPServers is part of an experimental API and may change or be + // removed. + ManagedMCPServers map[string]ManagedMCPServerConfig `json:"managedMcpServers,omitzero"` // Permissions-only enterprise policy injected by the SDK host at session create or resume. // Composes restrictively with self-fetched and device policy and is not persisted. ManagedSettings *SessionManagedSettings `json:"managedSettings,omitempty"` @@ -13707,16 +13877,6 @@ type SessionsReadPersistedEventsRequest struct { SessionID string `json:"sessionId"` } -// Optional registration options. -// Experimental: SessionsRegisterExtensionToolsOnSessionOptions is part of an experimental -// API and may change or be removed. -type SessionsRegisterExtensionToolsOnSessionOptions struct { - // In-process `() => boolean` gating callback used only by the CLI. - // Internal: Enabled is part of the SDK's internal API surface and is not intended for - // external use. - Enabled any `json:"enabled,omitempty"` -} - // Session ID whose in-use lock should be released. // Experimental: SessionsReleaseLockRequest is part of an experimental API and may change or // be removed. @@ -14700,6 +14860,10 @@ type SlashCommandTextResult struct { // True when the invocation mutated user runtime settings; consumers caching settings should // refresh RuntimeSettingsChanged *bool `json:"runtimeSettingsChanged,omitempty"` + // Present when the invocation changed the sandbox for this session only. Nothing was + // persisted, so consumers must mirror the change onto the live session rather than + // reloading settings, and must not treat it as a settings change. + SandboxSessionChange *SandboxSessionChange `json:"sandboxSessionChange,omitempty"` // Text output for the client to render Text string `json:"text"` } @@ -14782,6 +14946,15 @@ type SubagentSettingsEntry struct { ModelPolicy *AgentModelPolicy `json:"modelPolicy,omitempty"` } +// Experimental: SystemMessageBlock is part of an experimental API and may change or be +// removed. +type SystemMessageBlock struct { + // Text content for this system-message block. + Content string `json:"content"` + // Whether the block is static and may be cached independently of dynamic prompt content. + IsStatic *bool `json:"isStatic,omitempty"` +} + // Public owner attribution for a client-owned task. Identifiers are opaque and never // authorize requests. // Experimental: TaskClientOwner is part of an experimental API and may change or be removed. @@ -17621,6 +17794,9 @@ const ( // Redact each non-empty line as a session event JSON object, falling back to plain-text // redaction for malformed lines. DebugCollectLogsRedactionEventsJsonl DebugCollectLogsRedaction = "events-jsonl" + // No redaction is applied. The caller must ensure any necessary redaction is performed + // before this call. + DebugCollectLogsRedactionNone DebugCollectLogsRedaction = "none" // Redact the file as plain UTF-8 log text. DebugCollectLogsRedactionPlainText DebugCollectLogsRedaction = "plain-text" ) @@ -17633,7 +17809,7 @@ type DebugCollectLogsResultKind string const ( // A .tgz archive was written. DebugCollectLogsResultKindArchive DebugCollectLogsResultKind = "archive" - // A directory containing redacted files was written. + // A directory containing the collected files was written. DebugCollectLogsResultKindDirectory DebugCollectLogsResultKind = "directory" ) @@ -18362,6 +18538,7 @@ const ( type MCPHeadersHandlePendingHeadersRefreshRequestKind string const ( + MCPHeadersHandlePendingHeadersRefreshRequestKindError MCPHeadersHandlePendingHeadersRefreshRequestKind = "error" MCPHeadersHandlePendingHeadersRefreshRequestKindHeaders MCPHeadersHandlePendingHeadersRefreshRequestKind = "headers" MCPHeadersHandlePendingHeadersRefreshRequestKindNone MCPHeadersHandlePendingHeadersRefreshRequestKind = "none" ) @@ -18752,13 +18929,15 @@ const ( MCPServerConfigStdioTypeStdio MCPServerConfigStdioType = "stdio" ) -// Configuration source: user, workspace, plugin, or builtin +// Configuration source: user, workspace, plugin, builtin, or managed // Experimental: MCPServerSource is part of an experimental API and may change or be removed. type MCPServerSource string const ( // Server bundled with the runtime. MCPServerSourceBuiltin MCPServerSource = "builtin" + // Server supplied by a trusted host-managed catalog. + MCPServerSourceManaged MCPServerSource = "managed" // Server contributed by an installed plugin. MCPServerSourcePlugin MCPServerSource = "plugin" // Server configured in the user's global MCP configuration. @@ -19261,6 +19440,22 @@ const ( PluginInstallStagingModeExternal PluginInstallStagingMode = "external" ) +// Experimental: ProtocolAppendMode is part of an experimental API and may change or be +// removed. +type ProtocolAppendMode string + +const ( + ProtocolAppendModeAppend ProtocolAppendMode = "append" +) + +// Experimental: ProtocolCustomizeMode is part of an experimental API and may change or be +// removed. +type ProtocolCustomizeMode string + +const ( + ProtocolCustomizeModeCustomize ProtocolCustomizeMode = "customize" +) + // Controls whether the runtime may defer loading an external tool definition. // Experimental: ProtocolExternalToolDefer is part of an experimental API and may change or // be removed. @@ -19273,6 +19468,45 @@ const ( ProtocolExternalToolDeferNever ProtocolExternalToolDefer = "never" ) +// Action discriminator for ProtocolMarkerSectionOverride. +type ProtocolMarkerSectionOverrideAction string + +const ( + ProtocolMarkerSectionOverrideActionPreserve ProtocolMarkerSectionOverrideAction = "preserve" + ProtocolMarkerSectionOverrideActionTransform ProtocolMarkerSectionOverrideAction = "transform" +) + +// Experimental: ProtocolReplaceMode is part of an experimental API and may change or be +// removed. +type ProtocolReplaceMode string + +const ( + ProtocolReplaceModeReplace ProtocolReplaceMode = "replace" +) + +// Experimental: ProtocolStaticSectionAction is part of an experimental API and may change +// or be removed. +type ProtocolStaticSectionAction string + +const ( + // Append content to the section. + ProtocolStaticSectionActionAppend ProtocolStaticSectionAction = "append" + // Prepend content to the section. + ProtocolStaticSectionActionPrepend ProtocolStaticSectionAction = "prepend" + // Remove the section content. + ProtocolStaticSectionActionRemove ProtocolStaticSectionAction = "remove" + // Replace the section content. + ProtocolStaticSectionActionReplace ProtocolStaticSectionAction = "replace" +) + +type ProtocolSystemMessageConfigMode string + +const ( + ProtocolSystemMessageConfigModeAppend ProtocolSystemMessageConfigMode = "append" + ProtocolSystemMessageConfigModeCustomize ProtocolSystemMessageConfigMode = "customize" + ProtocolSystemMessageConfigModeReplace ProtocolSystemMessageConfigMode = "replace" +) + // Provider transport. Defaults to "http". // Experimental: ProviderConfigTransport is part of an experimental API and may change or be // removed. @@ -19492,6 +19726,13 @@ const ( RemoteSessionModeOn RemoteSessionMode = "on" ) +// Output format discriminator. Currently only json_schema is supported. +type ResponseFormatType string + +const ( + ResponseFormatTypeJSONSchema ResponseFormatType = "json_schema" +) + // Origin of the sandbox choice supplied by an internal client. // Experimental: SandboxConfigSource is part of an experimental API and may change or be // removed. @@ -19514,6 +19755,19 @@ const ( SandboxConfigSourceUserEnabled SandboxConfigSource = "user_enabled" ) +// A session-scoped sandbox transition applied while handling a slash command +// Experimental: SandboxSessionChange is part of an experimental API and may change or be +// removed. +type SandboxSessionChange string + +const ( + // The sandbox is off for the rest of this session; nothing was persisted and a new session + // starts from managed policy. + SandboxSessionChangeDisabled SandboxSessionChange = "disabled" + // A previous session-scoped opt-out was cleared and the sandbox is enforced again. + SandboxSessionChangeRestored SandboxSessionChange = "restored" +) + // 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. @@ -22392,12 +22646,9 @@ type internalServerAPI struct { type InternalServerSessionsAPI internalServerAPI // ConfigureSessionExtensions attaches (or detaches) an in-process ExtensionController -// delegate for the given session, used by shared-API surfaces that need to query or modify -// the session's extension state. Pass `controller: undefined` to detach. Marked internal -// because the controller is an in-process object that cannot cross the JSON-RPC boundary. -// Disappears alongside `registerExtensionToolsOnSession`: once the runtime owns extension -// management, the public surface exposes list/enable/disable/reload as dedicated RPCs -// served by the runtime. +// delegate for the given session in a local host adapter. Pass `controller: undefined` to +// detach. Internal because the controller cannot cross the JSON-RPC boundary; the runtime +// manages its own session extension service. // // RPC method: sessions.configureSessionExtensions. // @@ -22556,34 +22807,6 @@ func (a *InternalServerSessionsAPI) ListNonEmptySessionIds(ctx context.Context, return &result, nil } -// RegisterExtensionToolsOnSession registers extension-provided tools on the given session, -// gated by an optional `enabled` callback. Returns an opaque unsubscribe function the -// caller must invoke to deregister the tools when the extension is torn down. Marked -// internal because `loader`, `enabled`, and the returned `unsubscribe` are in-process -// handles that cannot cross the JSON-RPC boundary. Disappears once extension discovery / -// launch / tool registration are owned by the runtime: SDK consumers will pass pure config -// (search paths, disabled ids) via `SessionOptions` and the runtime will resolve, launch, -// register, and tear down extensions itself. -// -// RPC method: sessions.registerExtensionToolsOnSession. -// -// Parameters: Params to attach an extension loader's tools to a session. -// -// Returns: Handle for releasing the extension tool registration. -// Internal: RegisterExtensionToolsOnSession is part of the SDK's internal -// handshake/plumbing; external callers should not use it. -func (a *InternalServerSessionsAPI) RegisterExtensionToolsOnSession(ctx context.Context, params *RegisterExtensionToolsParams) (*RegisterExtensionToolsResult, error) { - raw, err := a.client.Request(ctx, "sessions.registerExtensionToolsOnSession", params) - if err != nil { - return nil, err - } - var result RegisterExtensionToolsResult - if err := json.Unmarshal(raw, &result); err != nil { - return nil, err - } - return &result, nil -} - // InternalServerRPC provides internal SDK server-scoped RPC methods (handshake helpers // etc.). Not part of the public API. type InternalServerRPC struct { @@ -23175,16 +23398,17 @@ func (a *ContentExclusionAPI) CheckPaths(ctx context.Context, params *ContentExc // Experimental: DebugAPI contains experimental APIs that may change or be removed. type DebugAPI sessionAPI -// CollectLogs collects a redacted session debug log bundle into a local archive or staging -// directory. The runtime includes session-owned logs by default and accepts caller-provided -// diagnostic entries so host applications can add their own files without changing this API -// shape. +// CollectLogs collects a session debug log bundle into a local archive or staging +// directory. Logs are redacted by default; redaction can be configured per caller-provided +// diagnostic entry. The runtime includes session-owned logs by default and accepts +// caller-provided diagnostic entries so host applications can add their own files without +// changing this API shape. // // RPC method: session.debug.collectLogs. // -// Parameters: Options for collecting a redacted session debug bundle. +// Parameters: Options for collecting a session debug bundle with configurable redaction. // -// Returns: Result of collecting a redacted debug bundle. +// Returns: Result of collecting a session debug bundle. func (a *DebugAPI) CollectLogs(ctx context.Context, params *DebugCollectLogsRequest) (*DebugCollectLogsResult, error) { req := map[string]any{"sessionId": a.sessionID} if params != nil { @@ -28722,6 +28946,9 @@ func (a *SessionRPC) Send(ctx context.Context, params *SendRequest) (*SendResult if params.RequiredTool != nil { req["requiredTool"] = *params.RequiredTool } + if params.ResponseFormat != nil { + req["responseFormat"] = *params.ResponseFormat + } if params.Source != nil { req["source"] = *params.Source } @@ -28777,6 +29004,9 @@ func (a *SessionRPC) SendMessages(ctx context.Context, params *SendMessagesReque if params.RequestHeaders != nil { req["requestHeaders"] = params.RequestHeaders } + if params.ResponseFormat != nil { + req["responseFormat"] = *params.ResponseFormat + } if params.Traceparent != nil { req["traceparent"] = *params.Traceparent } diff --git a/go/rpc/zrpc_encoding.go b/go/rpc/zrpc_encoding.go index 52c32b741d..d18b2c09e7 100644 --- a/go/rpc/zrpc_encoding.go +++ b/go/rpc/zrpc_encoding.go @@ -2693,6 +2693,12 @@ func unmarshalMCPHeadersHandlePendingHeadersRefreshRequest(data []byte) (MCPHead } switch raw.Kind { + case MCPHeadersHandlePendingHeadersRefreshRequestKindError: + var d MCPHeadersHandlePendingHeadersRefreshRequestError + if err := json.Unmarshal(data, &d); err != nil { + return nil, err + } + return &d, nil case MCPHeadersHandlePendingHeadersRefreshRequestKindHeaders: var d MCPHeadersHandlePendingHeadersRefreshRequestHeaders if err := json.Unmarshal(data, &d); err != nil { @@ -2721,6 +2727,17 @@ func (r RawMCPHeadersHandlePendingHeadersRefreshRequestData) MarshalJSON() ([]by }) } +func (r MCPHeadersHandlePendingHeadersRefreshRequestError) MarshalJSON() ([]byte, error) { + type alias MCPHeadersHandlePendingHeadersRefreshRequestError + return json.Marshal(struct { + Kind MCPHeadersHandlePendingHeadersRefreshRequestKind `json:"kind"` + alias + }{ + Kind: r.Kind(), + alias: alias(r), + }) +} + func (r MCPHeadersHandlePendingHeadersRefreshRequestHeaders) MarshalJSON() ([]byte, error) { type alias MCPHeadersHandlePendingHeadersRefreshRequestHeaders return json.Marshal(struct { @@ -5017,6 +5034,101 @@ func (r *PermissionLocationAddToolApprovalParams) UnmarshalJSON(data []byte) err return nil } +func unmarshalProtocolMarkerSectionOverride(data []byte) (ProtocolMarkerSectionOverride, error) { + if string(data) == "null" { + return nil, nil + } + type rawUnion struct { + Action ProtocolMarkerSectionOverrideAction `json:"action"` + } + var raw rawUnion + if err := json.Unmarshal(data, &raw); err != nil { + return nil, err + } + + switch raw.Action { + case ProtocolMarkerSectionOverrideActionPreserve: + var d ProtocolMarkerSectionOverridePreserve + if err := json.Unmarshal(data, &d); err != nil { + return nil, err + } + return &d, nil + case ProtocolMarkerSectionOverrideActionTransform: + var d ProtocolMarkerSectionOverrideTransform + if err := json.Unmarshal(data, &d); err != nil { + return nil, err + } + return &d, nil + default: + return &RawProtocolMarkerSectionOverrideData{Discriminator: raw.Action, Raw: data}, nil + } +} + +func (r RawProtocolMarkerSectionOverrideData) MarshalJSON() ([]byte, error) { + if r.Raw != nil { + return r.Raw, nil + } + return json.Marshal(struct { + Action ProtocolMarkerSectionOverrideAction `json:"action"` + }{ + Action: r.Discriminator, + }) +} + +func (r ProtocolMarkerSectionOverridePreserve) MarshalJSON() ([]byte, error) { + type alias ProtocolMarkerSectionOverridePreserve + return json.Marshal(struct { + Action ProtocolMarkerSectionOverrideAction `json:"action"` + alias + }{ + Action: r.Action(), + alias: alias(r), + }) +} + +func (r ProtocolMarkerSectionOverrideTransform) MarshalJSON() ([]byte, error) { + type alias ProtocolMarkerSectionOverrideTransform + return json.Marshal(struct { + Action ProtocolMarkerSectionOverrideAction `json:"action"` + alias + }{ + Action: r.Action(), + alias: alias(r), + }) +} + +func (r ProtocolSectionOverride) MarshalJSON() ([]byte, error) { + if r.ProtocolMarkerSectionOverride != nil { + return json.Marshal(r.ProtocolMarkerSectionOverride) + } + if r.ProtocolStaticSectionOverride != nil { + return json.Marshal(r.ProtocolStaticSectionOverride) + } + return []byte("null"), nil +} + +func (r *ProtocolSectionOverride) UnmarshalJSON(data []byte) error { + if string(data) == "null" { + *r = ProtocolSectionOverride{} + return nil + } + { + value, err := unmarshalProtocolMarkerSectionOverride(data) + if err == nil { + *r = ProtocolSectionOverride{ProtocolMarkerSectionOverride: value} + return nil + } + } + { + var value ProtocolStaticSectionOverride + if err := json.Unmarshal(data, &value); err == nil { + *r = ProtocolSectionOverride{ProtocolStaticSectionOverride: &value} + return nil + } + } + return errors.New("data did not match any union variant for ProtocolSectionOverride") +} + func unmarshalPushAttachment(data []byte) (PushAttachment, error) { if string(data) == "null" { return nil, nil @@ -5564,6 +5676,7 @@ func (r *SendRequest) UnmarshalJSON(data []byte) error { Prompt string `json:"prompt"` RequestHeaders map[string]string `json:"requestHeaders,omitzero"` RequiredTool *string `json:"requiredTool,omitempty"` + ResponseFormat *ResponseFormat `json:"responseFormat,omitempty"` Source *string `json:"source,omitempty"` Traceparent *string `json:"traceparent,omitempty"` Tracestate *string `json:"tracestate,omitempty"` @@ -5591,6 +5704,7 @@ func (r *SendRequest) UnmarshalJSON(data []byte) error { r.Prompt = raw.Prompt r.RequestHeaders = raw.RequestHeaders r.RequiredTool = raw.RequiredTool + r.ResponseFormat = raw.ResponseFormat r.Source = raw.Source r.Traceparent = raw.Traceparent r.Tracestate = raw.Tracestate @@ -5871,6 +5985,7 @@ func (r *SessionOpenOptions) UnmarshalJSON(data []byte) error { IsExperimentalMode *bool `json:"isExperimentalMode,omitempty"` LogInteractiveShells *bool `json:"logInteractiveShells,omitempty"` LspClientName *string `json:"lspClientName,omitempty"` + ManagedMCPServers map[string]ManagedMCPServerConfig `json:"managedMcpServers,omitzero"` ManagedSettings *SessionManagedSettings `json:"managedSettings,omitempty"` MaxInlineBinaryBytes *int64 `json:"maxInlineBinaryBytes,omitempty"` Memory *MemoryConfiguration `json:"memory,omitempty"` @@ -5955,6 +6070,7 @@ func (r *SessionOpenOptions) UnmarshalJSON(data []byte) error { r.IsExperimentalMode = raw.IsExperimentalMode r.LogInteractiveShells = raw.LogInteractiveShells r.LspClientName = raw.LspClientName + r.ManagedMCPServers = raw.ManagedMCPServers r.ManagedSettings = raw.ManagedSettings r.MaxInlineBinaryBytes = raw.MaxInlineBinaryBytes r.Memory = raw.Memory diff --git a/go/rpc/zsession_encoding.go b/go/rpc/zsession_encoding.go index b3e2f607b4..343c6c2f0f 100644 --- a/go/rpc/zsession_encoding.go +++ b/go/rpc/zsession_encoding.go @@ -767,12 +767,30 @@ func (e *SessionEvent) UnmarshalJSON(data []byte) error { return err } e.Data = &d + case SessionEventTypeSkillContextDelivered: + var d SkillContextDeliveredData + if err := json.Unmarshal(raw.Data, &d); err != nil { + return err + } + e.Data = &d + case SessionEventTypeSkillContextDeliveredRef: + var d SkillContextDeliveredRefData + if err := json.Unmarshal(raw.Data, &d); err != nil { + return err + } + e.Data = &d case SessionEventTypeSkillInvoked: var d SkillInvokedData if err := json.Unmarshal(raw.Data, &d); err != nil { return err } e.Data = &d + case SessionEventTypeSkillInvokedRef: + var d SkillInvokedRefData + if err := json.Unmarshal(raw.Data, &d); err != nil { + return err + } + e.Data = &d case SessionEventTypeSubagentCompleted: var d SubagentCompletedData if err := json.Unmarshal(raw.Data, &d); err != nil { diff --git a/go/rpc/zsession_events.go b/go/rpc/zsession_events.go index a4ccde9aaf..28868dc290 100644 --- a/go/rpc/zsession_events.go +++ b/go/rpc/zsession_events.go @@ -231,21 +231,30 @@ const ( SessionEventTypeSessionUsageInfo SessionEventType = "session.usage_info" SessionEventTypeSessionWarning SessionEventType = "session.warning" SessionEventTypeSessionWorkspaceFileChanged SessionEventType = "session.workspace_file_changed" - SessionEventTypeSkillInvoked SessionEventType = "skill.invoked" - SessionEventTypeSubagentCompleted SessionEventType = "subagent.completed" - SessionEventTypeSubagentConfigured SessionEventType = "subagent.configured" - SessionEventTypeSubagentDeselected SessionEventType = "subagent.deselected" - SessionEventTypeSubagentFailed SessionEventType = "subagent.failed" - SessionEventTypeSubagentSelected SessionEventType = "subagent.selected" - SessionEventTypeSubagentStarted SessionEventType = "subagent.started" - SessionEventTypeSystemMessage SessionEventType = "system.message" - SessionEventTypeSystemNotification SessionEventType = "system.notification" - SessionEventTypeToolExecutionComplete SessionEventType = "tool.execution_complete" - SessionEventTypeToolExecutionPartialResult SessionEventType = "tool.execution_partial_result" - SessionEventTypeToolExecutionProgress SessionEventType = "tool.execution_progress" - SessionEventTypeToolExecutionStart SessionEventType = "tool.execution_start" - SessionEventTypeToolSearchActivated SessionEventType = "tool_search.activated" - SessionEventTypeToolUserRequested SessionEventType = "tool.user_requested" + // Experimental: SessionEventTypeSkillContextDelivered identifies an experimental event that + // may change or be removed. + SessionEventTypeSkillContextDelivered SessionEventType = "skill.context_delivered" + // Experimental: SessionEventTypeSkillContextDeliveredRef identifies an experimental event + // that may change or be removed. + SessionEventTypeSkillContextDeliveredRef SessionEventType = "skill.context_delivered_ref" + SessionEventTypeSkillInvoked SessionEventType = "skill.invoked" + // Experimental: SessionEventTypeSkillInvokedRef identifies an experimental event that may + // change or be removed. + SessionEventTypeSkillInvokedRef SessionEventType = "skill.invoked_ref" + SessionEventTypeSubagentCompleted SessionEventType = "subagent.completed" + SessionEventTypeSubagentConfigured SessionEventType = "subagent.configured" + SessionEventTypeSubagentDeselected SessionEventType = "subagent.deselected" + SessionEventTypeSubagentFailed SessionEventType = "subagent.failed" + SessionEventTypeSubagentSelected SessionEventType = "subagent.selected" + SessionEventTypeSubagentStarted SessionEventType = "subagent.started" + SessionEventTypeSystemMessage SessionEventType = "system.message" + SessionEventTypeSystemNotification SessionEventType = "system.notification" + SessionEventTypeToolExecutionComplete SessionEventType = "tool.execution_complete" + SessionEventTypeToolExecutionPartialResult SessionEventType = "tool.execution_partial_result" + SessionEventTypeToolExecutionProgress SessionEventType = "tool.execution_progress" + SessionEventTypeToolExecutionStart SessionEventType = "tool.execution_start" + SessionEventTypeToolSearchActivated SessionEventType = "tool_search.activated" + SessionEventTypeToolUserRequested SessionEventType = "tool.user_requested" // Experimental: SessionEventTypeUIEphemeralQuery identifies an experimental event that may // change or be removed. SessionEventTypeUIEphemeralQuery SessionEventType = "ui.ephemeral_query" @@ -398,6 +407,8 @@ type AssistantMessageData struct { MessageID string `json:"messageId"` // Model that produced this assistant message, if known Model *string `json:"model,omitempty"` + // Logical ID of the primary user message that initiated this run, matching the messageId returned by session.send (or the last messageId of session.sendMessages). Stable across model/tool iterations, steering messages, and stop-hook corrections. Subagent runs use their own initiating message ID, not the parent's. Absent for runs without an associated initiating message, such as empty batches. + OriginatingMessageID *string `json:"originatingMessageId,omitempty"` // Actual output token count from the API response (completion_tokens), used for accurate token accounting OutputTokens *int64 `json:"outputTokens,omitempty"` // Tool call ID of the parent tool invocation when this event originates from a sub-agent @@ -953,6 +964,21 @@ type SessionErrorData struct { func (*SessionErrorData) sessionEventData() {} func (*SessionErrorData) Type() SessionEventType { return SessionEventTypeSessionError } +// Exact skill context delivered to the model during a tool phase. This is not a user submission or another skill invocation. +type SkillContextDeliveredData struct { + // Exact model-facing skill wrapper, including its invocation-time file context + Content string `json:"content"` + // Interaction that delivered this context, when known + InteractionID *string `json:"interactionId,omitempty"` + // Unmodified injection provenance, in the form skill- + Source string `json:"source"` +} + +func (*SkillContextDeliveredData) sessionEventData() {} +func (*SkillContextDeliveredData) Type() SessionEventType { + return SessionEventTypeSkillContextDelivered +} + // Experimental content-safe activity signal for a running HydraFusion phase. // Experimental: AssistantFusionPhaseActivityData is part of an experimental API and may change or be removed. type AssistantFusionPhaseActivityData struct { @@ -1382,7 +1408,7 @@ type HookEndData struct { HookInvocationID string `json:"hookInvocationId"` // Type of hook that was invoked (e.g., "preToolUse", "postToolUse", "sessionStart") HookType string `json:"hookType"` - // Output data produced by the hook + // Output data produced by the hook. Durable and resumed postToolUse receipts may omit messages owned by a successful skill invocation and replace an unchanged skill sessionLog copy with an elision marker; hook-modified or re-sourced values are preserved, and the authoritative body remains in the skill invocation event. Output any `json:"output,omitempty"` // Tool call ID of the parent tool invocation when this event originates from a sub-agent ParentToolCallID *string `json:"parentToolCallId,omitempty"` @@ -1399,7 +1425,7 @@ type HookStartData struct { HookInvocationID string `json:"hookInvocationId"` // Type of hook being invoked (e.g., "preToolUse", "postToolUse", "sessionStart") HookType string `json:"hookType"` - // Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) elides the tool result's inline `contents`/`uiResource` and replaces an over-long `textResultForLlm` with a `[copilot:elided ...]` marker, to keep a multi-megabyte payload out of the durable event log; the live subscription stream still delivers the full value. Read the adjacent tool.execution_complete event for the tool result itself. + // Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) drops the tool result's inline `contents`/`uiResource`/`skillInvocation` and replaces duplicated text result fields with a `[copilot:elided ...]` marker; the live subscription stream still delivers the full value. Canonical tool output remains in the adjacent tool.execution_complete event, while an invoked skill's authoritative body remains in its skill invocation event. Input any `json:"input,omitempty"` // Tool call ID of the parent tool invocation when this event originates from a sub-agent ParentToolCallID *string `json:"parentToolCallId,omitempty"` @@ -1423,6 +1449,56 @@ type SessionInfoData struct { func (*SessionInfoData) sessionEventData() {} func (*SessionInfoData) Type() SessionEventType { return SessionEventTypeSessionInfo } +// Internal durable receipt that reconstructs exact model-visible skill context from earlier session content. +type SkillContextDeliveredRefData struct { + // Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:` over the UTF-8 bytes of that event's `content` + ContentID string `json:"contentId"` + // Interaction that delivered this context, when known + InteractionID *string `json:"interactionId,omitempty"` + // Exact text preceding the referenced content in the delivered wrapper + Prefix *string `json:"prefix,omitempty"` + // Unmodified injection provenance, in the form skill- + Source string `json:"source"` + // Exact text following the referenced content in the delivered wrapper + Suffix *string `json:"suffix,omitempty"` +} + +func (*SkillContextDeliveredRefData) sessionEventData() {} +func (*SkillContextDeliveredRefData) Type() SessionEventType { + return SessionEventTypeSkillContextDeliveredRef +} + +// Internal durable skill invocation receipt whose content resolves from an earlier inline skill event in the same session. +type SkillInvokedRefData struct { + // Tool names that should be auto-approved when this skill is active + AllowedTools []string `json:"allowedTools,omitzero"` + // Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:` over the UTF-8 bytes of that event's `content` + ContentID string `json:"contentId"` + // UTF-16 code unit length of the referenced skill content. Derived from the referenced body and validated against it when the reference is expanded; a reference whose length disagrees with the body it names is rejected instead of expanded + ContentLength int64 `json:"contentLength"` + // Description of the skill from its SKILL.md frontmatter + Description *string `json:"description,omitempty"` + // Whether model invocation is disabled for this skill + DisableModelInvocation *bool `json:"disableModelInvocation,omitempty"` + // Model identifier active when the skill was invoked, when known + Model *string `json:"model,omitempty"` + // Name of the invoked skill + Name string `json:"name"` + // File path to the SKILL.md definition, or an empty string for an SDK-provided skill without a filesystem identity + Path string `json:"path"` + // Name of the plugin this skill originated from, when applicable + PluginName *string `json:"pluginName,omitempty"` + // Version of the plugin this skill originated from, when applicable + PluginVersion *string `json:"pluginVersion,omitempty"` + // Source identifier for where the skill was discovered + Source *string `json:"source,omitempty"` + // What triggered the skill invocation + Trigger *SkillInvokedTrigger `json:"trigger,omitempty"` +} + +func (*SkillInvokedRefData) sessionEventData() {} +func (*SkillInvokedRefData) Type() SessionEventType { return SessionEventTypeSkillInvokedRef } + // LLM API call usage metrics including tokens, costs, quotas, and billing information type AssistantUsageData struct { // Number of accepted speculative prediction tokens @@ -2760,6 +2836,8 @@ type SubagentStartedData struct { FactoryRunID *string `json:"factoryRunId,omitempty"` // Model the sub-agent will run with, when known at start. Model *string `json:"model,omitempty"` + // Authority or runtime mechanism responsible for sub-agent model selection, when known at start. + ModelSelectionSource *SubagentModelSelectionSource `json:"modelSelectionSource,omitempty"` // Task-registry ID of the spawning sub-agent. Absent when the root session spawned this child. ParentID *string `json:"parentId,omitempty"` // Whether this sub-agent can be resumed. Currently always false. @@ -2872,6 +2950,10 @@ type ToolExecutionStartData struct { // Experimental HydraFusion attribution for this tool execution. // Experimental: Fusion is part of an experimental API and may change or be removed. Fusion *FusionAttribution `json:"fusion,omitempty"` + // Preferred lookup name for the MCP server hosting this tool: the configured (namespaced) config-map key when the tool carries one, otherwise the display name from `mcpServerName`. Present when the tool is an MCP tool; this is the name unrestricted provenance telemetry hashes so it joins with `mcp_server_setup`, which keys off the configured name too. + MCPConfigServerName *string `json:"mcpConfigServerName,omitempty"` + // Where the MCP server's configuration came from (`user`, `workspace`, `plugin`, or `builtin`), when the tool is an MCP tool and the server is configured + MCPConfigSource *MCPServerSource `json:"mcpConfigSource,omitempty"` // Name of the MCP server hosting this tool, when the tool is an MCP tool MCPServerName *string `json:"mcpServerName,omitempty"` // Original tool name on the MCP server, when the tool is an MCP tool @@ -3639,6 +3721,8 @@ type MCPOauthWwwAuthenticateParams struct { // A single MCP server status summary in `session.mcp_servers_loaded`, including name, status, source, transport, and plugin metadata. type MCPServersLoadedServer struct { + // Human-readable display name supplied by a managed server catalog. + DisplayName *string `json:"displayName,omitempty"` // Error message if the server failed to connect Error *string `json:"error,omitempty"` // Server name (config key) @@ -3649,7 +3733,7 @@ type MCPServersLoadedServer struct { PluginVersion *string `json:"pluginVersion,omitempty"` // Server-advertised metadata for a connected server. Omitted when no live connection metadata is available, including while pending or when failed, disabled, stopped, or not configured. ServerMetadata *MCPServerMetadata `json:"serverMetadata,omitempty"` - // Configuration source: user, workspace, plugin, or builtin + // Configuration source: user, workspace, plugin, builtin, or managed Source *MCPServerSource `json:"source,omitempty"` // Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured Status MCPServerStatus `json:"status"` @@ -5047,7 +5131,7 @@ type ToolExecutionCompleteResult struct { Content string `json:"content"` // Structured content blocks (text, images, audio, resources) returned by the tool in their native format Contents []ToolExecutionCompleteContent `json:"contents,omitzero"` - // Full detailed tool result for UI/timeline display, preserving complete content such as diffs. Falls back to content when absent. + // Detailed tool result for UI/timeline display, preserving complete content such as diffs for most tools. Successful skill invocations intentionally use the concise model-facing content here; the authoritative skill body is carried by the corresponding skill invocation event. Falls back to content when absent. DetailedContent *string `json:"detailedContent,omitempty"` // FIDES IFC label projected from tool ingress metadata (MCP `CallToolResult._meta` or synthesized built-in ingress labels) — persisted as `{ ifc: ... }` (only the `ifc` key, not the whole `_meta`). Persisted so the FIDES IFC label survives session resume: the engine rehydrates accumulated taint by replaying these on load. Populated for ingress sources when FIDES IFC is on. Experimental. // Experimental: MCPMeta is part of an experimental API and may change or be removed. @@ -5732,6 +5816,8 @@ const ( type MCPHeadersRefreshCompletedOutcome string const ( + // The host credential broker rejected or failed the refresh. + MCPHeadersRefreshCompletedOutcomeError MCPHeadersRefreshCompletedOutcome = "error" // The host supplied dynamic headers. MCPHeadersRefreshCompletedOutcomeHeaders MCPHeadersRefreshCompletedOutcome = "headers" // The host responded with no dynamic headers. diff --git a/go/zsession_events.go b/go/zsession_events.go index 5dac5f535c..c93d70e209 100644 --- a/go/zsession_events.go +++ b/go/zsession_events.go @@ -347,7 +347,10 @@ type ( ShutdownModelMetricUsage = rpc.ShutdownModelMetricUsage ShutdownTokenDetail = rpc.ShutdownTokenDetail ShutdownType = rpc.ShutdownType + SkillContextDeliveredData = rpc.SkillContextDeliveredData + SkillContextDeliveredRefData = rpc.SkillContextDeliveredRefData SkillInvokedData = rpc.SkillInvokedData + SkillInvokedRefData = rpc.SkillInvokedRefData SkillInvokedTrigger = rpc.SkillInvokedTrigger SkillsLoadedSkill = rpc.SkillsLoadedSkill SkillSource = rpc.SkillSource @@ -602,6 +605,7 @@ const ( ManagedSettingsResolvedSourceNone = rpc.ManagedSettingsResolvedSourceNone ManagedSettingsResolvedSourcePolicyHelper = rpc.ManagedSettingsResolvedSourcePolicyHelper ManagedSettingsResolvedSourceServer = rpc.ManagedSettingsResolvedSourceServer + MCPHeadersRefreshCompletedOutcomeError = rpc.MCPHeadersRefreshCompletedOutcomeError MCPHeadersRefreshCompletedOutcomeHeaders = rpc.MCPHeadersRefreshCompletedOutcomeHeaders MCPHeadersRefreshCompletedOutcomeNone = rpc.MCPHeadersRefreshCompletedOutcomeNone MCPHeadersRefreshCompletedOutcomeTimeout = rpc.MCPHeadersRefreshCompletedOutcomeTimeout @@ -616,6 +620,7 @@ const ( MCPOauthRequestReasonUpscope = rpc.MCPOauthRequestReasonUpscope MCPOauthRequiredStaticClientConfigGrantTypeClientCredentials = rpc.MCPOauthRequiredStaticClientConfigGrantTypeClientCredentials MCPServerSourceBuiltin = rpc.MCPServerSourceBuiltin + MCPServerSourceManaged = rpc.MCPServerSourceManaged MCPServerSourcePlugin = rpc.MCPServerSourcePlugin MCPServerSourceUser = rpc.MCPServerSourceUser MCPServerSourceWorkspace = rpc.MCPServerSourceWorkspace @@ -850,7 +855,10 @@ const ( SessionEventTypeSessionUsageInfo = rpc.SessionEventTypeSessionUsageInfo SessionEventTypeSessionWarning = rpc.SessionEventTypeSessionWarning SessionEventTypeSessionWorkspaceFileChanged = rpc.SessionEventTypeSessionWorkspaceFileChanged + SessionEventTypeSkillContextDelivered = rpc.SessionEventTypeSkillContextDelivered + SessionEventTypeSkillContextDeliveredRef = rpc.SessionEventTypeSkillContextDeliveredRef SessionEventTypeSkillInvoked = rpc.SessionEventTypeSkillInvoked + SessionEventTypeSkillInvokedRef = rpc.SessionEventTypeSkillInvokedRef SessionEventTypeSubagentCompleted = rpc.SessionEventTypeSubagentCompleted SessionEventTypeSubagentConfigured = rpc.SessionEventTypeSubagentConfigured SessionEventTypeSubagentDeselected = rpc.SessionEventTypeSubagentDeselected 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 9ba4f05618..d3154846ed 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 @@ -37,6 +37,8 @@ public final class AssistantMessageEvent extends SessionEvent { public record AssistantMessageEventData( /** Unique identifier for this assistant message */ @JsonProperty("messageId") String messageId, + /** Logical ID of the primary user message that initiated this run, matching the messageId returned by session.send (or the last messageId of session.sendMessages). Stable across model/tool iterations, steering messages, and stop-hook corrections. Subagent runs use their own initiating message ID, not the parent's. Absent for runs without an associated initiating message, such as empty batches. */ + @JsonProperty("originatingMessageId") String originatingMessageId, /** Model that produced this assistant message, if known */ @JsonProperty("model") String model, /** The assistant's text response content */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/HookEndEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/HookEndEvent.java index 8d4afe7a1d..165905eb3c 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/HookEndEvent.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/HookEndEvent.java @@ -38,7 +38,7 @@ public record HookEndEventData( @JsonProperty("hookInvocationId") String hookInvocationId, /** Type of hook that was invoked (e.g., "preToolUse", "postToolUse", "sessionStart") */ @JsonProperty("hookType") String hookType, - /** Output data produced by the hook */ + /** Output data produced by the hook. Durable and resumed postToolUse receipts may omit messages owned by a successful skill invocation and replace an unchanged skill sessionLog copy with an elision marker; hook-modified or re-sourced values are preserved, and the authoritative body remains in the skill invocation event. */ @JsonProperty("output") Object output, /** Whether the hook completed successfully */ @JsonProperty("success") Boolean success, diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/HookStartEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/HookStartEvent.java index 030e08caf8..f47c4c6f08 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/HookStartEvent.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/HookStartEvent.java @@ -38,7 +38,7 @@ public record HookStartEventData( @JsonProperty("hookInvocationId") String hookInvocationId, /** Type of hook being invoked (e.g., "preToolUse", "postToolUse", "sessionStart") */ @JsonProperty("hookType") String hookType, - /** Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) elides the tool result's inline `contents`/`uiResource` and replaces an over-long `textResultForLlm` with a `[copilot:elided ...]` marker, to keep a multi-megabyte payload out of the durable event log; the live subscription stream still delivers the full value. Read the adjacent tool.execution_complete event for the tool result itself. */ + /** Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) drops the tool result's inline `contents`/`uiResource`/`skillInvocation` and replaces duplicated text result fields with a `[copilot:elided ...]` marker; the live subscription stream still delivers the full value. Canonical tool output remains in the adjacent tool.execution_complete event, while an invoked skill's authoritative body remains in its skill invocation event. */ @JsonProperty("input") Object input, /** Tool call ID of the parent tool invocation when this event originates from a sub-agent */ @JsonProperty("parentToolCallId") String parentToolCallId diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/McpHeadersRefreshCompletedOutcome.java b/java/sdk/src/generated/java/com/github/copilot/generated/McpHeadersRefreshCompletedOutcome.java index 7980dd0a67..7b3d9f58c2 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/McpHeadersRefreshCompletedOutcome.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/McpHeadersRefreshCompletedOutcome.java @@ -20,6 +20,8 @@ public enum McpHeadersRefreshCompletedOutcome { HEADERS("headers"), /** The {@code none} variant. */ NONE("none"), + /** The {@code error} variant. */ + ERROR("error"), /** The {@code timeout} variant. */ TIMEOUT("timeout"); diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/McpServerSource.java b/java/sdk/src/generated/java/com/github/copilot/generated/McpServerSource.java index 63514743ab..5ea2c39f51 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/McpServerSource.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/McpServerSource.java @@ -10,7 +10,7 @@ import javax.annotation.processing.Generated; /** - * Configuration source: user, workspace, plugin, or builtin + * Configuration source: user, workspace, plugin, builtin, or managed * * @since 1.0.0 */ @@ -23,7 +23,9 @@ public enum McpServerSource { /** The {@code plugin} variant. */ PLUGIN("plugin"), /** The {@code builtin} variant. */ - BUILTIN("builtin"); + BUILTIN("builtin"), + /** The {@code managed} variant. */ + MANAGED("managed"); private final String value; McpServerSource(String value) { this.value = value; } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/McpServersLoadedServer.java b/java/sdk/src/generated/java/com/github/copilot/generated/McpServersLoadedServer.java index ca16f83ece..bb9170c00b 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/McpServersLoadedServer.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/McpServersLoadedServer.java @@ -25,8 +25,10 @@ public record McpServersLoadedServer( @JsonProperty("name") String name, /** Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured */ @JsonProperty("status") McpServerStatus status, - /** Configuration source: user, workspace, plugin, or builtin */ + /** Configuration source: user, workspace, plugin, builtin, or managed */ @JsonProperty("source") McpServerSource source, + /** Human-readable display name supplied by a managed server catalog. */ + @JsonProperty("displayName") String displayName, /** Error message if the server failed to connect */ @JsonProperty("error") String error, /** Server-advertised metadata for a connected server. Omitted when no live connection metadata is available, including while pending or when failed, disabled, stopped, or not configured. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/SessionEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/SessionEvent.java index f41a34923b..6d2d86b1e4 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/SessionEvent.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/SessionEvent.java @@ -96,6 +96,9 @@ @JsonSubTypes.Type(value = ToolExecutionCompleteEvent.class, name = "tool.execution_complete"), @JsonSubTypes.Type(value = ToolSearchActivatedEvent.class, name = "tool_search.activated"), @JsonSubTypes.Type(value = SkillInvokedEvent.class, name = "skill.invoked"), + @JsonSubTypes.Type(value = SkillInvokedRefEvent.class, name = "skill.invoked_ref"), + @JsonSubTypes.Type(value = SkillContextDeliveredEvent.class, name = "skill.context_delivered"), + @JsonSubTypes.Type(value = SkillContextDeliveredRefEvent.class, name = "skill.context_delivered_ref"), @JsonSubTypes.Type(value = SandboxDecisionEvent.class, name = "sandbox.decision"), @JsonSubTypes.Type(value = SubagentStartedEvent.class, name = "subagent.started"), @JsonSubTypes.Type(value = SubagentConfiguredEvent.class, name = "subagent.configured"), @@ -240,6 +243,9 @@ public abstract sealed class SessionEvent permits ToolExecutionCompleteEvent, ToolSearchActivatedEvent, SkillInvokedEvent, + SkillInvokedRefEvent, + SkillContextDeliveredEvent, + SkillContextDeliveredRefEvent, SandboxDecisionEvent, SubagentStartedEvent, SubagentConfiguredEvent, diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/SkillContextDeliveredEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/SkillContextDeliveredEvent.java new file mode 100644 index 0000000000..a1f218d26e --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/SkillContextDeliveredEvent.java @@ -0,0 +1,45 @@ +/*--------------------------------------------------------------------------------------------- + * 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 javax.annotation.processing.Generated; + +/** + * Session event "skill.context_delivered". Exact skill context delivered to the model during a tool phase. This is not a user submission or another skill invocation. + * @since 1.0.0 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class SkillContextDeliveredEvent extends SessionEvent { + + @Override + public String getType() { return "skill.context_delivered"; } + + @JsonProperty("data") + private SkillContextDeliveredEventData data; + + public SkillContextDeliveredEventData getData() { return data; } + public void setData(SkillContextDeliveredEventData data) { this.data = data; } + + /** Data payload for {@link SkillContextDeliveredEvent}. */ + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public record SkillContextDeliveredEventData( + /** Exact model-facing skill wrapper, including its invocation-time file context */ + @JsonProperty("content") String content, + /** Unmodified injection provenance, in the form skill- */ + @JsonProperty("source") String source, + /** Interaction that delivered this context, when known */ + @JsonProperty("interactionId") String interactionId + ) { + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/SkillContextDeliveredRefEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/SkillContextDeliveredRefEvent.java new file mode 100644 index 0000000000..b0468b3be0 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/SkillContextDeliveredRefEvent.java @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * 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 javax.annotation.processing.Generated; + +/** + * Session event "skill.context_delivered_ref". Internal durable receipt that reconstructs exact model-visible skill context from earlier session content. + * @since 1.0.0 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class SkillContextDeliveredRefEvent extends SessionEvent { + + @Override + public String getType() { return "skill.context_delivered_ref"; } + + @JsonProperty("data") + private SkillContextDeliveredRefEventData data; + + public SkillContextDeliveredRefEventData getData() { return data; } + public void setData(SkillContextDeliveredRefEventData data) { this.data = data; } + + /** Data payload for {@link SkillContextDeliveredRefEvent}. */ + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public record SkillContextDeliveredRefEventData( + /** Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:` over the UTF-8 bytes of that event's `content` */ + @JsonProperty("contentId") String contentId, + /** Exact text preceding the referenced content in the delivered wrapper */ + @JsonProperty("prefix") String prefix, + /** Exact text following the referenced content in the delivered wrapper */ + @JsonProperty("suffix") String suffix, + /** Unmodified injection provenance, in the form skill- */ + @JsonProperty("source") String source, + /** Interaction that delivered this context, when known */ + @JsonProperty("interactionId") String interactionId + ) { + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/SkillInvokedRefEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/SkillInvokedRefEvent.java new file mode 100644 index 0000000000..c3a428ff6b --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/SkillInvokedRefEvent.java @@ -0,0 +1,64 @@ +/*--------------------------------------------------------------------------------------------- + * 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; + +/** + * Session event "skill.invoked_ref". Internal durable skill invocation receipt whose content resolves from an earlier inline skill event in the same session. + * @since 1.0.0 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public final class SkillInvokedRefEvent extends SessionEvent { + + @Override + public String getType() { return "skill.invoked_ref"; } + + @JsonProperty("data") + private SkillInvokedRefEventData data; + + public SkillInvokedRefEventData getData() { return data; } + public void setData(SkillInvokedRefEventData data) { this.data = data; } + + /** Data payload for {@link SkillInvokedRefEvent}. */ + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public record SkillInvokedRefEventData( + /** Name of the invoked skill */ + @JsonProperty("name") String name, + /** Model identifier active when the skill was invoked, when known */ + @JsonProperty("model") String model, + /** File path to the SKILL.md definition, or an empty string for an SDK-provided skill without a filesystem identity */ + @JsonProperty("path") String path, + /** Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:` over the UTF-8 bytes of that event's `content` */ + @JsonProperty("contentId") String contentId, + /** UTF-16 code unit length of the referenced skill content. Derived from the referenced body and validated against it when the reference is expanded; a reference whose length disagrees with the body it names is rejected instead of expanded */ + @JsonProperty("contentLength") Long contentLength, + /** Tool names that should be auto-approved when this skill is active */ + @JsonProperty("allowedTools") List allowedTools, + /** Whether model invocation is disabled for this skill */ + @JsonProperty("disableModelInvocation") Boolean disableModelInvocation, + /** Source identifier for where the skill was discovered */ + @JsonProperty("source") String source, + /** Name of the plugin this skill originated from, when applicable */ + @JsonProperty("pluginName") String pluginName, + /** Version of the plugin this skill originated from, when applicable */ + @JsonProperty("pluginVersion") String pluginVersion, + /** Description of the skill from its SKILL.md frontmatter */ + @JsonProperty("description") String description, + /** What triggered the skill invocation */ + @JsonProperty("trigger") SkillInvokedTrigger trigger + ) { + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/SubagentStartedEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/SubagentStartedEvent.java index bef7c0138d..7d8f5afe9e 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/SubagentStartedEvent.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/SubagentStartedEvent.java @@ -46,6 +46,8 @@ public record SubagentStartedEventData( @JsonProperty("model") String model, /** Where the model input for this sub-agent came from. Present when the task planner resolved the launch (the task tool and factory agents); absent for sub-agents created through other runtime paths. */ @JsonProperty("taskModelSource") SubagentTaskModelSource taskModelSource, + /** Authority or runtime mechanism responsible for sub-agent model selection, when known at start. */ + @JsonProperty("modelSelectionSource") SubagentModelSelectionSource modelSelectionSource, /** Root id of the factory run that spawned this sub-agent, when it was spawned by one. */ @JsonProperty("factoryRunId") String factoryRunId, /** Task-registry ID of the spawning sub-agent. Absent when the root session spawned this child. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteResult.java index f7f08d93c6..6d9205156d 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteResult.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionCompleteResult.java @@ -24,7 +24,7 @@ public record ToolExecutionCompleteResult( /** Concise tool result text sent to the LLM for chat completion, potentially truncated for token efficiency */ @JsonProperty("content") String content, - /** Full detailed tool result for UI/timeline display, preserving complete content such as diffs. Falls back to content when absent. */ + /** Detailed tool result for UI/timeline display, preserving complete content such as diffs for most tools. Successful skill invocations intentionally use the concise model-facing content here; the authoritative skill body is carried by the corresponding skill invocation event. Falls back to content when absent. */ @JsonProperty("detailedContent") String detailedContent, /** Structured content blocks (text, images, audio, resources) returned by the tool in their native format */ @JsonProperty("contents") List contents, diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionStartEvent.java b/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionStartEvent.java index 24d0cad2a5..e97a8c5a99 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionStartEvent.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/ToolExecutionStartEvent.java @@ -48,10 +48,14 @@ public record ToolExecutionStartEventData( @JsonProperty("rte") Boolean rte, /** Name of the MCP server hosting this tool, when the tool is an MCP tool */ @JsonProperty("mcpServerName") String mcpServerName, + /** Preferred lookup name for the MCP server hosting this tool: the configured (namespaced) config-map key when the tool carries one, otherwise the display name from `mcpServerName`. Present when the tool is an MCP tool; this is the name unrestricted provenance telemetry hashes so it joins with `mcp_server_setup`, which keys off the configured name too. */ + @JsonProperty("mcpConfigServerName") String mcpConfigServerName, /** Original tool name on the MCP server, when the tool is an MCP tool */ @JsonProperty("mcpToolName") String mcpToolName, /** Transport the MCP server hosting this tool is connected over, when the tool is an MCP tool and the server is configured */ @JsonProperty("mcpTransport") McpServerTransport mcpTransport, + /** Where the MCP server's configuration came from (`user`, `workspace`, `plugin`, or `builtin`), when the tool is an MCP tool and the server is configured */ + @JsonProperty("mcpConfigSource") McpServerSource mcpConfigSource, /** Identifier for the agent loop turn this tool was invoked in, matching the corresponding assistant.turn_start event */ @JsonProperty("turnId") String turnId, /** When true, the tool output should be displayed expanded (verbatim) in the CLI timeline */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsCollectedEntry.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsCollectedEntry.java index 9d8592220d..85708c8252 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsCollectedEntry.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsCollectedEntry.java @@ -13,7 +13,7 @@ import javax.annotation.processing.Generated; /** - * A file included in the redacted debug bundle. + * A file included in the session debug bundle. * * @since 1.0.0 */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsEntry.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsEntry.java index 285b1ef6e0..d2845fa565 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsEntry.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsEntry.java @@ -27,7 +27,7 @@ public record DebugCollectLogsEntry( @JsonProperty("path") String path, /** Relative path to use inside the staged bundle/archive. */ @JsonProperty("bundlePath") String bundlePath, - /** How text content from this entry should be redacted. Defaults to plain-text. */ + /** How text content from this entry should be redacted. Defaults to plain-text. With none, no redaction is applied; the caller must ensure any necessary redaction is performed before this call. */ @JsonProperty("redaction") DebugCollectLogsRedaction redaction, /** When true, collection fails if this entry cannot be read. Defaults to false, which records the entry in `skippedEntries`. */ @JsonProperty("required") Boolean required diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsRedaction.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsRedaction.java index 5f57e37378..8bfcf7a79f 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsRedaction.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/DebugCollectLogsRedaction.java @@ -19,7 +19,9 @@ public enum DebugCollectLogsRedaction { /** The {@code plain-text} variant. */ PLAIN_TEXT("plain-text"), /** The {@code events-jsonl} variant. */ - EVENTS_JSONL("events-jsonl"); + EVENTS_JSONL("events-jsonl"), + /** The {@code none} variant. */ + NONE("none"); private final String value; DebugCollectLogsRedaction(String value) { this.value = value; } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/InstalledPluginInfo.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/InstalledPluginInfo.java index 2c81e95f2b..5b42a40450 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/InstalledPluginInfo.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/InstalledPluginInfo.java @@ -32,6 +32,8 @@ public record InstalledPluginInfo( /** Whether the plugin is currently enabled for new sessions */ @JsonProperty("enabled") Boolean 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". */ - @JsonProperty("installedFrom") String installedFrom + @JsonProperty("installedFrom") String installedFrom, + /** Runtime-reported plugin provenance. Currently set to "builtin" only for plugins registered through the trusted host built-in boundary; absent for installed, marketplace, direct, and live plugins. */ + @JsonProperty("source") String source ) { } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/JsonSchemaResponseFormat.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/JsonSchemaResponseFormat.java new file mode 100644 index 0000000000..a673267f32 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/JsonSchemaResponseFormat.java @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +// AUTO-GENERATED FILE - DO NOT EDIT +// Generated from: api.schema.json + +package com.github.copilot.generated.rpc; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import javax.annotation.processing.Generated; + +/** + * A JSON Schema output contract. OpenAI receives the name, description, schema and strict setting; Anthropic receives the schema in output_config.format and always uses its native strict enforcement. + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public record JsonSchemaResponseFormat( + /** Name of the output schema, subject to the provider's naming restrictions. */ + @JsonProperty("name") String name, + /** JSON Schema passed unchanged to the inference provider. Schemas larger than 32 MiB when JSON-encoded are rejected before admission, using the runtime's existing request-size ceiling. This is not a guarantee that the entire model request fits. Supported keywords and schema restrictions are determined by the provider. */ + @JsonProperty("schema") Object schema, + /** Optional description passed to OpenAI providers. */ + @JsonProperty("description") String description, + /** Optional strict enforcement setting for OpenAI providers. Omitted uses the provider default. Anthropic always enforces its supported schema subset. */ + @JsonProperty("strict") Boolean strict +) { +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ManagedMcpServerConfig.java similarity index 50% rename from java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionResult.java rename to java/sdk/src/generated/java/com/github/copilot/generated/rpc/ManagedMcpServerConfig.java index 5cb5af063b..4a202063af 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionResult.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ManagedMcpServerConfig.java @@ -10,21 +10,27 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.github.copilot.CopilotExperimental; +import java.util.List; import javax.annotation.processing.Generated; /** - * Handle for releasing the extension tool registration. + * Non-secret host-managed HTTP MCP server configuration. The containing map key is the stable managed identity; credentials are supplied dynamically by the host. * - * @apiNote This method is experimental and may change in a future version. * @since 1.0.0 */ -@CopilotExperimental @javax.annotation.processing.Generated("copilot-sdk-codegen") @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) -public record SessionsRegisterExtensionToolsOnSessionResult( - /** In-process unsubscribe function used only by the CLI. */ - @JsonProperty("unsubscribe") Object unsubscribe +public record ManagedMcpServerConfig( + /** Human-readable catalog display name. */ + @JsonProperty("displayName") String displayName, + /** Hosted MCP streamable HTTP endpoint. */ + @JsonProperty("url") String url, + /** Tools to include. Defaults to all tools when omitted. */ + @JsonProperty("tools") List tools, + /** Timeout in milliseconds for tool discovery and tool calls. */ + @JsonProperty("timeout") Long timeout, + /** Maximum dynamic-header cache lifetime in milliseconds. */ + @JsonProperty("headersRefreshTtlMs") Long headersRefreshTtlMs ) { } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServer.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServer.java index 063385f6ff..d180998c54 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServer.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServer.java @@ -25,12 +25,14 @@ public record McpServer( @JsonProperty("name") String name, /** Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured */ @JsonProperty("status") McpServerStatus status, - /** Configuration source: user, workspace, plugin, or builtin */ + /** Configuration source: user, workspace, plugin, builtin, or managed */ @JsonProperty("source") McpServerSource source, /** Plugin name that provided this server, when source is plugin. */ @JsonProperty("sourcePlugin") String sourcePlugin, /** Plugin version that provided this server, when source is plugin. */ @JsonProperty("sourcePluginVersion") String sourcePluginVersion, + /** Human-readable display name supplied by a managed server catalog. */ + @JsonProperty("displayName") String displayName, /** Error message if the server failed to connect */ @JsonProperty("error") String error, /** Server-advertised metadata for a connected server. Omitted when no live connection metadata is available, including while pending or when failed, disabled, stopped, or not configured. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServerSource.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServerSource.java index f709df96dd..72b1503d59 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServerSource.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/McpServerSource.java @@ -10,7 +10,7 @@ import javax.annotation.processing.Generated; /** - * Configuration source: user, workspace, plugin, or builtin + * Configuration source: user, workspace, plugin, builtin, or managed * * @since 1.0.0 */ @@ -23,7 +23,9 @@ public enum McpServerSource { /** The {@code plugin} variant. */ PLUGIN("plugin"), /** The {@code builtin} variant. */ - BUILTIN("builtin"); + BUILTIN("builtin"), + /** The {@code managed} variant. */ + MANAGED("managed"); private final String value; McpServerSource(String value) { this.value = value; } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderModelConfig.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderModelConfig.java index 8e92701bad..a8acada0e0 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderModelConfig.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ProviderModelConfig.java @@ -38,6 +38,8 @@ public record ProviderModelConfig( /** Maximum output tokens for the model. */ @JsonProperty("maxOutputTokens") Long maxOutputTokens, /** Optional capability overrides (vision, tool_calls, reasoning, etc.). */ - @JsonProperty("capabilities") ModelCapabilitiesOverride capabilities + @JsonProperty("capabilities") ModelCapabilitiesOverride capabilities, + /** System-message configuration used when the runtime builds the standard prompt for this provider-qualified model, including general-purpose subagents. It uses the same object hierarchy as session-level systemMessage configuration, except transform actions are rejected because the current callback protocol is not model-scoped. When present, it overrides the session-wide configuration on those prompt paths. Selected custom-agent and specialized-subagent prompts remain authoritative. */ + @JsonProperty("systemMessage") Object systemMessage ) { } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfigUserPolicyNetwork.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfigUserPolicyNetwork.java index 9c5e3e475f..244555f3e9 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfigUserPolicyNetwork.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxConfigUserPolicyNetwork.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; import javax.annotation.processing.Generated; /** @@ -21,11 +22,15 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public record SandboxConfigUserPolicyNetwork( + /** Hosts allowed through the built-in sandbox proxy. A non-empty list denies unmatched hosts; an absent or empty list allows all hosts not blocked. Supports exact hostnames, IP addresses, and *.example.com for strict subdomains. Host rules do not override the outbound or local-network toggles. */ + @JsonProperty("allowedHosts") List allowedHosts, + /** Hosts denied by the built-in sandbox proxy. Deny rules take precedence over allowedHosts. A domain also denies all its subdomains. IP addresses match exactly; *.example.com matches strict subdomains, and * denies every host. */ + @JsonProperty("blockedHosts") List blockedHosts, /** Whether outbound network traffic is allowed at all. */ @JsonProperty("allowOutbound") Boolean allowOutbound, /** Whether traffic to local/loopback addresses is allowed. */ @JsonProperty("allowLocalNetwork") Boolean allowLocalNetwork, - /** HTTP proxy for sandboxed process traffic. Linux restricts egress to the proxy endpoint, requires that endpoint to be reachable over IPv4 (the [::] dual-stack wildcard is accepted and routed through the IPv4 gateway), and does not support proxy credentials. macOS relies on applications honoring proxy environment variables. Windows also configures a per-AppContainer WinHTTP proxy, but enforcement depends on the application's networking stack. Configure supported credentials in the separate `username` and `password` fields. A credential-free http:// loopback URL uses the localhost proxy form, while an https:// or authenticated loopback URL uses the URL form. */ + /** HTTP(S) proxy for sandboxed traffic. With host rules, this is the built-in local proxy's upstream; credentials stay in the runtime, and Linux and macOS restrict the child to the local listener. Without host rules, Linux restricts egress to this endpoint but rejects credentials, and macOS proxying is cooperative. Windows enforcement depends on the application's networking stack. Configure credentials in the separate username/password fields. The transient local listener URL is never persisted. */ @JsonProperty("proxy") SandboxConfigUserPolicyNetworkProxy proxy ) { } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxSessionChange.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxSessionChange.java new file mode 100644 index 0000000000..148e953b89 --- /dev/null +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SandboxSessionChange.java @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +// AUTO-GENERATED FILE - DO NOT EDIT +// Generated from: api.schema.json + +package com.github.copilot.generated.rpc; + +import javax.annotation.processing.Generated; + +/** + * A session-scoped sandbox transition applied while handling a slash command + * + * @since 1.0.0 + */ +@javax.annotation.processing.Generated("copilot-sdk-codegen") +public enum SandboxSessionChange { + /** The {@code disabled} variant. */ + DISABLED("disabled"), + /** The {@code restored} variant. */ + RESTORED("restored"); + + private final String value; + SandboxSessionChange(String value) { this.value = value; } + @com.fasterxml.jackson.annotation.JsonValue + public String getValue() { return value; } + @com.fasterxml.jackson.annotation.JsonCreator + public static SandboxSessionChange fromValue(String value) { + for (SandboxSessionChange v : values()) { + if (v.value.equals(value)) return v; + } + throw new IllegalArgumentException("Unknown SandboxSessionChange value: " + value); + } +} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ServerSessionsApi.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ServerSessionsApi.java index 1c3b8d10a1..bc65f86fcb 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ServerSessionsApi.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/ServerSessionsApi.java @@ -394,17 +394,6 @@ public CompletableFuture getRemoteControlS return caller.invoke("sessions.getRemoteControlStatus", java.util.Map.of(), SessionsGetRemoteControlStatusResult.class); } - /** - * Params to attach an extension loader's tools to a session. - * - * @apiNote This method is experimental and may change in a future version. - * @since 1.0.0 - */ - @CopilotExperimental - public CompletableFuture registerExtensionToolsOnSession(SessionsRegisterExtensionToolsOnSessionParams params) { - return caller.invoke("sessions.registerExtensionToolsOnSession", params, SessionsRegisterExtensionToolsOnSessionResult.class); - } - /** * Params to attach or detach an in-process ExtensionController delegate. * diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugApi.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugApi.java index e0ca94374a..b2cd030183 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugApi.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugApi.java @@ -31,7 +31,7 @@ public final class SessionDebugApi { } /** - * Options for collecting a redacted session debug bundle. + * Options for collecting a session debug bundle with configurable redaction. *

* Note: the {@code sessionId} field in the params record is overridden * by the session-scoped wrapper; any value provided is ignored. diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsParams.java index 2076e2ad7d..f578f0bad7 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsParams.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsParams.java @@ -15,7 +15,7 @@ import javax.annotation.processing.Generated; /** - * Options for collecting a redacted session debug bundle. + * Options for collecting a session debug bundle with configurable redaction. * * @apiNote This method is experimental and may change in a future version. * @since 1.0.0 @@ -27,7 +27,7 @@ public record SessionDebugCollectLogsParams( /** Target session identifier */ @JsonProperty("sessionId") String sessionId, - /** Where the redacted bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage redacted files for caller-managed upload/post-processing. */ + /** Where the bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage files for caller-managed upload/post-processing. */ @JsonProperty("destination") Object destination, /** Which built-in session diagnostics to include. Omitted fields default to true. */ @JsonProperty("include") DebugCollectLogsInclude include, diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsResult.java index 623792b02b..ef79198d86 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsResult.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionDebugCollectLogsResult.java @@ -15,7 +15,7 @@ import javax.annotation.processing.Generated; /** - * Result of collecting a redacted debug bundle. + * Result of collecting a session debug bundle. * * @apiNote This method is experimental and may change in a future version. * @since 1.0.0 @@ -29,7 +29,7 @@ public record SessionDebugCollectLogsResult( @JsonProperty("kind") DebugCollectLogsResultKind kind, /** Actual archive path or staging directory path written. This may differ from the requested path when no-overwrite suffixing or fallback-to-temp-directory was needed. */ @JsonProperty("path") String path, - /** Files included in the redacted bundle. */ + /** Files included in the bundle. */ @JsonProperty("entries") List entries, /** Optional files or directories that could not be included. */ @JsonProperty("skippedEntries") List skippedEntries diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionOpenOptions.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionOpenOptions.java index 52577dd16a..56e96953f0 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionOpenOptions.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionOpenOptions.java @@ -47,7 +47,7 @@ public record SessionOpenOptions( @JsonProperty("integrationId") String integrationId, /** ExP assignment ('flight') data injected by an SDK integrator, in the same JSON shape the Copilot CLI fetches from the experimentation service (CopilotExpAssignmentResponse). When supplied this is fed into the FeatureFlagService exactly like CLI-fetched assignments and ExP-backed flags wait for it. When absent the session does not block on ExP. */ @JsonProperty("expAssignments") Object expAssignments, - /** Opt-in: self-fetch and enforce enterprise managed settings at session bootstrap. */ + /** Opt-in: self-fetch and enforce enterprise managed settings, including managed hook policies, at session bootstrap. */ @JsonProperty("enableManagedSettings") Boolean enableManagedSettings, /** Permissions-only enterprise policy injected by the SDK host at session create or resume. Composes restrictively with self-fetched and device policy and is not persisted. */ @JsonProperty("managedSettings") SessionManagedSettings managedSettings, @@ -109,6 +109,8 @@ public record SessionOpenOptions( @JsonProperty("envValueMode") SessionOpenOptionsEnvValueMode envValueMode, /** MCP server names disabled for this session. Disabled servers are not started or authenticated on create or cold resume. */ @JsonProperty("disabledMcpServers") List disabledMcpServers, + /** Non-secret host-managed HTTP MCP servers keyed by stable managed identity. Managed provenance is runtime-established from this separate field and credentials are supplied through dynamic-header refresh. */ + @JsonProperty("managedMcpServers") Map managedMcpServers, /** Whether to include instructions from every MCP server in the system prompt instead of only allowlisted servers. */ @JsonProperty("allowAllMcpServerInstructions") Boolean allowAllMcpServerInstructions, /** Additional directories to search for skills. */ diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesParams.java index 2943192041..9c488a8287 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesParams.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesParams.java @@ -28,7 +28,7 @@ public record SessionSendMessagesParams( /** Target session identifier */ @JsonProperty("sessionId") String sessionId, - /** The user messages to append to the conversation, in order. May be empty, in which case a single turn runs over the existing history with no new user message. */ + /** The user messages to append to the conversation, in order, before running one agent loop. When the batch starts a run, its final message is the primary initiating message; earlier messages provide context, not separate runs or replies. May be empty, in which case a single turn runs over the existing history with no new user message or originatingMessageId. */ @JsonProperty("messages") List messages, /** How to deliver the messages. `enqueue` (default) appends to the message queue. `immediate` interjects during an in-progress turn. */ @JsonProperty("mode") SendMode mode, @@ -38,6 +38,8 @@ public record SessionSendMessagesParams( @JsonProperty("agentMode") SendAgentMode agentMode, /** Custom HTTP headers to include in outbound model requests for this turn. Merged with session-level provider headers; per-turn headers augment and overwrite session-level headers with the same key. */ @JsonProperty("requestHeaders") Map requestHeaders, + /** Provider-native output format for the whole turn, including an empty message batch and all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. */ + @JsonProperty("responseFormat") SessionSendMessagesParamsResponseFormat responseFormat, /** W3C Trace Context traceparent header for distributed tracing of this agent turn */ @JsonProperty("traceparent") String traceparent, /** W3C Trace Context tracestate header for distributed tracing */ @@ -45,4 +47,14 @@ public record SessionSendMessagesParams( /** If true, await completion of the agentic loop for this turn before returning. Defaults to false (fire-and-forget). When true, the result still contains the same `messageIds`; the caller can rely on the agent having processed the messages before the call resolves. Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally blocks until the completed turn's event tail has been dispatched to this session's in-process subscribers, so a subsequent read of subscriber state already reflects the turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery follows over the wire. Callers that need the stronger local guarantee on remote sessions should await the event stream explicitly. */ @JsonProperty("wait") Boolean wait_ ) { + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public record SessionSendMessagesParamsResponseFormat( + /** JSON Schema and provider options for the turn's output. */ + @JsonProperty("jsonSchema") JsonSchemaResponseFormat jsonSchema, + /** Output format discriminator. Currently only json_schema is supported. */ + @JsonProperty("type") String type + ) { + } } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesResult.java index aeb556ba0f..5fbdac79a6 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesResult.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendMessagesResult.java @@ -25,7 +25,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public record SessionSendMessagesResult( - /** Unique identifiers assigned to the messages, one per provided message in order. Empty when no messages were provided. */ + /** Unique identifiers assigned to the messages, one per provided message in order. For a batch that starts a run, assistant messages use the final ID as originatingMessageId throughout that run, including tool iterations and stop-hook corrections. Immediate steering does not replace the active run's origin. Empty when no messages were provided; that run has no originatingMessageId. */ @JsonProperty("messageIds") List messageIds ) { } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendParams.java index f19c85ebe2..964c48b438 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendParams.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionSendParams.java @@ -48,6 +48,8 @@ public record SessionSendParams( @JsonProperty("agentMode") SendAgentMode agentMode, /** Custom HTTP headers to include in outbound model requests for this turn. Merged with session-level provider headers; per-turn headers augment and overwrite session-level headers with the same key. */ @JsonProperty("requestHeaders") Map requestHeaders, + /** Provider-native output format for this turn, including all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. */ + @JsonProperty("responseFormat") SessionSendParamsResponseFormat responseFormat, /** W3C Trace Context traceparent header for distributed tracing of this agent turn */ @JsonProperty("traceparent") String traceparent, /** W3C Trace Context tracestate header for distributed tracing */ @@ -55,4 +57,14 @@ public record SessionSendParams( /** If true, await completion of the agentic loop for this message before returning. Defaults to false (fire-and-forget). When true, the result still contains the same `messageId`; the caller can rely on the agent having processed the message before the call resolves. Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally blocks until the completed turn's event tail has been dispatched to this session's in-process subscribers, so a subsequent read of subscriber state already reflects the turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery follows over the wire. Callers that need the stronger local guarantee on remote sessions should await the event stream explicitly. */ @JsonProperty("wait") Boolean wait_ ) { + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public record SessionSendParamsResponseFormat( + /** JSON Schema and provider options for the turn's output. */ + @JsonProperty("jsonSchema") JsonSchemaResponseFormat jsonSchema, + /** Output format discriminator. Currently only json_schema is supported. */ + @JsonProperty("type") String type + ) { + } } diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionOptions.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionOptions.java deleted file mode 100644 index e19737e32e..0000000000 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionOptions.java +++ /dev/null @@ -1,27 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - *--------------------------------------------------------------------------------------------*/ - -// AUTO-GENERATED FILE - DO NOT EDIT -// Generated from: api.schema.json - -package com.github.copilot.generated.rpc; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import javax.annotation.processing.Generated; - -/** - * Optional registration options. - * - * @since 1.0.0 - */ -@javax.annotation.processing.Generated("copilot-sdk-codegen") -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public record SessionsRegisterExtensionToolsOnSessionOptions( - /** In-process `() => boolean` gating callback used only by the CLI. */ - @JsonProperty("enabled") Object enabled -) { -} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionParams.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionParams.java deleted file mode 100644 index 7fcb3322e9..0000000000 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SessionsRegisterExtensionToolsOnSessionParams.java +++ /dev/null @@ -1,34 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - *--------------------------------------------------------------------------------------------*/ - -// AUTO-GENERATED FILE - DO NOT EDIT -// Generated from: api.schema.json - -package com.github.copilot.generated.rpc; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.github.copilot.CopilotExperimental; -import javax.annotation.processing.Generated; - -/** - * Params to attach an extension loader's tools to a session. - * - * @apiNote This method is experimental and may change in a future version. - * @since 1.0.0 - */ -@CopilotExperimental -@javax.annotation.processing.Generated("copilot-sdk-codegen") -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public record SessionsRegisterExtensionToolsOnSessionParams( - /** Session to register extension tools on. */ - @JsonProperty("sessionId") String sessionId, - /** In-process ExtensionLoader handle used only by the CLI and excluded from the public SDK surface. */ - @JsonProperty("loader") Object loader, - /** Optional registration options. */ - @JsonProperty("options") SessionsRegisterExtensionToolsOnSessionOptions options -) { -} diff --git a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SlashCommandTextResult.java b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SlashCommandTextResult.java index 5f232e8b9c..015fa1f5f1 100644 --- a/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SlashCommandTextResult.java +++ b/java/sdk/src/generated/java/com/github/copilot/generated/rpc/SlashCommandTextResult.java @@ -44,6 +44,10 @@ public final class SlashCommandTextResult extends SlashCommandInvocationResult { @JsonProperty("runtimeSettingsChanged") private Boolean runtimeSettingsChanged; + /** Present when the invocation changed the sandbox for this session only. Nothing was persisted, so consumers must mirror the change onto the live session rather than reloading settings, and must not treat it as a settings change. */ + @JsonProperty("sandboxSessionChange") + private SandboxSessionChange sandboxSessionChange; + public String getText() { return text; } public void setText(String text) { this.text = text; } @@ -55,4 +59,7 @@ public final class SlashCommandTextResult extends SlashCommandInvocationResult { public Boolean getRuntimeSettingsChanged() { return runtimeSettingsChanged; } public void setRuntimeSettingsChanged(Boolean runtimeSettingsChanged) { this.runtimeSettingsChanged = runtimeSettingsChanged; } + + public SandboxSessionChange getSandboxSessionChange() { return sandboxSessionChange; } + public void setSandboxSessionChange(SandboxSessionChange sandboxSessionChange) { this.sandboxSessionChange = sandboxSessionChange; } } diff --git a/java/sdk/src/test/java/com/github/copilot/McpOAuthE2ETest.java b/java/sdk/src/test/java/com/github/copilot/McpOAuthE2ETest.java index 623033a4aa..0eb6765174 100644 --- a/java/sdk/src/test/java/com/github/copilot/McpOAuthE2ETest.java +++ b/java/sdk/src/test/java/com/github/copilot/McpOAuthE2ETest.java @@ -167,7 +167,7 @@ void testShouldRequestReplacementTokensAcrossMcpOauthLifecycle() throws Exceptio assertNotNull(request.wwwAuthenticateParams()); assertEquals(oauthServer.url() + "/.well-known/oauth-protected-resource", request.wwwAuthenticateParams().resourceMetadataUrl()); - assertEquals("mcp.write", request.wwwAuthenticateParams().scope()); + assertEquals("mcp.read mcp.write", request.wwwAuthenticateParams().scope()); assertEquals("insufficient_scope", request.wwwAuthenticateParams().error()); yield McpAuthResult.token(new McpAuthToken(UPSCOPE_TOKEN, null, null)); } diff --git a/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java b/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java index a51a7eab53..676ef3d943 100644 --- a/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java +++ b/java/sdk/src/test/java/com/github/copilot/RpcSessionStateExtrasE2ETest.java @@ -59,7 +59,7 @@ void testShouldAddByokProviderAndModelAtRuntime() throws Exception { ProviderConfigWireApi.COMPLETIONS, null, "https://models.example.test/v1", "provider-key", null, null, Map.of("x-provider", "java"), null)), List.of(new ProviderModelConfig("small", "java-e2e-provider", null, null, "Java Added Model", - 4096L, null, null, null)))) + 4096L, null, null, null, null)))) .get(30, TimeUnit.SECONDS); assertEquals(1, result.models().size()); diff --git a/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java b/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java index 83913e82b1..a3891849ae 100644 --- a/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java +++ b/java/sdk/src/test/java/com/github/copilot/SessionEventHandlingTest.java @@ -1005,8 +1005,9 @@ private SessionStartEvent createSessionStartEvent(String sessionId) { private AssistantMessageEvent createAssistantMessageEvent(String content) { var event = new AssistantMessageEvent(); - var data = new AssistantMessageEvent.AssistantMessageEventData(null, null, content, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + var data = new AssistantMessageEvent.AssistantMessageEventData(null, null, null, content, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null); event.setData(data); return event; } diff --git a/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java b/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java index 9f9e1c441b..908f12e825 100644 --- a/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java +++ b/java/sdk/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java @@ -653,7 +653,7 @@ void sessionLogResult_record() { @Test void sessionMcpListResult_nested() { var metadata = new McpServerMetadata("Use this server for repository operations."); - var server = new McpServer("my-mcp", McpServerStatus.CONNECTED, McpServerSource.USER, null, null, null, + var server = new McpServer("my-mcp", McpServerStatus.CONNECTED, McpServerSource.USER, null, null, null, null, metadata); var result = new SessionMcpListResult(List.of(server), null); assertEquals(1, result.servers().size()); diff --git a/nodejs/package.json b/nodejs/package.json index 8805d0d4d8..d1565035d8 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -5,7 +5,7 @@ "url": "https://github.com/github/copilot-sdk.git" }, "version": "0.0.0-dev", - "copilotCliVersion": "1.0.84-5", + "copilotCliVersion": "1.0.84-6", "description": "TypeScript SDK for programmatic control of GitHub Copilot CLI via JSON-RPC", "main": "./dist/cjs/index.js", "types": "./dist/index.d.ts", diff --git a/nodejs/src/cliVersion.ts b/nodejs/src/cliVersion.ts index fc4c85afce..4e7d99b1ea 100644 --- a/nodejs/src/cliVersion.ts +++ b/nodejs/src/cliVersion.ts @@ -1,3 +1,3 @@ -export const COPILOT_CLI_VERSION = "1.0.84-5"; +export const COPILOT_CLI_VERSION = "1.0.84-6"; export const COPILOT_CLI_USE_NPM_PACKAGE = false; diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts index 09bfc8ffa7..43277362af 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -943,7 +943,7 @@ export type DebugCollectLogsSource = /** Caller-provided diagnostic entry. */ | "additional"; /** - * Destination for the redacted debug bundle. + * Destination for the session debug bundle. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "DebugCollectLogsDestination". @@ -966,7 +966,7 @@ export type DebugCollectLogsDestination = } | { /** - * Directory where redacted files should be staged. The directory is created if needed. + * Directory where files should be staged. The directory is created if needed. */ outputDirectory: string; /** @@ -997,7 +997,9 @@ export type DebugCollectLogsRedaction = /** Redact the file as plain UTF-8 log text. */ | "plain-text" /** Redact each non-empty line as a session event JSON object, falling back to plain-text redaction for malformed lines. */ - | "events-jsonl"; + | "events-jsonl" + /** No redaction is applied. The caller must ensure any necessary redaction is performed before this call. */ + | "none"; /** * Destination kind that was written. * @@ -1008,7 +1010,7 @@ export type DebugCollectLogsRedaction = export type DebugCollectLogsResultKind = /** A .tgz archive was written. */ | "archive" - /** A directory containing redacted files was written. */ + /** A directory containing the collected files was written. */ | "directory"; /** * Persisted extension discovery source @@ -1934,6 +1936,10 @@ export type McpHeadersHandlePendingHeadersRefreshRequest = headers: { [k: string]: string | undefined; }; + /** + * Optional lifetime in milliseconds for these returned headers. The runtime clamps its configured cache lifetime to this value. + */ + ttlMs?: number; /** * Headers-refresh response variant discriminator. */ @@ -1944,6 +1950,16 @@ export type McpHeadersHandlePendingHeadersRefreshRequest = * Headers-refresh response variant discriminator. */ kind: "none"; + } + | { + /** + * Host credential broker failure, denial, or revocation reason. + */ + message: string; + /** + * Headers-refresh response variant discriminator. + */ + kind: "error"; }; /** * One eligible way to run the server, represented as a tagged package or remote variant so package identity and endpoint states cannot contradict the install method. @@ -2938,6 +2954,12 @@ export type PluginsReloadRequest = */ deferRepoHooks?: boolean; }; + +/** @experimental */ +export type ProtocolAppendMode = "append"; + +/** @experimental */ +export type ProtocolCustomizeMode = "customize"; /** * Controls whether the runtime may defer loading an external tool definition. * @@ -2950,6 +2972,44 @@ export type ProtocolExternalToolDefer = | "auto" /** The runtime must include the tool without deferring it. */ | "never"; + +/** @experimental */ +export type ProtocolMarkerSectionOverride = + | { + /** + * Section override action discriminator. + */ + action: "transform"; + } + | { + /** + * Section override action discriminator. + */ + action: "preserve"; + }; + +/** @experimental */ +export type ProtocolReplaceMode = "replace"; + +/** @experimental */ +export type ProtocolSectionOverride = ProtocolStaticSectionOverride | ProtocolMarkerSectionOverride; + +/** @experimental */ +export type ProtocolStaticSectionAction = + /** Replace the section content. */ + | "replace" + /** Remove the section content. */ + | "remove" + /** Append content to the section. */ + | "append" + /** Prepend content to the section. */ + | "prepend"; + +/** @experimental */ +export type ProtocolSystemMessageConfig = + | ProtocolSystemMessageAppendConfig + | ProtocolSystemMessageReplaceConfig + | ProtocolSystemMessageCustomizeConfig; /** * Provider family. Matches the `type` field of a BYOK provider config. * @@ -3136,6 +3196,20 @@ export type RemoteSessionMetadataTaskType = | "cca" /** CLI remote task. */ | "cli"; +/** + * Provider-native structured output format. JSON Schema is forwarded without rewriting or validating the schema or the generated output. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ResponseFormat". + */ +/** @experimental */ +export type ResponseFormat = { + jsonSchema: JsonSchemaResponseFormat; + /** + * Output format discriminator. Currently only json_schema is supported. + */ + type: "json_schema"; +}; /** * Origin of the sandbox choice supplied by an internal client. * @@ -3159,6 +3233,18 @@ export type SandboxConfigSource = | "unsupported_host" /** A repository policy selected the sandbox state. */ | "repository_policy"; +/** + * A session-scoped sandbox transition applied while handling a slash command + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "SandboxSessionChange". + */ +/** @experimental */ +export type SandboxSessionChange = + /** The sandbox is off for the rest of this session; nothing was persisted and a new session starts from managed policy. */ + | "disabled" + /** A previous session-scoped opt-out was cleared and the sandbox is enforced again. */ + | "restored"; /** * Current authentication information, or null when no authentication is active. * @@ -7336,7 +7422,7 @@ export interface CurrentToolMetadata { deferLoading?: boolean; } /** - * A file included in the redacted debug bundle. + * A file included in the session debug bundle. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "DebugCollectLogsCollectedEntry". @@ -7414,7 +7500,7 @@ export interface DebugCollectLogsInclude { previousProcessLogLimit?: number; } /** - * Options for collecting a redacted session debug bundle. + * Options for collecting a session debug bundle with configurable redaction. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "DebugCollectLogsRequest". @@ -7429,7 +7515,7 @@ export interface DebugCollectLogsRequest { additionalEntries?: DebugCollectLogsEntry[]; } /** - * Result of collecting a redacted debug bundle. + * Result of collecting a session debug bundle. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "DebugCollectLogsResult". @@ -7442,7 +7528,7 @@ export interface DebugCollectLogsResult { */ path: string; /** - * Files included in the redacted bundle. + * Files included in the bundle. */ entries: DebugCollectLogsCollectedEntry[]; /** @@ -10042,6 +10128,10 @@ export interface InstalledPluginInfo { * 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; + /** + * Runtime-reported plugin provenance. Currently set to "builtin" only for plugins registered through the trusted host built-in boundary; absent for installed, marketplace, direct, and live plugins. + */ + source?: string; } /** * Canonical file or directory where custom instructions can be discovered or created, with location, kind, preference, and project path. @@ -10195,6 +10285,31 @@ export interface InterruptMainTurnResult { */ interrupted: boolean; } +/** + * A JSON Schema output contract. OpenAI receives the name, description, schema and strict setting; Anthropic receives the schema in output_config.format and always uses its native strict enforcement. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "JsonSchemaResponseFormat". + */ +/** @experimental */ +export interface JsonSchemaResponseFormat { + /** + * Name of the output schema, subject to the provider's naming restrictions. + */ + name: string; + /** + * JSON Schema passed unchanged to the inference provider. Schemas larger than 32 MiB when JSON-encoded are rejected before admission, using the runtime's existing request-size ceiling. This is not a guarantee that the entire model request fits. Supported keywords and schema restrictions are determined by the provider. + */ + schema: JsonValue; + /** + * Optional description passed to OpenAI providers. + */ + description?: string; + /** + * Optional strict enforcement setting for OpenAI providers. Omitted uses the provider default. Anthropic always enforces its supported schema subset. + */ + strict?: boolean; +} /** * HTTP headers as a map from lowercased header name to a list of values. Multi-valued headers (e.g. Set-Cookie) preserve all values. * @@ -10541,6 +10656,35 @@ export interface LspInitializeRequest { */ force?: boolean; } +/** + * Non-secret host-managed HTTP MCP server configuration. The containing map key is the stable managed identity; credentials are supplied dynamically by the host. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ManagedMcpServerConfig". + */ +/** @experimental */ +export interface ManagedMcpServerConfig { + /** + * Human-readable catalog display name. + */ + displayName: string; + /** + * Hosted MCP streamable HTTP endpoint. + */ + url: string; + /** + * Tools to include. Defaults to all tools when omitted. + */ + tools?: string[]; + /** + * Timeout in milliseconds for tool discovery and tool calls. + */ + timeout?: number; + /** + * Maximum dynamic-header cache lifetime in milliseconds. + */ + headersRefreshTtlMs?: number; +} /** * Validated device-managed settings discovered before a session exists. * @@ -12585,6 +12729,10 @@ export interface McpServer { * Plugin version that provided this server, when source is plugin. */ sourcePluginVersion?: string; + /** + * Human-readable display name supplied by a managed server catalog. + */ + displayName?: string; /** * Error message if the server failed to connect */ @@ -15990,6 +16138,64 @@ export interface ProtocolExternalToolDefinition { [k: string]: JsonValue | undefined; }; } + +/** @experimental */ +export interface ProtocolStaticSectionOverride { + action: ProtocolStaticSectionAction; + /** + * Optional content used by replace, append, and prepend operations. + */ + content?: string; +} + +/** @experimental */ +export interface ProtocolSystemMessageAppendConfig { + mode?: ProtocolAppendMode; + /** + * Text appended to the standard system prompt. + */ + content?: string; +} + +/** @experimental */ +export interface ProtocolSystemMessageReplaceConfig { + mode: ProtocolReplaceMode; + /** + * Complete replacement system-message text. + */ + content: string; + /** + * Optional structured blocks corresponding to the replacement content. + */ + contentBlocks?: SystemMessageBlock[]; +} + +/** @experimental */ +export interface SystemMessageBlock { + /** + * Text content for this system-message block. + */ + content: string; + /** + * Whether the block is static and may be cached independently of dynamic prompt content. + */ + isStatic?: boolean; +} + +/** @experimental */ +export interface ProtocolSystemMessageCustomizeConfig { + mode: ProtocolCustomizeMode; + /** + * Named standard-prompt section overrides. + */ + sections?: { + [k: string]: ProtocolSectionOverride; + }; + /** + * Text appended after the customized sections. + */ + content?: string; +} /** * BYOK providers and/or models to add to the session's registry at runtime. Both fields are optional; provide providers, models, or both. * @@ -16048,6 +16254,7 @@ export interface ProviderModelConfig { */ maxOutputTokens?: number; capabilities?: ModelCapabilitiesOverride; + systemMessage?: ProtocolSystemMessageConfig; } /** * The selectable model entries synthesized for the models added by this call. @@ -17118,62 +17325,6 @@ export interface RegisterEventInterestResult { */ handle: string; } -/** - * Params to attach an extension loader's tools to a session. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "RegisterExtensionToolsParams". - */ -/** @experimental */ -/** @internal */ -export interface RegisterExtensionToolsParams { - /** - * Session to register extension tools on. - */ - sessionId: string; - /** - * In-process ExtensionLoader handle used only by the CLI and excluded from the public SDK surface. - * - * @internal - * - * @internal - */ - loader: OpaqueInProcessValue; - options?: SessionsRegisterExtensionToolsOnSessionOptions; -} -/** - * Optional registration options. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "SessionsRegisterExtensionToolsOnSessionOptions". - */ -/** @experimental */ -export interface SessionsRegisterExtensionToolsOnSessionOptions { - /** - * In-process `() => boolean` gating callback used only by the CLI. - * - * @internal - */ - enabled?: OpaqueInProcessValue; -} -/** - * Handle for releasing the extension tool registration. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "RegisterExtensionToolsResult". - */ -/** @experimental */ -/** @internal */ -export interface RegisterExtensionToolsResult { - /** - * In-process unsubscribe function used only by the CLI. - * - * @internal - * - * @internal - */ - unsubscribe: OpaqueInProcessValue; -} /** * Opaque handle previously returned by `registerInterest` to release. * @@ -17618,6 +17769,14 @@ export interface SandboxConfigUserPolicyFilesystem { */ /** @experimental */ export interface SandboxConfigUserPolicyNetwork { + /** + * Hosts allowed through the built-in sandbox proxy. A non-empty list denies unmatched hosts; an absent or empty list allows all hosts not blocked. Supports exact hostnames, IP addresses, and *.example.com for strict subdomains. Host rules do not override the outbound or local-network toggles. + */ + allowedHosts?: string[]; + /** + * Hosts denied by the built-in sandbox proxy. Deny rules take precedence over allowedHosts. A domain also denies all its subdomains. IP addresses match exactly; *.example.com matches strict subdomains, and * denies every host. + */ + blockedHosts?: string[]; /** * Whether outbound network traffic is allowed at all. */ @@ -18068,7 +18227,7 @@ export interface SendMessageItem { /** @experimental */ export interface SendMessagesRequest { /** - * The user messages to append to the conversation, in order. May be empty, in which case a single turn runs over the existing history with no new user message. + * The user messages to append to the conversation, in order, before running one agent loop. When the batch starts a run, its final message is the primary initiating message; earlier messages provide context, not separate runs or replies. May be empty, in which case a single turn runs over the existing history with no new user message or originatingMessageId. */ messages: SendMessageItem[]; mode?: SendMode; @@ -18083,6 +18242,7 @@ export interface SendMessagesRequest { requestHeaders?: { [k: string]: string | undefined; }; + responseFormat?: ResponseFormat; /** * W3C Trace Context traceparent header for distributed tracing of this agent turn */ @@ -18105,7 +18265,7 @@ export interface SendMessagesRequest { /** @experimental */ export interface SendMessagesResult { /** - * Unique identifiers assigned to the messages, one per provided message in order. Empty when no messages were provided. + * Unique identifiers assigned to the messages, one per provided message in order. For a batch that starts a run, assistant messages use the final ID as originatingMessageId throughout that run, including tool iterations and stop-hook corrections. Immediate steering does not replace the active run's origin. Empty when no messages were provided; that run has no originatingMessageId. */ messageIds: string[]; } @@ -18155,6 +18315,7 @@ export interface SendRequest { requestHeaders?: { [k: string]: string | undefined; }; + responseFormat?: ResponseFormat; /** * W3C Trace Context traceparent header for distributed tracing of this agent turn */ @@ -19329,7 +19490,7 @@ export interface SessionOpenOptions { */ expAssignments?: JsonValue; /** - * Opt-in: self-fetch and enforce enterprise managed settings at session bootstrap. + * Opt-in: self-fetch and enforce enterprise managed settings, including managed hook policies, at session bootstrap. */ enableManagedSettings?: boolean; managedSettings?: SessionManagedSettings; @@ -19437,6 +19598,14 @@ export interface SessionOpenOptions { * MCP server names disabled for this session. Disabled servers are not started or authenticated on create or cold resume. */ disabledMcpServers?: string[]; + /** + * Non-secret host-managed HTTP MCP servers keyed by stable managed identity. Managed provenance is runtime-established from this separate field and credentials are supplied through dynamic-header refresh. + * + * @experimental + */ + managedMcpServers?: { + [k: string]: ManagedMcpServerConfig; + }; /** * Whether to include instructions from every MCP server in the system prompt instead of only allowlisted servers. */ @@ -21605,6 +21774,7 @@ export interface SlashCommandTextResult { * True when the invocation mutated user runtime settings; consumers caching settings should refresh */ runtimeSettingsChanged?: boolean; + sandboxSessionChange?: SandboxSessionChange; } /** * Slash-command invocation result asking the client to present subcommand options for a parent command. @@ -25178,16 +25348,7 @@ export function createInternalServerRpc(connection: MessageConnection) { getBoardEntryCount: async (params: SessionsGetBoardEntryCountRequest): Promise => connection.sendRequest("sessions.getBoardEntryCount", params), /** - * Registers extension-provided tools on the given session, gated by an optional `enabled` callback. Returns an opaque unsubscribe function the caller must invoke to deregister the tools when the extension is torn down. Marked internal because `loader`, `enabled`, and the returned `unsubscribe` are in-process handles that cannot cross the JSON-RPC boundary. Disappears once extension discovery / launch / tool registration are owned by the runtime: SDK consumers will pass pure config (search paths, disabled ids) via `SessionOptions` and the runtime will resolve, launch, register, and tear down extensions itself. - * - * @param params Params to attach an extension loader's tools to a session. - * - * @returns Handle for releasing the extension tool registration. - */ - registerExtensionToolsOnSession: async (params: RegisterExtensionToolsParams): Promise => - connection.sendRequest("sessions.registerExtensionToolsOnSession", params), - /** - * Attaches (or detaches) an in-process ExtensionController delegate for the given session, used by shared-API surfaces that need to query or modify the session's extension state. Pass `controller: undefined` to detach. Marked internal because the controller is an in-process object that cannot cross the JSON-RPC boundary. Disappears alongside `registerExtensionToolsOnSession`: once the runtime owns extension management, the public surface exposes list/enable/disable/reload as dedicated RPCs served by the runtime. + * Attaches (or detaches) an in-process ExtensionController delegate for the given session in a local host adapter. Pass `controller: undefined` to detach. Internal because the controller cannot cross the JSON-RPC boundary; the runtime manages its own session extension service. * * @param params Params to attach or detach an in-process ExtensionController delegate. */ @@ -25310,11 +25471,11 @@ export function createSessionRpc(connection: MessageConnection, sessionId: strin /** @experimental */ debug: { /** - * Collects a redacted session debug log bundle into a local archive or staging directory. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape. + * Collects a session debug log bundle into a local archive or staging directory. Logs are redacted by default; redaction can be configured per caller-provided diagnostic entry. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape. * - * @param params Options for collecting a redacted session debug bundle. + * @param params Options for collecting a session debug bundle with configurable redaction. * - * @returns Result of collecting a redacted debug bundle. + * @returns Result of collecting a session debug bundle. */ collectLogs: async (params: DebugCollectLogsRequest): Promise => connection.sendRequest("session.debug.collectLogs", { sessionId, ...params }), diff --git a/nodejs/src/generated/session-events.ts b/nodejs/src/generated/session-events.ts index 5bd67b8042..d6d094e69d 100644 --- a/nodejs/src/generated/session-events.ts +++ b/nodejs/src/generated/session-events.ts @@ -645,6 +645,20 @@ export type AbortReason = | "user_abort" /** Autopilot stopped the run because the active objective reached its user-set --max-ai-credits limit. */ | "autopilot_credit_limit"; +/** + * Configuration source: user, workspace, plugin, builtin, or managed + */ +export type McpServerSource = + /** Server configured in the user's global MCP configuration. */ + | "user" + /** Server configured by the current workspace. */ + | "workspace" + /** Server contributed by an installed plugin. */ + | "plugin" + /** Server bundled with the runtime. */ + | "builtin" + /** Server supplied by a trusted host-managed catalog. */ + | "managed"; /** * Transport mechanism: stdio, http, sse (deprecated), or memory (in-process MCP server) */ @@ -735,18 +749,6 @@ export type SkillInvokedTrigger = | "agent-invoked" /** Skill content loaded as part of another context, such as a configured custom agent or subagent. */ | "context-load"; -/** - * Where the model input for a task-tool sub-agent came from. - */ -export type SubagentTaskModelSource = - /** The spawning agent supplied the task tool's model argument. */ - | "task_argument" - /** The task omitted a model and the per-sub-agent settings entry supplied a concrete one. */ - | "subagent_configuration" - /** The task omitted a model and the user-defined custom agent's definition supplied one. */ - | "custom_agent_definition" - /** Neither the task call, the per-sub-agent settings entry, nor a custom agent definition supplied a model. */ - | "unset"; /** * Authority or runtime mechanism responsible for sub-agent model selection. */ @@ -765,6 +767,18 @@ export type SubagentModelSelectionSource = | "agent_definition_default" /** Runtime policy, Auto mode, or an experiment selected the model. */ | "runtime_policy"; +/** + * Where the model input for a task-tool sub-agent came from. + */ +export type SubagentTaskModelSource = + /** The spawning agent supplied the task tool's model argument. */ + | "task_argument" + /** The task omitted a model and the per-sub-agent settings entry supplied a concrete one. */ + | "subagent_configuration" + /** The task omitted a model and the user-defined custom agent's definition supplied one. */ + | "custom_agent_definition" + /** Neither the task call, the per-sub-agent settings entry, nor a custom agent definition supplied a model. */ + | "unset"; /** * Binary asset type discriminator. Use "image" for images and "resource" otherwise. */ @@ -1055,6 +1069,8 @@ export type McpHeadersRefreshCompletedOutcome = | "headers" /** The host responded with no dynamic headers. */ | "none" + /** The host credential broker rejected or failed the refresh. */ + | "error" /** No response arrived within the bounded window. */ | "timeout"; /** @@ -1200,18 +1216,6 @@ export type AgentModelPolicy = | "preferred" /** Require subagent execution to use one of the authored models. */ | "required"; -/** - * Configuration source: user, workspace, plugin, or builtin - */ -export type McpServerSource = - /** Server configured in the user's global MCP configuration. */ - | "user" - /** Server configured by the current workspace. */ - | "workspace" - /** Server contributed by an installed plugin. */ - | "plugin" - /** Server bundled with the runtime. */ - | "builtin"; /** * Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured */ @@ -5076,6 +5080,10 @@ export interface AssistantMessageData { * Model that produced this assistant message, if known */ model?: string; + /** + * Logical ID of the primary user message that initiated this run, matching the messageId returned by session.send (or the last messageId of session.sendMessages). Stable across model/tool iterations, steering messages, and stop-hook corrections. Subagent runs use their own initiating message ID, not the parent's. Absent for runs without an associated initiating message, such as empty batches. + */ + originatingMessageId?: string; /** * Actual output token count from the API response (completion_tokens), used for accurate token accounting */ @@ -6233,6 +6241,11 @@ export interface ToolExecutionStartData { * @experimental */ fusion?: FusionAttribution; + /** + * Preferred lookup name for the MCP server hosting this tool: the configured (namespaced) config-map key when the tool carries one, otherwise the display name from `mcpServerName`. Present when the tool is an MCP tool; this is the name unrestricted provenance telemetry hashes so it joins with `mcp_server_setup`, which keys off the configured name too. + */ + mcpConfigServerName?: string; + mcpConfigSource?: McpServerSource; /** * Name of the MCP server hosting this tool, when the tool is an MCP tool */ @@ -6540,7 +6553,7 @@ export interface ToolExecutionCompleteResult { */ contents?: ToolExecutionCompleteContent[]; /** - * Full detailed tool result for UI/timeline display, preserving complete content such as diffs. Falls back to content when absent. + * Detailed tool result for UI/timeline display, preserving complete content such as diffs for most tools. Successful skill invocations intentionally use the concise model-facing content here; the authoritative skill body is carried by the corresponding skill invocation event. Falls back to content when absent. */ detailedContent?: string; /** @@ -7164,6 +7177,7 @@ export interface SubagentStartedData { * Model the sub-agent will run with, when known at start. */ model?: string; + modelSelectionSource?: SubagentModelSelectionSource; /** * Task-registry ID of the spawning sub-agent. Absent when the root session spawned this child. */ @@ -7537,7 +7551,7 @@ export interface HookStartData { */ hookType: string; /** - * Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) elides the tool result's inline `contents`/`uiResource` and replaces an over-long `textResultForLlm` with a `[copilot:elided ...]` marker, to keep a multi-megabyte payload out of the durable event log; the live subscription stream still delivers the full value. Read the adjacent tool.execution_complete event for the tool result itself. + * Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) drops the tool result's inline `contents`/`uiResource`/`skillInvocation` and replaces duplicated text result fields with a `[copilot:elided ...]` marker; the live subscription stream still delivers the full value. Canonical tool output remains in the adjacent tool.execution_complete event, while an invoked skill's authoritative body remains in its skill invocation event. */ input?: JsonValue; /** @@ -7589,7 +7603,7 @@ export interface HookEndData { */ hookType: string; /** - * Output data produced by the hook + * Output data produced by the hook. Durable and resumed postToolUse receipts may omit messages owned by a successful skill invocation and replace an unchanged skill sessionLog copy with an elision marker; hook-modified or re-sourced values are preserved, and the authoritative body remains in the skill invocation event. */ output?: JsonValue; /** @@ -11661,6 +11675,10 @@ export interface McpServersLoadedData { * A single MCP server status summary in `session.mcp_servers_loaded`, including name, status, source, transport, and plugin metadata. */ export interface McpServersLoadedServer { + /** + * Human-readable display name supplied by a managed server catalog. + */ + displayName?: string; /** * Error message if the server failed to connect */ diff --git a/nodejs/test/e2e/mcp_oauth.e2e.test.ts b/nodejs/test/e2e/mcp_oauth.e2e.test.ts index cd7a6b88c7..ab68afc2ef 100644 --- a/nodejs/test/e2e/mcp_oauth.e2e.test.ts +++ b/nodejs/test/e2e/mcp_oauth.e2e.test.ts @@ -251,7 +251,7 @@ describe("MCP OAuth host auth", async () => { const upscopeRequest = authRequests.find((request) => request.reason === "upscope"); expect(upscopeRequest?.wwwAuthenticateParams).toEqual({ resourceMetadataUrl: `${oauthServer.url}/.well-known/oauth-protected-resource`, - scope: "mcp.write", + scope: "mcp.read mcp.write", error: "insufficient_scope", }); expect(upscopeRequest?.resourceMetadata).toBe( diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py index 237ec09620..c9d7c99f43 100644 --- a/python/copilot/generated/rpc.py +++ b/python/copilot/generated/rpc.py @@ -870,68 +870,6 @@ def to_dict(self) -> dict: result["cancelled"] = from_bool(self.cancelled) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class CanvasAction: - """Canvas action that the agent or host can invoke. To discover the input schema for a - particular action, call the list_canvas_capabilities tool. - """ - name: str - """Action name exposed by the canvas provider""" - - description: str | None = None - """Description of the action""" - - input_schema: Any = None - """JSON Schema for the action input""" - - @staticmethod - def from_dict(obj: Any) -> 'CanvasAction': - assert isinstance(obj, dict) - name = from_str(obj.get("name")) - description = from_union([from_str, from_none], obj.get("description")) - input_schema = obj.get("inputSchema") - return CanvasAction(name, description, input_schema) - - def to_dict(self) -> dict: - result: dict = {} - result["name"] = from_str(self.name) - if self.description is not None: - result["description"] = from_union([from_str, from_none], self.description) - if self.input_schema is not None: - result["inputSchema"] = self.input_schema - return result - -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class CanvasActionInvokeRequest: - """Canvas action invocation parameters.""" - - action_name: str - """Action name to invoke""" - - instance_id: str - """Open canvas instance identifier""" - - input: Any = None - """Action input""" - - @staticmethod - def from_dict(obj: Any) -> 'CanvasActionInvokeRequest': - assert isinstance(obj, dict) - action_name = from_str(obj.get("actionName")) - instance_id = from_str(obj.get("instanceId")) - input = obj.get("input") - return CanvasActionInvokeRequest(action_name, instance_id, input) - - def to_dict(self) -> dict: - result: dict = {} - result["actionName"] = from_str(self.action_name) - result["instanceId"] = from_str(self.instance_id) - if self.input is not None: - result["input"] = self.input - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class CanvasCloseRequest: @@ -2503,11 +2441,14 @@ class DebugCollectLogsResultKind(Enum): # Experimental: this type is part of an experimental API and may change or be removed. class DebugCollectLogsRedaction(Enum): - """How text content from this entry should be redacted. Defaults to plain-text. + """How text content from this entry should be redacted. Defaults to plain-text. With none, + no redaction is applied; the caller must ensure any necessary redaction is performed + before this call. How a collected debug entry should be redacted before being staged. """ EVENTS_JSONL = "events-jsonl" + NONE = "none" PLAIN_TEXT = "plain-text" # Experimental: this type is part of an experimental API and may change or be removed. @@ -3611,15 +3552,6 @@ class FactoryLogLineKind(Enum): LOG = "log" PHASE = "phase" -# Experimental: this type is part of an experimental API and may change or be removed. -class FactoryPauseCheckpointAction(Enum): - """Action the runtime selected for a durable factory pause checkpoint. - - Whether this execution attempt must pause or may continue. - """ - CONTINUE = "continue" - PAUSE = "pause" - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class FactoryPauseCheckpointRequest: @@ -4514,6 +4446,51 @@ def to_dict(self) -> dict: result["interrupted"] = from_bool(self.interrupted) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class JSONSchemaResponseFormat: + """A JSON Schema output contract. OpenAI receives the name, description, schema and strict + setting; Anthropic receives the schema in output_config.format and always uses its native + strict enforcement. + + JSON Schema and provider options for the turn's output. + """ + name: str + """Name of the output schema, subject to the provider's naming restrictions.""" + + schema: Any = None + """JSON Schema passed unchanged to the inference provider. Schemas larger than 32 MiB when + JSON-encoded are rejected before admission, using the runtime's existing request-size + ceiling. This is not a guarantee that the entire model request fits. Supported keywords + and schema restrictions are determined by the provider. + """ + description: str | None = None + """Optional description passed to OpenAI providers.""" + + strict: bool | None = None + """Optional strict enforcement setting for OpenAI providers. Omitted uses the provider + default. Anthropic always enforces its supported schema subset. + """ + + @staticmethod + def from_dict(obj: Any) -> 'JSONSchemaResponseFormat': + assert isinstance(obj, dict) + name = from_str(obj.get("name")) + schema = obj.get("schema") + description = from_union([from_str, from_none], obj.get("description")) + strict = from_union([from_bool, from_none], obj.get("strict")) + return JSONSchemaResponseFormat(name, schema, description, strict) + + def to_dict(self) -> dict: + result: dict = {} + result["name"] = from_str(self.name) + result["schema"] = self.schema + if self.description is not None: + result["description"] = from_union([from_str, from_none], self.description) + if self.strict is not None: + result["strict"] = from_union([from_bool, from_none], self.strict) + return result + @dataclass class LlmInferenceHTTPRequestChunkRequest: """A request body chunk or cancellation signal.""" @@ -4811,6 +4788,49 @@ def to_dict(self) -> dict: result["workingDirectory"] = from_union([from_str, from_none], self.working_directory) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ManagedMCPServerConfig: + """Non-secret host-managed HTTP MCP server configuration. The containing map key is the + stable managed identity; credentials are supplied dynamically by the host. + """ + display_name: str + """Human-readable catalog display name.""" + + url: str + """Hosted MCP streamable HTTP endpoint.""" + + headers_refresh_ttl_ms: int | None = None + """Maximum dynamic-header cache lifetime in milliseconds.""" + + timeout: int | None = None + """Timeout in milliseconds for tool discovery and tool calls.""" + + tools: list[str] | None = None + """Tools to include. Defaults to all tools when omitted.""" + + @staticmethod + def from_dict(obj: Any) -> 'ManagedMCPServerConfig': + assert isinstance(obj, dict) + display_name = from_str(obj.get("displayName")) + url = from_str(obj.get("url")) + headers_refresh_ttl_ms = from_union([from_int, from_none], obj.get("headersRefreshTtlMs")) + timeout = from_union([from_int, from_none], obj.get("timeout")) + tools = from_union([lambda x: from_list(from_str, x), from_none], obj.get("tools")) + return ManagedMCPServerConfig(display_name, url, headers_refresh_ttl_ms, timeout, tools) + + def to_dict(self) -> dict: + result: dict = {} + result["displayName"] = from_str(self.display_name) + result["url"] = from_str(self.url) + if self.headers_refresh_ttl_ms is not None: + result["headersRefreshTtlMs"] = from_union([from_int, from_none], self.headers_refresh_ttl_ms) + if self.timeout is not None: + result["timeout"] = from_union([from_int, from_none], self.timeout) + if self.tools is not None: + result["tools"] = from_union([lambda x: from_list(from_str, x), from_none], self.tools) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ManagedSettingsReadResult: @@ -5542,6 +5562,7 @@ def to_dict(self) -> dict: return result class MCPHeadersHandlePendingHeadersRefreshRequestKind(Enum): + ERROR = "error" HEADERS = "headers" NONE = "none" @@ -8777,6 +8798,81 @@ def to_dict(self) -> dict: result["force"] = from_union([from_bool, from_none], self.force) return result +# Experimental: this type is part of an experimental API and may change or be removed. +class ProtocolAppendMode(Enum): + """Append-mode discriminator. Omission also selects append mode.""" + + APPEND = "append" + +# Experimental: this type is part of an experimental API and may change or be removed. +class ProtocolCustomizeMode(Enum): + """Customize-mode discriminator.""" + + CUSTOMIZE = "customize" + +class Action(Enum): + PRESERVE = "preserve" + TRANSFORM = "transform" + +# Experimental: this type is part of an experimental API and may change or be removed. +class ProtocolReplaceMode(Enum): + """Replace-mode discriminator.""" + + REPLACE = "replace" + +class ProtocolSectionOverrideAction(Enum): + """Declarative operation applied to the section.""" + + APPEND = "append" + PREPEND = "prepend" + PRESERVE = "preserve" + REMOVE = "remove" + REPLACE = "replace" + TRANSFORM = "transform" + +# Experimental: this type is part of an experimental API and may change or be removed. +class ProtocolStaticSectionAction(Enum): + """Declarative operation applied to the section.""" + + APPEND = "append" + PREPEND = "prepend" + REMOVE = "remove" + REPLACE = "replace" + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class SystemMessageBlock: + content: str + """Text content for this system-message block.""" + + is_static: bool | None = None + """Whether the block is static and may be cached independently of dynamic prompt content.""" + + @staticmethod + def from_dict(obj: Any) -> 'SystemMessageBlock': + assert isinstance(obj, dict) + content = from_str(obj.get("content")) + is_static = from_union([from_bool, from_none], obj.get("isStatic")) + return SystemMessageBlock(content, is_static) + + def to_dict(self) -> dict: + result: dict = {} + result["content"] = from_str(self.content) + if self.is_static is not None: + result["isStatic"] = from_union([from_bool, from_none], self.is_static) + return result + +class ProtocolMode(Enum): + """Append-mode discriminator. Omission also selects append mode. + + Replace-mode discriminator. + + Customize-mode discriminator. + """ + APPEND = "append" + CUSTOMIZE = "customize" + REPLACE = "replace" + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ProviderAddResult: @@ -9223,30 +9319,6 @@ def to_dict(self) -> dict: result["hasPending"] = from_bool(self.has_pending) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class QueueFinishDeferredIdleDrainResult: - """Action selected by the native deferred-idle drain.""" - - aborted: bool - """Whether the deferred idle was caused by an aborted foreground turn.""" - - action: str - """One of none, processQueue, or emitSessionIdle.""" - - @staticmethod - def from_dict(obj: Any) -> 'QueueFinishDeferredIdleDrainResult': - assert isinstance(obj, dict) - aborted = from_bool(obj.get("aborted")) - action = from_str(obj.get("action")) - return QueueFinishDeferredIdleDrainResult(aborted, action) - - def to_dict(self) -> dict: - result: dict = {} - result["aborted"] = from_bool(self.aborted) - result["action"] = from_str(self.action) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class QueueHasPendingResult: @@ -9645,47 +9717,6 @@ def to_dict(self) -> dict: result["handle"] = from_str(self.handle) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class SessionsRegisterExtensionToolsOnSessionOptions: - """Optional registration options.""" - - # Internal: this field is an internal SDK API and is not part of the public surface. - enabled: Any = None - """In-process `() => boolean` gating callback used only by the CLI.""" - - @staticmethod - def from_dict(obj: Any) -> 'SessionsRegisterExtensionToolsOnSessionOptions': - assert isinstance(obj, dict) - enabled = obj.get("enabled") - return SessionsRegisterExtensionToolsOnSessionOptions(enabled) - - def to_dict(self) -> dict: - result: dict = {} - if self.enabled is not None: - result["enabled"] = self.enabled - return result - -# Experimental: this type is part of an experimental API and may change or be removed. -# Internal: this type is an internal SDK API and is not part of the public surface. -@dataclass -class _RegisterExtensionToolsResult: - """Handle for releasing the extension tool registration.""" - - unsubscribe: Any - """In-process unsubscribe function used only by the CLI.""" - - @staticmethod - def from_dict(obj: Any) -> '_RegisterExtensionToolsResult': - assert isinstance(obj, dict) - unsubscribe = obj.get("unsubscribe") - return _RegisterExtensionToolsResult(unsubscribe) - - def to_dict(self) -> dict: - result: dict = {} - result["unsubscribe"] = self.unsubscribe - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ReleaseEventInterestParams: @@ -9968,6 +9999,9 @@ def to_dict(self) -> dict: result["branch"] = from_union([from_str, from_none], self.branch) return result +class ResponseFormatType(Enum): + JSON_SCHEMA = "json_schema" + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class SandboxConfigAuth: @@ -10065,14 +10099,12 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class SandboxConfigUserPolicyNetworkProxy: - """HTTP proxy for sandboxed process traffic. Linux restricts egress to the proxy endpoint, - requires that endpoint to be reachable over IPv4 (the [::] dual-stack wildcard is - accepted and routed through the IPv4 gateway), and does not support proxy credentials. - macOS relies on applications honoring proxy environment variables. Windows also - configures a per-AppContainer WinHTTP proxy, but enforcement depends on the application's - networking stack. Configure supported credentials in the separate `username` and - `password` fields. A credential-free http:// loopback URL uses the localhost proxy form, - while an https:// or authenticated loopback URL uses the URL form. + """HTTP(S) proxy for sandboxed traffic. With host rules, this is the built-in local proxy's + upstream; credentials stay in the runtime, and Linux and macOS restrict the child to the + local listener. Without host rules, Linux restricts egress to this endpoint but rejects + credentials, and macOS proxying is cooperative. Windows enforcement depends on the + application's networking stack. Configure credentials in the separate username/password + fields. The transient local listener URL is never persisted. HTTP proxy configuration for sandboxed traffic. """ @@ -10207,6 +10239,17 @@ def to_dict(self) -> dict: result["reason"] = from_union([from_str, from_none], self.reason) return result +# Experimental: this type is part of an experimental API and may change or be removed. +class SandboxSessionChange(Enum): + """A session-scoped sandbox transition applied while handling a slash command + + Present when the invocation changed the sandbox for this session only. Nothing was + persisted, so consumers must mirror the change onto the live session rather than + reloading settings, and must not treat it as a settings change. + """ + DISABLED = "disabled" + RESTORED = "restored" + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ScheduleAddAtRequest: @@ -10617,8 +10660,11 @@ class SendMessagesResult: """Result of sending zero or more user messages""" message_ids: list[str] - """Unique identifiers assigned to the messages, one per provided message in order. Empty - when no messages were provided. + """Unique identifiers assigned to the messages, one per provided message in order. For a + batch that starts a run, assistant messages use the final ID as originatingMessageId + throughout that run, including tool iterations and stop-hook corrections. Immediate + steering does not replace the active run's origin. Empty when no messages were provided; + that run has no originatingMessageId. """ @staticmethod @@ -14571,17 +14617,6 @@ def to_dict(self) -> dict: result["response"] = from_union([lambda x: from_dict(lambda x: x, x), from_none], self.response) return result -# Experimental: this type is part of an experimental API and may change or be removed. -class UISessionLimitsExhaustedResponseAction(Enum): - """Action selected by the user. - - User action selected for an exhausted session limit. - """ - ADD = "add" - CANCEL = "cancel" - SET = "set" - UNSET = "unset" - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class UIUserInputResponse: @@ -16827,64 +16862,6 @@ def to_dict(self) -> dict: result["canvases"] = from_union([from_bool, from_none], self.canvases) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class DiscoveredCanvas: - """Canvas available in the current session.""" - - canvas_id: str - """Provider-local canvas identifier""" - - description: str - """Short, single-sentence description shown to the agent in canvas catalogs.""" - - display_name: str - """Human-readable canvas name""" - - extension_id: str - """Owning provider identifier""" - - actions: list[CanvasAction] | None = None - """Actions the agent or host may invoke on an open instance""" - - extension_name: str | None = None - """Owning extension display name, when available""" - - icon: str | None = None - """Host-local PNG path for the canvas icon, when supplied""" - - input_schema: Any = None - """JSON Schema for canvas open input""" - - @staticmethod - def from_dict(obj: Any) -> 'DiscoveredCanvas': - assert isinstance(obj, dict) - canvas_id = from_str(obj.get("canvasId")) - description = from_str(obj.get("description")) - display_name = from_str(obj.get("displayName")) - extension_id = from_str(obj.get("extensionId")) - actions = from_union([lambda x: from_list(CanvasAction.from_dict, x), from_none], obj.get("actions")) - extension_name = from_union([from_str, from_none], obj.get("extensionName")) - icon = from_union([from_str, from_none], obj.get("icon")) - input_schema = obj.get("inputSchema") - return DiscoveredCanvas(canvas_id, description, display_name, extension_id, actions, extension_name, icon, input_schema) - - def to_dict(self) -> dict: - result: dict = {} - result["canvasId"] = from_str(self.canvas_id) - result["description"] = from_str(self.description) - result["displayName"] = from_str(self.display_name) - result["extensionId"] = from_str(self.extension_id) - if self.actions is not None: - result["actions"] = from_union([lambda x: from_list(lambda x: to_class(CanvasAction, x), x), from_none], self.actions) - if self.extension_name is not None: - result["extensionName"] = from_union([from_str, from_none], self.extension_name) - if self.icon is not None: - result["icon"] = from_union([from_str, from_none], self.icon) - if self.input_schema is not None: - result["inputSchema"] = self.input_schema - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class OpenCanvasInstance: @@ -17112,7 +17089,7 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class DebugCollectLogsCollectedEntry: - """A file included in the redacted debug bundle.""" + """A file included in the session debug bundle.""" bundle_path: str """Relative path of the file in the staged bundle/archive.""" @@ -17141,10 +17118,10 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class DebugCollectLogsDestination: - """Destination for the redacted debug bundle. + """Destination for the session debug bundle. - Where the redacted bundle should be written. Use `archive` to produce a .tgz, or - `directory` to stage redacted files for caller-managed upload/post-processing. + Where the bundle should be written. Use `archive` to produce a .tgz, or `directory` to + stage files for caller-managed upload/post-processing. """ kind: DebugCollectLogsResultKind """Destination variant discriminator.""" @@ -17157,7 +17134,7 @@ class DebugCollectLogsDestination: """Absolute or server-relative path for the .tgz archive to create.""" output_directory: str | None = None - """Directory where redacted files should be staged. The directory is created if needed.""" + """Directory where files should be staged. The directory is created if needed.""" @staticmethod def from_dict(obj: Any) -> 'DebugCollectLogsDestination': @@ -17889,49 +17866,6 @@ def to_dict(self) -> dict: result["type"] = self.type return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class SlashCommandTextResult: - """Slash-command invocation result containing text output plus Markdown/ANSI rendering flags.""" - - kind: ClassVar[str] = "text" - """Text result discriminator""" - - text: str - """Text output for the client to render""" - - markdown: bool | None = None - """Whether text contains Markdown""" - - preserve_ansi: bool | None = None - """Whether ANSI sequences should be preserved""" - - runtime_settings_changed: bool | None = None - """True when the invocation mutated user runtime settings; consumers caching settings should - refresh - """ - - @staticmethod - def from_dict(obj: Any) -> 'SlashCommandTextResult': - assert isinstance(obj, dict) - text = from_str(obj.get("text")) - markdown = from_union([from_bool, from_none], obj.get("markdown")) - preserve_ansi = from_union([from_bool, from_none], obj.get("preserveAnsi")) - runtime_settings_changed = from_union([from_bool, from_none], obj.get("runtimeSettingsChanged")) - return SlashCommandTextResult(text, markdown, preserve_ansi, runtime_settings_changed) - - def to_dict(self) -> dict: - result: dict = {} - result["kind"] = self.kind - result["text"] = from_str(self.text) - if self.markdown is not None: - result["markdown"] = from_union([from_bool, from_none], self.markdown) - if self.preserve_ansi is not None: - result["preserveAnsi"] = from_union([from_bool, from_none], self.preserve_ansi) - if self.runtime_settings_changed is not None: - result["runtimeSettingsChanged"] = from_union([from_bool, from_none], self.runtime_settings_changed) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class FactoryAgentRequest: @@ -18165,40 +18099,6 @@ def to_dict(self) -> dict: result["phaseId"] = from_union([from_none, from_str], self.phase_id) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class FactoryPauseCheckpointResult: - action: FactoryPauseCheckpointAction - """Whether this execution attempt must pause or may continue.""" - - @staticmethod - def from_dict(obj: Any) -> 'FactoryPauseCheckpointResult': - assert isinstance(obj, dict) - action = FactoryPauseCheckpointAction(obj.get("action")) - return FactoryPauseCheckpointResult(action) - - def to_dict(self) -> dict: - result: dict = {} - result["action"] = to_enum(FactoryPauseCheckpointAction, self.action) - return result - -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class SessionFactoryPauseAtCheckpointResult: - action: FactoryPauseCheckpointAction - """Whether this execution attempt must pause or may continue.""" - - @staticmethod - def from_dict(obj: Any) -> 'SessionFactoryPauseAtCheckpointResult': - assert isinstance(obj, dict) - action = FactoryPauseCheckpointAction(obj.get("action")) - return SessionFactoryPauseAtCheckpointResult(action) - - def to_dict(self) -> dict: - result: dict = {} - result["action"] = to_enum(FactoryPauseCheckpointAction, self.action) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class FactoryPhaseObservation: @@ -19735,19 +19635,31 @@ class MCPHeadersHandlePendingHeadersRefreshRequest: """Headers to overlay onto the MCP request. Dynamic headers override static config headers but do not replace SDK-managed request headers. """ + ttl_ms: int | None = None + """Optional lifetime in milliseconds for these returned headers. The runtime clamps its + configured cache lifetime to this value. + """ + message: str | None = None + """Host credential broker failure, denial, or revocation reason.""" @staticmethod def from_dict(obj: Any) -> 'MCPHeadersHandlePendingHeadersRefreshRequest': assert isinstance(obj, dict) kind = MCPHeadersHandlePendingHeadersRefreshRequestKind(obj.get("kind")) headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("headers")) - return MCPHeadersHandlePendingHeadersRefreshRequest(kind, headers) + ttl_ms = from_union([from_int, from_none], obj.get("ttlMs")) + message = from_union([from_str, from_none], obj.get("message")) + return MCPHeadersHandlePendingHeadersRefreshRequest(kind, headers, ttl_ms, message) def to_dict(self) -> dict: result: dict = {} result["kind"] = to_enum(MCPHeadersHandlePendingHeadersRefreshRequestKind, self.kind) if self.headers is not None: result["headers"] = from_union([lambda x: from_dict(from_str, x), from_none], self.headers) + if self.ttl_ms is not None: + result["ttlMs"] = from_union([from_int, from_none], self.ttl_ms) + if self.message is not None: + result["message"] = from_union([from_str, from_none], self.message) return result # Experimental: this type is part of an experimental API and may change or be removed. @@ -20529,92 +20441,6 @@ def to_dict(self) -> dict: result["taskType"] = from_union([lambda x: to_enum(TaskType, x), from_none], self.task_type) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class ModeSetRequest: - """Agent interaction mode to apply to the session.""" - - mode: SessionMode - """The session mode the agent is operating in""" - - compaction_decision: str | None = None - """Explicit response to a model-switch compaction preflight.""" - - expected_mode: SessionMode | None = None - """Mode the session must currently be in for the change to apply. When set and the session - is in a different mode the request is a no-op and reports status 'unchanged'. - """ - inherit_plan_base_from_session_id: str | None = None - """Session whose plan-mode base state should be inherited.""" - - persist_plan_selection: bool | None = None - """Whether the selected plan model should be persisted.""" - - picker_settings_context: ModelPickerSettingsContext | None = None - """Settings context used when persisting the selected plan model.""" - - plan_context_tier: str | None = None - """Context tier to use with the dedicated plan model.""" - - plan_exit_action: str | None = None - """Action to perform when leaving plan mode.""" - - plan_model: str | None = None - """Dedicated model to use in plan mode, when configured.""" - - plan_model_configured: bool | None = None - """Whether a dedicated plan model is configured.""" - - plan_reasoning_effort: str | None = None - """Reasoning effort to use with the dedicated plan model.""" - - restore_plan_model: bool | None = None - """Whether leaving plan mode should restore the session's previous model.""" - - @staticmethod - def from_dict(obj: Any) -> 'ModeSetRequest': - assert isinstance(obj, dict) - mode = SessionMode(obj.get("mode")) - compaction_decision = from_union([from_str, from_none], obj.get("compactionDecision")) - expected_mode = from_union([SessionMode, from_none], obj.get("expectedMode")) - inherit_plan_base_from_session_id = from_union([from_str, from_none], obj.get("inheritPlanBaseFromSessionId")) - persist_plan_selection = from_union([from_bool, from_none], obj.get("persistPlanSelection")) - picker_settings_context = from_union([ModelPickerSettingsContext.from_dict, from_none], obj.get("pickerSettingsContext")) - plan_context_tier = from_union([from_str, from_none], obj.get("planContextTier")) - plan_exit_action = from_union([from_str, from_none], obj.get("planExitAction")) - plan_model = from_union([from_str, from_none], obj.get("planModel")) - plan_model_configured = from_union([from_bool, from_none], obj.get("planModelConfigured")) - plan_reasoning_effort = from_union([from_str, from_none], obj.get("planReasoningEffort")) - restore_plan_model = from_union([from_bool, from_none], obj.get("restorePlanModel")) - return ModeSetRequest(mode, compaction_decision, expected_mode, inherit_plan_base_from_session_id, persist_plan_selection, picker_settings_context, plan_context_tier, plan_exit_action, plan_model, plan_model_configured, plan_reasoning_effort, restore_plan_model) - - def to_dict(self) -> dict: - result: dict = {} - result["mode"] = to_enum(SessionMode, self.mode) - if self.compaction_decision is not None: - result["compactionDecision"] = from_union([from_str, from_none], self.compaction_decision) - if self.expected_mode is not None: - result["expectedMode"] = from_union([lambda x: to_enum(SessionMode, x), from_none], self.expected_mode) - if self.inherit_plan_base_from_session_id is not None: - result["inheritPlanBaseFromSessionId"] = from_union([from_str, from_none], self.inherit_plan_base_from_session_id) - if self.persist_plan_selection is not None: - result["persistPlanSelection"] = from_union([from_bool, from_none], self.persist_plan_selection) - if self.picker_settings_context is not None: - result["pickerSettingsContext"] = from_union([lambda x: to_class(ModelPickerSettingsContext, x), from_none], self.picker_settings_context) - if self.plan_context_tier is not None: - result["planContextTier"] = from_union([from_str, from_none], self.plan_context_tier) - if self.plan_exit_action is not None: - result["planExitAction"] = from_union([from_str, from_none], self.plan_exit_action) - if self.plan_model is not None: - result["planModel"] = from_union([from_str, from_none], self.plan_model) - if self.plan_model_configured is not None: - result["planModelConfigured"] = from_union([from_bool, from_none], self.plan_model_configured) - if self.plan_reasoning_effort is not None: - result["planReasoningEffort"] = from_union([from_str, from_none], self.plan_reasoning_effort) - if self.restore_plan_model is not None: - result["restorePlanModel"] = from_union([from_bool, from_none], self.restore_plan_model) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ModelPickerPersistenceRequest: @@ -22437,6 +22263,11 @@ class InstalledPluginInfo: plugin is always present on disk, so `enabled` is its only meaningful state and it is never "not installed". """ + source: str | None = None + """Runtime-reported plugin provenance. Currently set to "builtin" only for plugins + registered through the trusted host built-in boundary; absent for installed, marketplace, + direct, and live plugins. + """ version: str | None = None """Installed version (when reported by the plugin manifest)""" @@ -22448,8 +22279,9 @@ def from_dict(obj: Any) -> 'InstalledPluginInfo': name = from_str(obj.get("name")) direct_source_id = from_union([from_str, from_none], obj.get("directSourceId")) installed_from = from_union([from_str, from_none], obj.get("installedFrom")) + source = from_union([from_str, from_none], obj.get("source")) version = from_union([from_str, from_none], obj.get("version")) - return InstalledPluginInfo(enabled, marketplace, name, direct_source_id, installed_from, version) + return InstalledPluginInfo(enabled, marketplace, name, direct_source_id, installed_from, source, version) def to_dict(self) -> dict: result: dict = {} @@ -22460,6 +22292,8 @@ def to_dict(self) -> dict: result["directSourceId"] = from_union([from_str, from_none], self.direct_source_id) if self.installed_from is not None: result["installedFrom"] = from_union([from_str, from_none], self.installed_from) + if self.source is not None: + result["source"] = from_union([from_str, from_none], self.source) if self.version is not None: result["version"] = from_union([from_str, from_none], self.version) return result @@ -22501,6 +22335,9 @@ class MCPServer: """Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured """ + display_name: str | None = None + """Human-readable display name supplied by a managed server catalog.""" + error: str | None = None """Error message if the server failed to connect""" @@ -22510,7 +22347,7 @@ class MCPServer: configured. """ source: McpServerSource | None = None - """Configuration source: user, workspace, plugin, or builtin""" + """Configuration source: user, workspace, plugin, builtin, or managed""" source_plugin: str | None = None """Plugin name that provided this server, when source is plugin.""" @@ -22523,17 +22360,20 @@ def from_dict(obj: Any) -> 'MCPServer': assert isinstance(obj, dict) name = from_str(obj.get("name")) status = McpServerStatus(obj.get("status")) + display_name = from_union([from_str, from_none], obj.get("displayName")) error = from_union([from_str, from_none], obj.get("error")) server_metadata = from_union([McpServerMetadata.from_dict, from_none], obj.get("serverMetadata")) source = from_union([McpServerSource, from_none], obj.get("source")) source_plugin = from_union([from_str, from_none], obj.get("sourcePlugin")) source_plugin_version = from_union([from_str, from_none], obj.get("sourcePluginVersion")) - return MCPServer(name, status, error, server_metadata, source, source_plugin, source_plugin_version) + return MCPServer(name, status, display_name, error, server_metadata, source, source_plugin, source_plugin_version) def to_dict(self) -> dict: result: dict = {} result["name"] = from_str(self.name) result["status"] = to_enum(McpServerStatus, self.status) + if self.display_name is not None: + result["displayName"] = from_union([from_str, from_none], self.display_name) if self.error is not None: result["error"] = from_union([from_str, from_none], self.error) if self.server_metadata is not None: @@ -22762,6 +22602,315 @@ def to_dict(self) -> dict: result["name"] = from_str(self.name) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProtocolSystemMessageAppendConfig: + content: str | None = None + """Text appended to the standard system prompt.""" + + mode: ProtocolAppendMode | None = None + """Append-mode discriminator. Omission also selects append mode.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProtocolSystemMessageAppendConfig': + assert isinstance(obj, dict) + content = from_union([from_str, from_none], obj.get("content")) + mode = from_union([ProtocolAppendMode, from_none], obj.get("mode")) + return ProtocolSystemMessageAppendConfig(content, mode) + + def to_dict(self) -> dict: + result: dict = {} + if self.content is not None: + result["content"] = from_union([from_str, from_none], self.content) + if self.mode is not None: + result["mode"] = from_union([lambda x: to_enum(ProtocolAppendMode, x), from_none], self.mode) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class CanvasAction: + """Canvas action that the agent or host can invoke. To discover the input schema for a + particular action, call the list_canvas_capabilities tool. + """ + name: str + """Action name exposed by the canvas provider""" + + description: str | None = None + """Description of the action""" + + input_schema: Any = None + """JSON Schema for the action input""" + + @staticmethod + def from_dict(obj: Any) -> 'CanvasAction': + assert isinstance(obj, dict) + name = from_str(obj.get("name")) + description = from_union([from_str, from_none], obj.get("description")) + input_schema = obj.get("inputSchema") + return CanvasAction(name, description, input_schema) + + def to_dict(self) -> dict: + result: dict = {} + result["name"] = from_str(self.name) + if self.description is not None: + result["description"] = from_union([from_str, from_none], self.description) + if self.input_schema is not None: + result["inputSchema"] = self.input_schema + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class CanvasActionInvokeRequest: + """Canvas action invocation parameters.""" + + action_name: str + """Action name to invoke""" + + instance_id: str + """Open canvas instance identifier""" + + input: Any = None + """Action input""" + + @staticmethod + def from_dict(obj: Any) -> 'CanvasActionInvokeRequest': + assert isinstance(obj, dict) + action_name = from_str(obj.get("actionName")) + instance_id = from_str(obj.get("instanceId")) + input = obj.get("input") + return CanvasActionInvokeRequest(action_name, instance_id, input) + + def to_dict(self) -> dict: + result: dict = {} + result["actionName"] = from_str(self.action_name) + result["instanceId"] = from_str(self.instance_id) + if self.input is not None: + result["input"] = self.input + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +class FactoryPauseCheckpointAction(Enum): + """Action the runtime selected for a durable factory pause checkpoint. + + Whether this execution attempt must pause or may continue. + """ + CONTINUE = "continue" + PAUSE = "pause" + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ModeSetRequest: + """Agent interaction mode to apply to the session.""" + + mode: SessionMode + """The session mode the agent is operating in""" + + compaction_decision: str | None = None + """Explicit response to a model-switch compaction preflight.""" + + expected_mode: SessionMode | None = None + """Mode the session must currently be in for the change to apply. When set and the session + is in a different mode the request is a no-op and reports status 'unchanged'. + """ + inherit_plan_base_from_session_id: str | None = None + """Session whose plan-mode base state should be inherited.""" + + persist_plan_selection: bool | None = None + """Whether the selected plan model should be persisted.""" + + picker_settings_context: ModelPickerSettingsContext | None = None + """Settings context used when persisting the selected plan model.""" + + plan_context_tier: str | None = None + """Context tier to use with the dedicated plan model.""" + + plan_exit_action: str | None = None + """Action to perform when leaving plan mode.""" + + plan_model: str | None = None + """Dedicated model to use in plan mode, when configured.""" + + plan_model_configured: bool | None = None + """Whether a dedicated plan model is configured.""" + + plan_reasoning_effort: str | None = None + """Reasoning effort to use with the dedicated plan model.""" + + restore_plan_model: bool | None = None + """Whether leaving plan mode should restore the session's previous model.""" + + @staticmethod + def from_dict(obj: Any) -> 'ModeSetRequest': + assert isinstance(obj, dict) + mode = SessionMode(obj.get("mode")) + compaction_decision = from_union([from_str, from_none], obj.get("compactionDecision")) + expected_mode = from_union([SessionMode, from_none], obj.get("expectedMode")) + inherit_plan_base_from_session_id = from_union([from_str, from_none], obj.get("inheritPlanBaseFromSessionId")) + persist_plan_selection = from_union([from_bool, from_none], obj.get("persistPlanSelection")) + picker_settings_context = from_union([ModelPickerSettingsContext.from_dict, from_none], obj.get("pickerSettingsContext")) + plan_context_tier = from_union([from_str, from_none], obj.get("planContextTier")) + plan_exit_action = from_union([from_str, from_none], obj.get("planExitAction")) + plan_model = from_union([from_str, from_none], obj.get("planModel")) + plan_model_configured = from_union([from_bool, from_none], obj.get("planModelConfigured")) + plan_reasoning_effort = from_union([from_str, from_none], obj.get("planReasoningEffort")) + restore_plan_model = from_union([from_bool, from_none], obj.get("restorePlanModel")) + return ModeSetRequest(mode, compaction_decision, expected_mode, inherit_plan_base_from_session_id, persist_plan_selection, picker_settings_context, plan_context_tier, plan_exit_action, plan_model, plan_model_configured, plan_reasoning_effort, restore_plan_model) + + def to_dict(self) -> dict: + result: dict = {} + result["mode"] = to_enum(SessionMode, self.mode) + if self.compaction_decision is not None: + result["compactionDecision"] = from_union([from_str, from_none], self.compaction_decision) + if self.expected_mode is not None: + result["expectedMode"] = from_union([lambda x: to_enum(SessionMode, x), from_none], self.expected_mode) + if self.inherit_plan_base_from_session_id is not None: + result["inheritPlanBaseFromSessionId"] = from_union([from_str, from_none], self.inherit_plan_base_from_session_id) + if self.persist_plan_selection is not None: + result["persistPlanSelection"] = from_union([from_bool, from_none], self.persist_plan_selection) + if self.picker_settings_context is not None: + result["pickerSettingsContext"] = from_union([lambda x: to_class(ModelPickerSettingsContext, x), from_none], self.picker_settings_context) + if self.plan_context_tier is not None: + result["planContextTier"] = from_union([from_str, from_none], self.plan_context_tier) + if self.plan_exit_action is not None: + result["planExitAction"] = from_union([from_str, from_none], self.plan_exit_action) + if self.plan_model is not None: + result["planModel"] = from_union([from_str, from_none], self.plan_model) + if self.plan_model_configured is not None: + result["planModelConfigured"] = from_union([from_bool, from_none], self.plan_model_configured) + if self.plan_reasoning_effort is not None: + result["planReasoningEffort"] = from_union([from_str, from_none], self.plan_reasoning_effort) + if self.restore_plan_model is not None: + result["restorePlanModel"] = from_union([from_bool, from_none], self.restore_plan_model) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProtocolMarkerSectionOverride: + action: Action + """Section override action discriminator.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProtocolMarkerSectionOverride': + assert isinstance(obj, dict) + action = Action(obj.get("action")) + return ProtocolMarkerSectionOverride(action) + + def to_dict(self) -> dict: + result: dict = {} + result["action"] = to_enum(Action, self.action) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class QueueFinishDeferredIdleDrainResult: + """Action selected by the native deferred-idle drain.""" + + aborted: bool + """Whether the deferred idle was caused by an aborted foreground turn.""" + + action: str + """One of none, processQueue, or emitSessionIdle.""" + + @staticmethod + def from_dict(obj: Any) -> 'QueueFinishDeferredIdleDrainResult': + assert isinstance(obj, dict) + aborted = from_bool(obj.get("aborted")) + action = from_str(obj.get("action")) + return QueueFinishDeferredIdleDrainResult(aborted, action) + + def to_dict(self) -> dict: + result: dict = {} + result["aborted"] = from_bool(self.aborted) + result["action"] = from_str(self.action) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +class UISessionLimitsExhaustedResponseAction(Enum): + """Action selected by the user. + + User action selected for an exhausted session limit. + """ + ADD = "add" + CANCEL = "cancel" + SET = "set" + UNSET = "unset" + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProtocolSectionOverride: + action: ProtocolSectionOverrideAction + """Declarative operation applied to the section. + + Section override action discriminator. + """ + content: str | None = None + """Optional content used by replace, append, and prepend operations.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProtocolSectionOverride': + assert isinstance(obj, dict) + action = ProtocolSectionOverrideAction(obj.get("action")) + content = from_union([from_str, from_none], obj.get("content")) + return ProtocolSectionOverride(action, content) + + def to_dict(self) -> dict: + result: dict = {} + result["action"] = to_enum(ProtocolSectionOverrideAction, self.action) + if self.content is not None: + result["content"] = from_union([from_str, from_none], self.content) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProtocolStaticSectionOverride: + action: ProtocolStaticSectionAction + """Declarative operation applied to the section.""" + + content: str | None = None + """Optional content used by replace, append, and prepend operations.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProtocolStaticSectionOverride': + assert isinstance(obj, dict) + action = ProtocolStaticSectionAction(obj.get("action")) + content = from_union([from_str, from_none], obj.get("content")) + return ProtocolStaticSectionOverride(action, content) + + def to_dict(self) -> dict: + result: dict = {} + result["action"] = to_enum(ProtocolStaticSectionAction, self.action) + if self.content is not None: + result["content"] = from_union([from_str, from_none], self.content) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProtocolSystemMessageReplaceConfig: + content: str + """Complete replacement system-message text.""" + + mode: ProtocolReplaceMode + """Replace-mode discriminator.""" + + content_blocks: list[SystemMessageBlock] | None = None + """Optional structured blocks corresponding to the replacement content.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProtocolSystemMessageReplaceConfig': + assert isinstance(obj, dict) + content = from_str(obj.get("content")) + mode = ProtocolReplaceMode(obj.get("mode")) + content_blocks = from_union([lambda x: from_list(SystemMessageBlock.from_dict, x), from_none], obj.get("contentBlocks")) + return ProtocolSystemMessageReplaceConfig(content, mode, content_blocks) + + def to_dict(self) -> dict: + result: dict = {} + result["content"] = from_str(self.content) + result["mode"] = to_enum(ProtocolReplaceMode, self.mode) + if self.content_blocks is not None: + result["contentBlocks"] = from_union([lambda x: from_list(lambda x: to_class(SystemMessageBlock, x), x), from_none], self.content_blocks) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ProviderEndpoint: @@ -23380,116 +23529,6 @@ def to_dict(self) -> dict: result["wait"] = from_union([from_bool, from_none], self.wait) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class SendRequest: - """Parameters for sending a user message to the session""" - - prompt: str - """The user message text""" - - agent_mode: SendAgentMode | None = None - """The UI mode the agent was in when this message was sent. Defaults to the session's - current mode. - """ - attachments: list[Attachment] | None = None - """Optional attachments (files, directories, selections, blobs, GitHub references) to - include with the message - """ - billable: bool | None = None - """If false, this message will not trigger a Premium Request Unit charge. User messages - default to billable. - """ - display_prompt: str | None = None - """If provided, this is shown in the timeline instead of `prompt`""" - - mode: SendMode | None = None - """How to deliver the message. `enqueue` (default) appends to the message queue. `immediate` - interjects during an in-progress turn. - """ - prepend: bool | None = None - """If true, adds the message to the front of the queue instead of the end""" - - request_headers: dict[str, str] | None = None - """Custom HTTP headers to include in outbound model requests for this turn. Merged with - session-level provider headers; per-turn headers augment and overwrite session-level - headers with the same key. - """ - required_tool: str | None = None - """If set, the request will fail if the named tool is not available when this message is - among the user messages at the start of the current exchange - """ - # Internal: this field is an internal SDK API and is not part of the public surface. - source: str | None = None - """Optional provenance tag copied to the resulting user.message event. Must be `user`, - `system`, `command-` for command-originated messages, `schedule-` - for scheduled prompts, or `agent-` for prompts sent by another agent. - """ - traceparent: str | None = None - """W3C Trace Context traceparent header for distributed tracing of this agent turn""" - - tracestate: str | None = None - """W3C Trace Context tracestate header for distributed tracing""" - - wait: bool | None = None - """If true, await completion of the agentic loop for this message before returning. Defaults - to false (fire-and-forget). When true, the result still contains the same `messageId`; - the caller can rely on the agent having processed the message before the call resolves. - Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally - blocks until the completed turn's event tail has been dispatched to this session's - in-process subscribers, so a subsequent read of subscriber state already reflects the - turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery - follows over the wire. Callers that need the stronger local guarantee on remote sessions - should await the event stream explicitly. - """ - - @staticmethod - def from_dict(obj: Any) -> 'SendRequest': - assert isinstance(obj, dict) - prompt = from_str(obj.get("prompt")) - agent_mode = from_union([SendAgentMode, from_none], obj.get("agentMode")) - attachments = from_union([lambda x: from_list(Attachment.from_dict, x), from_none], obj.get("attachments")) - billable = from_union([from_bool, from_none], obj.get("billable")) - display_prompt = from_union([from_str, from_none], obj.get("displayPrompt")) - mode = from_union([SendMode, from_none], obj.get("mode")) - prepend = from_union([from_bool, from_none], obj.get("prepend")) - request_headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("requestHeaders")) - required_tool = from_union([from_str, from_none], obj.get("requiredTool")) - source = from_union([from_str, from_none], obj.get("source")) - traceparent = from_union([from_str, from_none], obj.get("traceparent")) - tracestate = from_union([from_str, from_none], obj.get("tracestate")) - wait = from_union([from_bool, from_none], obj.get("wait")) - return SendRequest(prompt, agent_mode, attachments, billable, display_prompt, mode, prepend, request_headers, required_tool, source, traceparent, tracestate, wait) - - def to_dict(self) -> dict: - result: dict = {} - result["prompt"] = from_str(self.prompt) - if self.agent_mode is not None: - result["agentMode"] = from_union([lambda x: to_enum(SendAgentMode, x), from_none], self.agent_mode) - if self.attachments is not None: - result["attachments"] = from_union([lambda x: from_list(lambda x: to_class(Attachment, x), x), from_none], self.attachments) - if self.billable is not None: - result["billable"] = from_union([from_bool, from_none], self.billable) - if self.display_prompt is not None: - result["displayPrompt"] = from_union([from_str, from_none], self.display_prompt) - if self.mode is not None: - result["mode"] = from_union([lambda x: to_enum(SendMode, x), from_none], self.mode) - if self.prepend is not None: - result["prepend"] = from_union([from_bool, from_none], self.prepend) - if self.request_headers is not None: - result["requestHeaders"] = from_union([lambda x: from_dict(from_str, x), from_none], self.request_headers) - if self.required_tool is not None: - result["requiredTool"] = from_union([from_str, from_none], self.required_tool) - if self.source is not None: - result["source"] = from_union([from_str, from_none], self.source) - if self.traceparent is not None: - result["traceparent"] = from_union([from_str, from_none], self.traceparent) - if self.tracestate is not None: - result["tracestate"] = from_union([from_str, from_none], self.tracestate) - if self.wait is not None: - result["wait"] = from_union([from_bool, from_none], self.wait) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class QueuePendingItems: @@ -23536,38 +23575,6 @@ def to_dict(self) -> dict: result["messageId"] = from_union([from_str, from_none], self.message_id) return result -# Experimental: this type is part of an experimental API and may change or be removed. -# Internal: this type is an internal SDK API and is not part of the public surface. -@dataclass -class _RegisterExtensionToolsParams: - """Params to attach an extension loader's tools to a session.""" - - loader: Any - """In-process ExtensionLoader handle used only by the CLI and excluded from the public SDK - surface. - """ - session_id: str - """Session to register extension tools on.""" - - options: SessionsRegisterExtensionToolsOnSessionOptions | None = None - """Optional registration options.""" - - @staticmethod - def from_dict(obj: Any) -> '_RegisterExtensionToolsParams': - assert isinstance(obj, dict) - loader = obj.get("loader") - session_id = from_str(obj.get("sessionId")) - options = from_union([SessionsRegisterExtensionToolsOnSessionOptions.from_dict, from_none], obj.get("options")) - return _RegisterExtensionToolsParams(loader, session_id, options) - - def to_dict(self) -> dict: - result: dict = {} - result["loader"] = self.loader - result["sessionId"] = from_str(self.session_id) - if self.options is not None: - result["options"] = from_union([lambda x: to_class(SessionsRegisterExtensionToolsOnSessionOptions, x), from_none], self.options) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class RemoteControlConfig: @@ -23761,6 +23768,43 @@ def to_dict(self) -> dict: result["mode"] = from_union([lambda x: to_enum(RemoteSessionMode, x), from_none], self.mode) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ResponseFormat: + """Provider-native structured output format. JSON Schema is forwarded without rewriting or + validating the schema or the generated output. + + Provider-native output format for the whole turn, including an empty message batch and + all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering + inherits the active format; specifying responseFormat with mode: immediate is an error, + even while idle. Returned assistant content remains text; the runtime does not parse or + validate it. Unsupported models or schemas produce provider errors. + + Provider-native output format for this turn, including all tool-call iterations. Not + inherited by later turns or subagents. Ordinary steering inherits the active format; + specifying responseFormat with mode: immediate is an error, even while idle. Returned + assistant content remains text; the runtime does not parse or validate it. Unsupported + models or schemas produce provider errors. + """ + json_schema: JSONSchemaResponseFormat + """JSON Schema and provider options for the turn's output.""" + + type: ResponseFormatType + """Output format discriminator. Currently only json_schema is supported.""" + + @staticmethod + def from_dict(obj: Any) -> 'ResponseFormat': + assert isinstance(obj, dict) + json_schema = JSONSchemaResponseFormat.from_dict(obj.get("jsonSchema")) + type = ResponseFormatType(obj.get("type")) + return ResponseFormat(json_schema, type) + + def to_dict(self) -> dict: + result: dict = {} + result["jsonSchema"] = to_class(JSONSchemaResponseFormat, self.json_schema) + result["type"] = to_enum(ResponseFormatType, self.type) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class SandboxConfigUserPolicyExperimental: @@ -23789,41 +23833,107 @@ def to_dict(self) -> dict: class SandboxConfigUserPolicyNetwork: """Network rules to merge into the base policy.""" + allowed_hosts: list[str] | None = None + """Hosts allowed through the built-in sandbox proxy. A non-empty list denies unmatched + hosts; an absent or empty list allows all hosts not blocked. Supports exact hostnames, IP + addresses, and *.example.com for strict subdomains. Host rules do not override the + outbound or local-network toggles. + """ allow_local_network: bool | None = None """Whether traffic to local/loopback addresses is allowed.""" allow_outbound: bool | None = None """Whether outbound network traffic is allowed at all.""" + blocked_hosts: list[str] | None = None + """Hosts denied by the built-in sandbox proxy. Deny rules take precedence over allowedHosts. + A domain also denies all its subdomains. IP addresses match exactly; *.example.com + matches strict subdomains, and * denies every host. + """ proxy: SandboxConfigUserPolicyNetworkProxy | None = None - """HTTP proxy for sandboxed process traffic. Linux restricts egress to the proxy endpoint, - requires that endpoint to be reachable over IPv4 (the [::] dual-stack wildcard is - accepted and routed through the IPv4 gateway), and does not support proxy credentials. - macOS relies on applications honoring proxy environment variables. Windows also - configures a per-AppContainer WinHTTP proxy, but enforcement depends on the application's - networking stack. Configure supported credentials in the separate `username` and - `password` fields. A credential-free http:// loopback URL uses the localhost proxy form, - while an https:// or authenticated loopback URL uses the URL form. + """HTTP(S) proxy for sandboxed traffic. With host rules, this is the built-in local proxy's + upstream; credentials stay in the runtime, and Linux and macOS restrict the child to the + local listener. Without host rules, Linux restricts egress to this endpoint but rejects + credentials, and macOS proxying is cooperative. Windows enforcement depends on the + application's networking stack. Configure credentials in the separate username/password + fields. The transient local listener URL is never persisted. """ @staticmethod def from_dict(obj: Any) -> 'SandboxConfigUserPolicyNetwork': assert isinstance(obj, dict) + allowed_hosts = from_union([lambda x: from_list(from_str, x), from_none], obj.get("allowedHosts")) allow_local_network = from_union([from_bool, from_none], obj.get("allowLocalNetwork")) allow_outbound = from_union([from_bool, from_none], obj.get("allowOutbound")) + blocked_hosts = from_union([lambda x: from_list(from_str, x), from_none], obj.get("blockedHosts")) proxy = from_union([SandboxConfigUserPolicyNetworkProxy.from_dict, from_none], obj.get("proxy")) - return SandboxConfigUserPolicyNetwork(allow_local_network, allow_outbound, proxy) + return SandboxConfigUserPolicyNetwork(allowed_hosts, allow_local_network, allow_outbound, blocked_hosts, proxy) def to_dict(self) -> dict: result: dict = {} + if self.allowed_hosts is not None: + result["allowedHosts"] = from_union([lambda x: from_list(from_str, x), from_none], self.allowed_hosts) if self.allow_local_network is not None: result["allowLocalNetwork"] = from_union([from_bool, from_none], self.allow_local_network) if self.allow_outbound is not None: result["allowOutbound"] = from_union([from_bool, from_none], self.allow_outbound) + if self.blocked_hosts is not None: + result["blockedHosts"] = from_union([lambda x: from_list(from_str, x), from_none], self.blocked_hosts) if self.proxy is not None: result["proxy"] = from_union([lambda x: to_class(SandboxConfigUserPolicyNetworkProxy, x), from_none], self.proxy) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class SlashCommandTextResult: + """Slash-command invocation result containing text output plus Markdown/ANSI rendering flags.""" + + kind: ClassVar[str] = "text" + """Text result discriminator""" + + text: str + """Text output for the client to render""" + + markdown: bool | None = None + """Whether text contains Markdown""" + + preserve_ansi: bool | None = None + """Whether ANSI sequences should be preserved""" + + runtime_settings_changed: bool | None = None + """True when the invocation mutated user runtime settings; consumers caching settings should + refresh + """ + sandbox_session_change: SandboxSessionChange | None = None + """Present when the invocation changed the sandbox for this session only. Nothing was + persisted, so consumers must mirror the change onto the live session rather than + reloading settings, and must not treat it as a settings change. + """ + + @staticmethod + def from_dict(obj: Any) -> 'SlashCommandTextResult': + assert isinstance(obj, dict) + text = from_str(obj.get("text")) + markdown = from_union([from_bool, from_none], obj.get("markdown")) + preserve_ansi = from_union([from_bool, from_none], obj.get("preserveAnsi")) + runtime_settings_changed = from_union([from_bool, from_none], obj.get("runtimeSettingsChanged")) + sandbox_session_change = from_union([SandboxSessionChange, from_none], obj.get("sandboxSessionChange")) + return SlashCommandTextResult(text, markdown, preserve_ansi, runtime_settings_changed, sandbox_session_change) + + def to_dict(self) -> dict: + result: dict = {} + result["kind"] = self.kind + result["text"] = from_str(self.text) + if self.markdown is not None: + result["markdown"] = from_union([from_bool, from_none], self.markdown) + if self.preserve_ansi is not None: + result["preserveAnsi"] = from_union([from_bool, from_none], self.preserve_ansi) + if self.runtime_settings_changed is not None: + result["runtimeSettingsChanged"] = from_union([from_bool, from_none], self.runtime_settings_changed) + if self.sandbox_session_change is not None: + result["sandboxSessionChange"] = from_union([lambda x: to_enum(SandboxSessionChange, x), from_none], self.sandbox_session_change) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ScheduleAddResult: @@ -23889,83 +23999,6 @@ def to_dict(self) -> dict: result["entry"] = from_union([lambda x: to_class(ScheduleEntry, x), from_none], self.entry) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class SendMessagesRequest: - """Parameters for sending zero or more user messages to the session in a single turn. - Remote-backed (Mission Control) sessions do not support this method and will return an - error. - """ - messages: list[SendMessageItem] - """The user messages to append to the conversation, in order. May be empty, in which case a - single turn runs over the existing history with no new user message. - """ - agent_mode: SendAgentMode | None = None - """The UI mode the agent was in when these messages were sent. Defaults to the session's - current mode. - """ - mode: SendMode | None = None - """How to deliver the messages. `enqueue` (default) appends to the message queue. - `immediate` interjects during an in-progress turn. - """ - prepend: bool | None = None - """If true, adds the messages to the front of the queue instead of the end""" - - request_headers: dict[str, str] | None = None - """Custom HTTP headers to include in outbound model requests for this turn. Merged with - session-level provider headers; per-turn headers augment and overwrite session-level - headers with the same key. - """ - traceparent: str | None = None - """W3C Trace Context traceparent header for distributed tracing of this agent turn""" - - tracestate: str | None = None - """W3C Trace Context tracestate header for distributed tracing""" - - wait: bool | None = None - """If true, await completion of the agentic loop for this turn before returning. Defaults to - false (fire-and-forget). When true, the result still contains the same `messageIds`; the - caller can rely on the agent having processed the messages before the call resolves. - Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally - blocks until the completed turn's event tail has been dispatched to this session's - in-process subscribers, so a subsequent read of subscriber state already reflects the - turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery - follows over the wire. Callers that need the stronger local guarantee on remote sessions - should await the event stream explicitly. - """ - - @staticmethod - def from_dict(obj: Any) -> 'SendMessagesRequest': - assert isinstance(obj, dict) - messages = from_list(SendMessageItem.from_dict, obj.get("messages")) - agent_mode = from_union([SendAgentMode, from_none], obj.get("agentMode")) - mode = from_union([SendMode, from_none], obj.get("mode")) - prepend = from_union([from_bool, from_none], obj.get("prepend")) - request_headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("requestHeaders")) - traceparent = from_union([from_str, from_none], obj.get("traceparent")) - tracestate = from_union([from_str, from_none], obj.get("tracestate")) - wait = from_union([from_bool, from_none], obj.get("wait")) - return SendMessagesRequest(messages, agent_mode, mode, prepend, request_headers, traceparent, tracestate, wait) - - def to_dict(self) -> dict: - result: dict = {} - result["messages"] = from_list(lambda x: to_class(SendMessageItem, x), self.messages) - if self.agent_mode is not None: - result["agentMode"] = from_union([lambda x: to_enum(SendAgentMode, x), from_none], self.agent_mode) - if self.mode is not None: - result["mode"] = from_union([lambda x: to_enum(SendMode, x), from_none], self.mode) - if self.prepend is not None: - result["prepend"] = from_union([from_bool, from_none], self.prepend) - if self.request_headers is not None: - result["requestHeaders"] = from_union([lambda x: from_dict(from_str, x), from_none], self.request_headers) - if self.traceparent is not None: - result["traceparent"] = from_union([from_str, from_none], self.traceparent) - if self.tracestate is not None: - result["tracestate"] = from_union([from_str, from_none], self.tracestate) - if self.wait is not None: - result["wait"] = from_union([from_bool, from_none], self.wait) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ServerSkillList: @@ -26379,39 +26412,6 @@ def to_dict(self) -> dict: result["selectedAction"] = from_union([lambda x: to_enum(UIExitPlanModeAction, x), from_none], self.selected_action) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class UISessionLimitsExhaustedResponse: - """The selected session-limit action. - - The user's selected action for an exhausted session limit. - """ - action: UISessionLimitsExhaustedResponseAction - """Action selected by the user.""" - - additional_ai_credits: float | None = None - """AI Credits to add to the current max when action is 'add'.""" - - max_ai_credits: float | None = None - """New absolute max AI Credits when action is 'set'.""" - - @staticmethod - def from_dict(obj: Any) -> 'UISessionLimitsExhaustedResponse': - assert isinstance(obj, dict) - action = UISessionLimitsExhaustedResponseAction(obj.get("action")) - additional_ai_credits = from_union([from_float, from_none], obj.get("additionalAiCredits")) - max_ai_credits = from_union([from_float, from_none], obj.get("maxAiCredits")) - return UISessionLimitsExhaustedResponse(action, additional_ai_credits, max_ai_credits) - - def to_dict(self) -> dict: - result: dict = {} - result["action"] = to_enum(UISessionLimitsExhaustedResponseAction, self.action) - if self.additional_ai_credits is not None: - result["additionalAiCredits"] = from_union([to_float, from_none], self.additional_ai_credits) - if self.max_ai_credits is not None: - result["maxAiCredits"] = from_union([to_float, from_none], self.max_ai_credits) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class UIHandlePendingUserInputRequest: @@ -27063,25 +27063,6 @@ def to_dict(self) -> dict: result["capabilities"] = from_union([lambda x: to_class(CanvasHostContextCapabilities, x), from_none], self.capabilities) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class CanvasList: - """Declared canvases available in this session.""" - - canvases: list[DiscoveredCanvas] - """Declared canvases available in this session""" - - @staticmethod - def from_dict(obj: Any) -> 'CanvasList': - assert isinstance(obj, dict) - canvases = from_list(DiscoveredCanvas.from_dict, obj.get("canvases")) - return CanvasList(canvases) - - def to_dict(self) -> dict: - result: dict = {} - result["canvases"] = from_list(lambda x: to_class(DiscoveredCanvas, x), self.canvases) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class CanvasListOpenResult: @@ -27355,10 +27336,10 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class DebugCollectLogsResult: - """Result of collecting a redacted debug bundle.""" + """Result of collecting a session debug bundle.""" entries: list[DebugCollectLogsCollectedEntry] - """Files included in the redacted bundle.""" + """Files included in the bundle.""" kind: DebugCollectLogsResultKind """Destination kind that was written.""" @@ -28906,8 +28887,10 @@ class DebugCollectLogsEntry: """Server-local source path to read.""" redaction: DebugCollectLogsRedaction | None = None - """How text content from this entry should be redacted. Defaults to plain-text.""" - + """How text content from this entry should be redacted. Defaults to plain-text. With none, + no redaction is applied; the caller must ensure any necessary redaction is performed + before this call. + """ required: bool | None = None """When true, collection fails if this entry cannot be read. Defaults to false, which records the entry in `skippedEntries`. @@ -29424,6 +29407,211 @@ def to_dict(self) -> dict: result["results"] = from_list(lambda x: to_class(PluginUpdateAllEntry, x), self.results) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class DiscoveredCanvas: + """Canvas available in the current session.""" + + canvas_id: str + """Provider-local canvas identifier""" + + description: str + """Short, single-sentence description shown to the agent in canvas catalogs.""" + + display_name: str + """Human-readable canvas name""" + + extension_id: str + """Owning provider identifier""" + + actions: list[CanvasAction] | None = None + """Actions the agent or host may invoke on an open instance""" + + extension_name: str | None = None + """Owning extension display name, when available""" + + icon: str | None = None + """Host-local PNG path for the canvas icon, when supplied""" + + input_schema: Any = None + """JSON Schema for canvas open input""" + + @staticmethod + def from_dict(obj: Any) -> 'DiscoveredCanvas': + assert isinstance(obj, dict) + canvas_id = from_str(obj.get("canvasId")) + description = from_str(obj.get("description")) + display_name = from_str(obj.get("displayName")) + extension_id = from_str(obj.get("extensionId")) + actions = from_union([lambda x: from_list(CanvasAction.from_dict, x), from_none], obj.get("actions")) + extension_name = from_union([from_str, from_none], obj.get("extensionName")) + icon = from_union([from_str, from_none], obj.get("icon")) + input_schema = obj.get("inputSchema") + return DiscoveredCanvas(canvas_id, description, display_name, extension_id, actions, extension_name, icon, input_schema) + + def to_dict(self) -> dict: + result: dict = {} + result["canvasId"] = from_str(self.canvas_id) + result["description"] = from_str(self.description) + result["displayName"] = from_str(self.display_name) + result["extensionId"] = from_str(self.extension_id) + if self.actions is not None: + result["actions"] = from_union([lambda x: from_list(lambda x: to_class(CanvasAction, x), x), from_none], self.actions) + if self.extension_name is not None: + result["extensionName"] = from_union([from_str, from_none], self.extension_name) + if self.icon is not None: + result["icon"] = from_union([from_str, from_none], self.icon) + if self.input_schema is not None: + result["inputSchema"] = self.input_schema + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class FactoryPauseCheckpointResult: + action: FactoryPauseCheckpointAction + """Whether this execution attempt must pause or may continue.""" + + @staticmethod + def from_dict(obj: Any) -> 'FactoryPauseCheckpointResult': + assert isinstance(obj, dict) + action = FactoryPauseCheckpointAction(obj.get("action")) + return FactoryPauseCheckpointResult(action) + + def to_dict(self) -> dict: + result: dict = {} + result["action"] = to_enum(FactoryPauseCheckpointAction, self.action) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class SessionFactoryPauseAtCheckpointResult: + action: FactoryPauseCheckpointAction + """Whether this execution attempt must pause or may continue.""" + + @staticmethod + def from_dict(obj: Any) -> 'SessionFactoryPauseAtCheckpointResult': + assert isinstance(obj, dict) + action = FactoryPauseCheckpointAction(obj.get("action")) + return SessionFactoryPauseAtCheckpointResult(action) + + def to_dict(self) -> dict: + result: dict = {} + result["action"] = to_enum(FactoryPauseCheckpointAction, self.action) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class UISessionLimitsExhaustedResponse: + """The selected session-limit action. + + The user's selected action for an exhausted session limit. + """ + action: UISessionLimitsExhaustedResponseAction + """Action selected by the user.""" + + additional_ai_credits: float | None = None + """AI Credits to add to the current max when action is 'add'.""" + + max_ai_credits: float | None = None + """New absolute max AI Credits when action is 'set'.""" + + @staticmethod + def from_dict(obj: Any) -> 'UISessionLimitsExhaustedResponse': + assert isinstance(obj, dict) + action = UISessionLimitsExhaustedResponseAction(obj.get("action")) + additional_ai_credits = from_union([from_float, from_none], obj.get("additionalAiCredits")) + max_ai_credits = from_union([from_float, from_none], obj.get("maxAiCredits")) + return UISessionLimitsExhaustedResponse(action, additional_ai_credits, max_ai_credits) + + def to_dict(self) -> dict: + result: dict = {} + result["action"] = to_enum(UISessionLimitsExhaustedResponseAction, self.action) + if self.additional_ai_credits is not None: + result["additionalAiCredits"] = from_union([to_float, from_none], self.additional_ai_credits) + if self.max_ai_credits is not None: + result["maxAiCredits"] = from_union([to_float, from_none], self.max_ai_credits) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProtocolSystemMessageConfig: + """System-message configuration used when the runtime builds the standard prompt for this + provider-qualified model, including general-purpose subagents. It uses the same object + hierarchy as session-level systemMessage configuration, except transform actions are + rejected because the current callback protocol is not model-scoped. When present, it + overrides the session-wide configuration on those prompt paths. Selected custom-agent and + specialized-subagent prompts remain authoritative. + """ + content: str | None = None + """Text appended to the standard system prompt. + + Complete replacement system-message text. + + Text appended after the customized sections. + """ + mode: ProtocolMode | None = None + """Append-mode discriminator. Omission also selects append mode. + + Replace-mode discriminator. + + Customize-mode discriminator. + """ + content_blocks: list[SystemMessageBlock] | None = None + """Optional structured blocks corresponding to the replacement content.""" + + sections: dict[str, ProtocolSectionOverride] | None = None + """Named standard-prompt section overrides.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProtocolSystemMessageConfig': + assert isinstance(obj, dict) + content = from_union([from_str, from_none], obj.get("content")) + mode = from_union([ProtocolMode, from_none], obj.get("mode")) + content_blocks = from_union([lambda x: from_list(SystemMessageBlock.from_dict, x), from_none], obj.get("contentBlocks")) + sections = from_union([lambda x: from_dict(ProtocolSectionOverride.from_dict, x), from_none], obj.get("sections")) + return ProtocolSystemMessageConfig(content, mode, content_blocks, sections) + + def to_dict(self) -> dict: + result: dict = {} + if self.content is not None: + result["content"] = from_union([from_str, from_none], self.content) + if self.mode is not None: + result["mode"] = from_union([lambda x: to_enum(ProtocolMode, x), from_none], self.mode) + if self.content_blocks is not None: + result["contentBlocks"] = from_union([lambda x: from_list(lambda x: to_class(SystemMessageBlock, x), x), from_none], self.content_blocks) + if self.sections is not None: + result["sections"] = from_union([lambda x: from_dict(lambda x: to_class(ProtocolSectionOverride, x), x), from_none], self.sections) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProtocolSystemMessageCustomizeConfig: + mode: ProtocolCustomizeMode + """Customize-mode discriminator.""" + + content: str | None = None + """Text appended after the customized sections.""" + + sections: dict[str, ProtocolSectionOverride] | None = None + """Named standard-prompt section overrides.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProtocolSystemMessageCustomizeConfig': + assert isinstance(obj, dict) + mode = ProtocolCustomizeMode(obj.get("mode")) + content = from_union([from_str, from_none], obj.get("content")) + sections = from_union([lambda x: from_dict(ProtocolSectionOverride.from_dict, x), from_none], obj.get("sections")) + return ProtocolSystemMessageCustomizeConfig(mode, content, sections) + + def to_dict(self) -> dict: + result: dict = {} + result["mode"] = to_enum(ProtocolCustomizeMode, self.mode) + if self.content is not None: + result["content"] = from_union([from_str, from_none], self.content) + if self.sections is not None: + result["sections"] = from_union([lambda x: from_dict(lambda x: to_class(ProtocolSectionOverride, x), x), from_none], self.sections) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class PushAttachmentGitHubFileDiff: @@ -29649,6 +29837,216 @@ def to_dict(self) -> dict: result["sessionId"] = from_str(self.session_id) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class SendMessagesRequest: + """Parameters for sending zero or more user messages to the session in a single turn. + Remote-backed (Mission Control) sessions do not support this method and will return an + error. + """ + messages: list[SendMessageItem] + """The user messages to append to the conversation, in order, before running one agent loop. + When the batch starts a run, its final message is the primary initiating message; earlier + messages provide context, not separate runs or replies. May be empty, in which case a + single turn runs over the existing history with no new user message or + originatingMessageId. + """ + agent_mode: SendAgentMode | None = None + """The UI mode the agent was in when these messages were sent. Defaults to the session's + current mode. + """ + mode: SendMode | None = None + """How to deliver the messages. `enqueue` (default) appends to the message queue. + `immediate` interjects during an in-progress turn. + """ + prepend: bool | None = None + """If true, adds the messages to the front of the queue instead of the end""" + + request_headers: dict[str, str] | None = None + """Custom HTTP headers to include in outbound model requests for this turn. Merged with + session-level provider headers; per-turn headers augment and overwrite session-level + headers with the same key. + """ + response_format: ResponseFormat | None = None + """Provider-native output format for the whole turn, including an empty message batch and + all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering + inherits the active format; specifying responseFormat with mode: immediate is an error, + even while idle. Returned assistant content remains text; the runtime does not parse or + validate it. Unsupported models or schemas produce provider errors. + """ + traceparent: str | None = None + """W3C Trace Context traceparent header for distributed tracing of this agent turn""" + + tracestate: str | None = None + """W3C Trace Context tracestate header for distributed tracing""" + + wait: bool | None = None + """If true, await completion of the agentic loop for this turn before returning. Defaults to + false (fire-and-forget). When true, the result still contains the same `messageIds`; the + caller can rely on the agent having processed the messages before the call resolves. + Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally + blocks until the completed turn's event tail has been dispatched to this session's + in-process subscribers, so a subsequent read of subscriber state already reflects the + turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery + follows over the wire. Callers that need the stronger local guarantee on remote sessions + should await the event stream explicitly. + """ + + @staticmethod + def from_dict(obj: Any) -> 'SendMessagesRequest': + assert isinstance(obj, dict) + messages = from_list(SendMessageItem.from_dict, obj.get("messages")) + agent_mode = from_union([SendAgentMode, from_none], obj.get("agentMode")) + mode = from_union([SendMode, from_none], obj.get("mode")) + prepend = from_union([from_bool, from_none], obj.get("prepend")) + request_headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("requestHeaders")) + response_format = from_union([ResponseFormat.from_dict, from_none], obj.get("responseFormat")) + traceparent = from_union([from_str, from_none], obj.get("traceparent")) + tracestate = from_union([from_str, from_none], obj.get("tracestate")) + wait = from_union([from_bool, from_none], obj.get("wait")) + return SendMessagesRequest(messages, agent_mode, mode, prepend, request_headers, response_format, traceparent, tracestate, wait) + + def to_dict(self) -> dict: + result: dict = {} + result["messages"] = from_list(lambda x: to_class(SendMessageItem, x), self.messages) + if self.agent_mode is not None: + result["agentMode"] = from_union([lambda x: to_enum(SendAgentMode, x), from_none], self.agent_mode) + if self.mode is not None: + result["mode"] = from_union([lambda x: to_enum(SendMode, x), from_none], self.mode) + if self.prepend is not None: + result["prepend"] = from_union([from_bool, from_none], self.prepend) + if self.request_headers is not None: + result["requestHeaders"] = from_union([lambda x: from_dict(from_str, x), from_none], self.request_headers) + if self.response_format is not None: + result["responseFormat"] = from_union([lambda x: to_class(ResponseFormat, x), from_none], self.response_format) + if self.traceparent is not None: + result["traceparent"] = from_union([from_str, from_none], self.traceparent) + if self.tracestate is not None: + result["tracestate"] = from_union([from_str, from_none], self.tracestate) + if self.wait is not None: + result["wait"] = from_union([from_bool, from_none], self.wait) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class SendRequest: + """Parameters for sending a user message to the session""" + + prompt: str + """The user message text""" + + agent_mode: SendAgentMode | None = None + """The UI mode the agent was in when this message was sent. Defaults to the session's + current mode. + """ + attachments: list[Attachment] | None = None + """Optional attachments (files, directories, selections, blobs, GitHub references) to + include with the message + """ + billable: bool | None = None + """If false, this message will not trigger a Premium Request Unit charge. User messages + default to billable. + """ + display_prompt: str | None = None + """If provided, this is shown in the timeline instead of `prompt`""" + + mode: SendMode | None = None + """How to deliver the message. `enqueue` (default) appends to the message queue. `immediate` + interjects during an in-progress turn. + """ + prepend: bool | None = None + """If true, adds the message to the front of the queue instead of the end""" + + request_headers: dict[str, str] | None = None + """Custom HTTP headers to include in outbound model requests for this turn. Merged with + session-level provider headers; per-turn headers augment and overwrite session-level + headers with the same key. + """ + required_tool: str | None = None + """If set, the request will fail if the named tool is not available when this message is + among the user messages at the start of the current exchange + """ + response_format: ResponseFormat | None = None + """Provider-native output format for this turn, including all tool-call iterations. Not + inherited by later turns or subagents. Ordinary steering inherits the active format; + specifying responseFormat with mode: immediate is an error, even while idle. Returned + assistant content remains text; the runtime does not parse or validate it. Unsupported + models or schemas produce provider errors. + """ + # Internal: this field is an internal SDK API and is not part of the public surface. + source: str | None = None + """Optional provenance tag copied to the resulting user.message event. Must be `user`, + `system`, `command-` for command-originated messages, `schedule-` + for scheduled prompts, or `agent-` for prompts sent by another agent. + """ + traceparent: str | None = None + """W3C Trace Context traceparent header for distributed tracing of this agent turn""" + + tracestate: str | None = None + """W3C Trace Context tracestate header for distributed tracing""" + + wait: bool | None = None + """If true, await completion of the agentic loop for this message before returning. Defaults + to false (fire-and-forget). When true, the result still contains the same `messageId`; + the caller can rely on the agent having processed the message before the call resolves. + Transport-dependent tail semantics: on a LOCAL (in-process) session the wait additionally + blocks until the completed turn's event tail has been dispatched to this session's + in-process subscribers, so a subsequent read of subscriber state already reflects the + turn; on a REMOTE session the wait resolves once the loop completes and mirrored delivery + follows over the wire. Callers that need the stronger local guarantee on remote sessions + should await the event stream explicitly. + """ + + @staticmethod + def from_dict(obj: Any) -> 'SendRequest': + assert isinstance(obj, dict) + prompt = from_str(obj.get("prompt")) + agent_mode = from_union([SendAgentMode, from_none], obj.get("agentMode")) + attachments = from_union([lambda x: from_list(Attachment.from_dict, x), from_none], obj.get("attachments")) + billable = from_union([from_bool, from_none], obj.get("billable")) + display_prompt = from_union([from_str, from_none], obj.get("displayPrompt")) + mode = from_union([SendMode, from_none], obj.get("mode")) + prepend = from_union([from_bool, from_none], obj.get("prepend")) + request_headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("requestHeaders")) + required_tool = from_union([from_str, from_none], obj.get("requiredTool")) + response_format = from_union([ResponseFormat.from_dict, from_none], obj.get("responseFormat")) + source = from_union([from_str, from_none], obj.get("source")) + traceparent = from_union([from_str, from_none], obj.get("traceparent")) + tracestate = from_union([from_str, from_none], obj.get("tracestate")) + wait = from_union([from_bool, from_none], obj.get("wait")) + return SendRequest(prompt, agent_mode, attachments, billable, display_prompt, mode, prepend, request_headers, required_tool, response_format, source, traceparent, tracestate, wait) + + def to_dict(self) -> dict: + result: dict = {} + result["prompt"] = from_str(self.prompt) + if self.agent_mode is not None: + result["agentMode"] = from_union([lambda x: to_enum(SendAgentMode, x), from_none], self.agent_mode) + if self.attachments is not None: + result["attachments"] = from_union([lambda x: from_list(lambda x: to_class(Attachment, x), x), from_none], self.attachments) + if self.billable is not None: + result["billable"] = from_union([from_bool, from_none], self.billable) + if self.display_prompt is not None: + result["displayPrompt"] = from_union([from_str, from_none], self.display_prompt) + if self.mode is not None: + result["mode"] = from_union([lambda x: to_enum(SendMode, x), from_none], self.mode) + if self.prepend is not None: + result["prepend"] = from_union([from_bool, from_none], self.prepend) + if self.request_headers is not None: + result["requestHeaders"] = from_union([lambda x: from_dict(from_str, x), from_none], self.request_headers) + if self.required_tool is not None: + result["requiredTool"] = from_union([from_str, from_none], self.required_tool) + if self.response_format is not None: + result["responseFormat"] = from_union([lambda x: to_class(ResponseFormat, x), from_none], self.response_format) + if self.source is not None: + result["source"] = from_union([from_str, from_none], self.source) + if self.traceparent is not None: + result["traceparent"] = from_union([from_str, from_none], self.traceparent) + if self.tracestate is not None: + result["tracestate"] = from_union([from_str, from_none], self.tracestate) + if self.wait is not None: + result["wait"] = from_union([from_bool, from_none], self.wait) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class SandboxConfigUserPolicy: @@ -31267,31 +31665,6 @@ def to_dict(self) -> dict: result["response"] = to_class(UIExitPlanModeResponse, self.response) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class UIHandlePendingSessionLimitsExhaustedRequest: - """Request ID of a pending `session_limits_exhausted.requested` event and the user's - selected limit action. - """ - request_id: str - """The unique request ID from the session_limits_exhausted.requested event""" - - response: UISessionLimitsExhaustedResponse - """The selected session-limit action.""" - - @staticmethod - def from_dict(obj: Any) -> 'UIHandlePendingSessionLimitsExhaustedRequest': - assert isinstance(obj, dict) - request_id = from_str(obj.get("requestId")) - response = UISessionLimitsExhaustedResponse.from_dict(obj.get("response")) - return UIHandlePendingSessionLimitsExhaustedRequest(request_id, response) - - def to_dict(self) -> dict: - result: dict = {} - result["requestId"] = from_str(self.request_id) - result["response"] = to_class(UISessionLimitsExhaustedResponse, self.response) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class UsageMetricsAgentMetric: @@ -32161,11 +32534,11 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class DebugCollectLogsRequest: - """Options for collecting a redacted session debug bundle.""" + """Options for collecting a session debug bundle with configurable redaction.""" destination: DebugCollectLogsDestination - """Where the redacted bundle should be written. Use `archive` to produce a .tgz, or - `directory` to stage redacted files for caller-managed upload/post-processing. + """Where the bundle should be written. Use `archive` to produce a .tgz, or `directory` to + stage files for caller-managed upload/post-processing. """ additional_entries: list[DebugCollectLogsEntry] | None = None """Caller-provided server-local files or directories to include in addition to the runtime's @@ -32238,6 +32611,286 @@ def to_dict(self) -> dict: result["error"] = from_union([lambda x: to_class(SessionFSError, x), from_none], self.error) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProviderConfig: + """Custom model-provider configuration (BYOK).""" + + base_url: str + """API endpoint URL.""" + + api_key: str | None = None + """API key. Optional for local providers like Ollama.""" + + azure: ProviderConfigAzure | None = None + """Azure-specific provider options.""" + + bearer_token: str | None = None + """Bearer token for authentication. Sets the Authorization header directly. Takes precedence + over apiKey when both are set. + """ + has_bearer_token_provider: bool | None = None + """When true, the SDK client supplies bearer tokens on demand: the runtime calls the + client-session `providerToken.getToken` callback before each request and applies the + returned token as an `Authorization: Bearer ` header. This is the bearer/OAuth + scheme used by Azure AD / managed-identity tokens and provider OAuth access tokens + (including Anthropic's), not a provider-specific API-key header such as Anthropic's + `x-api-key`. The token-acquiring function itself stays on the SDK side and is never + serialized; only this flag crosses the wire. When set alongside `apiKey`/`bearerToken`, + the callback takes precedence: the runtime applies the token returned by + `providerToken.getToken` as the `Authorization: Bearer` header for each request and does + not send the static credential. + """ + headers: dict[str, str] | None = None + """Custom HTTP headers to include in all outbound requests to the provider.""" + + max_context_window_tokens: float | None = None + """Maximum context window tokens for the model.""" + + max_output_tokens: float | None = None + """Maximum output tokens for the model.""" + + max_prompt_tokens: float | None = None + """Maximum prompt/input tokens for the model.""" + + model_capabilities: ModelCapabilitiesOverride | None = None + """Overrides for model capabilities when they cannot be inferred from modelId.""" + + model_id: str | None = None + """Well-known model ID used for capability lookup. When set, agent behavior config and token + limits are inferred from this model. + """ + provider_name: str | None = None + """Provider name used for model and telemetry attribution.""" + + transport: ProviderTransport | None = None + """Provider transport. Defaults to "http".""" + + type: ProviderType | None = None + """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs.""" + + wire_api: ProviderWireAPI | None = None + """Wire API format (openai/azure only). Defaults to "completions".""" + + wire_model: str | None = None + """The model identifier sent to the provider API for inference (the "wire" model), as + opposed to modelId which is the well-known base. + """ + + @staticmethod + def from_dict(obj: Any) -> 'ProviderConfig': + assert isinstance(obj, dict) + base_url = from_str(obj.get("baseUrl")) + api_key = from_union([from_str, from_none], obj.get("apiKey")) + azure = from_union([ProviderConfigAzure.from_dict, from_none], obj.get("azure")) + bearer_token = from_union([from_str, from_none], obj.get("bearerToken")) + has_bearer_token_provider = from_union([from_bool, from_none], obj.get("hasBearerTokenProvider")) + headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("headers")) + max_context_window_tokens = from_union([from_float, from_none], obj.get("maxContextWindowTokens")) + max_output_tokens = from_union([from_float, from_none], obj.get("maxOutputTokens")) + max_prompt_tokens = from_union([from_float, from_none], obj.get("maxPromptTokens")) + model_capabilities = from_union([ModelCapabilitiesOverride.from_dict, from_none], obj.get("modelCapabilities")) + model_id = from_union([from_str, from_none], obj.get("modelId")) + provider_name = from_union([from_str, from_none], obj.get("providerName")) + transport = from_union([ProviderTransport, from_none], obj.get("transport")) + type = from_union([ProviderType, from_none], obj.get("type")) + wire_api = from_union([ProviderWireAPI, from_none], obj.get("wireApi")) + wire_model = from_union([from_str, from_none], obj.get("wireModel")) + return ProviderConfig(base_url, api_key, azure, bearer_token, has_bearer_token_provider, headers, max_context_window_tokens, max_output_tokens, max_prompt_tokens, model_capabilities, model_id, provider_name, transport, type, wire_api, wire_model) + + def to_dict(self) -> dict: + result: dict = {} + result["baseUrl"] = from_str(self.base_url) + if self.api_key is not None: + result["apiKey"] = from_union([from_str, from_none], self.api_key) + if self.azure is not None: + result["azure"] = from_union([lambda x: to_class(ProviderConfigAzure, x), from_none], self.azure) + if self.bearer_token is not None: + result["bearerToken"] = from_union([from_str, from_none], self.bearer_token) + if self.has_bearer_token_provider is not None: + result["hasBearerTokenProvider"] = from_union([from_bool, from_none], self.has_bearer_token_provider) + if self.headers is not None: + result["headers"] = from_union([lambda x: from_dict(from_str, x), from_none], self.headers) + if self.max_context_window_tokens is not None: + result["maxContextWindowTokens"] = from_union([to_float, from_none], self.max_context_window_tokens) + if self.max_output_tokens is not None: + result["maxOutputTokens"] = from_union([to_float, from_none], self.max_output_tokens) + if self.max_prompt_tokens is not None: + result["maxPromptTokens"] = from_union([to_float, from_none], self.max_prompt_tokens) + if self.model_capabilities is not None: + result["modelCapabilities"] = from_union([lambda x: to_class(ModelCapabilitiesOverride, x), from_none], self.model_capabilities) + if self.model_id is not None: + result["modelId"] = from_union([from_str, from_none], self.model_id) + if self.provider_name is not None: + result["providerName"] = from_union([from_str, from_none], self.provider_name) + if self.transport is not None: + result["transport"] = from_union([lambda x: to_enum(ProviderTransport, x), from_none], self.transport) + if self.type is not None: + result["type"] = from_union([lambda x: to_enum(ProviderType, x), from_none], self.type) + if self.wire_api is not None: + result["wireApi"] = from_union([lambda x: to_enum(ProviderWireAPI, x), from_none], self.wire_api) + if self.wire_model is not None: + result["wireModel"] = from_union([from_str, from_none], self.wire_model) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class PermissionsConfigureParams: + """Patch of permission policy fields to apply (omit a field to leave it unchanged).""" + + additional_content_exclusion_policies: list[PermissionsConfigureAdditionalContentExclusionPolicy] | None = None + """If specified, replaces the host-supplied GitHub Content Exclusion policies on the session + (combined with natively-discovered policies when evaluating tool/file access). Omit to + leave the current policies unchanged. + """ + approve_all_read_permission_requests: bool | None = None + """If specified, sets whether path/URL read permission requests are auto-approved. Omit to + leave the current value unchanged. + """ + approve_all_tool_permission_requests: bool | None = None + """If specified, sets whether tool permission requests are auto-approved without prompting. + Omit to leave the current value unchanged. + """ + paths: PermissionPathsConfig | None = None + """If specified, replaces the session's path-permission policy. The runtime constructs the + appropriate PathManager based on these inputs (rooted at the session's working + directory). Omit to leave the current path policy unchanged. + """ + rules: PermissionRulesSet | None = None + """If specified, replaces the session's approved/denied permission rules. Omit to leave the + current rules unchanged. + """ + urls: PermissionUrlsConfig | None = None + """If specified, replaces the session's URL-permission policy. The runtime constructs a + fresh DefaultUrlManager based on these inputs. Omit to leave the current URL policy + unchanged. + """ + + @staticmethod + def from_dict(obj: Any) -> 'PermissionsConfigureParams': + assert isinstance(obj, dict) + additional_content_exclusion_policies = from_union([lambda x: from_list(PermissionsConfigureAdditionalContentExclusionPolicy.from_dict, x), from_none], obj.get("additionalContentExclusionPolicies")) + approve_all_read_permission_requests = from_union([from_bool, from_none], obj.get("approveAllReadPermissionRequests")) + approve_all_tool_permission_requests = from_union([from_bool, from_none], obj.get("approveAllToolPermissionRequests")) + paths = from_union([PermissionPathsConfig.from_dict, from_none], obj.get("paths")) + rules = from_union([PermissionRulesSet.from_dict, from_none], obj.get("rules")) + urls = from_union([PermissionUrlsConfig.from_dict, from_none], obj.get("urls")) + return PermissionsConfigureParams(additional_content_exclusion_policies, approve_all_read_permission_requests, approve_all_tool_permission_requests, paths, rules, urls) + + def to_dict(self) -> dict: + result: dict = {} + if self.additional_content_exclusion_policies is not None: + result["additionalContentExclusionPolicies"] = from_union([lambda x: from_list(lambda x: to_class(PermissionsConfigureAdditionalContentExclusionPolicy, x), x), from_none], self.additional_content_exclusion_policies) + if self.approve_all_read_permission_requests is not None: + result["approveAllReadPermissionRequests"] = from_union([from_bool, from_none], self.approve_all_read_permission_requests) + if self.approve_all_tool_permission_requests is not None: + result["approveAllToolPermissionRequests"] = from_union([from_bool, from_none], self.approve_all_tool_permission_requests) + if self.paths is not None: + result["paths"] = from_union([lambda x: to_class(PermissionPathsConfig, x), from_none], self.paths) + if self.rules is not None: + result["rules"] = from_union([lambda x: to_class(PermissionRulesSet, x), from_none], self.rules) + if self.urls is not None: + result["urls"] = from_union([lambda x: to_class(PermissionUrlsConfig, x), from_none], self.urls) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class DiscoveredMCPServer: + """MCP server discovered by `mcp.discover`, with config source, optional plugin source, + transport type, and enabled state. + """ + enabled: bool + """Whether the server is enabled (not in the disabled list)""" + + name: str + """Server name (config key)""" + + source: McpServerSource + """Configuration source: user, workspace, plugin, or builtin""" + + effective_source: MCPSourceRef | None = None + """Canonical identity and location of the effective server declaration.""" + + source_plugin: str | None = None + """Plugin name that provided this server, when source is plugin.""" + + source_plugin_version: str | None = None + """Plugin version that provided this server, when source is plugin.""" + + type: DiscoveredMCPServerType | None = None + """Server transport type: stdio, http, sse (deprecated), or memory""" + + @staticmethod + def from_dict(obj: Any) -> 'DiscoveredMCPServer': + assert isinstance(obj, dict) + enabled = from_bool(obj.get("enabled")) + name = from_str(obj.get("name")) + source = McpServerSource(obj.get("source")) + effective_source = from_union([MCPSourceRef.from_dict, from_none], obj.get("effectiveSource")) + source_plugin = from_union([from_str, from_none], obj.get("sourcePlugin")) + source_plugin_version = from_union([from_str, from_none], obj.get("sourcePluginVersion")) + type = from_union([DiscoveredMCPServerType, from_none], obj.get("type")) + return DiscoveredMCPServer(enabled, name, source, effective_source, source_plugin, source_plugin_version, type) + + def to_dict(self) -> dict: + result: dict = {} + result["enabled"] = from_bool(self.enabled) + result["name"] = from_str(self.name) + result["source"] = to_enum(McpServerSource, self.source) + if self.effective_source is not None: + result["effectiveSource"] = from_union([lambda x: to_class(MCPSourceRef, x), from_none], self.effective_source) + if self.source_plugin is not None: + result["sourcePlugin"] = from_union([from_str, from_none], self.source_plugin) + if self.source_plugin_version is not None: + result["sourcePluginVersion"] = from_union([from_str, from_none], self.source_plugin_version) + if self.type is not None: + result["type"] = from_union([lambda x: to_enum(DiscoveredMCPServerType, x), from_none], self.type) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class CanvasList: + """Declared canvases available in this session.""" + + canvases: list[DiscoveredCanvas] + """Declared canvases available in this session""" + + @staticmethod + def from_dict(obj: Any) -> 'CanvasList': + assert isinstance(obj, dict) + canvases = from_list(DiscoveredCanvas.from_dict, obj.get("canvases")) + return CanvasList(canvases) + + def to_dict(self) -> dict: + result: dict = {} + result["canvases"] = from_list(lambda x: to_class(DiscoveredCanvas, x), self.canvases) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class UIHandlePendingSessionLimitsExhaustedRequest: + """Request ID of a pending `session_limits_exhausted.requested` event and the user's + selected limit action. + """ + request_id: str + """The unique request ID from the session_limits_exhausted.requested event""" + + response: UISessionLimitsExhaustedResponse + """The selected session-limit action.""" + + @staticmethod + def from_dict(obj: Any) -> 'UIHandlePendingSessionLimitsExhaustedRequest': + assert isinstance(obj, dict) + request_id = from_str(obj.get("requestId")) + response = UISessionLimitsExhaustedResponse.from_dict(obj.get("response")) + return UIHandlePendingSessionLimitsExhaustedRequest(request_id, response) + + def to_dict(self) -> dict: + result: dict = {} + result["requestId"] = from_str(self.request_id) + result["response"] = to_class(UISessionLimitsExhaustedResponse, self.response) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ProviderModelConfig: @@ -32269,6 +32922,14 @@ class ProviderModelConfig: """Display name for model pickers. Defaults to the provider-qualified selection id (`provider/id`). """ + system_message: ProtocolSystemMessageConfig | None = None + """System-message configuration used when the runtime builds the standard prompt for this + provider-qualified model, including general-purpose subagents. It uses the same object + hierarchy as session-level systemMessage configuration, except transform actions are + rejected because the current callback protocol is not model-scoped. When present, it + overrides the session-wide configuration on those prompt paths. Selected custom-agent and + specialized-subagent prompts remain authoritative. + """ wire_model: str | None = None """The model name sent to the provider API for inference. Defaults to `id`.""" @@ -32283,8 +32944,9 @@ def from_dict(obj: Any) -> 'ProviderModelConfig': max_prompt_tokens = from_union([from_float, from_none], obj.get("maxPromptTokens")) model_id = from_union([from_str, from_none], obj.get("modelId")) name = from_union([from_str, from_none], obj.get("name")) + system_message = from_union([ProtocolSystemMessageConfig.from_dict, from_none], obj.get("systemMessage")) wire_model = from_union([from_str, from_none], obj.get("wireModel")) - return ProviderModelConfig(id, provider, capabilities, max_context_window_tokens, max_output_tokens, max_prompt_tokens, model_id, name, wire_model) + return ProviderModelConfig(id, provider, capabilities, max_context_window_tokens, max_output_tokens, max_prompt_tokens, model_id, name, system_message, wire_model) def to_dict(self) -> dict: result: dict = {} @@ -32302,246 +32964,12 @@ def to_dict(self) -> dict: result["modelId"] = from_union([from_str, from_none], self.model_id) if self.name is not None: result["name"] = from_union([from_str, from_none], self.name) + if self.system_message is not None: + result["systemMessage"] = from_union([lambda x: to_class(ProtocolSystemMessageConfig, x), from_none], self.system_message) if self.wire_model is not None: result["wireModel"] = from_union([from_str, from_none], self.wire_model) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class ProviderConfig: - """Custom model-provider configuration (BYOK).""" - - base_url: str - """API endpoint URL.""" - - api_key: str | None = None - """API key. Optional for local providers like Ollama.""" - - azure: ProviderConfigAzure | None = None - """Azure-specific provider options.""" - - bearer_token: str | None = None - """Bearer token for authentication. Sets the Authorization header directly. Takes precedence - over apiKey when both are set. - """ - has_bearer_token_provider: bool | None = None - """When true, the SDK client supplies bearer tokens on demand: the runtime calls the - client-session `providerToken.getToken` callback before each request and applies the - returned token as an `Authorization: Bearer ` header. This is the bearer/OAuth - scheme used by Azure AD / managed-identity tokens and provider OAuth access tokens - (including Anthropic's), not a provider-specific API-key header such as Anthropic's - `x-api-key`. The token-acquiring function itself stays on the SDK side and is never - serialized; only this flag crosses the wire. When set alongside `apiKey`/`bearerToken`, - the callback takes precedence: the runtime applies the token returned by - `providerToken.getToken` as the `Authorization: Bearer` header for each request and does - not send the static credential. - """ - headers: dict[str, str] | None = None - """Custom HTTP headers to include in all outbound requests to the provider.""" - - max_context_window_tokens: float | None = None - """Maximum context window tokens for the model.""" - - max_output_tokens: float | None = None - """Maximum output tokens for the model.""" - - max_prompt_tokens: float | None = None - """Maximum prompt/input tokens for the model.""" - - model_capabilities: ModelCapabilitiesOverride | None = None - """Overrides for model capabilities when they cannot be inferred from modelId.""" - - model_id: str | None = None - """Well-known model ID used for capability lookup. When set, agent behavior config and token - limits are inferred from this model. - """ - provider_name: str | None = None - """Provider name used for model and telemetry attribution.""" - - transport: ProviderTransport | None = None - """Provider transport. Defaults to "http".""" - - type: ProviderType | None = None - """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs.""" - - wire_api: ProviderWireAPI | None = None - """Wire API format (openai/azure only). Defaults to "completions".""" - - wire_model: str | None = None - """The model identifier sent to the provider API for inference (the "wire" model), as - opposed to modelId which is the well-known base. - """ - - @staticmethod - def from_dict(obj: Any) -> 'ProviderConfig': - assert isinstance(obj, dict) - base_url = from_str(obj.get("baseUrl")) - api_key = from_union([from_str, from_none], obj.get("apiKey")) - azure = from_union([ProviderConfigAzure.from_dict, from_none], obj.get("azure")) - bearer_token = from_union([from_str, from_none], obj.get("bearerToken")) - has_bearer_token_provider = from_union([from_bool, from_none], obj.get("hasBearerTokenProvider")) - headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("headers")) - max_context_window_tokens = from_union([from_float, from_none], obj.get("maxContextWindowTokens")) - max_output_tokens = from_union([from_float, from_none], obj.get("maxOutputTokens")) - max_prompt_tokens = from_union([from_float, from_none], obj.get("maxPromptTokens")) - model_capabilities = from_union([ModelCapabilitiesOverride.from_dict, from_none], obj.get("modelCapabilities")) - model_id = from_union([from_str, from_none], obj.get("modelId")) - provider_name = from_union([from_str, from_none], obj.get("providerName")) - transport = from_union([ProviderTransport, from_none], obj.get("transport")) - type = from_union([ProviderType, from_none], obj.get("type")) - wire_api = from_union([ProviderWireAPI, from_none], obj.get("wireApi")) - wire_model = from_union([from_str, from_none], obj.get("wireModel")) - return ProviderConfig(base_url, api_key, azure, bearer_token, has_bearer_token_provider, headers, max_context_window_tokens, max_output_tokens, max_prompt_tokens, model_capabilities, model_id, provider_name, transport, type, wire_api, wire_model) - - def to_dict(self) -> dict: - result: dict = {} - result["baseUrl"] = from_str(self.base_url) - if self.api_key is not None: - result["apiKey"] = from_union([from_str, from_none], self.api_key) - if self.azure is not None: - result["azure"] = from_union([lambda x: to_class(ProviderConfigAzure, x), from_none], self.azure) - if self.bearer_token is not None: - result["bearerToken"] = from_union([from_str, from_none], self.bearer_token) - if self.has_bearer_token_provider is not None: - result["hasBearerTokenProvider"] = from_union([from_bool, from_none], self.has_bearer_token_provider) - if self.headers is not None: - result["headers"] = from_union([lambda x: from_dict(from_str, x), from_none], self.headers) - if self.max_context_window_tokens is not None: - result["maxContextWindowTokens"] = from_union([to_float, from_none], self.max_context_window_tokens) - if self.max_output_tokens is not None: - result["maxOutputTokens"] = from_union([to_float, from_none], self.max_output_tokens) - if self.max_prompt_tokens is not None: - result["maxPromptTokens"] = from_union([to_float, from_none], self.max_prompt_tokens) - if self.model_capabilities is not None: - result["modelCapabilities"] = from_union([lambda x: to_class(ModelCapabilitiesOverride, x), from_none], self.model_capabilities) - if self.model_id is not None: - result["modelId"] = from_union([from_str, from_none], self.model_id) - if self.provider_name is not None: - result["providerName"] = from_union([from_str, from_none], self.provider_name) - if self.transport is not None: - result["transport"] = from_union([lambda x: to_enum(ProviderTransport, x), from_none], self.transport) - if self.type is not None: - result["type"] = from_union([lambda x: to_enum(ProviderType, x), from_none], self.type) - if self.wire_api is not None: - result["wireApi"] = from_union([lambda x: to_enum(ProviderWireAPI, x), from_none], self.wire_api) - if self.wire_model is not None: - result["wireModel"] = from_union([from_str, from_none], self.wire_model) - return result - -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class PermissionsConfigureParams: - """Patch of permission policy fields to apply (omit a field to leave it unchanged).""" - - additional_content_exclusion_policies: list[PermissionsConfigureAdditionalContentExclusionPolicy] | None = None - """If specified, replaces the host-supplied GitHub Content Exclusion policies on the session - (combined with natively-discovered policies when evaluating tool/file access). Omit to - leave the current policies unchanged. - """ - approve_all_read_permission_requests: bool | None = None - """If specified, sets whether path/URL read permission requests are auto-approved. Omit to - leave the current value unchanged. - """ - approve_all_tool_permission_requests: bool | None = None - """If specified, sets whether tool permission requests are auto-approved without prompting. - Omit to leave the current value unchanged. - """ - paths: PermissionPathsConfig | None = None - """If specified, replaces the session's path-permission policy. The runtime constructs the - appropriate PathManager based on these inputs (rooted at the session's working - directory). Omit to leave the current path policy unchanged. - """ - rules: PermissionRulesSet | None = None - """If specified, replaces the session's approved/denied permission rules. Omit to leave the - current rules unchanged. - """ - urls: PermissionUrlsConfig | None = None - """If specified, replaces the session's URL-permission policy. The runtime constructs a - fresh DefaultUrlManager based on these inputs. Omit to leave the current URL policy - unchanged. - """ - - @staticmethod - def from_dict(obj: Any) -> 'PermissionsConfigureParams': - assert isinstance(obj, dict) - additional_content_exclusion_policies = from_union([lambda x: from_list(PermissionsConfigureAdditionalContentExclusionPolicy.from_dict, x), from_none], obj.get("additionalContentExclusionPolicies")) - approve_all_read_permission_requests = from_union([from_bool, from_none], obj.get("approveAllReadPermissionRequests")) - approve_all_tool_permission_requests = from_union([from_bool, from_none], obj.get("approveAllToolPermissionRequests")) - paths = from_union([PermissionPathsConfig.from_dict, from_none], obj.get("paths")) - rules = from_union([PermissionRulesSet.from_dict, from_none], obj.get("rules")) - urls = from_union([PermissionUrlsConfig.from_dict, from_none], obj.get("urls")) - return PermissionsConfigureParams(additional_content_exclusion_policies, approve_all_read_permission_requests, approve_all_tool_permission_requests, paths, rules, urls) - - def to_dict(self) -> dict: - result: dict = {} - if self.additional_content_exclusion_policies is not None: - result["additionalContentExclusionPolicies"] = from_union([lambda x: from_list(lambda x: to_class(PermissionsConfigureAdditionalContentExclusionPolicy, x), x), from_none], self.additional_content_exclusion_policies) - if self.approve_all_read_permission_requests is not None: - result["approveAllReadPermissionRequests"] = from_union([from_bool, from_none], self.approve_all_read_permission_requests) - if self.approve_all_tool_permission_requests is not None: - result["approveAllToolPermissionRequests"] = from_union([from_bool, from_none], self.approve_all_tool_permission_requests) - if self.paths is not None: - result["paths"] = from_union([lambda x: to_class(PermissionPathsConfig, x), from_none], self.paths) - if self.rules is not None: - result["rules"] = from_union([lambda x: to_class(PermissionRulesSet, x), from_none], self.rules) - if self.urls is not None: - result["urls"] = from_union([lambda x: to_class(PermissionUrlsConfig, x), from_none], self.urls) - return result - -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class DiscoveredMCPServer: - """MCP server discovered by `mcp.discover`, with config source, optional plugin source, - transport type, and enabled state. - """ - enabled: bool - """Whether the server is enabled (not in the disabled list)""" - - name: str - """Server name (config key)""" - - source: McpServerSource - """Configuration source: user, workspace, plugin, or builtin""" - - effective_source: MCPSourceRef | None = None - """Canonical identity and location of the effective server declaration.""" - - source_plugin: str | None = None - """Plugin name that provided this server, when source is plugin.""" - - source_plugin_version: str | None = None - """Plugin version that provided this server, when source is plugin.""" - - type: DiscoveredMCPServerType | None = None - """Server transport type: stdio, http, sse (deprecated), or memory""" - - @staticmethod - def from_dict(obj: Any) -> 'DiscoveredMCPServer': - assert isinstance(obj, dict) - enabled = from_bool(obj.get("enabled")) - name = from_str(obj.get("name")) - source = McpServerSource(obj.get("source")) - effective_source = from_union([MCPSourceRef.from_dict, from_none], obj.get("effectiveSource")) - source_plugin = from_union([from_str, from_none], obj.get("sourcePlugin")) - source_plugin_version = from_union([from_str, from_none], obj.get("sourcePluginVersion")) - type = from_union([DiscoveredMCPServerType, from_none], obj.get("type")) - return DiscoveredMCPServer(enabled, name, source, effective_source, source_plugin, source_plugin_version, type) - - def to_dict(self) -> dict: - result: dict = {} - result["enabled"] = from_bool(self.enabled) - result["name"] = from_str(self.name) - result["source"] = to_enum(McpServerSource, self.source) - if self.effective_source is not None: - result["effectiveSource"] = from_union([lambda x: to_class(MCPSourceRef, x), from_none], self.effective_source) - if self.source_plugin is not None: - result["sourcePlugin"] = from_union([from_str, from_none], self.source_plugin) - if self.source_plugin_version is not None: - result["sourcePluginVersion"] = from_union([from_str, from_none], self.source_plugin_version) - if self.type is not None: - result["type"] = from_union([lambda x: to_enum(DiscoveredMCPServerType, x), from_none], self.type) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class SandboxConfig: @@ -33048,6 +33476,25 @@ def to_dict(self) -> dict: result["omittedOlder"] = from_union([from_int, from_none], self.omitted_older) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class MCPDiscoverResult: + """MCP servers discovered from user, workspace, plugin, and built-in sources.""" + + servers: list[DiscoveredMCPServer] + """MCP servers discovered from all sources""" + + @staticmethod + def from_dict(obj: Any) -> 'MCPDiscoverResult': + assert isinstance(obj, dict) + servers = from_list(DiscoveredMCPServer.from_dict, obj.get("servers")) + return MCPDiscoverResult(servers) + + def to_dict(self) -> dict: + result: dict = {} + result["servers"] = from_list(lambda x: to_class(DiscoveredMCPServer, x), self.servers) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ProviderAddRequest: @@ -33079,25 +33526,6 @@ def to_dict(self) -> dict: result["providers"] = from_union([lambda x: from_list(lambda x: to_class(NamedProviderConfig, x), x), from_none], self.providers) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class MCPDiscoverResult: - """MCP servers discovered from user, workspace, plugin, and built-in sources.""" - - servers: list[DiscoveredMCPServer] - """MCP servers discovered from all sources""" - - @staticmethod - def from_dict(obj: Any) -> 'MCPDiscoverResult': - assert isinstance(obj, dict) - servers = from_list(DiscoveredMCPServer.from_dict, obj.get("servers")) - return MCPDiscoverResult(servers) - - def to_dict(self) -> dict: - result: dict = {} - result["servers"] = from_list(lambda x: to_class(DiscoveredMCPServer, x), self.servers) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class SessionOpenOptions: @@ -33214,8 +33642,9 @@ class SessionOpenOptions: turn onward, so the earlier spawning turn reverts it as well. """ enable_managed_settings: bool | None = None - """Opt-in: self-fetch and enforce enterprise managed settings at session bootstrap.""" - + """Opt-in: self-fetch and enforce enterprise managed settings, including managed hook + policies, at session bootstrap. + """ enable_on_demand_instruction_discovery: bool | None = None """Whether on-demand custom instruction discovery is enabled.""" @@ -33289,6 +33718,11 @@ class SessionOpenOptions: lsp_client_name: str | None = None """Identifier sent to LSP-style integrations.""" + managed_mcp_servers: dict[str, ManagedMCPServerConfig] | None = None + """Non-secret host-managed HTTP MCP servers keyed by stable managed identity. Managed + provenance is runtime-established from this separate field and credentials are supplied + through dynamic-header refresh. + """ managed_settings: SessionManagedSettings | None = None """Permissions-only enterprise policy injected by the SDK host at session create or resume. Composes restrictively with self-fetched and device policy and is not persisted. @@ -33434,6 +33868,7 @@ def from_dict(obj: Any) -> 'SessionOpenOptions': is_experimental_mode = from_union([from_bool, from_none], obj.get("isExperimentalMode")) log_interactive_shells = from_union([from_bool, from_none], obj.get("logInteractiveShells")) lsp_client_name = from_union([from_str, from_none], obj.get("lspClientName")) + managed_mcp_servers = from_union([lambda x: from_dict(ManagedMCPServerConfig.from_dict, x), from_none], obj.get("managedMcpServers")) managed_settings = from_union([SessionManagedSettings.from_dict, from_none], obj.get("managedSettings")) max_inline_binary_bytes = from_union([from_int, from_none], obj.get("maxInlineBinaryBytes")) memory = from_union([MemoryConfiguration.from_dict, from_none], obj.get("memory")) @@ -33464,7 +33899,7 @@ def from_dict(obj: Any) -> 'SessionOpenOptions': verbosity = from_union([Verbosity, from_none], obj.get("verbosity")) working_directory = from_union([from_str, from_none], obj.get("workingDirectory")) working_directory_context = from_union([SessionContext.from_dict, from_none], obj.get("workingDirectoryContext")) - return SessionOpenOptions(additional_content_exclusion_policies, additional_directories, agent_context, allow_all_mcp_server_instructions, ask_user_disabled, auth_client_id_metadata_url, auth_info, available_tools, capi, client_kind, client_name, coauthor_enabled, config_dir, continue_on_auto_mode, copilot_url, custom_agents_local_only, detached_from_spawning_parent_engagement_id, detached_from_spawning_parent_session_id, disabled_instruction_sources, disabled_mcp_servers, disabled_skills, enable_citations, enable_file_change_tracking, enable_managed_settings, enable_on_demand_instruction_discovery, enable_script_safety, enable_skills, enable_streaming, env_value_mode, events_log_directory, events_log_includes_subagents, excluded_builtin_agents, excluded_tools, exp_assignments, feature_flags, has_skill_provider, included_builtin_agents, included_builtin_skills, installed_plugins, integration_id, is_experimental_mode, log_interactive_shells, lsp_client_name, managed_settings, max_inline_binary_bytes, memory, model, model_capabilities_overrides, models, name, provider, providers, reasoning_effort, reasoning_summary, refresh_custom_instructions, remote_defaulted_on, remote_exporting, remote_steerable, running_in_interactive_mode, sandbox_config, sandbox_config_source, session_capabilities, session_id, session_limits, shell, shell_init_profile, shell_process_flags, skill_directories, skip_custom_instructions, trajectory_file, verbosity, working_directory, working_directory_context) + return SessionOpenOptions(additional_content_exclusion_policies, additional_directories, agent_context, allow_all_mcp_server_instructions, ask_user_disabled, auth_client_id_metadata_url, auth_info, available_tools, capi, client_kind, client_name, coauthor_enabled, config_dir, continue_on_auto_mode, copilot_url, custom_agents_local_only, detached_from_spawning_parent_engagement_id, detached_from_spawning_parent_session_id, disabled_instruction_sources, disabled_mcp_servers, disabled_skills, enable_citations, enable_file_change_tracking, enable_managed_settings, enable_on_demand_instruction_discovery, enable_script_safety, enable_skills, enable_streaming, env_value_mode, events_log_directory, events_log_includes_subagents, excluded_builtin_agents, excluded_tools, exp_assignments, feature_flags, has_skill_provider, included_builtin_agents, included_builtin_skills, installed_plugins, integration_id, is_experimental_mode, log_interactive_shells, lsp_client_name, managed_mcp_servers, managed_settings, max_inline_binary_bytes, memory, model, model_capabilities_overrides, models, name, provider, providers, reasoning_effort, reasoning_summary, refresh_custom_instructions, remote_defaulted_on, remote_exporting, remote_steerable, running_in_interactive_mode, sandbox_config, sandbox_config_source, session_capabilities, session_id, session_limits, shell, shell_init_profile, shell_process_flags, skill_directories, skip_custom_instructions, trajectory_file, verbosity, working_directory, working_directory_context) def to_dict(self) -> dict: result: dict = {} @@ -33554,6 +33989,8 @@ def to_dict(self) -> dict: result["logInteractiveShells"] = from_union([from_bool, from_none], self.log_interactive_shells) if self.lsp_client_name is not None: result["lspClientName"] = from_union([from_str, from_none], self.lsp_client_name) + if self.managed_mcp_servers is not None: + result["managedMcpServers"] = from_union([lambda x: from_dict(lambda x: to_class(ManagedMCPServerConfig, x), x), from_none], self.managed_mcp_servers) if self.managed_settings is not None: result["managedSettings"] = from_union([lambda x: to_class(SessionManagedSettings, x), from_none], self.managed_settings) if self.max_inline_binary_bytes is not None: @@ -37876,6 +38313,7 @@ class RPC: instruction_source_type: InstructionSourceType interrupt_main_turn_request: InterruptMainTurnRequest interrupt_main_turn_result: InterruptMainTurnResult + json_schema_response_format: JSONSchemaResponseFormat llm_inference_headers: dict[str, list[str]] llm_inference_http_request_chunk_request: LlmInferenceHTTPRequestChunkRequest llm_inference_http_request_chunk_result: LlmInferenceHTTPRequestChunkResult @@ -37892,6 +38330,7 @@ class RPC: log_request: LogRequest log_result: LogResult lsp_initialize_request: LspInitializeRequest + managed_mcp_server_config: ManagedMCPServerConfig managed_settings_read_result: ManagedSettingsReadResult marketplace_add_result: MarketplaceAddResult marketplace_browse_result: MarketplaceBrowseResult @@ -38259,8 +38698,19 @@ class RPC: plugin_update_all_entry: PluginUpdateAllEntry plugin_update_all_result: PluginUpdateAllResult plugin_update_result: PluginUpdateResult + protocol_append_mode: ProtocolAppendMode + protocol_customize_mode: ProtocolCustomizeMode protocol_external_tool_defer: MCPServerConfigDeferTools protocol_external_tool_definition: ProtocolExternalToolDefinition + protocol_marker_section_override: ProtocolMarkerSectionOverride + protocol_replace_mode: ProtocolReplaceMode + protocol_section_override: ProtocolSectionOverride + protocol_static_section_action: ProtocolStaticSectionAction + protocol_static_section_override: ProtocolStaticSectionOverride + protocol_system_message_append_config: ProtocolSystemMessageAppendConfig + protocol_system_message_config: ProtocolSystemMessageConfig + protocol_system_message_customize_config: ProtocolSystemMessageCustomizeConfig + protocol_system_message_replace_config: ProtocolSystemMessageReplaceConfig provider_add_request: ProviderAddRequest provider_add_result: ProviderAddResult provider_config: ProviderConfig @@ -38332,8 +38782,6 @@ class RPC: queue_update_text_result: QueueUpdateTextResult register_event_interest_params: RegisterEventInterestParams register_event_interest_result: RegisterEventInterestResult - register_extension_tools_params: _RegisterExtensionToolsParams - register_extension_tools_result: _RegisterExtensionToolsResult release_event_interest_params: ReleaseEventInterestParams remote_control_config: RemoteControlConfig remote_control_config_existing_mc_session: RemoteControlConfigExistingMcSession @@ -38356,6 +38804,7 @@ class RPC: remote_session_metadata_value: RemoteSessionMetadataValue remote_session_mode: RemoteSessionMode remote_session_repository: RemoteSessionRepository + response_format: ResponseFormat run_options: RunOptions sandbox_config: SandboxConfig sandbox_config_auth: SandboxConfigAuth @@ -38370,6 +38819,7 @@ class RPC: sandbox_disable_for_session_request: SandboxDisableForSessionRequest sandbox_disable_for_session_result: SandboxDisableForSessionResult sandbox_enforcement_status: SandboxEnforcementStatus + sandbox_session_change: SandboxSessionChange schedule_add_at_request: ScheduleAddAtRequest schedule_add_cron_request: ScheduleAddCronRequest schedule_add_request: ScheduleAddRequest @@ -38546,7 +38996,6 @@ class RPC: session_source: SessionSource sessions_prune_old_request: SessionsPruneOldRequest sessions_read_persisted_events_request: SessionsReadPersistedEventsRequest - sessions_register_extension_tools_on_session_options: SessionsRegisterExtensionToolsOnSessionOptions sessions_release_lock_request: SessionsReleaseLockRequest sessions_release_lock_result: SessionsReleaseLockResult sessions_reload_plugin_hooks_request: SessionsReloadPluginHooksRequest @@ -38618,6 +39067,7 @@ class RPC: slash_command_timeline_entry: SlashCommandTimelineEntry subagent_settings_entry: SubagentSettingsEntry subagent_settings_entry_context_tier: SubagentSettingsEntryContextTier + system_message_block: SystemMessageBlock task_agent_info: TaskAgentInfo task_agent_progress: TaskAgentProgress task_client_active_status: TaskClientActiveStatus @@ -39133,6 +39583,7 @@ def from_dict(obj: Any) -> 'RPC': instruction_source_type = InstructionSourceType(obj.get("InstructionSourceType")) interrupt_main_turn_request = InterruptMainTurnRequest.from_dict(obj.get("InterruptMainTurnRequest")) interrupt_main_turn_result = InterruptMainTurnResult.from_dict(obj.get("InterruptMainTurnResult")) + json_schema_response_format = JSONSchemaResponseFormat.from_dict(obj.get("JsonSchemaResponseFormat")) llm_inference_headers = from_dict(lambda x: from_list(from_str, x), obj.get("LlmInferenceHeaders")) llm_inference_http_request_chunk_request = LlmInferenceHTTPRequestChunkRequest.from_dict(obj.get("LlmInferenceHttpRequestChunkRequest")) llm_inference_http_request_chunk_result = LlmInferenceHTTPRequestChunkResult.from_dict(obj.get("LlmInferenceHttpRequestChunkResult")) @@ -39149,6 +39600,7 @@ def from_dict(obj: Any) -> 'RPC': log_request = LogRequest.from_dict(obj.get("LogRequest")) log_result = LogResult.from_dict(obj.get("LogResult")) lsp_initialize_request = LspInitializeRequest.from_dict(obj.get("LspInitializeRequest")) + managed_mcp_server_config = ManagedMCPServerConfig.from_dict(obj.get("ManagedMcpServerConfig")) managed_settings_read_result = ManagedSettingsReadResult.from_dict(obj.get("ManagedSettingsReadResult")) marketplace_add_result = MarketplaceAddResult.from_dict(obj.get("MarketplaceAddResult")) marketplace_browse_result = MarketplaceBrowseResult.from_dict(obj.get("MarketplaceBrowseResult")) @@ -39516,8 +39968,19 @@ def from_dict(obj: Any) -> 'RPC': plugin_update_all_entry = PluginUpdateAllEntry.from_dict(obj.get("PluginUpdateAllEntry")) plugin_update_all_result = PluginUpdateAllResult.from_dict(obj.get("PluginUpdateAllResult")) plugin_update_result = PluginUpdateResult.from_dict(obj.get("PluginUpdateResult")) + protocol_append_mode = ProtocolAppendMode(obj.get("ProtocolAppendMode")) + protocol_customize_mode = ProtocolCustomizeMode(obj.get("ProtocolCustomizeMode")) protocol_external_tool_defer = MCPServerConfigDeferTools(obj.get("ProtocolExternalToolDefer")) protocol_external_tool_definition = ProtocolExternalToolDefinition.from_dict(obj.get("ProtocolExternalToolDefinition")) + protocol_marker_section_override = ProtocolMarkerSectionOverride.from_dict(obj.get("ProtocolMarkerSectionOverride")) + protocol_replace_mode = ProtocolReplaceMode(obj.get("ProtocolReplaceMode")) + protocol_section_override = ProtocolSectionOverride.from_dict(obj.get("ProtocolSectionOverride")) + protocol_static_section_action = ProtocolStaticSectionAction(obj.get("ProtocolStaticSectionAction")) + protocol_static_section_override = ProtocolStaticSectionOverride.from_dict(obj.get("ProtocolStaticSectionOverride")) + protocol_system_message_append_config = ProtocolSystemMessageAppendConfig.from_dict(obj.get("ProtocolSystemMessageAppendConfig")) + protocol_system_message_config = ProtocolSystemMessageConfig.from_dict(obj.get("ProtocolSystemMessageConfig")) + protocol_system_message_customize_config = ProtocolSystemMessageCustomizeConfig.from_dict(obj.get("ProtocolSystemMessageCustomizeConfig")) + protocol_system_message_replace_config = ProtocolSystemMessageReplaceConfig.from_dict(obj.get("ProtocolSystemMessageReplaceConfig")) provider_add_request = ProviderAddRequest.from_dict(obj.get("ProviderAddRequest")) provider_add_result = ProviderAddResult.from_dict(obj.get("ProviderAddResult")) provider_config = ProviderConfig.from_dict(obj.get("ProviderConfig")) @@ -39589,8 +40052,6 @@ def from_dict(obj: Any) -> 'RPC': queue_update_text_result = QueueUpdateTextResult.from_dict(obj.get("QueueUpdateTextResult")) register_event_interest_params = RegisterEventInterestParams.from_dict(obj.get("RegisterEventInterestParams")) register_event_interest_result = RegisterEventInterestResult.from_dict(obj.get("RegisterEventInterestResult")) - register_extension_tools_params = _RegisterExtensionToolsParams.from_dict(obj.get("RegisterExtensionToolsParams")) - register_extension_tools_result = _RegisterExtensionToolsResult.from_dict(obj.get("RegisterExtensionToolsResult")) release_event_interest_params = ReleaseEventInterestParams.from_dict(obj.get("ReleaseEventInterestParams")) remote_control_config = RemoteControlConfig.from_dict(obj.get("RemoteControlConfig")) remote_control_config_existing_mc_session = RemoteControlConfigExistingMcSession.from_dict(obj.get("RemoteControlConfigExistingMcSession")) @@ -39613,6 +40074,7 @@ def from_dict(obj: Any) -> 'RPC': remote_session_metadata_value = RemoteSessionMetadataValue.from_dict(obj.get("RemoteSessionMetadataValue")) remote_session_mode = RemoteSessionMode(obj.get("RemoteSessionMode")) remote_session_repository = RemoteSessionRepository.from_dict(obj.get("RemoteSessionRepository")) + response_format = ResponseFormat.from_dict(obj.get("ResponseFormat")) run_options = RunOptions.from_dict(obj.get("RunOptions")) sandbox_config = SandboxConfig.from_dict(obj.get("SandboxConfig")) sandbox_config_auth = SandboxConfigAuth.from_dict(obj.get("SandboxConfigAuth")) @@ -39627,6 +40089,7 @@ def from_dict(obj: Any) -> 'RPC': sandbox_disable_for_session_request = SandboxDisableForSessionRequest.from_dict(obj.get("SandboxDisableForSessionRequest")) sandbox_disable_for_session_result = SandboxDisableForSessionResult.from_dict(obj.get("SandboxDisableForSessionResult")) sandbox_enforcement_status = SandboxEnforcementStatus.from_dict(obj.get("SandboxEnforcementStatus")) + sandbox_session_change = SandboxSessionChange(obj.get("SandboxSessionChange")) schedule_add_at_request = ScheduleAddAtRequest.from_dict(obj.get("ScheduleAddAtRequest")) schedule_add_cron_request = ScheduleAddCronRequest.from_dict(obj.get("ScheduleAddCronRequest")) schedule_add_request = ScheduleAddRequest.from_dict(obj.get("ScheduleAddRequest")) @@ -39803,7 +40266,6 @@ def from_dict(obj: Any) -> 'RPC': session_source = SessionSource(obj.get("SessionSource")) sessions_prune_old_request = SessionsPruneOldRequest.from_dict(obj.get("SessionsPruneOldRequest")) sessions_read_persisted_events_request = SessionsReadPersistedEventsRequest.from_dict(obj.get("SessionsReadPersistedEventsRequest")) - sessions_register_extension_tools_on_session_options = SessionsRegisterExtensionToolsOnSessionOptions.from_dict(obj.get("SessionsRegisterExtensionToolsOnSessionOptions")) sessions_release_lock_request = SessionsReleaseLockRequest.from_dict(obj.get("SessionsReleaseLockRequest")) sessions_release_lock_result = SessionsReleaseLockResult.from_dict(obj.get("SessionsReleaseLockResult")) sessions_reload_plugin_hooks_request = SessionsReloadPluginHooksRequest.from_dict(obj.get("SessionsReloadPluginHooksRequest")) @@ -39875,6 +40337,7 @@ def from_dict(obj: Any) -> 'RPC': slash_command_timeline_entry = SlashCommandTimelineEntry.from_dict(obj.get("SlashCommandTimelineEntry")) subagent_settings_entry = SubagentSettingsEntry.from_dict(obj.get("SubagentSettingsEntry")) subagent_settings_entry_context_tier = SubagentSettingsEntryContextTier(obj.get("SubagentSettingsEntryContextTier")) + system_message_block = SystemMessageBlock.from_dict(obj.get("SystemMessageBlock")) task_agent_info = TaskAgentInfo.from_dict(obj.get("TaskAgentInfo")) task_agent_progress = TaskAgentProgress.from_dict(obj.get("TaskAgentProgress")) task_client_active_status = TaskClientActiveStatus(obj.get("TaskClientActiveStatus")) @@ -40030,7 +40493,7 @@ def from_dict(obj: Any) -> 'RPC': subagent_settings = from_union([SubagentSettings.from_dict, from_none], obj.get("SubagentSettings")) task_progress = from_union([TaskProgress.from_dict, from_none], obj.get("TaskProgress")) workspace_summary = from_union([WorkspaceSummary.from_dict, from_none], obj.get("WorkspaceSummary")) - return RPC(abort_request, abort_result, account_all_users, account_get_all_users_result, account_get_current_auth_result, account_get_quota_request, account_get_quota_result, account_login_request, account_login_result, account_logout_request, account_logout_result, account_quota_snapshot, adaptive_thinking_support, agent_discovery_path, agent_discovery_path_list, agent_discovery_path_scope, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_list_request, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, agent_set_prompt_request, agents_get_discovery_paths_request, api_key_auth_info, auth_identity, auth_info, auth_info_type, auth_validation_error, auth_validation_errors, autopilot_objective_credit_limit, autopilot_objective_get_state_result, autopilot_objective_state, autopilot_objective_status, built_in_model_catalog, built_in_model_catalog_entry, builtin_tool_descriptor, builtin_tool_format, builtin_tool_format_type, builtin_tool_input_schema, builtin_tool_input_schema_type, builtin_tool_safe_for_telemetry, builtin_tool_safe_telemetry_fields, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_provider_register_request, canvas_provider_unregister_request, canvas_session_context, capi_session_options, card_digest, card_digest_algorithm, card_digest_value, catalog_ai_skill_candidate, catalog_ai_skill_candidate_provenance, catalog_authentication_required_error, catalog_authentication_required_reason, catalog_candidate, catalog_candidate_kind, catalog_candidate_source, catalog_candidate_source_embedded, catalog_candidate_source_url, catalog_capability, catalog_capability_id, catalog_client_contract, catalog_contract_violation_error, catalog_contract_violation_reason, catalog_handle_rejected_error, catalog_handle_rejection_reason, catalog_handle_type, catalog_invalid_request_error, catalog_invalid_request_field, catalog_malformed_card_error, catalog_malformed_card_reason, catalog_mcp_server_candidate, catalog_mcp_server_candidate_provenance, catalog_mcp_server_installability, catalog_media_type, catalog_negotiated_contract, catalog_negotiation_refused_error, catalog_negotiation_refused_reason, catalog_network_failure_error, catalog_network_failure_reason, catalog_not_installable_error, catalog_not_installable_reason, catalog_policy_rejected_error, catalog_search_request, catalog_search_result, catalog_search_succeeded, catalog_trust_eligibility, catalog_trust_provenance, catalog_trust_snapshot, catalog_trust_snapshot_absent, catalog_trust_snapshot_absent_status, catalog_trust_snapshot_current, catalog_trust_snapshot_current_status, catalog_trust_snapshot_downgraded, catalog_trust_snapshot_downgraded_status, catalog_trust_snapshot_malformed, catalog_trust_snapshot_malformed_status, catalog_trust_snapshot_revoked, catalog_trust_snapshot_revoked_status, catalog_trust_snapshot_schema_version, catalog_trust_snapshot_stale, catalog_trust_snapshot_stale_status, catalog_trust_snapshot_unsupported, catalog_trust_snapshot_unsupported_status, catalog_trust_source, catalog_trust_tier, catalog_unavailable_error, catalog_unavailable_reason, catalog_unavailable_transport_error, catalog_unavailable_transport_reason, catalog_unsafe_retrieval_error, catalog_unsafe_retrieval_reason, catalog_unsupported_kind_error, client_metadata, client_task_cancel_reason, client_task_cancel_request, client_task_cancel_result, command_list, commands_finalize_invocation_effect_request, commands_finalize_invocation_effect_result, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invocation_effect_outcome, commands_invocation_origin, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, completions_get_trigger_characters_result, completions_request_request, completions_request_result, configure_session_extensions_params, connect_client_info, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_exclusion_check_paths_request, content_exclusion_check_paths_result, content_exclusion_path_check, content_filter_mode, context_heaviest_message, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, debug_collect_logs_collected_entry, debug_collect_logs_destination, debug_collect_logs_entry, debug_collect_logs_entry_kind, debug_collect_logs_include, debug_collect_logs_redaction, debug_collect_logs_request, debug_collect_logs_result, debug_collect_logs_result_kind, debug_collect_logs_skipped_entry, debug_collect_logs_source, discovered_canvas, discovered_extension, discovered_extension_mode, discovered_extension_plugin, discovered_extensions, discovered_extensions_disable_request, discovered_extensions_enable_request, discovered_extension_source, discovered_hook, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_direction, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_launch_profile, extension_launch_provider_resolve_request, extension_launch_provider_resolve_result, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_shell_exit, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, factory_abort_request, factory_ack_result, factory_agent_options, factory_agent_request, factory_agent_result, factory_agent_summary, factory_cancel_request, factory_current_phase, factory_declared_limits, factory_durable_operation, factory_execute_request, factory_execute_result, factory_get_run_progress_request, factory_get_run_request, factory_journal_get_request, factory_journal_get_result, factory_journal_put_request, factory_list_runs_request, factory_list_runs_result, factory_log_line, factory_log_line_kind, factory_log_request, factory_pause_checkpoint_action, factory_pause_checkpoint_request, factory_pause_checkpoint_result, factory_pause_info, factory_pause_request, factory_phase_observation, factory_phase_status, factory_progress_line, factory_progress_page, factory_resume_request, factory_resume_result, factory_run_consumed, factory_run_detail, factory_run_failure, factory_run_failure_kind, factory_run_limits, factory_run_request, factory_run_result, factory_run_status, factory_run_summary, factory_run_terminal, factory_tool_resume_request, factory_tool_run_options, factory_tool_run_request, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, git_hub_telemetry_client_info, git_hub_telemetry_event, git_hub_telemetry_notification, git_hub_token_acquire_reason, git_hub_token_acquire_request, git_hub_token_acquire_result, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_clear_context_request, history_clear_context_result, history_compact_context_window, history_compact_request, history_compact_result, history_file_restore_skip_reason, history_list_rewind_points_result, history_preview_rewind_request, history_preview_rewind_result, history_rewind_change_type, history_rewind_file_preview, history_rewind_mode, history_rewind_outcome, history_rewind_point, history_rewind_request, history_rewind_result, history_rewind_unavailable_reason, history_skipped_file_restore, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, hook_invoke_request, hook_invoke_response, hook_origin, hooks_discover_request, hooks_discover_result, hook_type, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instruction_discovery_path, instruction_discovery_path_kind, instruction_discovery_path_list, instruction_discovery_path_location, instructions_discover_request, instructions_get_discovery_paths_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, interrupt_main_turn_request, interrupt_main_turn_result, llm_inference_headers, llm_inference_http_request_chunk_request, llm_inference_http_request_chunk_result, llm_inference_http_request_start_request, llm_inference_http_request_start_result, llm_inference_http_request_start_transport, llm_inference_http_response_chunk_error, llm_inference_http_response_chunk_request, llm_inference_http_response_chunk_result, llm_inference_http_response_start_request, llm_inference_http_response_start_result, llm_inference_set_provider_result, local_session_metadata_value, log_request, log_result, lsp_initialize_request, managed_settings_read_result, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_elicitation_form_mode, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_failed_server, mcp_filtered_server, mcp_headers_handle_pending_headers_refresh_request, mcp_headers_handle_pending_headers_refresh_request_request, mcp_headers_handle_pending_headers_refresh_request_result, mcp_host_state, mcp_install_plan, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_authentication_state_changed_request, mcp_oauth_handle_pending_request, mcp_oauth_handle_pending_result, mcp_oauth_login_grant_type, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_pending_request_response, mcp_oauth_probe_needs_auth_reason, mcp_oauth_probe_request, mcp_oauth_probe_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_plan_configuration_change, mcp_plan_configuration_operation, mcp_plan_enum_value_type, mcp_plan_install_planned, mcp_plan_install_request, mcp_plan_install_result, mcp_plan_install_source, mcp_plan_install_source_candidate, mcp_plan_install_source_candidate_kind, mcp_plan_install_source_card, mcp_plan_install_source_card_kind, mcp_plan_package_install_method, mcp_plan_package_transport, mcp_plan_policy_decision, mcp_plan_policy_result, mcp_plan_policy_source, mcp_plan_provenance, mcp_plan_remote_install_method, mcp_plan_remote_transport, mcp_plan_required_value, mcp_plan_required_value_enum, mcp_plan_required_value_enum_kind, mcp_plan_required_value_scalar, mcp_plan_required_value_scalar_kind, mcp_plan_resource_identity, mcp_plan_scalar_value_type, mcp_plan_scope, mcp_plan_secret_placeholder, mcp_plan_secret_reference, mcp_plan_target, mcp_plan_transport_choice, mcp_plan_transport_choice_package, mcp_plan_transport_choice_remote, mcp_plan_value_category, mcp_register_external_client_request, mcp_reload_config, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_resource, mcp_resource_annotations, mcp_resource_content, mcp_resource_icon, mcp_resources_list_request, mcp_resources_list_result, mcp_resources_list_templates_request, mcp_resources_list_templates_result, mcp_resources_read_request, mcp_resources_read_result, mcp_resource_template, mcp_restart_server_request, mcp_safe_for_telemetry, mcp_safe_for_telemetry_fields, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_serializable_server_config, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_card_embedded, mcp_server_card_embedded_kind, mcp_server_card_media_type, mcp_server_card_reference, mcp_server_card_url, mcp_server_card_url_kind, mcp_server_config, mcp_server_config_defer_tools, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_memory, mcp_server_config_memory_type, mcp_server_config_stdio, mcp_server_config_stdio_type, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_source_file, mcp_source_plugin, mcp_source_ref, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_task_metadata, mcp_tools, mcp_tool_ui, mcp_tool_ui_visibility, mcp_unregister_external_client_request, memory_configuration, metadata_context_attribution_result, metadata_context_heaviest_messages_request, metadata_context_heaviest_messages_result, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, metadata_update_client_metadata_request, model, model_apply_startup_overlay_request, model_billing, model_billing_promo, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_message, model_picker_category, model_picker_persistence_request, model_picker_price_category, model_picker_settings_context, model_policy, model_policy_state, model_set_allowed_models_request, model_set_allowed_models_result, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_auto_tier_request, model_switch_auto_tier_result, model_switch_auto_tier_status, model_switch_confirmation, model_switch_to_request, model_switch_to_result, model_warning_text, mode_set_request, mode_set_result, move_mcp_loading_to_background_result, named_provider_config, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_env_access, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_factory, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_env_access, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_factory, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_context, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_outcome, permission_decision_reject, permission_decision_request, permission_decision_surface, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_mode_source, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_response_capability, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_mode_request, permissions_get_mode_result, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_env_access, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_factory, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_mode_request, permissions_set_mode_result, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_install_staging_mode, plugin_list, plugin_list_result, plugins_builtin_set_request, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, protocol_external_tool_defer, protocol_external_tool_definition, provider_add_request, provider_add_result, provider_config, provider_config_azure, provider_config_transport, provider_config_type, provider_config_wire_api, provider_endpoint, provider_endpoint_transport, provider_endpoint_type, provider_endpoint_wire_api, provider_get_endpoint_request, provider_model_config, provider_session_token, provider_token_acquire_request, provider_token_acquire_result, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_actions_job, push_attachment_git_hub_commit, push_attachment_git_hub_file, push_attachment_git_hub_file_diff, push_attachment_git_hub_file_diff_side, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_git_hub_release, push_attachment_git_hub_repository, push_attachment_git_hub_snippet, push_attachment_git_hub_tree_comparison, push_attachment_git_hub_tree_comparison_side, push_attachment_git_hub_url, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, push_git_hub_repo_ref, queue_begin_deferred_idle_drain_request, queue_begin_deferred_idle_drain_result, queue_consume_system_notifications_request, queued_command_handled, queued_command_not_handled, queued_command_result, queue_defer_session_idle_request, queue_duplicate_at_request, queue_duplicate_at_result, queue_enqueue_resume_pending_result, queue_finish_deferred_idle_drain_request, queue_finish_deferred_idle_drain_result, queue_has_pending_result, queue_insert_at_request, queue_insert_at_result, queue_insert_message, queue_move_item_request, queue_move_item_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_at_request, queue_remove_at_result, queue_remove_most_recent_result, queue_send_now_request, queue_send_now_result, queue_set_drain_paused_request, queue_snapshot_result, queue_update_text_request, queue_update_text_result, register_event_interest_params, register_event_interest_result, register_extension_tools_params, register_extension_tools_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_host_status, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, run_options, sandbox_config, sandbox_config_auth, sandbox_config_source, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, sandbox_config_user_policy_network_proxy, sandbox_config_user_policy_seatbelt, sandbox_disable_for_session_request, sandbox_disable_for_session_result, sandbox_enforcement_status, schedule_add_at_request, schedule_add_cron_request, schedule_add_request, schedule_add_result, schedule_add_self_paced_request, schedule_entry, schedule_has_self_paced_result, schedule_list, schedule_rearm_self_paced_request, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_message_item, send_messages_request, send_messages_result, send_mode, send_request, send_result, send_system_notification_request, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_agent_list_request, session_auth_login_request, session_auth_logout_user_request, session_auth_status, session_auth_switch_request, session_bulk_delete_result, session_cancel_all_background_agents_result, session_capability, session_commands_list_request, session_completion_item, session_context, session_context_host_type, session_enrich_metadata_result, session_factory_pause_at_checkpoint_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_sqlite_transaction_error, session_fs_sqlite_transaction_error_class, session_fs_sqlite_transaction_request, session_fs_sqlite_transaction_result, session_fs_sqlite_transaction_statement, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_git_hub_auth_get_all_auth_available_result, session_git_hub_auth_logout_result, session_git_hub_auth_logout_user_result, session_history_compact_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_limit_prediction_baseline_data, session_limit_prediction_client_type, session_limit_prediction_details, session_limit_prediction_predict_request, session_limit_prediction_request, session_limit_prediction_result, session_limit_prediction_source, session_limit_prediction_tier, session_limit_prediction_tier_option, session_limit_prediction_unavailable_reason, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_managed_permissions, session_managed_settings, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_model_list_request, session_model_price_category, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_plugins_reload_request, session_provider_get_endpoint_request, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_client_metadata_entry, sessions_close_request, sessions_close_result, sessions_delete_request, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, session_settings_built_in_tool_availability_snapshot, session_settings_evaluate_predicate_request, session_settings_evaluate_predicate_result, session_settings_job_snapshot, session_settings_model_snapshot, session_settings_online_evaluation_snapshot, session_settings_predicate_name, session_settings_repo_snapshot, session_settings_snapshot, session_settings_validation_snapshot, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_client_metadata_request, sessions_get_client_metadata_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_metadata_request, sessions_get_metadata_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_non_empty_session_ids_request, sessions_list_non_empty_session_ids_result, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_prune_old_request, sessions_read_persisted_events_request, sessions_register_extension_tools_on_session_options, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_visibility_status, session_working_directory_context, session_working_directory_context_host_type, settable_auth_info, settable_token_auth_info, shell_cancel_user_requested_request, shell_credentials, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_init_profile, shell_init_script, shell_init_script_shell, shell_kill_request, shell_kill_result, shell_kill_signal, shell_options, shutdown_request, skill, skill_discovery_path, skill_discovery_path_list, skill_discovery_scope, skill_list, skill_provider_descriptor, skill_provider_list_request, skill_provider_list_result, skill_provider_read_request, skill_provider_read_result, skills_config_set_disabled_skills_request, skills_config_set_skill_disabled_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_discovery_paths_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_add_timeline_entry_result, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_choice, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_model_picker_dialog, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_set_model_result, slash_command_set_plan_model_result, slash_command_show_dialog_result, slash_command_text_result, slash_command_timeline_entry, subagent_settings_entry, subagent_settings_entry_context_tier, task_agent_info, task_agent_progress, task_client_active_status, task_client_execution_mode, task_client_info, task_client_owner, task_client_owner_kind, task_client_owner_presence, task_client_progress, task_client_status, task_client_type, task_client_update, task_complete_data, task_completion_decision, task_execution_mode, task_info, task_kind, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_register_request, tasks_register_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_update_request, tasks_update_result, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, token_provider_auth_info, tool, tool_list, tool_result, tool_result_expanded, tool_result_new_message, tool_result_type, tools_execute_request, tools_get_builtin_descriptors_request, tools_get_builtin_descriptors_result, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_set_request, tools_set_result, tools_shell_descriptor_config, tools_task_complete_event_data_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_session_limits_exhausted_request, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_session_limits_exhausted_response, ui_session_limits_exhausted_response_action, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_agent_metric, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, user_setting_metadata, user_settings_get_result, user_settings_set_request, user_settings_set_result, visibility_get_result, visibility_set_request, visibility_set_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_add_summary_request, workspaces_add_summary_result, workspaces_autopilot_objective_exists_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_delete_autopilot_objective_result, workspaces_diff_request, workspaces_ensure_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_autopilot_objective_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspaces_truncate_summaries_request, workspace_summary_host_type, workspaces_update_metadata_request, workspaces_workspace_details_host_type, workspaces_write_autopilot_objective_request, workspaces_write_autopilot_objective_result, session_auth_info_result, session_context_attribution, session_context_info, subagent_settings, task_progress, workspace_summary) + return RPC(abort_request, abort_result, account_all_users, account_get_all_users_result, account_get_current_auth_result, account_get_quota_request, account_get_quota_result, account_login_request, account_login_result, account_logout_request, account_logout_result, account_quota_snapshot, adaptive_thinking_support, agent_discovery_path, agent_discovery_path_list, agent_discovery_path_scope, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_list_request, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, agent_set_prompt_request, agents_get_discovery_paths_request, api_key_auth_info, auth_identity, auth_info, auth_info_type, auth_validation_error, auth_validation_errors, autopilot_objective_credit_limit, autopilot_objective_get_state_result, autopilot_objective_state, autopilot_objective_status, built_in_model_catalog, built_in_model_catalog_entry, builtin_tool_descriptor, builtin_tool_format, builtin_tool_format_type, builtin_tool_input_schema, builtin_tool_input_schema_type, builtin_tool_safe_for_telemetry, builtin_tool_safe_telemetry_fields, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_provider_register_request, canvas_provider_unregister_request, canvas_session_context, capi_session_options, card_digest, card_digest_algorithm, card_digest_value, catalog_ai_skill_candidate, catalog_ai_skill_candidate_provenance, catalog_authentication_required_error, catalog_authentication_required_reason, catalog_candidate, catalog_candidate_kind, catalog_candidate_source, catalog_candidate_source_embedded, catalog_candidate_source_url, catalog_capability, catalog_capability_id, catalog_client_contract, catalog_contract_violation_error, catalog_contract_violation_reason, catalog_handle_rejected_error, catalog_handle_rejection_reason, catalog_handle_type, catalog_invalid_request_error, catalog_invalid_request_field, catalog_malformed_card_error, catalog_malformed_card_reason, catalog_mcp_server_candidate, catalog_mcp_server_candidate_provenance, catalog_mcp_server_installability, catalog_media_type, catalog_negotiated_contract, catalog_negotiation_refused_error, catalog_negotiation_refused_reason, catalog_network_failure_error, catalog_network_failure_reason, catalog_not_installable_error, catalog_not_installable_reason, catalog_policy_rejected_error, catalog_search_request, catalog_search_result, catalog_search_succeeded, catalog_trust_eligibility, catalog_trust_provenance, catalog_trust_snapshot, catalog_trust_snapshot_absent, catalog_trust_snapshot_absent_status, catalog_trust_snapshot_current, catalog_trust_snapshot_current_status, catalog_trust_snapshot_downgraded, catalog_trust_snapshot_downgraded_status, catalog_trust_snapshot_malformed, catalog_trust_snapshot_malformed_status, catalog_trust_snapshot_revoked, catalog_trust_snapshot_revoked_status, catalog_trust_snapshot_schema_version, catalog_trust_snapshot_stale, catalog_trust_snapshot_stale_status, catalog_trust_snapshot_unsupported, catalog_trust_snapshot_unsupported_status, catalog_trust_source, catalog_trust_tier, catalog_unavailable_error, catalog_unavailable_reason, catalog_unavailable_transport_error, catalog_unavailable_transport_reason, catalog_unsafe_retrieval_error, catalog_unsafe_retrieval_reason, catalog_unsupported_kind_error, client_metadata, client_task_cancel_reason, client_task_cancel_request, client_task_cancel_result, command_list, commands_finalize_invocation_effect_request, commands_finalize_invocation_effect_result, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invocation_effect_outcome, commands_invocation_origin, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, completions_get_trigger_characters_result, completions_request_request, completions_request_result, configure_session_extensions_params, connect_client_info, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_exclusion_check_paths_request, content_exclusion_check_paths_result, content_exclusion_path_check, content_filter_mode, context_heaviest_message, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, debug_collect_logs_collected_entry, debug_collect_logs_destination, debug_collect_logs_entry, debug_collect_logs_entry_kind, debug_collect_logs_include, debug_collect_logs_redaction, debug_collect_logs_request, debug_collect_logs_result, debug_collect_logs_result_kind, debug_collect_logs_skipped_entry, debug_collect_logs_source, discovered_canvas, discovered_extension, discovered_extension_mode, discovered_extension_plugin, discovered_extensions, discovered_extensions_disable_request, discovered_extensions_enable_request, discovered_extension_source, discovered_hook, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_direction, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_launch_profile, extension_launch_provider_resolve_request, extension_launch_provider_resolve_result, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_shell_exit, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, factory_abort_request, factory_ack_result, factory_agent_options, factory_agent_request, factory_agent_result, factory_agent_summary, factory_cancel_request, factory_current_phase, factory_declared_limits, factory_durable_operation, factory_execute_request, factory_execute_result, factory_get_run_progress_request, factory_get_run_request, factory_journal_get_request, factory_journal_get_result, factory_journal_put_request, factory_list_runs_request, factory_list_runs_result, factory_log_line, factory_log_line_kind, factory_log_request, factory_pause_checkpoint_action, factory_pause_checkpoint_request, factory_pause_checkpoint_result, factory_pause_info, factory_pause_request, factory_phase_observation, factory_phase_status, factory_progress_line, factory_progress_page, factory_resume_request, factory_resume_result, factory_run_consumed, factory_run_detail, factory_run_failure, factory_run_failure_kind, factory_run_limits, factory_run_request, factory_run_result, factory_run_status, factory_run_summary, factory_run_terminal, factory_tool_resume_request, factory_tool_run_options, factory_tool_run_request, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, git_hub_telemetry_client_info, git_hub_telemetry_event, git_hub_telemetry_notification, git_hub_token_acquire_reason, git_hub_token_acquire_request, git_hub_token_acquire_result, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_clear_context_request, history_clear_context_result, history_compact_context_window, history_compact_request, history_compact_result, history_file_restore_skip_reason, history_list_rewind_points_result, history_preview_rewind_request, history_preview_rewind_result, history_rewind_change_type, history_rewind_file_preview, history_rewind_mode, history_rewind_outcome, history_rewind_point, history_rewind_request, history_rewind_result, history_rewind_unavailable_reason, history_skipped_file_restore, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, hook_invoke_request, hook_invoke_response, hook_origin, hooks_discover_request, hooks_discover_result, hook_type, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instruction_discovery_path, instruction_discovery_path_kind, instruction_discovery_path_list, instruction_discovery_path_location, instructions_discover_request, instructions_get_discovery_paths_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, interrupt_main_turn_request, interrupt_main_turn_result, json_schema_response_format, llm_inference_headers, llm_inference_http_request_chunk_request, llm_inference_http_request_chunk_result, llm_inference_http_request_start_request, llm_inference_http_request_start_result, llm_inference_http_request_start_transport, llm_inference_http_response_chunk_error, llm_inference_http_response_chunk_request, llm_inference_http_response_chunk_result, llm_inference_http_response_start_request, llm_inference_http_response_start_result, llm_inference_set_provider_result, local_session_metadata_value, log_request, log_result, lsp_initialize_request, managed_mcp_server_config, managed_settings_read_result, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_elicitation_form_mode, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_failed_server, mcp_filtered_server, mcp_headers_handle_pending_headers_refresh_request, mcp_headers_handle_pending_headers_refresh_request_request, mcp_headers_handle_pending_headers_refresh_request_result, mcp_host_state, mcp_install_plan, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_authentication_state_changed_request, mcp_oauth_handle_pending_request, mcp_oauth_handle_pending_result, mcp_oauth_login_grant_type, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_pending_request_response, mcp_oauth_probe_needs_auth_reason, mcp_oauth_probe_request, mcp_oauth_probe_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_plan_configuration_change, mcp_plan_configuration_operation, mcp_plan_enum_value_type, mcp_plan_install_planned, mcp_plan_install_request, mcp_plan_install_result, mcp_plan_install_source, mcp_plan_install_source_candidate, mcp_plan_install_source_candidate_kind, mcp_plan_install_source_card, mcp_plan_install_source_card_kind, mcp_plan_package_install_method, mcp_plan_package_transport, mcp_plan_policy_decision, mcp_plan_policy_result, mcp_plan_policy_source, mcp_plan_provenance, mcp_plan_remote_install_method, mcp_plan_remote_transport, mcp_plan_required_value, mcp_plan_required_value_enum, mcp_plan_required_value_enum_kind, mcp_plan_required_value_scalar, mcp_plan_required_value_scalar_kind, mcp_plan_resource_identity, mcp_plan_scalar_value_type, mcp_plan_scope, mcp_plan_secret_placeholder, mcp_plan_secret_reference, mcp_plan_target, mcp_plan_transport_choice, mcp_plan_transport_choice_package, mcp_plan_transport_choice_remote, mcp_plan_value_category, mcp_register_external_client_request, mcp_reload_config, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_resource, mcp_resource_annotations, mcp_resource_content, mcp_resource_icon, mcp_resources_list_request, mcp_resources_list_result, mcp_resources_list_templates_request, mcp_resources_list_templates_result, mcp_resources_read_request, mcp_resources_read_result, mcp_resource_template, mcp_restart_server_request, mcp_safe_for_telemetry, mcp_safe_for_telemetry_fields, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_serializable_server_config, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_card_embedded, mcp_server_card_embedded_kind, mcp_server_card_media_type, mcp_server_card_reference, mcp_server_card_url, mcp_server_card_url_kind, mcp_server_config, mcp_server_config_defer_tools, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_memory, mcp_server_config_memory_type, mcp_server_config_stdio, mcp_server_config_stdio_type, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_source_file, mcp_source_plugin, mcp_source_ref, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_task_metadata, mcp_tools, mcp_tool_ui, mcp_tool_ui_visibility, mcp_unregister_external_client_request, memory_configuration, metadata_context_attribution_result, metadata_context_heaviest_messages_request, metadata_context_heaviest_messages_result, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, metadata_update_client_metadata_request, model, model_apply_startup_overlay_request, model_billing, model_billing_promo, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_message, model_picker_category, model_picker_persistence_request, model_picker_price_category, model_picker_settings_context, model_policy, model_policy_state, model_set_allowed_models_request, model_set_allowed_models_result, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_auto_tier_request, model_switch_auto_tier_result, model_switch_auto_tier_status, model_switch_confirmation, model_switch_to_request, model_switch_to_result, model_warning_text, mode_set_request, mode_set_result, move_mcp_loading_to_background_result, named_provider_config, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_env_access, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_factory, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_env_access, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_factory, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_context, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_outcome, permission_decision_reject, permission_decision_request, permission_decision_surface, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_mode_source, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_response_capability, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_mode_request, permissions_get_mode_result, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_env_access, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_factory, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_mode_request, permissions_set_mode_result, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_install_staging_mode, plugin_list, plugin_list_result, plugins_builtin_set_request, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, protocol_append_mode, protocol_customize_mode, protocol_external_tool_defer, protocol_external_tool_definition, protocol_marker_section_override, protocol_replace_mode, protocol_section_override, protocol_static_section_action, protocol_static_section_override, protocol_system_message_append_config, protocol_system_message_config, protocol_system_message_customize_config, protocol_system_message_replace_config, provider_add_request, provider_add_result, provider_config, provider_config_azure, provider_config_transport, provider_config_type, provider_config_wire_api, provider_endpoint, provider_endpoint_transport, provider_endpoint_type, provider_endpoint_wire_api, provider_get_endpoint_request, provider_model_config, provider_session_token, provider_token_acquire_request, provider_token_acquire_result, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_actions_job, push_attachment_git_hub_commit, push_attachment_git_hub_file, push_attachment_git_hub_file_diff, push_attachment_git_hub_file_diff_side, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_git_hub_release, push_attachment_git_hub_repository, push_attachment_git_hub_snippet, push_attachment_git_hub_tree_comparison, push_attachment_git_hub_tree_comparison_side, push_attachment_git_hub_url, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, push_git_hub_repo_ref, queue_begin_deferred_idle_drain_request, queue_begin_deferred_idle_drain_result, queue_consume_system_notifications_request, queued_command_handled, queued_command_not_handled, queued_command_result, queue_defer_session_idle_request, queue_duplicate_at_request, queue_duplicate_at_result, queue_enqueue_resume_pending_result, queue_finish_deferred_idle_drain_request, queue_finish_deferred_idle_drain_result, queue_has_pending_result, queue_insert_at_request, queue_insert_at_result, queue_insert_message, queue_move_item_request, queue_move_item_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_at_request, queue_remove_at_result, queue_remove_most_recent_result, queue_send_now_request, queue_send_now_result, queue_set_drain_paused_request, queue_snapshot_result, queue_update_text_request, queue_update_text_result, register_event_interest_params, register_event_interest_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_host_status, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, response_format, run_options, sandbox_config, sandbox_config_auth, sandbox_config_source, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, sandbox_config_user_policy_network_proxy, sandbox_config_user_policy_seatbelt, sandbox_disable_for_session_request, sandbox_disable_for_session_result, sandbox_enforcement_status, sandbox_session_change, schedule_add_at_request, schedule_add_cron_request, schedule_add_request, schedule_add_result, schedule_add_self_paced_request, schedule_entry, schedule_has_self_paced_result, schedule_list, schedule_rearm_self_paced_request, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_message_item, send_messages_request, send_messages_result, send_mode, send_request, send_result, send_system_notification_request, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_agent_list_request, session_auth_login_request, session_auth_logout_user_request, session_auth_status, session_auth_switch_request, session_bulk_delete_result, session_cancel_all_background_agents_result, session_capability, session_commands_list_request, session_completion_item, session_context, session_context_host_type, session_enrich_metadata_result, session_factory_pause_at_checkpoint_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_sqlite_transaction_error, session_fs_sqlite_transaction_error_class, session_fs_sqlite_transaction_request, session_fs_sqlite_transaction_result, session_fs_sqlite_transaction_statement, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_git_hub_auth_get_all_auth_available_result, session_git_hub_auth_logout_result, session_git_hub_auth_logout_user_result, session_history_compact_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_limit_prediction_baseline_data, session_limit_prediction_client_type, session_limit_prediction_details, session_limit_prediction_predict_request, session_limit_prediction_request, session_limit_prediction_result, session_limit_prediction_source, session_limit_prediction_tier, session_limit_prediction_tier_option, session_limit_prediction_unavailable_reason, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_managed_permissions, session_managed_settings, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_model_list_request, session_model_price_category, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_plugins_reload_request, session_provider_get_endpoint_request, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_client_metadata_entry, sessions_close_request, sessions_close_result, sessions_delete_request, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, session_settings_built_in_tool_availability_snapshot, session_settings_evaluate_predicate_request, session_settings_evaluate_predicate_result, session_settings_job_snapshot, session_settings_model_snapshot, session_settings_online_evaluation_snapshot, session_settings_predicate_name, session_settings_repo_snapshot, session_settings_snapshot, session_settings_validation_snapshot, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_client_metadata_request, sessions_get_client_metadata_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_metadata_request, sessions_get_metadata_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_non_empty_session_ids_request, sessions_list_non_empty_session_ids_result, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_prune_old_request, sessions_read_persisted_events_request, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_visibility_status, session_working_directory_context, session_working_directory_context_host_type, settable_auth_info, settable_token_auth_info, shell_cancel_user_requested_request, shell_credentials, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_init_profile, shell_init_script, shell_init_script_shell, shell_kill_request, shell_kill_result, shell_kill_signal, shell_options, shutdown_request, skill, skill_discovery_path, skill_discovery_path_list, skill_discovery_scope, skill_list, skill_provider_descriptor, skill_provider_list_request, skill_provider_list_result, skill_provider_read_request, skill_provider_read_result, skills_config_set_disabled_skills_request, skills_config_set_skill_disabled_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_discovery_paths_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_add_timeline_entry_result, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_choice, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_model_picker_dialog, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_set_model_result, slash_command_set_plan_model_result, slash_command_show_dialog_result, slash_command_text_result, slash_command_timeline_entry, subagent_settings_entry, subagent_settings_entry_context_tier, system_message_block, task_agent_info, task_agent_progress, task_client_active_status, task_client_execution_mode, task_client_info, task_client_owner, task_client_owner_kind, task_client_owner_presence, task_client_progress, task_client_status, task_client_type, task_client_update, task_complete_data, task_completion_decision, task_execution_mode, task_info, task_kind, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_register_request, tasks_register_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_update_request, tasks_update_result, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, token_provider_auth_info, tool, tool_list, tool_result, tool_result_expanded, tool_result_new_message, tool_result_type, tools_execute_request, tools_get_builtin_descriptors_request, tools_get_builtin_descriptors_result, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_set_request, tools_set_result, tools_shell_descriptor_config, tools_task_complete_event_data_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_session_limits_exhausted_request, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_session_limits_exhausted_response, ui_session_limits_exhausted_response_action, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_agent_metric, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, user_setting_metadata, user_settings_get_result, user_settings_set_request, user_settings_set_result, visibility_get_result, visibility_set_request, visibility_set_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_add_summary_request, workspaces_add_summary_result, workspaces_autopilot_objective_exists_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_delete_autopilot_objective_result, workspaces_diff_request, workspaces_ensure_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_autopilot_objective_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspaces_truncate_summaries_request, workspace_summary_host_type, workspaces_update_metadata_request, workspaces_workspace_details_host_type, workspaces_write_autopilot_objective_request, workspaces_write_autopilot_objective_result, session_auth_info_result, session_context_attribution, session_context_info, subagent_settings, task_progress, workspace_summary) def to_dict(self) -> dict: result: dict = {} @@ -40390,6 +40853,7 @@ def to_dict(self) -> dict: result["InstructionSourceType"] = to_enum(InstructionSourceType, self.instruction_source_type) result["InterruptMainTurnRequest"] = to_class(InterruptMainTurnRequest, self.interrupt_main_turn_request) result["InterruptMainTurnResult"] = to_class(InterruptMainTurnResult, self.interrupt_main_turn_result) + result["JsonSchemaResponseFormat"] = to_class(JSONSchemaResponseFormat, self.json_schema_response_format) result["LlmInferenceHeaders"] = from_dict(lambda x: from_list(from_str, x), self.llm_inference_headers) result["LlmInferenceHttpRequestChunkRequest"] = to_class(LlmInferenceHTTPRequestChunkRequest, self.llm_inference_http_request_chunk_request) result["LlmInferenceHttpRequestChunkResult"] = to_class(LlmInferenceHTTPRequestChunkResult, self.llm_inference_http_request_chunk_result) @@ -40406,6 +40870,7 @@ def to_dict(self) -> dict: result["LogRequest"] = to_class(LogRequest, self.log_request) result["LogResult"] = to_class(LogResult, self.log_result) result["LspInitializeRequest"] = to_class(LspInitializeRequest, self.lsp_initialize_request) + result["ManagedMcpServerConfig"] = to_class(ManagedMCPServerConfig, self.managed_mcp_server_config) result["ManagedSettingsReadResult"] = to_class(ManagedSettingsReadResult, self.managed_settings_read_result) result["MarketplaceAddResult"] = to_class(MarketplaceAddResult, self.marketplace_add_result) result["MarketplaceBrowseResult"] = to_class(MarketplaceBrowseResult, self.marketplace_browse_result) @@ -40773,8 +41238,19 @@ def to_dict(self) -> dict: result["PluginUpdateAllEntry"] = to_class(PluginUpdateAllEntry, self.plugin_update_all_entry) result["PluginUpdateAllResult"] = to_class(PluginUpdateAllResult, self.plugin_update_all_result) result["PluginUpdateResult"] = to_class(PluginUpdateResult, self.plugin_update_result) + result["ProtocolAppendMode"] = to_enum(ProtocolAppendMode, self.protocol_append_mode) + result["ProtocolCustomizeMode"] = to_enum(ProtocolCustomizeMode, self.protocol_customize_mode) result["ProtocolExternalToolDefer"] = to_enum(MCPServerConfigDeferTools, self.protocol_external_tool_defer) result["ProtocolExternalToolDefinition"] = to_class(ProtocolExternalToolDefinition, self.protocol_external_tool_definition) + result["ProtocolMarkerSectionOverride"] = to_class(ProtocolMarkerSectionOverride, self.protocol_marker_section_override) + result["ProtocolReplaceMode"] = to_enum(ProtocolReplaceMode, self.protocol_replace_mode) + result["ProtocolSectionOverride"] = to_class(ProtocolSectionOverride, self.protocol_section_override) + result["ProtocolStaticSectionAction"] = to_enum(ProtocolStaticSectionAction, self.protocol_static_section_action) + result["ProtocolStaticSectionOverride"] = to_class(ProtocolStaticSectionOverride, self.protocol_static_section_override) + result["ProtocolSystemMessageAppendConfig"] = to_class(ProtocolSystemMessageAppendConfig, self.protocol_system_message_append_config) + result["ProtocolSystemMessageConfig"] = to_class(ProtocolSystemMessageConfig, self.protocol_system_message_config) + result["ProtocolSystemMessageCustomizeConfig"] = to_class(ProtocolSystemMessageCustomizeConfig, self.protocol_system_message_customize_config) + result["ProtocolSystemMessageReplaceConfig"] = to_class(ProtocolSystemMessageReplaceConfig, self.protocol_system_message_replace_config) result["ProviderAddRequest"] = to_class(ProviderAddRequest, self.provider_add_request) result["ProviderAddResult"] = to_class(ProviderAddResult, self.provider_add_result) result["ProviderConfig"] = to_class(ProviderConfig, self.provider_config) @@ -40846,8 +41322,6 @@ def to_dict(self) -> dict: result["QueueUpdateTextResult"] = to_class(QueueUpdateTextResult, self.queue_update_text_result) result["RegisterEventInterestParams"] = to_class(RegisterEventInterestParams, self.register_event_interest_params) result["RegisterEventInterestResult"] = to_class(RegisterEventInterestResult, self.register_event_interest_result) - result["RegisterExtensionToolsParams"] = to_class(_RegisterExtensionToolsParams, self.register_extension_tools_params) - result["RegisterExtensionToolsResult"] = to_class(_RegisterExtensionToolsResult, self.register_extension_tools_result) result["ReleaseEventInterestParams"] = to_class(ReleaseEventInterestParams, self.release_event_interest_params) result["RemoteControlConfig"] = to_class(RemoteControlConfig, self.remote_control_config) result["RemoteControlConfigExistingMcSession"] = to_class(RemoteControlConfigExistingMcSession, self.remote_control_config_existing_mc_session) @@ -40870,6 +41344,7 @@ def to_dict(self) -> dict: result["RemoteSessionMetadataValue"] = to_class(RemoteSessionMetadataValue, self.remote_session_metadata_value) result["RemoteSessionMode"] = to_enum(RemoteSessionMode, self.remote_session_mode) result["RemoteSessionRepository"] = to_class(RemoteSessionRepository, self.remote_session_repository) + result["ResponseFormat"] = to_class(ResponseFormat, self.response_format) result["RunOptions"] = to_class(RunOptions, self.run_options) result["SandboxConfig"] = to_class(SandboxConfig, self.sandbox_config) result["SandboxConfigAuth"] = to_class(SandboxConfigAuth, self.sandbox_config_auth) @@ -40884,6 +41359,7 @@ def to_dict(self) -> dict: result["SandboxDisableForSessionRequest"] = to_class(SandboxDisableForSessionRequest, self.sandbox_disable_for_session_request) result["SandboxDisableForSessionResult"] = to_class(SandboxDisableForSessionResult, self.sandbox_disable_for_session_result) result["SandboxEnforcementStatus"] = to_class(SandboxEnforcementStatus, self.sandbox_enforcement_status) + result["SandboxSessionChange"] = to_enum(SandboxSessionChange, self.sandbox_session_change) result["ScheduleAddAtRequest"] = to_class(ScheduleAddAtRequest, self.schedule_add_at_request) result["ScheduleAddCronRequest"] = to_class(ScheduleAddCronRequest, self.schedule_add_cron_request) result["ScheduleAddRequest"] = to_class(ScheduleAddRequest, self.schedule_add_request) @@ -41060,7 +41536,6 @@ def to_dict(self) -> dict: result["SessionSource"] = to_enum(SessionSource, self.session_source) result["SessionsPruneOldRequest"] = to_class(SessionsPruneOldRequest, self.sessions_prune_old_request) result["SessionsReadPersistedEventsRequest"] = to_class(SessionsReadPersistedEventsRequest, self.sessions_read_persisted_events_request) - result["SessionsRegisterExtensionToolsOnSessionOptions"] = to_class(SessionsRegisterExtensionToolsOnSessionOptions, self.sessions_register_extension_tools_on_session_options) result["SessionsReleaseLockRequest"] = to_class(SessionsReleaseLockRequest, self.sessions_release_lock_request) result["SessionsReleaseLockResult"] = to_class(SessionsReleaseLockResult, self.sessions_release_lock_result) result["SessionsReloadPluginHooksRequest"] = to_class(SessionsReloadPluginHooksRequest, self.sessions_reload_plugin_hooks_request) @@ -41132,6 +41607,7 @@ def to_dict(self) -> dict: result["SlashCommandTimelineEntry"] = to_class(SlashCommandTimelineEntry, self.slash_command_timeline_entry) result["SubagentSettingsEntry"] = to_class(SubagentSettingsEntry, self.subagent_settings_entry) result["SubagentSettingsEntryContextTier"] = to_enum(SubagentSettingsEntryContextTier, self.subagent_settings_entry_context_tier) + result["SystemMessageBlock"] = to_class(SystemMessageBlock, self.system_message_block) result["TaskAgentInfo"] = to_class(TaskAgentInfo, self.task_agent_info) result["TaskAgentProgress"] = to_class(TaskAgentProgress, self.task_agent_progress) result["TaskClientActiveStatus"] = to_enum(TaskClientActiveStatus, self.task_client_active_status) @@ -42379,13 +42855,8 @@ async def _get_board_entry_count(self, params: SessionsGetBoardEntryCountRequest params_dict = {k: v for k, v in params.to_dict().items() if v is not None} return SessionsGetBoardEntryCountResult.from_dict(await self._client.request("sessions.getBoardEntryCount", params_dict, **_timeout_kwargs(timeout))) - async def _register_extension_tools_on_session(self, params: _RegisterExtensionToolsParams, *, timeout: float | None = None) -> _RegisterExtensionToolsResult: - "Registers extension-provided tools on the given session, gated by an optional `enabled` callback. Returns an opaque unsubscribe function the caller must invoke to deregister the tools when the extension is torn down. Marked internal because `loader`, `enabled`, and the returned `unsubscribe` are in-process handles that cannot cross the JSON-RPC boundary. Disappears once extension discovery / launch / tool registration are owned by the runtime: SDK consumers will pass pure config (search paths, disabled ids) via `SessionOptions` and the runtime will resolve, launch, register, and tear down extensions itself.\n\nArgs:\n params: Params to attach an extension loader's tools to a session.\n\nReturns:\n Handle for releasing the extension tool registration.\n\n:meta private:\n\nInternal SDK API; not part of the public surface." - params_dict = {k: v for k, v in params.to_dict().items() if v is not None} - return _RegisterExtensionToolsResult.from_dict(await self._client.request("sessions.registerExtensionToolsOnSession", params_dict, **_timeout_kwargs(timeout))) - async def _configure_session_extensions(self, params: _ConfigureSessionExtensionsParams, *, timeout: float | None = None) -> None: - "Attaches (or detaches) an in-process ExtensionController delegate for the given session, used by shared-API surfaces that need to query or modify the session's extension state. Pass `controller: undefined` to detach. Marked internal because the controller is an in-process object that cannot cross the JSON-RPC boundary. Disappears alongside `registerExtensionToolsOnSession`: once the runtime owns extension management, the public surface exposes list/enable/disable/reload as dedicated RPCs served by the runtime.\n\nArgs:\n params: Params to attach or detach an in-process ExtensionController delegate.\n\n:meta private:\n\nInternal SDK API; not part of the public surface." + "Attaches (or detaches) an in-process ExtensionController delegate for the given session in a local host adapter. Pass `controller: undefined` to detach. Internal because the controller cannot cross the JSON-RPC boundary; the runtime manages its own session extension service.\n\nArgs:\n params: Params to attach or detach an in-process ExtensionController delegate.\n\n:meta private:\n\nInternal SDK API; not part of the public surface." params_dict = {k: v for k, v in params.to_dict().items() if v is not None} await self._client.request("sessions.configureSessionExtensions", params_dict, **_timeout_kwargs(timeout)) @@ -42443,7 +42914,7 @@ def __init__(self, client: "JsonRpcClient", session_id: str): self._session_id = session_id async def collect_logs(self, params: DebugCollectLogsRequest, *, timeout: float | None = None) -> DebugCollectLogsResult: - "Collects a redacted session debug log bundle into a local archive or staging directory. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape.\n\nArgs:\n params: Options for collecting a redacted session debug bundle.\n\nReturns:\n Result of collecting a redacted debug bundle." + "Collects a session debug log bundle into a local archive or staging directory. Logs are redacted by default; redaction can be configured per caller-provided diagnostic entry. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape.\n\nArgs:\n params: Options for collecting a session debug bundle with configurable redaction.\n\nReturns:\n Result of collecting a session debug bundle." params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} params_dict["sessionId"] = self._session_id return DebugCollectLogsResult.from_dict(await self._client.request("session.debug.collectLogs", params_dict, **_timeout_kwargs(timeout))) @@ -44656,6 +45127,7 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "AccountLogoutRequest", "AccountLogoutResult", "AccountQuotaSnapshot", + "Action", "AdaptiveThinkingSupport", "AdditionalContentExclusionPolicyScope", "AgentApi", @@ -45068,6 +45540,7 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "InstructionsGetSourcesResult", "InterruptMainTurnRequest", "InterruptMainTurnResult", + "JSONSchemaResponseFormat", "KindEnum", "LimitPredictionApi", "LlmInferenceHTTPRequestChunkRequest", @@ -45240,6 +45713,7 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "MCPToolUIVisibility", "MCPTools", "MCPUnregisterExternalClientRequest", + "ManagedMCPServerConfig", "ManagedSettingsReadResult", "MarketplaceAddResult", "MarketplaceBrowseResult", @@ -45522,8 +45996,21 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "PluginsReloadRequest", "PluginsUninstallRequest", "PluginsUpdateRequest", + "ProtocolAppendMode", + "ProtocolCustomizeMode", "ProtocolExternalToolDefer", "ProtocolExternalToolDefinition", + "ProtocolMarkerSectionOverride", + "ProtocolMode", + "ProtocolReplaceMode", + "ProtocolSectionOverride", + "ProtocolSectionOverrideAction", + "ProtocolStaticSectionAction", + "ProtocolStaticSectionOverride", + "ProtocolSystemMessageAppendConfig", + "ProtocolSystemMessageConfig", + "ProtocolSystemMessageCustomizeConfig", + "ProtocolSystemMessageReplaceConfig", "ProviderAddRequest", "ProviderAddResult", "ProviderApi", @@ -45645,6 +46132,8 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "RemoteSessionMetadataValue", "RemoteSessionMode", "RemoteSessionRepository", + "ResponseFormat", + "ResponseFormatType", "RunOptions", "SandboxApi", "SandboxConfig", @@ -45659,6 +46148,7 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "SandboxDisableForSessionRequest", "SandboxDisableForSessionResult", "SandboxEnforcementStatus", + "SandboxSessionChange", "Saved", "ScheduleAddAtRequest", "ScheduleAddCronRequest", @@ -45882,7 +46372,6 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "SessionsOpenStatus", "SessionsPruneOldRequest", "SessionsReadPersistedEventsRequest", - "SessionsRegisterExtensionToolsOnSessionOptions", "SessionsReleaseLockRequest", "SessionsReleaseLockResult", "SessionsReloadPluginHooksRequest", @@ -45959,6 +46448,7 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "SubagentSettings", "SubagentSettingsEntry", "SubagentSettingsEntryContextTier", + "SystemMessageBlock", "TaskAgentInfo", "TaskAgentInfoType", "TaskAgentProgress", diff --git a/python/copilot/generated/session_events.py b/python/copilot/generated/session_events.py index c46d222656..cecdbe1dd7 100644 --- a/python/copilot/generated/session_events.py +++ b/python/copilot/generated/session_events.py @@ -205,6 +205,12 @@ class SessionEventType(Enum): TOOL_EXECUTION_COMPLETE = "tool.execution_complete" TOOL_SEARCH_ACTIVATED = "tool_search.activated" SKILL_INVOKED = "skill.invoked" + # Experimental: this event is part of an experimental API and may change or be removed. + SKILL_INVOKED_REF = "skill.invoked_ref" + # Experimental: this event is part of an experimental API and may change or be removed. + SKILL_CONTEXT_DELIVERED = "skill.context_delivered" + # Experimental: this event is part of an experimental API and may change or be removed. + SKILL_CONTEXT_DELIVERED_REF = "skill.context_delivered_ref" SANDBOX_DECISION = "sandbox.decision" SUBAGENT_STARTED = "subagent.started" SUBAGENT_CONFIGURED = "subagent.configured" @@ -2599,6 +2605,7 @@ class AssistantMessageData: fusion: FusionAttribution | None = None interaction_id: str | None = None model: str | None = None + originating_message_id: str | None = None output_tokens: int | None = None # Deprecated: this field is deprecated. parent_tool_call_id: str | None = None @@ -2628,6 +2635,7 @@ def from_dict(obj: Any) -> "AssistantMessageData": fusion = from_union([from_none, FusionAttribution.from_dict], obj.get("fusion")) interaction_id = from_union([from_none, from_str], obj.get("interactionId")) model = from_union([from_none, from_str], obj.get("model")) + originating_message_id = from_union([from_none, from_str], obj.get("originatingMessageId")) output_tokens = from_union([from_none, from_int], obj.get("outputTokens")) parent_tool_call_id = from_union([from_none, from_str], obj.get("parentToolCallId")) phase = from_union([from_none, from_str], obj.get("phase")) @@ -2653,6 +2661,7 @@ def from_dict(obj: Any) -> "AssistantMessageData": fusion=fusion, interaction_id=interaction_id, model=model, + originating_message_id=originating_message_id, output_tokens=output_tokens, parent_tool_call_id=parent_tool_call_id, phase=phase, @@ -2690,6 +2699,8 @@ def to_dict(self) -> dict: result["interactionId"] = from_union([from_none, from_str], self.interaction_id) if self.model is not None: result["model"] = from_union([from_none, from_str], self.model) + if self.originating_message_id is not None: + result["originatingMessageId"] = from_union([from_none, from_str], self.originating_message_id) if self.output_tokens is not None: result["outputTokens"] = from_union([from_none, to_int], self.output_tokens) if self.parent_tool_call_id is not None: @@ -5580,6 +5591,7 @@ class McpServersLoadedServer: "A single MCP server status summary in `session.mcp_servers_loaded`, including name, status, source, transport, and plugin metadata." name: str status: McpServerStatus + display_name: str | None = None error: str | None = None plugin_name: str | None = None plugin_version: str | None = None @@ -5592,6 +5604,7 @@ def from_dict(obj: Any) -> "McpServersLoadedServer": assert isinstance(obj, dict) name = from_str(obj.get("name")) status = parse_enum(McpServerStatus, obj.get("status")) + display_name = from_union([from_none, from_str], obj.get("displayName")) error = from_union([from_none, from_str], obj.get("error")) plugin_name = from_union([from_none, from_str], obj.get("pluginName")) plugin_version = from_union([from_none, from_str], obj.get("pluginVersion")) @@ -5601,6 +5614,7 @@ def from_dict(obj: Any) -> "McpServersLoadedServer": return McpServersLoadedServer( name=name, status=status, + display_name=display_name, error=error, plugin_name=plugin_name, plugin_version=plugin_version, @@ -5613,6 +5627,8 @@ def to_dict(self) -> dict: result: dict = {} result["name"] = from_str(self.name) result["status"] = to_enum(McpServerStatus, self.status) + if self.display_name is not None: + result["displayName"] = from_union([from_none, from_str], self.display_name) if self.error is not None: result["error"] = from_union([from_none, from_str], self.error) if self.plugin_name is not None: @@ -9783,6 +9799,72 @@ def to_dict(self) -> dict: return result +@dataclass +class SkillContextDeliveredData: + "Exact skill context delivered to the model during a tool phase. This is not a user submission or another skill invocation." + content: str + source: str + interaction_id: str | None = None + + @staticmethod + def from_dict(obj: Any) -> "SkillContextDeliveredData": + assert isinstance(obj, dict) + content = from_str(obj.get("content")) + source = from_str(obj.get("source")) + interaction_id = from_union([from_none, from_str], obj.get("interactionId")) + return SkillContextDeliveredData( + content=content, + source=source, + interaction_id=interaction_id, + ) + + def to_dict(self) -> dict: + result: dict = {} + result["content"] = from_str(self.content) + result["source"] = from_str(self.source) + if self.interaction_id is not None: + result["interactionId"] = from_union([from_none, from_str], self.interaction_id) + return result + + +@dataclass +class SkillContextDeliveredRefData: + "Internal durable receipt that reconstructs exact model-visible skill context from earlier session content." + content_id: str + source: str + interaction_id: str | None = None + prefix: str | None = None + suffix: str | None = None + + @staticmethod + def from_dict(obj: Any) -> "SkillContextDeliveredRefData": + assert isinstance(obj, dict) + content_id = from_str(obj.get("contentId")) + source = from_str(obj.get("source")) + interaction_id = from_union([from_none, from_str], obj.get("interactionId")) + prefix = from_union([from_none, from_str], obj.get("prefix")) + suffix = from_union([from_none, from_str], obj.get("suffix")) + return SkillContextDeliveredRefData( + content_id=content_id, + source=source, + interaction_id=interaction_id, + prefix=prefix, + suffix=suffix, + ) + + def to_dict(self) -> dict: + result: dict = {} + result["contentId"] = from_str(self.content_id) + result["source"] = from_str(self.source) + if self.interaction_id is not None: + result["interactionId"] = from_union([from_none, from_str], self.interaction_id) + if self.prefix is not None: + result["prefix"] = from_union([from_none, from_str], self.prefix) + if self.suffix is not None: + result["suffix"] = from_union([from_none, from_str], self.suffix) + return result + + @dataclass class SkillInvokedData: "Skill invocation details including content, allowed tools, and plugin metadata" @@ -9850,6 +9932,77 @@ def to_dict(self) -> dict: return result +@dataclass +class SkillInvokedRefData: + "Internal durable skill invocation receipt whose content resolves from an earlier inline skill event in the same session." + content_id: str + content_length: int + name: str + path: str + allowed_tools: list[str] | None = None + description: str | None = None + disable_model_invocation: bool | None = None + model: str | None = None + plugin_name: str | None = None + plugin_version: str | None = None + source: str | None = None + trigger: SkillInvokedTrigger | None = None + + @staticmethod + def from_dict(obj: Any) -> "SkillInvokedRefData": + assert isinstance(obj, dict) + content_id = from_str(obj.get("contentId")) + content_length = from_int(obj.get("contentLength")) + name = from_str(obj.get("name")) + path = from_str(obj.get("path")) + allowed_tools = from_union([from_none, lambda x: from_list(from_str, x)], obj.get("allowedTools")) + description = from_union([from_none, from_str], obj.get("description")) + disable_model_invocation = from_union([from_none, from_bool], obj.get("disableModelInvocation")) + model = from_union([from_none, from_str], obj.get("model")) + plugin_name = from_union([from_none, from_str], obj.get("pluginName")) + plugin_version = from_union([from_none, from_str], obj.get("pluginVersion")) + source = from_union([from_none, from_str], obj.get("source")) + trigger = from_union([from_none, lambda x: parse_enum(SkillInvokedTrigger, x)], obj.get("trigger")) + return SkillInvokedRefData( + content_id=content_id, + content_length=content_length, + name=name, + path=path, + allowed_tools=allowed_tools, + description=description, + disable_model_invocation=disable_model_invocation, + model=model, + plugin_name=plugin_name, + plugin_version=plugin_version, + source=source, + trigger=trigger, + ) + + def to_dict(self) -> dict: + result: dict = {} + result["contentId"] = from_str(self.content_id) + result["contentLength"] = to_int(self.content_length) + result["name"] = from_str(self.name) + result["path"] = from_str(self.path) + if self.allowed_tools is not None: + result["allowedTools"] = from_union([from_none, lambda x: from_list(from_str, x)], self.allowed_tools) + if self.description is not None: + result["description"] = from_union([from_none, from_str], self.description) + if self.disable_model_invocation is not None: + result["disableModelInvocation"] = from_union([from_none, from_bool], self.disable_model_invocation) + if self.model is not None: + result["model"] = from_union([from_none, from_str], self.model) + if self.plugin_name is not None: + result["pluginName"] = from_union([from_none, from_str], self.plugin_name) + if self.plugin_version is not None: + result["pluginVersion"] = from_union([from_none, from_str], self.plugin_version) + if self.source is not None: + result["source"] = from_union([from_none, from_str], self.source) + if self.trigger is not None: + result["trigger"] = from_union([from_none, lambda x: to_enum(SkillInvokedTrigger, x)], self.trigger) + return result + + @dataclass class SkillsLoadedSkill: "A single resolved skill in `session.skills_loaded`, including source, invocability, enabled state, path, and argument hint." @@ -10156,6 +10309,7 @@ class SubagentStartedData: execution_mode: str | None = None factory_run_id: str | None = None model: str | None = None + model_selection_source: SubagentModelSelectionSource | None = None parent_id: str | None = None resumable: bool | None = None task_model_source: SubagentTaskModelSource | None = None @@ -10171,6 +10325,7 @@ def from_dict(obj: Any) -> "SubagentStartedData": execution_mode = from_union([from_none, from_str], obj.get("executionMode")) factory_run_id = from_union([from_none, from_str], obj.get("factoryRunId")) model = from_union([from_none, from_str], obj.get("model")) + model_selection_source = from_union([from_none, lambda x: parse_enum(SubagentModelSelectionSource, x)], obj.get("modelSelectionSource")) parent_id = from_union([from_none, from_str], obj.get("parentId")) resumable = from_union([from_none, from_bool], obj.get("resumable")) task_model_source = from_union([from_none, lambda x: parse_enum(SubagentTaskModelSource, x)], obj.get("taskModelSource")) @@ -10183,6 +10338,7 @@ def from_dict(obj: Any) -> "SubagentStartedData": execution_mode=execution_mode, factory_run_id=factory_run_id, model=model, + model_selection_source=model_selection_source, parent_id=parent_id, resumable=resumable, task_model_source=task_model_source, @@ -10202,6 +10358,8 @@ def to_dict(self) -> dict: result["factoryRunId"] = from_union([from_none, from_str], self.factory_run_id) if self.model is not None: result["model"] = from_union([from_none, from_str], self.model) + if self.model_selection_source is not None: + result["modelSelectionSource"] = from_union([from_none, lambda x: to_enum(SubagentModelSelectionSource, x)], self.model_selection_source) if self.parent_id is not None: result["parentId"] = from_union([from_none, from_str], self.parent_id) if self.resumable is not None: @@ -11349,6 +11507,8 @@ class ToolExecutionStartData: display_verbatim: bool | None = None # Experimental: this field is part of an experimental API and may change or be removed. fusion: FusionAttribution | None = None + mcp_config_server_name: str | None = None + mcp_config_source: McpServerSource | None = None mcp_server_name: str | None = None mcp_tool_name: str | None = None mcp_transport: McpServerTransport | None = None @@ -11368,6 +11528,8 @@ def from_dict(obj: Any) -> "ToolExecutionStartData": arguments = obj.get("arguments") display_verbatim = from_union([from_none, from_bool], obj.get("displayVerbatim")) fusion = from_union([from_none, FusionAttribution.from_dict], obj.get("fusion")) + mcp_config_server_name = from_union([from_none, from_str], obj.get("mcpConfigServerName")) + mcp_config_source = from_union([from_none, lambda x: parse_enum(McpServerSource, x)], obj.get("mcpConfigSource")) mcp_server_name = from_union([from_none, from_str], obj.get("mcpServerName")) mcp_tool_name = from_union([from_none, from_str], obj.get("mcpToolName")) mcp_transport = from_union([from_none, lambda x: parse_enum(McpServerTransport, x)], obj.get("mcpTransport")) @@ -11383,6 +11545,8 @@ def from_dict(obj: Any) -> "ToolExecutionStartData": arguments=arguments, display_verbatim=display_verbatim, fusion=fusion, + mcp_config_server_name=mcp_config_server_name, + mcp_config_source=mcp_config_source, mcp_server_name=mcp_server_name, mcp_tool_name=mcp_tool_name, mcp_transport=mcp_transport, @@ -11404,6 +11568,10 @@ def to_dict(self) -> dict: result["displayVerbatim"] = from_union([from_none, from_bool], self.display_verbatim) if self.fusion is not None: result["fusion"] = from_union([from_none, lambda x: to_class(FusionAttribution, x)], self.fusion) + if self.mcp_config_server_name is not None: + result["mcpConfigServerName"] = from_union([from_none, from_str], self.mcp_config_server_name) + if self.mcp_config_source is not None: + result["mcpConfigSource"] = from_union([from_none, lambda x: to_enum(McpServerSource, x)], self.mcp_config_source) if self.mcp_server_name is not None: result["mcpServerName"] = from_union([from_none, from_str], self.mcp_server_name) if self.mcp_tool_name is not None: @@ -12703,6 +12871,8 @@ class McpHeadersRefreshCompletedOutcome(Enum): HEADERS = "headers" # The host responded with no dynamic headers. NONE = "none" + # The host credential broker rejected or failed the refresh. + ERROR = "error" # No response arrived within the bounded window. TIMEOUT = "timeout" @@ -12738,7 +12908,7 @@ class McpOauthRequestReason(Enum): class McpServerSource(Enum): - "Configuration source: user, workspace, plugin, or builtin" + "Configuration source: user, workspace, plugin, builtin, or managed" # Server configured in the user's global MCP configuration. USER = "user" # Server configured by the current workspace. @@ -12747,6 +12917,8 @@ class McpServerSource(Enum): PLUGIN = "plugin" # Server bundled with the runtime. BUILTIN = "builtin" + # Server supplied by a trusted host-managed catalog. + MANAGED = "managed" class McpServerStatus(Enum): @@ -13183,7 +13355,7 @@ class WorkspaceFileChangedOperation(Enum): UPDATE = "update" -SessionEventData = SessionStartData | SessionResumeData | SessionRemoteSteerableChangedData | SessionErrorData | SessionIdleData | SessionTitleChangedData | SessionScheduleCreatedData | SessionScheduleCancelledData | SessionScheduleRearmedData | SessionAutopilotObjectiveChangedData | SessionInfoData | SessionWarningData | SessionModelChangeData | SessionAutoTierRecommendationData | SessionAutoTierSwitchFailedData | SessionModeChangedData | SessionModeNoticeDeliveredData | SessionSessionLimitsChangedData | SessionPermissionsChangedData | SessionPlanChangedData | SessionTodosChangedData | SessionWorkspaceFileChangedData | SessionHandoffData | SessionTruncationData | SessionSnapshotRewindData | SessionShutdownData | SessionUsageCheckpointData | SessionContextChangedData | SessionUsageInfoData | SessionContextClearedData | SessionCompactionStartData | SessionCompactionCompleteData | SessionTaskCompleteData | SessionCompletionReceiptData | SessionFusionRouteStartedData | SessionFusionRouteFailedData | SessionFusionResolvedData | SessionFusionCompletedData | UserMessageData | PendingMessagesModifiedData | AssistantTurnStartData | AssistantTurnRetryData | AgentInterruptedData | AssistantIntentData | AssistantFusionPhaseStartedData | AssistantFusionPhaseActivityData | AssistantFusionPhaseCompletedData | AssistantFusionPhaseFailedData | AssistantServerToolProgressData | AssistantReasoningData | AssistantReasoningDeltaData | AssistantToolCallDeltaData | AssistantStreamingDeltaData | AssistantMessageData | AssistantMessageStartData | AssistantMessageDeltaData | AssistantTurnEndData | AssistantIdleData | AssistantUsageData | PromptCacheBreakData | ModelCallFailureData | ModelCallFinishedData | ModelCallStartData | AbortData | ToolUserRequestedData | ToolExecutionStartData | ToolExecutionPartialResultData | ToolExecutionProgressData | ToolExecutionCompleteData | ToolSearchActivatedData | SkillInvokedData | SandboxDecisionData | SubagentStartedData | SubagentConfiguredData | SubagentCompletedData | SubagentFailedData | SubagentSelectedData | SubagentDeselectedData | HookStartData | HookEndData | HookProgressData | SessionBinaryAssetData | SystemMessageData | SystemNotificationData | PermissionRequestedData | PermissionCompletedData | PermissionCarriedForwardData | PermissionMessageAuthorizationData | PermissionMessageAuthorizationReadData | PermissionMessageAuthorizationDegradedData | UserInputRequestedData | UserInputCompletedData | ElicitationRequestedData | ElicitationCompletedData | SamplingRequestedData | SamplingCompletedData | McpOauthRequiredData | McpOauthCompletedData | McpHeadersRefreshRequiredData | McpHeadersRefreshCompletedData | SessionCustomNotificationData | UiEphemeralQueryData | ExternalToolRequestedData | ExternalToolCompletedData | CommandQueuedData | CommandExecuteData | CommandCompletedData | AutoModeSwitchRequestedData | AutoModeSwitchCompletedData | SessionLimitsExhaustedRequestedData | SessionLimitsExhaustedCompletedData | SessionAutoModeResolvedData | SessionManagedSettingsResolvedData | SessionManagedSettingsEnforcedData | CommandsChangedData | CapabilitiesChangedData | ExitPlanModeRequestedData | ExitPlanModeCompletedData | SessionToolsUpdatedData | SessionBackgroundTasksChangedData | FactoryRunUpdatedData | FactoryRunStartedData | FactoryRunSettledData | SessionSkillsLoadedData | SessionCustomAgentsUpdatedData | SessionMcpServersLoadedData | SessionMcpServerStatusChangedData | SessionMcpServerRemovedData | SessionMcpServerNeedsReconnectData | McpToolsListChangedData | McpResourcesListChangedData | McpPromptsListChangedData | SessionExtensionsLoadedData | SessionCanvasOpenedData | SessionCanvasRegistryChangedData | SessionCanvasClosedData | SessionCanvasUnavailableData | SessionCanvasRecordedData | SessionCanvasRemovedData | SessionExtensionsAttachmentsPushedData | McpAppToolCallCompleteData | RawSessionEventData | Data +SessionEventData = SessionStartData | SessionResumeData | SessionRemoteSteerableChangedData | SessionErrorData | SessionIdleData | SessionTitleChangedData | SessionScheduleCreatedData | SessionScheduleCancelledData | SessionScheduleRearmedData | SessionAutopilotObjectiveChangedData | SessionInfoData | SessionWarningData | SessionModelChangeData | SessionAutoTierRecommendationData | SessionAutoTierSwitchFailedData | SessionModeChangedData | SessionModeNoticeDeliveredData | SessionSessionLimitsChangedData | SessionPermissionsChangedData | SessionPlanChangedData | SessionTodosChangedData | SessionWorkspaceFileChangedData | SessionHandoffData | SessionTruncationData | SessionSnapshotRewindData | SessionShutdownData | SessionUsageCheckpointData | SessionContextChangedData | SessionUsageInfoData | SessionContextClearedData | SessionCompactionStartData | SessionCompactionCompleteData | SessionTaskCompleteData | SessionCompletionReceiptData | SessionFusionRouteStartedData | SessionFusionRouteFailedData | SessionFusionResolvedData | SessionFusionCompletedData | UserMessageData | PendingMessagesModifiedData | AssistantTurnStartData | AssistantTurnRetryData | AgentInterruptedData | AssistantIntentData | AssistantFusionPhaseStartedData | AssistantFusionPhaseActivityData | AssistantFusionPhaseCompletedData | AssistantFusionPhaseFailedData | AssistantServerToolProgressData | AssistantReasoningData | AssistantReasoningDeltaData | AssistantToolCallDeltaData | AssistantStreamingDeltaData | AssistantMessageData | AssistantMessageStartData | AssistantMessageDeltaData | AssistantTurnEndData | AssistantIdleData | AssistantUsageData | PromptCacheBreakData | ModelCallFailureData | ModelCallFinishedData | ModelCallStartData | AbortData | ToolUserRequestedData | ToolExecutionStartData | ToolExecutionPartialResultData | ToolExecutionProgressData | ToolExecutionCompleteData | ToolSearchActivatedData | SkillInvokedData | SkillInvokedRefData | SkillContextDeliveredData | SkillContextDeliveredRefData | SandboxDecisionData | SubagentStartedData | SubagentConfiguredData | SubagentCompletedData | SubagentFailedData | SubagentSelectedData | SubagentDeselectedData | HookStartData | HookEndData | HookProgressData | SessionBinaryAssetData | SystemMessageData | SystemNotificationData | PermissionRequestedData | PermissionCompletedData | PermissionCarriedForwardData | PermissionMessageAuthorizationData | PermissionMessageAuthorizationReadData | PermissionMessageAuthorizationDegradedData | UserInputRequestedData | UserInputCompletedData | ElicitationRequestedData | ElicitationCompletedData | SamplingRequestedData | SamplingCompletedData | McpOauthRequiredData | McpOauthCompletedData | McpHeadersRefreshRequiredData | McpHeadersRefreshCompletedData | SessionCustomNotificationData | UiEphemeralQueryData | ExternalToolRequestedData | ExternalToolCompletedData | CommandQueuedData | CommandExecuteData | CommandCompletedData | AutoModeSwitchRequestedData | AutoModeSwitchCompletedData | SessionLimitsExhaustedRequestedData | SessionLimitsExhaustedCompletedData | SessionAutoModeResolvedData | SessionManagedSettingsResolvedData | SessionManagedSettingsEnforcedData | CommandsChangedData | CapabilitiesChangedData | ExitPlanModeRequestedData | ExitPlanModeCompletedData | SessionToolsUpdatedData | SessionBackgroundTasksChangedData | FactoryRunUpdatedData | FactoryRunStartedData | FactoryRunSettledData | SessionSkillsLoadedData | SessionCustomAgentsUpdatedData | SessionMcpServersLoadedData | SessionMcpServerStatusChangedData | SessionMcpServerRemovedData | SessionMcpServerNeedsReconnectData | McpToolsListChangedData | McpResourcesListChangedData | McpPromptsListChangedData | SessionExtensionsLoadedData | SessionCanvasOpenedData | SessionCanvasRegistryChangedData | SessionCanvasClosedData | SessionCanvasUnavailableData | SessionCanvasRecordedData | SessionCanvasRemovedData | SessionExtensionsAttachmentsPushedData | McpAppToolCallCompleteData | RawSessionEventData | Data @dataclass @@ -13280,6 +13452,9 @@ def from_dict(obj: Any) -> "SessionEvent": case SessionEventType.TOOL_EXECUTION_COMPLETE: data = ToolExecutionCompleteData.from_dict(data_obj) case SessionEventType.TOOL_SEARCH_ACTIVATED: data = ToolSearchActivatedData.from_dict(data_obj) case SessionEventType.SKILL_INVOKED: data = SkillInvokedData.from_dict(data_obj) + case SessionEventType.SKILL_INVOKED_REF: data = SkillInvokedRefData.from_dict(data_obj) + case SessionEventType.SKILL_CONTEXT_DELIVERED: data = SkillContextDeliveredData.from_dict(data_obj) + case SessionEventType.SKILL_CONTEXT_DELIVERED_REF: data = SkillContextDeliveredRefData.from_dict(data_obj) case SessionEventType.SANDBOX_DECISION: data = SandboxDecisionData.from_dict(data_obj) case SessionEventType.SUBAGENT_STARTED: data = SubagentStartedData.from_dict(data_obj) case SessionEventType.SUBAGENT_CONFIGURED: data = SubagentConfiguredData.from_dict(data_obj) @@ -13710,7 +13885,10 @@ def session_event_to_dict(x: SessionEvent) -> Any: "ShutdownModelMetricUsage", "ShutdownTokenDetail", "ShutdownType", + "SkillContextDeliveredData", + "SkillContextDeliveredRefData", "SkillInvokedData", + "SkillInvokedRefData", "SkillInvokedTrigger", "SkillSource", "SkillsLoadedSkill", diff --git a/python/e2e/test_mcp_oauth_e2e.py b/python/e2e/test_mcp_oauth_e2e.py index 20832fabcd..202c842faa 100644 --- a/python/e2e/test_mcp_oauth_e2e.py +++ b/python/e2e/test_mcp_oauth_e2e.py @@ -294,7 +294,7 @@ def on_mcp_auth_request(request, _invocation): if request["reason"] == "upscope": assert request["wwwAuthenticateParams"] == { "resourceMetadataUrl": f"{url}/.well-known/oauth-protected-resource", - "scope": "mcp.write", + "scope": "mcp.read mcp.write", "error": "insufficient_scope", } return {"kind": "token", "accessToken": UPSCOPE_TOKEN} diff --git a/rust/src/generated/api_types.rs b/rust/src/generated/api_types.rs index 9d77180ebf..866d2034df 100644 --- a/rust/src/generated/api_types.rs +++ b/rust/src/generated/api_types.rs @@ -199,9 +199,6 @@ pub mod rpc_methods { pub const SESSIONS_STOPREMOTECONTROL: &str = "sessions.stopRemoteControl"; /// `sessions.getRemoteControlStatus` pub const SESSIONS_GETREMOTECONTROLSTATUS: &str = "sessions.getRemoteControlStatus"; - /// `sessions.registerExtensionToolsOnSession` - pub const SESSIONS_REGISTEREXTENSIONTOOLSONSESSION: &str = - "sessions.registerExtensionToolsOnSession"; /// `sessions.configureSessionExtensions` pub const SESSIONS_CONFIGURESESSIONEXTENSIONS: &str = "sessions.configureSessionExtensions"; /// `agentRegistry.spawn` @@ -2035,7 +2032,7 @@ pub struct AttachmentDirectory { pub display_name: String, /// Absolute directory path pub path: String, - /// Frozen rendered line this attachment contributed to the prompt block (e.g. "* /path (12 items)"). Captured at send time so resumed history reproduces the exact text the model saw, independent of later filesystem changes. + /// Frozen rendered line this attachment contributed to the `` prompt block (e.g. "* /path (12 items)"). Captured at send time so resumed history reproduces the exact text the model saw, independent of later filesystem changes. #[serde(skip_serializing_if = "Option::is_none")] pub tagged_files_entry: Option, /// Attachment type discriminator @@ -2119,7 +2116,7 @@ pub struct AttachmentFile { pub omitted_reason: Option, /// Absolute file path pub path: String, - /// Frozen rendered line this attachment contributed to the prompt block (e.g. "* /path (123 lines)"). Captured at send time so resumed history reproduces the exact text the model saw, independent of later filesystem changes. Present only for attachments routed to (mutually exclusive with assetId, which marks bytes sent natively). + /// Frozen rendered line this attachment contributed to the `` prompt block (e.g. "* /path (123 lines)"). Captured at send time so resumed history reproduces the exact text the model saw, independent of later filesystem changes. Present only for attachments routed to `` (mutually exclusive with assetId, which marks bytes sent natively). #[serde(skip_serializing_if = "Option::is_none")] pub tagged_files_entry: Option, /// Attachment type discriminator @@ -4465,7 +4462,7 @@ pub struct CurrentToolMetadata { pub namespaced_name: Option, } -/// A file included in the redacted debug bundle. +/// A file included in the session debug bundle. /// ///

/// @@ -4501,7 +4498,7 @@ pub struct DebugCollectLogsDestinationArchive { pub struct DebugCollectLogsDestinationDirectory { /// Destination variant discriminator. pub kind: DebugCollectLogsDestinationDirectoryKind, - /// Directory where redacted files should be staged. The directory is created if needed. + /// Directory where files should be staged. The directory is created if needed. pub output_directory: String, } @@ -4522,7 +4519,7 @@ pub struct DebugCollectLogsEntry { pub kind: DebugCollectLogsEntryKind, /// Server-local source path to read. pub path: String, - /// How text content from this entry should be redacted. Defaults to plain-text. + /// How text content from this entry should be redacted. Defaults to plain-text. With none, no redaction is applied; the caller must ensure any necessary redaction is performed before this call. #[serde(skip_serializing_if = "Option::is_none")] pub redaction: Option, /// When true, collection fails if this entry cannot be read. Defaults to false, which records the entry in `skippedEntries`. @@ -4564,7 +4561,7 @@ pub struct DebugCollectLogsInclude { pub shell_logs: Option, } -/// Options for collecting a redacted session debug bundle. +/// Options for collecting a session debug bundle with configurable redaction. /// ///
/// @@ -4578,7 +4575,7 @@ pub struct DebugCollectLogsRequest { /// Caller-provided server-local files or directories to include in addition to the runtime's built-in session diagnostics. This lets host applications add their own diagnostics without changing the API shape. #[serde(skip_serializing_if = "Option::is_none")] pub additional_entries: Option>, - /// Where the redacted bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage redacted files for caller-managed upload/post-processing. + /// Where the bundle should be written. Use `archive` to produce a .tgz, or `directory` to stage files for caller-managed upload/post-processing. pub destination: DebugCollectLogsDestination, /// Which built-in session diagnostics to include. Omitted fields default to true. #[serde(skip_serializing_if = "Option::is_none")] @@ -4605,7 +4602,7 @@ pub struct DebugCollectLogsSkippedEntry { pub reason: String, } -/// Result of collecting a redacted debug bundle. +/// Result of collecting a session debug bundle. /// ///
/// @@ -4616,7 +4613,7 @@ pub struct DebugCollectLogsSkippedEntry { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DebugCollectLogsResult { - /// Files included in the redacted bundle. + /// Files included in the bundle. pub entries: Vec, /// Destination kind that was written. pub kind: DebugCollectLogsResultKind, @@ -5012,7 +5009,7 @@ pub struct Extension { /// Process ID if the extension is running #[serde(skip_serializing_if = "Option::is_none")] pub pid: Option, - /// Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin (installed plugin), or session (session-state//extensions/) + /// Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin (installed plugin), or session (session-state/``/extensions/) pub source: ExtensionSource, /// Current status: running, disabled, failed, or starting pub status: ExtensionStatus, @@ -7072,6 +7069,9 @@ pub struct InstalledPluginInfo { pub marketplace: String, /// Plugin name pub name: String, + /// Runtime-reported plugin provenance. Currently set to "builtin" only for plugins registered through the trusted host built-in boundary; absent for installed, marketplace, direct, and live plugins. + #[serde(skip_serializing_if = "Option::is_none")] + pub source: Option, /// Installed version (when reported by the plugin manifest) #[serde(skip_serializing_if = "Option::is_none")] pub version: Option, @@ -7306,6 +7306,29 @@ pub struct InterruptMainTurnResult { pub interrupted: bool, } +/// A JSON Schema output contract. OpenAI receives the name, description, schema and strict setting; Anthropic receives the schema in output_config.format and always uses its native strict enforcement. +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct JsonSchemaResponseFormat { + /// Optional description passed to OpenAI providers. + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Name of the output schema, subject to the provider's naming restrictions. + pub name: String, + /// JSON Schema passed unchanged to the inference provider. Schemas larger than 32 MiB when JSON-encoded are rejected before admission, using the runtime's existing request-size ceiling. This is not a guarantee that the entire model request fits. Supported keywords and schema restrictions are determined by the provider. + pub schema: serde_json::Value, + /// Optional strict enforcement setting for OpenAI providers. Omitted uses the provider default. Anthropic always enforces its supported schema subset. + #[serde(skip_serializing_if = "Option::is_none")] + pub strict: Option, +} + /// A request body chunk or cancellation signal. #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -7617,6 +7640,32 @@ pub struct LspInitializeRequest { pub working_directory: Option, } +/// Non-secret host-managed HTTP MCP server configuration. The containing map key is the stable managed identity; credentials are supplied dynamically by the host. +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ManagedMcpServerConfig { + /// Human-readable catalog display name. + pub display_name: String, + /// Maximum dynamic-header cache lifetime in milliseconds. + #[serde(skip_serializing_if = "Option::is_none")] + pub headers_refresh_ttl_ms: Option, + /// Timeout in milliseconds for tool discovery and tool calls. + #[serde(skip_serializing_if = "Option::is_none")] + pub timeout: Option, + /// Tools to include. Defaults to all tools when omitted. + #[serde(skip_serializing_if = "Option::is_none")] + pub tools: Option>, + /// Hosted MCP streamable HTTP endpoint. + pub url: String, +} + /// Validated device-managed settings discovered before a session exists. /// ///
@@ -8378,6 +8427,9 @@ pub struct McpHeadersHandlePendingHeadersRefreshRequestHeaders { pub headers: HashMap, /// Headers-refresh response variant discriminator. pub kind: McpHeadersHandlePendingHeadersRefreshRequestHeadersKind, + /// Optional lifetime in milliseconds for these returned headers. The runtime clamps its configured cache lifetime to this value. + #[serde(skip_serializing_if = "Option::is_none")] + pub ttl_ms: Option, } #[derive(Debug, Clone, Default, Serialize, Deserialize)] @@ -8387,6 +8439,15 @@ pub struct McpHeadersHandlePendingHeadersRefreshRequestNone { pub kind: McpHeadersHandlePendingHeadersRefreshRequestNoneKind, } +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct McpHeadersHandlePendingHeadersRefreshRequestError { + /// Headers-refresh response variant discriminator. + pub kind: McpHeadersHandlePendingHeadersRefreshRequestErrorKind, + /// Host credential broker failure, denial, or revocation reason. + pub message: String, +} + /// MCP headers refresh request id and the host response. /// ///
@@ -9610,6 +9671,9 @@ pub struct McpSamplingExecutionResult { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct McpServer { + /// Human-readable display name supplied by a managed server catalog. + #[serde(skip_serializing_if = "Option::is_none")] + pub display_name: Option, /// Error message if the server failed to connect #[serde(skip_serializing_if = "Option::is_none")] pub error: Option, @@ -9618,7 +9682,7 @@ pub struct McpServer { /// Server-advertised metadata for a connected server. Omitted when no live connection metadata is available, including while pending or when failed, disabled, stopped, or not configured. #[serde(skip_serializing_if = "Option::is_none")] pub server_metadata: Option, - /// Configuration source: user, workspace, plugin, or builtin + /// Configuration source: user, workspace, plugin, builtin, or managed #[serde(skip_serializing_if = "Option::is_none")] pub source: Option, /// Plugin name that provided this server, when source is plugin. @@ -13662,6 +13726,97 @@ pub struct ProtocolExternalToolDefinition { pub title: Option, } +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProtocolStaticSectionOverride { + /// Declarative operation applied to the section. + pub action: ProtocolStaticSectionAction, + /// Optional content used by replace, append, and prepend operations. + #[serde(skip_serializing_if = "Option::is_none")] + pub content: Option, +} + +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProtocolSystemMessageAppendConfig { + /// Text appended to the standard system prompt. + #[serde(skip_serializing_if = "Option::is_none")] + pub content: Option, + /// Append-mode discriminator. Omission also selects append mode. + #[serde(skip_serializing_if = "Option::is_none")] + pub mode: Option, +} + +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProtocolSystemMessageCustomizeConfig { + /// Text appended after the customized sections. + #[serde(skip_serializing_if = "Option::is_none")] + pub content: Option, + /// Customize-mode discriminator. + pub mode: ProtocolCustomizeMode, + /// Named standard-prompt section overrides. + #[serde(skip_serializing_if = "Option::is_none")] + pub sections: Option>, +} + +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SystemMessageBlock { + /// Text content for this system-message block. + pub content: String, + /// Whether the block is static and may be cached independently of dynamic prompt content. + #[serde(skip_serializing_if = "Option::is_none")] + pub is_static: Option, +} + +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProtocolSystemMessageReplaceConfig { + /// Complete replacement system-message text. + pub content: String, + /// Optional structured blocks corresponding to the replacement content. + #[serde(skip_serializing_if = "Option::is_none")] + pub content_blocks: Option>, + /// Replace-mode discriminator. + pub mode: ProtocolReplaceMode, +} + /// A BYOK model definition referencing a named provider. /// ///
@@ -13695,6 +13850,9 @@ pub struct ProviderModelConfig { pub name: Option, /// Name of the configured provider that serves this model. pub provider: String, + /// System-message configuration used when the runtime builds the standard prompt for this provider-qualified model, including general-purpose subagents. It uses the same object hierarchy as session-level systemMessage configuration, except transform actions are rejected because the current callback protocol is not model-scoped. When present, it overrides the session-wide configuration on those prompt paths. Selected custom-agent and specialized-subagent prompts remain authoritative. + #[serde(skip_serializing_if = "Option::is_none")] + pub system_message: Option, /// The model name sent to the provider API for inference. Defaults to `id`. #[serde(skip_serializing_if = "Option::is_none")] pub wire_model: Option, @@ -14860,60 +15018,6 @@ pub struct RegisterEventInterestResult { pub handle: String, } -/// Optional registration options. -/// -///
-/// -/// **Experimental.** This type is part of an experimental wire-protocol surface -/// and may change or be removed in future SDK or CLI releases. -/// -///
-#[derive(Debug, Clone, Default, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SessionsRegisterExtensionToolsOnSessionOptions { - /// In-process `() => boolean` gating callback used only by the CLI. - #[doc(hidden)] - #[serde(skip_serializing_if = "Option::is_none")] - pub(crate) enabled: Option, -} - -/// Params to attach an extension loader's tools to a session. -/// -///
-/// -/// **Experimental.** This type is part of an experimental wire-protocol surface -/// and may change or be removed in future SDK or CLI releases. -/// -///
-#[derive(Debug, Clone, Default, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct RegisterExtensionToolsParams { - /// In-process ExtensionLoader handle used only by the CLI and excluded from the public SDK surface. - #[doc(hidden)] - pub(crate) loader: serde_json::Value, - /// Optional registration options. - #[serde(skip_serializing_if = "Option::is_none")] - pub options: Option, - /// Session to register extension tools on. - pub session_id: SessionId, -} - -/// Handle for releasing the extension tool registration. -/// -///
-/// -/// **Experimental.** This type is part of an experimental wire-protocol surface -/// and may change or be removed in future SDK or CLI releases. -/// -///
-#[derive(Debug, Clone, Default, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct RegisterExtensionToolsResult { - /// In-process unsubscribe function used only by the CLI. - #[doc(hidden)] - pub(crate) unsubscribe: serde_json::Value, -} - /// Opaque handle previously returned by `registerInterest` to release. /// ///
@@ -15276,6 +15380,23 @@ pub struct RemoteSessionRepository { pub owner: String, } +/// Provider-native structured output format. JSON Schema is forwarded without rewriting or validating the schema or the generated output. +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResponseFormat { + /// JSON Schema and provider options for the turn's output. + pub json_schema: JsonSchemaResponseFormat, + /// Output format discriminator. Currently only json_schema is supported. + pub r#type: ResponseFormatType, +} + /// Credential-injection capability flags applied while the sandbox is enabled. For the same capability independent of sandboxing, and matched to the credential's GitHub host, see `shell.credentials`; the two are additive. /// ///
@@ -15384,13 +15505,19 @@ pub struct SandboxConfigUserPolicyNetworkProxy { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SandboxConfigUserPolicyNetwork { + /// Hosts allowed through the built-in sandbox proxy. A non-empty list denies unmatched hosts; an absent or empty list allows all hosts not blocked. Supports exact hostnames, IP addresses, and *.example.com for strict subdomains. Host rules do not override the outbound or local-network toggles. + #[serde(skip_serializing_if = "Option::is_none")] + pub allowed_hosts: Option>, /// Whether traffic to local/loopback addresses is allowed. #[serde(skip_serializing_if = "Option::is_none")] pub allow_local_network: Option, /// Whether outbound network traffic is allowed at all. #[serde(skip_serializing_if = "Option::is_none")] pub allow_outbound: Option, - /// HTTP proxy for sandboxed process traffic. Linux restricts egress to the proxy endpoint, requires that endpoint to be reachable over IPv4 (the `[::]` dual-stack wildcard is accepted and routed through the IPv4 gateway), and does not support proxy credentials. macOS relies on applications honoring proxy environment variables. Windows also configures a per-AppContainer WinHTTP proxy, but enforcement depends on the application's networking stack. Configure supported credentials in the separate `username` and `password` fields. A credential-free http:// loopback URL uses the localhost proxy form, while an https:// or authenticated loopback URL uses the URL form. + /// Hosts denied by the built-in sandbox proxy. Deny rules take precedence over allowedHosts. A domain also denies all its subdomains. IP addresses match exactly; *.example.com matches strict subdomains, and * denies every host. + #[serde(skip_serializing_if = "Option::is_none")] + pub blocked_hosts: Option>, + /// HTTP(S) proxy for sandboxed traffic. With host rules, this is the built-in local proxy's upstream; credentials stay in the runtime, and Linux and macOS restrict the child to the local listener. Without host rules, Linux restricts egress to this endpoint but rejects credentials, and macOS proxying is cooperative. Windows enforcement depends on the application's networking stack. Configure credentials in the separate username/password fields. The transient local listener URL is never persisted. #[serde(skip_serializing_if = "Option::is_none")] pub proxy: Option, } @@ -15841,6 +15968,15 @@ pub struct SendMessageItem { pub(crate) source: Option, } +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SendMessagesRequestResponseFormat { + /// JSON Schema and provider options for the turn's output. + pub json_schema: JsonSchemaResponseFormat, + /// Output format discriminator. Currently only json_schema is supported. + pub r#type: SendMessagesRequestResponseFormatType, +} + /// Parameters for sending zero or more user messages to the session in a single turn. Remote-backed (Mission Control) sessions do not support this method and will return an error. /// ///
@@ -15855,7 +15991,7 @@ pub struct SendMessagesRequest { /// The UI mode the agent was in when these messages were sent. Defaults to the session's current mode. #[serde(skip_serializing_if = "Option::is_none")] pub agent_mode: Option, - /// The user messages to append to the conversation, in order. May be empty, in which case a single turn runs over the existing history with no new user message. + /// The user messages to append to the conversation, in order, before running one agent loop. When the batch starts a run, its final message is the primary initiating message; earlier messages provide context, not separate runs or replies. May be empty, in which case a single turn runs over the existing history with no new user message or originatingMessageId. pub messages: Vec, /// How to deliver the messages. `enqueue` (default) appends to the message queue. `immediate` interjects during an in-progress turn. #[serde(skip_serializing_if = "Option::is_none")] @@ -15866,6 +16002,9 @@ pub struct SendMessagesRequest { /// Custom HTTP headers to include in outbound model requests for this turn. Merged with session-level provider headers; per-turn headers augment and overwrite session-level headers with the same key. #[serde(skip_serializing_if = "Option::is_none")] pub request_headers: Option>, + /// Provider-native output format for the whole turn, including an empty message batch and all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. + #[serde(skip_serializing_if = "Option::is_none")] + pub response_format: Option, /// W3C Trace Context traceparent header for distributed tracing of this agent turn #[serde(skip_serializing_if = "Option::is_none")] pub traceparent: Option, @@ -15888,10 +16027,19 @@ pub struct SendMessagesRequest { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SendMessagesResult { - /// Unique identifiers assigned to the messages, one per provided message in order. Empty when no messages were provided. + /// Unique identifiers assigned to the messages, one per provided message in order. For a batch that starts a run, assistant messages use the final ID as originatingMessageId throughout that run, including tool iterations and stop-hook corrections. Immediate steering does not replace the active run's origin. Empty when no messages were provided; that run has no originatingMessageId. pub message_ids: Vec, } +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SendRequestResponseFormat { + /// JSON Schema and provider options for the turn's output. + pub json_schema: JsonSchemaResponseFormat, + /// Output format discriminator. Currently only json_schema is supported. + pub r#type: SendRequestResponseFormatType, +} + /// Parameters for sending a user message to the session /// ///
@@ -15929,6 +16077,9 @@ pub struct SendRequest { /// If set, the request will fail if the named tool is not available when this message is among the user messages at the start of the current exchange #[serde(skip_serializing_if = "Option::is_none")] pub required_tool: Option, + /// Provider-native output format for this turn, including all tool-call iterations. Not inherited by later turns or subagents. Ordinary steering inherits the active format; specifying responseFormat with mode: immediate is an error, even while idle. Returned assistant content remains text; the runtime does not parse or validate it. Unsupported models or schemas produce provider errors. + #[serde(skip_serializing_if = "Option::is_none")] + pub response_format: Option, /// Optional provenance tag copied to the resulting user.message event. Must be `user`, `system`, `command-` for command-originated messages, `schedule-` for scheduled prompts, or `agent-` for prompts sent by another agent. #[doc(hidden)] #[serde(skip_serializing_if = "Option::is_none")] @@ -17530,7 +17681,7 @@ pub struct SessionOpenOptions { /// Opt in to capturing file changes for session rewind and session diff. Capture cannot reconstruct changes made before it was enabled. On create it starts capture from the first turn. It is also honored on resume: for a session that already has tracked prior turns, tracking continues automatically even if this is omitted; passing it on resume additionally enables tracking for an eligible session that has no prior root turn yet. Resuming a session whose prior root turns were never tracked has no restorable baseline, so tracking stays disabled for it and rewind reports file change tracking as unavailable; the resume itself still succeeds, so sessions that predate tracking remain loadable. The opt-in is only rejected when the session can never track (a subagent session, or one without local session storage). It is intentionally absent from the mutable options update because enabling it after edits have occurred would create an incomplete, misleading baseline. Subagents share the parent session's capture store and are not tracked as separate rewind points: a file a subagent writes is attributed to whichever root user turn was open when the capture was staged, just before the tool body ran. A turn cannot open while a staged capture is still in flight, so a subagent tool that staged under the spawning turn stays attributed to it however late the write lands, while a capture it stages after the user's next message belongs to that later turn. Attribution decides which turn's rewind point counts and file preview include that write; it does not narrow which rewinds revert it, because a rewind restores every capture from the selected turn onward, so the earlier spawning turn reverts it as well. #[serde(skip_serializing_if = "Option::is_none")] pub enable_file_change_tracking: Option, - /// Opt-in: self-fetch and enforce enterprise managed settings at session bootstrap. + /// Opt-in: self-fetch and enforce enterprise managed settings, including managed hook policies, at session bootstrap. #[serde(skip_serializing_if = "Option::is_none")] pub enable_managed_settings: Option, /// Whether on-demand custom instruction discovery is enabled. @@ -17599,6 +17750,16 @@ pub struct SessionOpenOptions { /// Identifier sent to LSP-style integrations. #[serde(skip_serializing_if = "Option::is_none")] pub lsp_client_name: Option, + /// Non-secret host-managed HTTP MCP servers keyed by stable managed identity. Managed provenance is runtime-established from this separate field and credentials are supplied through dynamic-header refresh. + /// + ///
+ /// + /// **Experimental.** This type is part of an experimental wire-protocol surface + /// and may change or be removed in future SDK or CLI releases. + /// + ///
+ #[serde(skip_serializing_if = "Option::is_none")] + pub managed_mcp_servers: Option>, /// Permissions-only enterprise policy injected by the SDK host at session create or resume. Composes restrictively with self-fetched and device policy and is not persisted. #[serde(skip_serializing_if = "Option::is_none")] pub managed_settings: Option, @@ -19744,6 +19905,9 @@ pub struct SlashCommandTextResult { /// True when the invocation mutated user runtime settings; consumers caching settings should refresh #[serde(skip_serializing_if = "Option::is_none")] pub runtime_settings_changed: Option, + /// Present when the invocation changed the sandbox for this session only. Nothing was persisted, so consumers must mirror the change onto the live session rather than reloading settings, and must not treat it as a settings change. + #[serde(skip_serializing_if = "Option::is_none")] + pub sandbox_session_change: Option, /// Text output for the client to render pub text: String, } @@ -23161,22 +23325,6 @@ pub struct SessionsGetRemoteControlStatusResult { pub status: serde_json::Value, } -/// Handle for releasing the extension tool registration. -/// -///
-/// -/// **Experimental.** This type is part of an experimental wire-protocol surface -/// and may change or be removed in future SDK or CLI releases. -/// -///
-#[derive(Debug, Clone, Default, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct SessionsRegisterExtensionToolsOnSessionResult { - /// In-process unsubscribe function used only by the CLI. - #[doc(hidden)] - pub(crate) unsubscribe: serde_json::Value, -} - /// Identifies the target session. /// ///
@@ -23218,7 +23366,7 @@ pub struct SessionSendResult { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SessionSendMessagesResult { - /// Unique identifiers assigned to the messages, one per provided message in order. Empty when no messages were provided. + /// Unique identifiers assigned to the messages, one per provided message in order. For a batch that starts a run, assistant messages use the final ID as originatingMessageId throughout that run, including tool iterations and stop-hook corrections. Immediate steering does not replace the active run's origin. Empty when no messages were provided; that run has no originatingMessageId. pub message_ids: Vec, } @@ -23460,7 +23608,7 @@ pub struct SessionGitHubAuthLastAuthErrorsParams { pub session_id: SessionId, } -/// Result of collecting a redacted debug bundle. +/// Result of collecting a session debug bundle. /// ///
/// @@ -23471,7 +23619,7 @@ pub struct SessionGitHubAuthLastAuthErrorsParams { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SessionDebugCollectLogsResult { - /// Files included in the redacted bundle. + /// Files included in the bundle. pub entries: Vec, /// Destination kind that was written. pub kind: DebugCollectLogsResultKind, @@ -30594,7 +30742,7 @@ pub enum DebugCollectLogsDestinationDirectoryKind { Directory, } -/// Destination for the redacted debug bundle. +/// Destination for the session debug bundle. /// ///
/// @@ -30647,6 +30795,9 @@ pub enum DebugCollectLogsRedaction { /// Redact each non-empty line as a session event JSON object, falling back to plain-text redaction for malformed lines. #[serde(rename = "events-jsonl")] EventsJsonl, + /// No redaction is applied. The caller must ensure any necessary redaction is performed before this call. + #[serde(rename = "none")] + None, /// Unknown variant for forward compatibility. #[default] #[serde(other)] @@ -30666,7 +30817,7 @@ pub enum DebugCollectLogsResultKind { /// A .tgz archive was written. #[serde(rename = "archive")] Archive, - /// A directory containing redacted files was written. + /// A directory containing the collected files was written. #[serde(rename = "directory")] Directory, /// Unknown variant for forward compatibility. @@ -31885,6 +32036,14 @@ pub enum McpHeadersHandlePendingHeadersRefreshRequestNoneKind { None, } +/// Headers-refresh response variant discriminator. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum McpHeadersHandlePendingHeadersRefreshRequestErrorKind { + #[serde(rename = "error")] + #[default] + Error, +} + /// Host response: supply dynamic headers or decline this refresh. /// ///
@@ -31898,6 +32057,7 @@ pub enum McpHeadersHandlePendingHeadersRefreshRequestNoneKind { pub enum McpHeadersHandlePendingHeadersRefreshRequest { Headers(McpHeadersHandlePendingHeadersRefreshRequestHeaders), None(McpHeadersHandlePendingHeadersRefreshRequestNone), + Error(McpHeadersHandlePendingHeadersRefreshRequestError), } /// Whether a planned configuration change would create or modify an entry @@ -33691,6 +33851,40 @@ pub enum PluginInstallStagingMode { Unknown, } +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ProtocolAppendMode { + #[serde(rename = "append")] + Append, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ProtocolCustomizeMode { + #[serde(rename = "customize")] + Customize, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + /// Controls whether the runtime may defer loading an external tool definition. /// ///
@@ -33713,6 +33907,50 @@ pub enum ProtocolExternalToolDefer { Unknown, } +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ProtocolReplaceMode { + #[serde(rename = "replace")] + Replace, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ProtocolStaticSectionAction { + /// Replace the section content. + #[serde(rename = "replace")] + Replace, + /// Remove the section content. + #[serde(rename = "remove")] + Remove, + /// Append content to the section. + #[serde(rename = "append")] + Append, + /// Prepend content to the section. + #[serde(rename = "prepend")] + Prepend, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + /// Transport to be used for provider requests. /// ///
@@ -34090,6 +34328,14 @@ pub enum RemoteSessionMetadataTaskType { Unknown, } +/// Output format discriminator. Currently only json_schema is supported. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum ResponseFormatType { + #[serde(rename = "json_schema")] + #[default] + JsonSchema, +} + /// Origin of the sandbox choice supplied by an internal client. /// ///
@@ -34127,6 +34373,44 @@ pub enum SandboxConfigSource { Unknown, } +/// A session-scoped sandbox transition applied while handling a slash command +/// +///
+/// +/// **Experimental.** This type is part of an experimental wire-protocol surface +/// and may change or be removed in future SDK or CLI releases. +/// +///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum SandboxSessionChange { + /// The sandbox is off for the rest of this session; nothing was persisted and a new session starts from managed policy. + #[serde(rename = "disabled")] + Disabled, + /// A previous session-scoped opt-out was cleared and the sandbox is enforced again. + #[serde(rename = "restored")] + Restored, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + +/// Output format discriminator. Currently only json_schema is supported. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum SendMessagesRequestResponseFormatType { + #[serde(rename = "json_schema")] + #[default] + JsonSchema, +} + +/// Output format discriminator. Currently only json_schema is supported. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum SendRequestResponseFormatType { + #[serde(rename = "json_schema")] + #[default] + JsonSchema, +} + /// Session capability enabled for this session /// ///
diff --git a/rust/src/generated/rpc.rs b/rust/src/generated/rpc.rs index fd54f8dcb8..d07ccf0b4f 100644 --- a/rust/src/generated/rpc.rs +++ b/rust/src/generated/rpc.rs @@ -2776,41 +2776,7 @@ impl<'a> ClientRpcSessions<'a> { Ok(serde_json::from_value(_value)?) } - /// Registers extension-provided tools on the given session, gated by an optional `enabled` callback. Returns an opaque unsubscribe function the caller must invoke to deregister the tools when the extension is torn down. Marked internal because `loader`, `enabled`, and the returned `unsubscribe` are in-process handles that cannot cross the JSON-RPC boundary. Disappears once extension discovery / launch / tool registration are owned by the runtime: SDK consumers will pass pure config (search paths, disabled ids) via `SessionOptions` and the runtime will resolve, launch, register, and tear down extensions itself. - /// - /// Wire method: `sessions.registerExtensionToolsOnSession`. - /// - /// # Parameters - /// - /// * `params` - Params to attach an extension loader's tools to a session. - /// - /// # Returns - /// - /// Handle for releasing the extension tool registration. - /// - ///
- /// - /// **Experimental.** This API is part of an experimental wire-protocol surface - /// and may change or be removed in future SDK or CLI releases. Pin both the - /// SDK and CLI versions if your code depends on it. - /// - ///
- pub(crate) async fn register_extension_tools_on_session( - &self, - params: RegisterExtensionToolsParams, - ) -> Result { - let wire_params = serde_json::to_value(params)?; - let _value = self - .client - .call( - rpc_methods::SESSIONS_REGISTEREXTENSIONTOOLSONSESSION, - Some(wire_params), - ) - .await?; - Ok(serde_json::from_value(_value)?) - } - - /// Attaches (or detaches) an in-process ExtensionController delegate for the given session, used by shared-API surfaces that need to query or modify the session's extension state. Pass `controller: undefined` to detach. Marked internal because the controller is an in-process object that cannot cross the JSON-RPC boundary. Disappears alongside `registerExtensionToolsOnSession`: once the runtime owns extension management, the public surface exposes list/enable/disable/reload as dedicated RPCs served by the runtime. + /// Attaches (or detaches) an in-process ExtensionController delegate for the given session in a local host adapter. Pass `controller: undefined` to detach. Internal because the controller cannot cross the JSON-RPC boundary; the runtime manages its own session extension service. /// /// Wire method: `sessions.configureSessionExtensions`. /// @@ -4532,17 +4498,17 @@ pub struct SessionRpcDebug<'a> { } impl<'a> SessionRpcDebug<'a> { - /// Collects a redacted session debug log bundle into a local archive or staging directory. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape. + /// Collects a session debug log bundle into a local archive or staging directory. Logs are redacted by default; redaction can be configured per caller-provided diagnostic entry. The runtime includes session-owned logs by default and accepts caller-provided diagnostic entries so host applications can add their own files without changing this API shape. /// /// Wire method: `session.debug.collectLogs`. /// /// # Parameters /// - /// * `params` - Options for collecting a redacted session debug bundle. + /// * `params` - Options for collecting a session debug bundle with configurable redaction. /// /// # Returns /// - /// Result of collecting a redacted debug bundle. + /// Result of collecting a session debug bundle. /// ///
/// diff --git a/rust/src/generated/session_events.rs b/rust/src/generated/session_events.rs index 05e3590043..bacecbe528 100644 --- a/rust/src/generated/session_events.rs +++ b/rust/src/generated/session_events.rs @@ -230,6 +230,33 @@ pub enum SessionEventType { ToolSearchActivated, #[serde(rename = "skill.invoked")] SkillInvoked, + /// + ///
+ /// + /// **Experimental.** This type is part of an experimental wire-protocol surface + /// and may change or be removed in future SDK or CLI releases. + /// + ///
+ #[serde(rename = "skill.invoked_ref")] + SkillInvokedRef, + /// + ///
+ /// + /// **Experimental.** This type is part of an experimental wire-protocol surface + /// and may change or be removed in future SDK or CLI releases. + /// + ///
+ #[serde(rename = "skill.context_delivered")] + SkillContextDelivered, + /// + ///
+ /// + /// **Experimental.** This type is part of an experimental wire-protocol surface + /// and may change or be removed in future SDK or CLI releases. + /// + ///
+ #[serde(rename = "skill.context_delivered_ref")] + SkillContextDeliveredRef, #[serde(rename = "sandbox.decision")] SandboxDecision, #[serde(rename = "subagent.started")] @@ -727,6 +754,12 @@ pub enum SessionEventData { ToolSearchActivated(ToolSearchActivatedData), #[serde(rename = "skill.invoked")] SkillInvoked(SkillInvokedData), + #[serde(rename = "skill.invoked_ref")] + SkillInvokedRef(SkillInvokedRefData), + #[serde(rename = "skill.context_delivered")] + SkillContextDelivered(SkillContextDeliveredData), + #[serde(rename = "skill.context_delivered_ref")] + SkillContextDeliveredRef(SkillContextDeliveredRefData), #[serde(rename = "sandbox.decision")] SandboxDecision(SandboxDecisionData), #[serde(rename = "subagent.started")] @@ -2952,6 +2985,9 @@ pub struct AssistantMessageData { /// Model that produced this assistant message, if known #[serde(skip_serializing_if = "Option::is_none")] pub model: Option, + /// Logical ID of the primary user message that initiated this run, matching the messageId returned by session.send (or the last messageId of session.sendMessages). Stable across model/tool iterations, steering messages, and stop-hook corrections. Subagent runs use their own initiating message ID, not the parent's. Absent for runs without an associated initiating message, such as empty batches. + #[serde(skip_serializing_if = "Option::is_none")] + pub originating_message_id: Option, /// Actual output token count from the API response (completion_tokens), used for accurate token accounting #[serde(skip_serializing_if = "Option::is_none")] pub output_tokens: Option, @@ -3604,6 +3640,12 @@ pub struct ToolExecutionStartData { ///
#[serde(skip_serializing_if = "Option::is_none")] pub fusion: Option, + /// Preferred lookup name for the MCP server hosting this tool: the configured (namespaced) config-map key when the tool carries one, otherwise the display name from `mcpServerName`. Present when the tool is an MCP tool; this is the name unrestricted provenance telemetry hashes so it joins with `mcp_server_setup`, which keys off the configured name too. + #[serde(skip_serializing_if = "Option::is_none")] + pub mcp_config_server_name: Option, + /// Where the MCP server's configuration came from (`user`, `workspace`, `plugin`, or `builtin`), when the tool is an MCP tool and the server is configured + #[serde(skip_serializing_if = "Option::is_none")] + pub mcp_config_source: Option, /// Name of the MCP server hosting this tool, when the tool is an MCP tool #[serde(skip_serializing_if = "Option::is_none")] pub mcp_server_name: Option, @@ -4058,7 +4100,7 @@ pub struct ToolExecutionCompleteResult { /// Structured content blocks (text, images, audio, resources) returned by the tool in their native format #[serde(skip_serializing_if = "Option::is_none")] pub contents: Option>, - /// Full detailed tool result for UI/timeline display, preserving complete content such as diffs. Falls back to content when absent. + /// Detailed tool result for UI/timeline display, preserving complete content such as diffs for most tools. Successful skill invocations intentionally use the concise model-facing content here; the authoritative skill body is carried by the corresponding skill invocation event. Falls back to content when absent. #[serde(skip_serializing_if = "Option::is_none")] pub detailed_content: Option, /// FIDES IFC label projected from tool ingress metadata (MCP `CallToolResult._meta` or synthesized built-in ingress labels) — persisted as `{ ifc: ... }` (only the `ifc` key, not the whole `_meta`). Persisted so the FIDES IFC label survives session resume: the engine rehydrates accumulated taint by replaying these on load. Populated for ingress sources when FIDES IFC is on. Experimental. @@ -4225,6 +4267,76 @@ pub struct SkillInvokedData { pub trigger: Option, } +/// Session event "skill.invoked_ref". Internal durable skill invocation receipt whose content resolves from an earlier inline skill event in the same session. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SkillInvokedRefData { + /// Tool names that should be auto-approved when this skill is active + #[serde(skip_serializing_if = "Option::is_none")] + pub allowed_tools: Option>, + /// Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:` over the UTF-8 bytes of that event's `content` + pub content_id: String, + /// UTF-16 code unit length of the referenced skill content. Derived from the referenced body and validated against it when the reference is expanded; a reference whose length disagrees with the body it names is rejected instead of expanded + pub content_length: i64, + /// Description of the skill from its SKILL.md frontmatter + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Whether model invocation is disabled for this skill + #[serde(skip_serializing_if = "Option::is_none")] + pub disable_model_invocation: Option, + /// Model identifier active when the skill was invoked, when known + #[serde(skip_serializing_if = "Option::is_none")] + pub model: Option, + /// Name of the invoked skill + pub name: String, + /// File path to the SKILL.md definition, or an empty string for an SDK-provided skill without a filesystem identity + pub path: String, + /// Name of the plugin this skill originated from, when applicable + #[serde(skip_serializing_if = "Option::is_none")] + pub plugin_name: Option, + /// Version of the plugin this skill originated from, when applicable + #[serde(skip_serializing_if = "Option::is_none")] + pub plugin_version: Option, + /// Source identifier for where the skill was discovered + #[serde(skip_serializing_if = "Option::is_none")] + pub source: Option, + /// What triggered the skill invocation + #[serde(skip_serializing_if = "Option::is_none")] + pub trigger: Option, +} + +/// Session event "skill.context_delivered". Exact skill context delivered to the model during a tool phase. This is not a user submission or another skill invocation. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SkillContextDeliveredData { + /// Exact model-facing skill wrapper, including its invocation-time file context + pub content: String, + /// Interaction that delivered this context, when known + #[serde(skip_serializing_if = "Option::is_none")] + pub interaction_id: Option, + /// Unmodified injection provenance, in the form skill-`` + pub source: String, +} + +/// Session event "skill.context_delivered_ref". Internal durable receipt that reconstructs exact model-visible skill context from earlier session content. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SkillContextDeliveredRefData { + /// Content identifier of an earlier inline skill event in this session, in the prefixed form `sha256:` over the UTF-8 bytes of that event's `content` + pub content_id: String, + /// Interaction that delivered this context, when known + #[serde(skip_serializing_if = "Option::is_none")] + pub interaction_id: Option, + /// Exact text preceding the referenced content in the delivered wrapper + #[serde(skip_serializing_if = "Option::is_none")] + pub prefix: Option, + /// Unmodified injection provenance, in the form skill-`` + pub source: String, + /// Exact text following the referenced content in the delivered wrapper + #[serde(skip_serializing_if = "Option::is_none")] + pub suffix: Option, +} + /// Session event "sandbox.decision". Payload of `sandbox.decision`, a bounded governance record of what the process sandbox was configured to do and whether it took effect. Discriminated by `kind`. #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -4252,6 +4364,9 @@ pub struct SubagentStartedData { /// Model the sub-agent will run with, when known at start. #[serde(skip_serializing_if = "Option::is_none")] pub model: Option, + /// Authority or runtime mechanism responsible for sub-agent model selection, when known at start. + #[serde(skip_serializing_if = "Option::is_none")] + pub model_selection_source: Option, /// Task-registry ID of the spawning sub-agent. Absent when the root session spawned this child. #[serde(skip_serializing_if = "Option::is_none")] pub parent_id: Option, @@ -4401,7 +4516,7 @@ pub struct HookStartData { pub hook_invocation_id: String, /// Type of hook being invoked (e.g., "preToolUse", "postToolUse", "sessionStart") pub hook_type: String, - /// Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) elides the tool result's inline `contents`/`uiResource` and replaces an over-long `textResultForLlm` with a `[copilot:elided ...]` marker, to keep a multi-megabyte payload out of the durable event log; the live subscription stream still delivers the full value. Read the adjacent tool.execution_complete event for the tool result itself. + /// Input data passed to the hook. For postToolUse hooks the retained copy served by session.eventLog.read (and by a resumed session) drops the tool result's inline `contents`/`uiResource`/`skillInvocation` and replaces duplicated text result fields with a `[copilot:elided ...]` marker; the live subscription stream still delivers the full value. Canonical tool output remains in the adjacent tool.execution_complete event, while an invoked skill's authoritative body remains in its skill invocation event. #[serde(skip_serializing_if = "Option::is_none")] pub input: Option, /// Tool call ID of the parent tool invocation when this event originates from a sub-agent @@ -4434,7 +4549,7 @@ pub struct HookEndData { pub hook_invocation_id: String, /// Type of hook that was invoked (e.g., "preToolUse", "postToolUse", "sessionStart") pub hook_type: String, - /// Output data produced by the hook + /// Output data produced by the hook. Durable and resumed postToolUse receipts may omit messages owned by a successful skill invocation and replace an unchanged skill sessionLog copy with an elision marker; hook-modified or re-sourced values are preserved, and the authoritative body remains in the skill invocation event. #[serde(skip_serializing_if = "Option::is_none")] pub output: Option, /// Tool call ID of the parent tool invocation when this event originates from a sub-agent @@ -4512,7 +4627,7 @@ pub struct SystemMessageData { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SystemNotificationData { - /// The notification text, typically wrapped in XML tags + /// The notification text, typically wrapped in `` XML tags pub content: String, /// Structured metadata identifying what triggered this notification pub kind: serde_json::Value, @@ -6655,6 +6770,9 @@ pub struct McpServerMetadata { #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct McpServersLoadedServer { + /// Human-readable display name supplied by a managed server catalog. + #[serde(skip_serializing_if = "Option::is_none")] + pub display_name: Option, /// Error message if the server failed to connect #[serde(skip_serializing_if = "Option::is_none")] pub error: Option, @@ -6669,7 +6787,7 @@ pub struct McpServersLoadedServer { /// Server-advertised metadata for a connected server. Omitted when no live connection metadata is available, including while pending or when failed, disabled, stopped, or not configured. #[serde(skip_serializing_if = "Option::is_none")] pub server_metadata: Option, - /// Configuration source: user, workspace, plugin, or builtin + /// Configuration source: user, workspace, plugin, builtin, or managed #[serde(skip_serializing_if = "Option::is_none")] pub source: Option, /// Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured @@ -7919,6 +8037,30 @@ pub enum AbortReason { Unknown, } +/// Configuration source: user, workspace, plugin, builtin, or managed +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum McpServerSource { + /// Server configured in the user's global MCP configuration. + #[serde(rename = "user")] + User, + /// Server configured by the current workspace. + #[serde(rename = "workspace")] + Workspace, + /// Server contributed by an installed plugin. + #[serde(rename = "plugin")] + Plugin, + /// Server bundled with the runtime. + #[serde(rename = "builtin")] + Builtin, + /// Server supplied by a trusted host-managed catalog. + #[serde(rename = "managed")] + Managed, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + /// Transport mechanism: stdio, http, sse (deprecated), or memory (in-process MCP server) #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub enum McpServerTransport { @@ -8156,27 +8298,6 @@ pub enum SkillInvokedTrigger { Unknown, } -/// Where the model input for a task-tool sub-agent came from. -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] -pub enum SubagentTaskModelSource { - /// The spawning agent supplied the task tool's model argument. - #[serde(rename = "task_argument")] - TaskArgument, - /// The task omitted a model and the per-sub-agent settings entry supplied a concrete one. - #[serde(rename = "subagent_configuration")] - SubagentConfiguration, - /// The task omitted a model and the user-defined custom agent's definition supplied one. - #[serde(rename = "custom_agent_definition")] - CustomAgentDefinition, - /// Neither the task call, the per-sub-agent settings entry, nor a custom agent definition supplied a model. - #[serde(rename = "unset")] - Unset, - /// Unknown variant for forward compatibility. - #[default] - #[serde(other)] - Unknown, -} - /// Authority or runtime mechanism responsible for sub-agent model selection. #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub enum SubagentModelSelectionSource { @@ -8207,6 +8328,27 @@ pub enum SubagentModelSelectionSource { Unknown, } +/// Where the model input for a task-tool sub-agent came from. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum SubagentTaskModelSource { + /// The spawning agent supplied the task tool's model argument. + #[serde(rename = "task_argument")] + TaskArgument, + /// The task omitted a model and the per-sub-agent settings entry supplied a concrete one. + #[serde(rename = "subagent_configuration")] + SubagentConfiguration, + /// The task omitted a model and the user-defined custom agent's definition supplied one. + #[serde(rename = "custom_agent_definition")] + CustomAgentDefinition, + /// Neither the task call, the per-sub-agent settings entry, nor a custom agent definition supplied a model. + #[serde(rename = "unset")] + Unset, + /// Unknown variant for forward compatibility. + #[default] + #[serde(other)] + Unknown, +} + /// Binary asset type discriminator. Use "image" for images and "resource" otherwise. #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub enum BinaryAssetType { @@ -8973,6 +9115,9 @@ pub enum McpHeadersRefreshCompletedOutcome { /// The host responded with no dynamic headers. #[serde(rename = "none")] None, + /// The host credential broker rejected or failed the refresh. + #[serde(rename = "error")] + Error, /// No response arrived within the bounded window. #[serde(rename = "timeout")] Timeout, @@ -9229,27 +9374,6 @@ pub enum AgentModelPolicy { Unknown, } -/// Configuration source: user, workspace, plugin, or builtin -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] -pub enum McpServerSource { - /// Server configured in the user's global MCP configuration. - #[serde(rename = "user")] - User, - /// Server configured by the current workspace. - #[serde(rename = "workspace")] - Workspace, - /// Server contributed by an installed plugin. - #[serde(rename = "plugin")] - Plugin, - /// Server bundled with the runtime. - #[serde(rename = "builtin")] - Builtin, - /// Unknown variant for forward compatibility. - #[default] - #[serde(other)] - Unknown, -} - /// Connection status: connected, failed, needs-auth, pending, disabled, stopped, or not_configured #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub enum McpServerStatus { diff --git a/rust/tests/e2e/mcp_oauth.rs b/rust/tests/e2e/mcp_oauth.rs index c5e4d7117a..ba98aec7c8 100644 --- a/rust/tests/e2e/mcp_oauth.rs +++ b/rust/tests/e2e/mcp_oauth.rs @@ -494,7 +494,10 @@ impl McpAuthHandler for LifecycleAuthHandler { .as_deref() .is_some_and(|url| url.ends_with("/.well-known/oauth-protected-resource")) ); - assert_eq!(www_authenticate.scope.as_deref(), Some("mcp.write")); + assert_eq!( + www_authenticate.scope.as_deref(), + Some("mcp.read mcp.write") + ); assert_eq!( www_authenticate.error.as_deref(), Some("insufficient_scope") diff --git a/rust/tests/e2e/rpc_session_state_extras.rs b/rust/tests/e2e/rpc_session_state_extras.rs index 54079d31ae..f7eb1e5e95 100644 --- a/rust/tests/e2e/rpc_session_state_extras.rs +++ b/rust/tests/e2e/rpc_session_state_extras.rs @@ -309,6 +309,7 @@ async fn should_add_byok_provider_and_model_at_runtime() { model_id: None, name: Some("Rust Added Model".to_string()), provider: "rust-e2e-provider".to_string(), + system_message: None, wire_model: None, }]), }) diff --git a/rust/tests/e2e/rpc_tasks_and_handlers.rs b/rust/tests/e2e/rpc_tasks_and_handlers.rs index 0b8e7d0642..3a66c6ab74 100644 --- a/rust/tests/e2e/rpc_tasks_and_handlers.rs +++ b/rust/tests/e2e/rpc_tasks_and_handlers.rs @@ -428,6 +428,7 @@ async fn should_return_expected_results_for_missing_pending_handler_requestids() "missing".to_string(), )]), kind: McpHeadersHandlePendingHeadersRefreshRequestHeadersKind::Headers, + ttl_ms: None, }, ), }, diff --git a/scripts/codegen/rust.ts b/scripts/codegen/rust.ts index 03ac5adcec..714988cb05 100644 --- a/scripts/codegen/rust.ts +++ b/scripts/codegen/rust.ts @@ -473,7 +473,15 @@ function pushRustExperimentalDocs( function pushRustDoc(lines: string[], text: string | undefined, indent = ""): void { if (!text) return; - const sanitized = text.replace(/\[::\]/g, "`[::]`"); + const sanitized = text + .split("`") + .map((segment, index) => + index % 2 === 0 + ? segment.replace(/<[A-Za-z][A-Za-z0-9_-]*>/g, "`$&`") + : segment, + ) + .join("`") + .replace(/\[::\]/g, "`[::]`"); for (const paragraph of sanitized.trim().split(/\r?\n/)) { if (paragraph.trim().length === 0) { lines.push(`${indent}///`);