From 0e85d7010cad39eae081b8b9eaa7a9219b0f85b8 Mon Sep 17 00:00:00 2001 From: Ben Brandt Date: Thu, 13 Aug 2026 17:12:53 -0700 Subject: [PATCH] feat(rust): make schemars optional Closes #1841 --- .github/workflows/ci.yml | 1 + agent-client-protocol-schema/Cargo.toml | 9 +- agent-client-protocol-schema/src/lib.rs | 22 +- agent-client-protocol-schema/src/rpc.rs | 49 +- .../src/serde_util.rs | 6 +- agent-client-protocol-schema/src/v1/agent.rs | 589 ++++++++++-------- agent-client-protocol-schema/src/v1/client.rs | 308 +++++---- .../src/v1/content.rs | 82 +-- .../src/v1/elicitation.rs | 211 ++++--- agent-client-protocol-schema/src/v1/error.rs | 35 +- agent-client-protocol-schema/src/v1/ext.rs | 18 +- agent-client-protocol-schema/src/v1/mcp.rs | 57 +- agent-client-protocol-schema/src/v1/mod.rs | 4 +- agent-client-protocol-schema/src/v1/nes.rs | 354 ++++++----- agent-client-protocol-schema/src/v1/plan.rs | 59 +- .../src/v1/protocol_level.rs | 13 +- .../src/v1/tool_call.rs | 82 +-- agent-client-protocol-schema/src/v2/agent.rs | 579 +++++++++-------- agent-client-protocol-schema/src/v2/client.rs | 248 +++++--- .../src/v2/content.rs | 127 ++-- .../src/v2/elicitation.rs | 221 ++++--- agent-client-protocol-schema/src/v2/error.rs | 35 +- agent-client-protocol-schema/src/v2/ext.rs | 18 +- agent-client-protocol-schema/src/v2/mcp.rs | 57 +- agent-client-protocol-schema/src/v2/mod.rs | 8 +- agent-client-protocol-schema/src/v2/nes.rs | 400 +++++++----- agent-client-protocol-schema/src/v2/plan.rs | 56 +- .../src/v2/protocol_level.rs | 13 +- .../src/v2/terminal.rs | 46 +- .../src/v2/tool_call.rs | 105 ++-- agent-client-protocol-schema/src/version.rs | 15 +- package.json | 2 +- schema-generator/Cargo.toml | 2 +- 33 files changed, 2213 insertions(+), 1618 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ee59c8a5..fdda4a798 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,6 +74,7 @@ jobs: - name: Lint run: | cargo clippy + cargo clippy -p agent-client-protocol-schema --all-targets --no-default-features --features unstable,unstable_protocol_v2,tracing cargo clippy --all-targets --all-features - name: Build diff --git a/agent-client-protocol-schema/Cargo.toml b/agent-client-protocol-schema/Cargo.toml index 7cdde263e..0ae20701a 100644 --- a/agent-client-protocol-schema/Cargo.toml +++ b/agent-client-protocol-schema/Cargo.toml @@ -22,6 +22,11 @@ rustdoc-args = ["--cfg", "docsrs"] workspace = true [features] +default = ["schemars"] +# Implement `schemars::JsonSchema` for protocol types. This remains enabled by +# default to preserve the existing default API. Size-sensitive consumers can +# omit the dependency and those impls with `default-features = false`. +schemars = ["dep:schemars", "serde_with/schemars_1"] unstable = [ "unstable_auth_methods", "unstable_llm_providers", @@ -53,12 +58,12 @@ tracing = ["dep:tracing"] [dependencies] anyhow = "1" derive_more = { version = "2", features = ["from", "display"] } -schemars = { version = "1" } +schemars = { version = "1", optional = true } # `rc` is required for Arc-based protocol strings and RawValue payloads. serde = { version = "1", features = ["derive", "rc"] } # `raw_value` powers extension passthrough payloads; `preserve_order` keeps # caller-supplied object key order in arbitrary JSON values and maps. serde_json = { version = "1", features = ["preserve_order", "raw_value"] } -serde_with = { version = "3.20.0", features = ["json", "schemars_1"] } +serde_with = { version = "3.20.0", features = ["json"] } strum = { version = "0.28", features = ["derive"] } tracing = { version = "0.1", default-features = false, optional = true } diff --git a/agent-client-protocol-schema/src/lib.rs b/agent-client-protocol-schema/src/lib.rs index 118800614..e15aa1903 100644 --- a/agent-client-protocol-schema/src/lib.rs +++ b/agent-client-protocol-schema/src/lib.rs @@ -10,8 +10,8 @@ //! (programs that use generative AI to autonomously modify code). //! //! This crate is **only** the schema: the request, response, and -//! notification types, plus serde plumbing and JSON Schema generation. For -//! the runtime pieces (transport, connection setup, the `Agent` / `Client` +//! notification types, plus serde plumbing and optional JSON Schema generation. +//! For the runtime pieces (transport, connection setup, the `Agent` / `Client` //! traits, etc.) use the higher-level [`agent-client-protocol`] crate, which //! builds on top of these types. //! @@ -29,6 +29,13 @@ //! [`v1::AgentNotification`], and the matching client-side trio used by SDK //! crates to dispatch incoming JSON-RPC messages. //! +//! ## Cargo features +//! +//! The `schemars` feature implements `schemars::JsonSchema` for the protocol +//! types. It is enabled by default to preserve the existing default API. +//! Consumers that only need serialization can disable default features to omit +//! the dependency and those trait implementations. +//! //! ## Versioning //! //! Stable protocol types are exposed through explicit version modules. For @@ -51,8 +58,19 @@ pub use version::*; #[cfg(test)] mod serde_json_feature_tests { + #[cfg(feature = "schemars")] + use schemars::JsonSchema; use serde_json::Value; + #[cfg(feature = "schemars")] + #[test] + fn protocol_types_implement_json_schema_when_enabled() { + fn assert_json_schema() {} + + assert_json_schema::(); + assert_json_schema::(); + } + #[test] fn serde_json_values_preserve_object_key_order() { let Value::Object(object) = diff --git a/agent-client-protocol-schema/src/rpc.rs b/agent-client-protocol-schema/src/rpc.rs index 7de8d6781..62cbfcfe8 100644 --- a/agent-client-protocol-schema/src/rpc.rs +++ b/agent-client-protocol-schema/src/rpc.rs @@ -6,7 +6,6 @@ use std::sync::Arc; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; @@ -19,19 +18,9 @@ use serde_with::skip_serializing_none; /// \[1\] The use of Null as a value for the id member in a Request object is discouraged, because this specification uses a value of Null for Responses with an unknown id. Also, because JSON-RPC 1.0 uses an id value of Null for Notifications this could cause confusion in handling. /// /// \[2\] Fractional parts may be problematic, since many decimal fractions cannot be represented exactly as binary fractions. +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive( - Debug, - PartialEq, - Clone, - Hash, - Eq, - Deserialize, - Serialize, - PartialOrd, - Ord, - Display, - JsonSchema, - From, + Debug, PartialEq, Clone, Hash, Eq, Deserialize, Serialize, PartialOrd, Ord, Display, From, )] #[serde(untagged)] #[allow( @@ -50,12 +39,13 @@ pub enum RequestId { } /// A JSON-RPC request object. -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] #[allow( clippy::exhaustive_structs, reason = "This comes from the JSON-RPC specification itself" )] -#[schemars(rename = "{Params}", extend("x-docs-ignore" = true))] +#[cfg_attr(feature = "schemars", schemars(rename = "{Params}", extend("x-docs-ignore" = true)))] #[skip_serializing_none] pub struct Request { /// The request id used to correlate the matching response. @@ -67,13 +57,14 @@ pub struct Request { } /// A JSON-RPC response object. -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] #[allow( clippy::exhaustive_enums, reason = "This comes from the JSON-RPC specification itself" )] #[serde(untagged)] -#[schemars(rename = "{Result}", extend("x-docs-ignore" = true))] +#[cfg_attr(feature = "schemars", schemars(rename = "{Result}", extend("x-docs-ignore" = true)))] pub enum Response { /// A successful JSON-RPC response. Result { @@ -109,12 +100,13 @@ impl Response { } /// A JSON-RPC notification object. -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] #[allow( clippy::exhaustive_structs, reason = "This comes from the JSON-RPC specification itself" )] -#[schemars(rename = "{Params}", extend("x-docs-ignore" = true))] +#[cfg_attr(feature = "schemars", schemars(rename = "{Params}", extend("x-docs-ignore" = true)))] #[skip_serializing_none] pub struct Notification { /// The notification method name. @@ -123,8 +115,9 @@ pub struct Notification { pub params: Option, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] enum JsonRpcVersion { #[serde(rename = "2.0")] V2, @@ -134,8 +127,9 @@ enum JsonRpcVersion { /// [required by JSON-RPC 2.0 Specification][1]. /// /// [1]: https://www.jsonrpc.org/specification#compatibility -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] pub struct JsonRpcMessage { jsonrpc: JsonRpcVersion, #[serde(flatten)] @@ -174,14 +168,17 @@ pub struct EmptyJsonRpcBatch; impl std::error::Error for EmptyJsonRpcBatch {} /// A non-empty JSON-RPC 2.0 batch message. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, JsonSchema)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[serde(transparent)] #[allow( clippy::exhaustive_structs, reason = "This comes from the JSON-RPC specification itself" )] -pub struct JsonRpcBatch(#[schemars(length(min = 1))] Vec>); +pub struct JsonRpcBatch( + #[cfg_attr(feature = "schemars", schemars(length(min = 1)))] Vec>, +); impl JsonRpcBatch { /// Creates a non-empty JSON-RPC batch. diff --git a/agent-client-protocol-schema/src/serde_util.rs b/agent-client-protocol-schema/src/serde_util.rs index c5423b48f..ca6c23ca0 100644 --- a/agent-client-protocol-schema/src/serde_util.rs +++ b/agent-client-protocol-schema/src/serde_util.rs @@ -20,7 +20,6 @@ use std::{ sync::Arc, }; -use schemars::JsonSchema; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_with::{DeserializeAs, de::DeserializeAsWrap}; @@ -307,8 +306,9 @@ impl IntoOption for Cow<'_, str> { /// a: MaybeUndefined, /// } /// ``` -#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Debug, Hash, JsonSchema)] -#[schemars(with = "Option>", inline)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] +#[cfg_attr(feature = "schemars", schemars(with = "Option>", inline))] #[expect(clippy::exhaustive_enums)] pub enum MaybeUndefined { /// The field was not present. diff --git a/agent-client-protocol-schema/src/v1/agent.rs b/agent-client-protocol-schema/src/v1/agent.rs index 3bd4928b0..f24fd3dc2 100644 --- a/agent-client-protocol-schema/src/v1/agent.rs +++ b/agent-client-protocol-schema/src/v1/agent.rs @@ -9,7 +9,6 @@ use std::{path::PathBuf, sync::Arc}; use std::collections::HashMap; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -49,8 +48,9 @@ use super::{ /// See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct InitializeRequest { @@ -58,14 +58,14 @@ pub struct InitializeRequest { pub protocol_version: ProtocolVersion, /// Capabilities supported by the client. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub client_capabilities: ClientCapabilities, /// Information about the Client name and version sent to the Agent. /// /// Note: in future versions of the protocol, this will be required. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub client_info: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -74,7 +74,7 @@ pub struct InitializeRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -125,8 +125,9 @@ impl InitializeRequest { /// See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct InitializeResponse { @@ -137,19 +138,19 @@ pub struct InitializeResponse { pub protocol_version: ProtocolVersion, /// Capabilities supported by the agent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub agent_capabilities: AgentCapabilities, /// Authentication methods supported by the agent. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub auth_methods: Vec, /// Information about the Agent name and version sent to the Client. /// /// Note: in future versions of the protocol, this will be required. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub agent_info: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -158,7 +159,7 @@ pub struct InitializeResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -215,7 +216,8 @@ impl InitializeResponse { /// title for UI representation. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Implementation { @@ -227,7 +229,7 @@ pub struct Implementation { /// /// If not provided, the name should be used for display. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Version of the implementation. Can be displayed to the user or used @@ -239,7 +241,7 @@ pub struct Implementation { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -286,8 +288,9 @@ impl Implementation { /// Specifies which authentication method to use. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = AUTHENTICATE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = AUTHENTICATE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthenticateRequest { @@ -300,7 +303,7 @@ pub struct AuthenticateRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -331,8 +334,9 @@ impl AuthenticateRequest { /// Response to the `authenticate` method. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = AUTHENTICATE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = AUTHENTICATE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthenticateResponse { @@ -342,7 +346,7 @@ pub struct AuthenticateResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -374,8 +378,9 @@ impl AuthenticateResponse { /// Terminates the current authenticated session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = LOGOUT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = LOGOUT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LogoutRequest { @@ -385,7 +390,7 @@ pub struct LogoutRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -413,8 +418,9 @@ impl LogoutRequest { /// Response to the `logout` method. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = LOGOUT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = LOGOUT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LogoutResponse { @@ -424,7 +430,7 @@ pub struct LogoutResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -452,7 +458,8 @@ impl LogoutResponse { /// Authentication-related capabilities supported by the agent. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AgentAuthCapabilities { @@ -461,7 +468,7 @@ pub struct AgentAuthCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports the logout method. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub logout: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -470,7 +477,7 @@ pub struct AgentAuthCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -507,7 +514,8 @@ impl AgentAuthCapabilities { /// Supplying `{}` means the agent supports the logout method. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct LogoutCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -516,7 +524,7 @@ pub struct LogoutCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -542,7 +550,8 @@ impl LogoutCapabilities { } /// Typed identifier used for auth method values on the wire. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -560,7 +569,8 @@ impl AuthMethodId { /// /// The `type` field acts as the discriminator in the serialized JSON form. /// When no `type` is present, the method is treated as `agent`. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum AuthMethod { @@ -630,7 +640,8 @@ impl AuthMethod { /// This is the default authentication method type. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthMethodAgent { @@ -640,7 +651,7 @@ pub struct AuthMethodAgent { pub name: String, /// Optional description providing more details about this authentication method. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -649,7 +660,7 @@ pub struct AuthMethodAgent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -700,7 +711,8 @@ impl AuthMethodAgent { #[cfg(feature = "unstable_auth_methods")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthMethodTerminal { @@ -710,18 +722,18 @@ pub struct AuthMethodTerminal { pub name: String, /// Optional description providing more details about this authentication method. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Additional arguments to append to the configured agent invocation for terminal auth. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub args: Vec, /// Additional environment variables to set on the configured agent invocation for terminal auth. /// These values override same-named variables in the base launch configuration. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "HashMap::is_empty")] pub env: HashMap, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -730,7 +742,7 @@ pub struct AuthMethodTerminal { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -792,8 +804,9 @@ impl AuthMethodTerminal { /// See protocol docs: [Creating a Session](https://agentclientprotocol.com/protocol/session-setup#creating-a-session) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NewSessionRequest { @@ -805,12 +818,12 @@ pub struct NewSessionRequest { /// remains the base for relative paths. When omitted or empty, no /// additional roots are activated for the new session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// List of MCP (Model Context Protocol) servers the agent should connect to. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub mcp_servers: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -818,7 +831,7 @@ pub struct NewSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -867,8 +880,9 @@ impl NewSessionRequest { /// See protocol docs: [Creating a Session](https://agentclientprotocol.com/protocol/session-setup#creating-a-session) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NewSessionResponse { @@ -880,12 +894,12 @@ pub struct NewSessionResponse { /// /// See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub modes: Option, /// Initial session configuration options if supported by the Agent. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub config_options: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -894,7 +908,7 @@ pub struct NewSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -952,14 +966,15 @@ impl NewSessionResponse { /// See protocol docs: [Loading Sessions](https://agentclientprotocol.com/protocol/session-setup#loading-sessions) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_LOAD_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_LOAD_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LoadSessionRequest { /// List of MCP servers to connect to for this session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub mcp_servers: Vec, /// The working directory for this session. Must be an absolute path. pub cwd: PathBuf, @@ -970,7 +985,7 @@ pub struct LoadSessionRequest { /// session. It may differ from any previously used or reported list as long as /// the request `cwd` matches the session's `cwd`. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// The ID of the session to load. @@ -981,7 +996,7 @@ pub struct LoadSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1029,8 +1044,9 @@ impl LoadSessionRequest { /// Response from loading an existing session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_LOAD_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_LOAD_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LoadSessionResponse { @@ -1038,12 +1054,12 @@ pub struct LoadSessionResponse { /// /// See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub modes: Option, /// Initial session configuration options if supported by the Agent. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub config_options: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1052,7 +1068,7 @@ pub struct LoadSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1111,8 +1127,9 @@ impl LoadSessionResponse { #[cfg(feature = "unstable_session_fork")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ForkSessionRequest { @@ -1126,12 +1143,12 @@ pub struct ForkSessionRequest { /// this is the complete resulting additional-root list for the forked /// session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// List of MCP servers to connect to for this session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub mcp_servers: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1140,7 +1157,7 @@ pub struct ForkSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1194,8 +1211,9 @@ impl ForkSessionRequest { #[cfg(feature = "unstable_session_fork")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ForkSessionResponse { @@ -1205,12 +1223,12 @@ pub struct ForkSessionResponse { /// /// See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub modes: Option, /// Initial session configuration options if supported by the Agent. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub config_options: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1219,7 +1237,7 @@ pub struct ForkSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1279,8 +1297,9 @@ impl ForkSessionResponse { /// Only available if the Agent supports the `sessionCapabilities.resume` capability. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ResumeSessionRequest { @@ -1295,12 +1314,12 @@ pub struct ResumeSessionRequest { /// session. It may differ from any previously used or reported list as long as /// the request `cwd` matches the session's `cwd`. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// List of MCP servers to connect to for this session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub mcp_servers: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1309,7 +1328,7 @@ pub struct ResumeSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1357,8 +1376,9 @@ impl ResumeSessionRequest { /// Response from resuming an existing session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ResumeSessionResponse { @@ -1366,12 +1386,12 @@ pub struct ResumeSessionResponse { /// /// See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub modes: Option, /// Initial session configuration options if supported by the Agent. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub config_options: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1380,7 +1400,7 @@ pub struct ResumeSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1435,8 +1455,9 @@ impl ResumeSessionResponse { /// Only available if the Agent supports the `sessionCapabilities.close` capability. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseSessionRequest { @@ -1448,7 +1469,7 @@ pub struct CloseSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1479,8 +1500,9 @@ impl CloseSessionRequest { /// Response from closing a session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseSessionResponse { @@ -1490,7 +1512,7 @@ pub struct CloseSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1522,8 +1544,9 @@ impl CloseSessionResponse { /// Only available if the Agent supports the `sessionCapabilities.list` capability. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListSessionsRequest { @@ -1539,7 +1562,7 @@ pub struct ListSessionsRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1581,19 +1604,20 @@ impl ListSessionsRequest { /// Response from listing sessions. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListSessionsResponse { /// Array of session information objects #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub sessions: Vec, /// Opaque cursor token. If present, pass this in the next request's cursor parameter /// to fetch the next page. If absent, there are no more results. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub next_cursor: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1602,7 +1626,7 @@ pub struct ListSessionsResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1645,8 +1669,9 @@ impl ListSessionsResponse { /// Only available if the Agent supports the `sessionCapabilities.delete` capability. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DeleteSessionRequest { @@ -1658,7 +1683,7 @@ pub struct DeleteSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1689,8 +1714,9 @@ impl DeleteSessionRequest { /// Response from deleting a session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DeleteSessionResponse { @@ -1700,7 +1726,7 @@ pub struct DeleteSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1728,7 +1754,8 @@ impl DeleteSessionResponse { /// Information about a session returned by session/list #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionInfo { @@ -1742,18 +1769,18 @@ pub struct SessionInfo { /// by the Agent. Omitted and empty values are equivalent: the response /// reports no additional roots. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// Human-readable title for the session #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// ISO 8601 timestamp of last activity #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub updated_at: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1762,7 +1789,7 @@ pub struct SessionInfo { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1820,7 +1847,8 @@ impl SessionInfo { /// The set of modes and the one currently active. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionModeState { @@ -1828,7 +1856,7 @@ pub struct SessionModeState { pub current_mode_id: SessionModeId, /// The set of modes that the Agent can operate in #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub available_modes: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -1836,7 +1864,7 @@ pub struct SessionModeState { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1873,7 +1901,8 @@ impl SessionModeState { /// See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionMode { @@ -1883,7 +1912,7 @@ pub struct SessionMode { pub name: String, /// Optional human-readable details shown with this protocol object. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1892,7 +1921,7 @@ pub struct SessionMode { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1930,7 +1959,8 @@ impl SessionMode { } /// Unique identifier for a Session Mode. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From, Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From, Display)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -1947,8 +1977,9 @@ impl SessionModeId { /// Request parameters for setting a session mode. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_MODE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_MODE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetSessionModeRequest { @@ -1962,7 +1993,7 @@ pub struct SetSessionModeRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1990,8 +2021,9 @@ impl SetSessionModeRequest { /// Response to `session/set_mode` method. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_MODE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_MODE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetSessionModeResponse { @@ -2001,7 +2033,7 @@ pub struct SetSessionModeResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2029,7 +2061,8 @@ impl SetSessionModeResponse { // Session config options /// Unique identifier for a session configuration option. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From, Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From, Display)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -2044,7 +2077,8 @@ impl SessionConfigId { } /// Unique identifier for a session configuration option value. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From, Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From, Display)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -2059,7 +2093,8 @@ impl SessionConfigValueId { } /// Unique identifier for a session configuration option value group. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From, Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From, Display)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -2076,7 +2111,8 @@ impl SessionConfigGroupId { /// A possible value for a session configuration option. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigSelectOption { @@ -2086,7 +2122,7 @@ pub struct SessionConfigSelectOption { pub name: String, /// Optional description for this option value. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2095,7 +2131,7 @@ pub struct SessionConfigSelectOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2135,7 +2171,8 @@ impl SessionConfigSelectOption { /// A group of possible values for a session configuration option. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigSelectGroup { @@ -2145,7 +2182,7 @@ pub struct SessionConfigSelectGroup { pub name: String, /// The set of option values in this group. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -2153,7 +2190,7 @@ pub struct SessionConfigSelectGroup { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2188,7 +2225,8 @@ impl SessionConfigSelectGroup { } /// Possible values for a session configuration option. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(untagged)] #[non_exhaustive] pub enum SessionConfigSelectOptions { @@ -2212,7 +2250,8 @@ impl From> for SessionConfigSelectOptions { /// A single-value selector (dropdown) session configuration option payload. #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigSelect { @@ -2238,7 +2277,8 @@ impl SessionConfigSelect { /// A boolean on/off toggle session configuration option payload. #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigBoolean { @@ -2263,7 +2303,8 @@ impl SessionConfigBoolean { /// /// Category names beginning with `_` are free for custom use, like other ACP extension methods. /// Category names that do not begin with `_` are reserved for the ACP spec. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum SessionConfigOptionCategory { @@ -2281,9 +2322,10 @@ pub enum SessionConfigOptionCategory { } /// Type-specific session configuration option payload. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] -#[schemars(extend("discriminator" = {"propertyName": "type"}))] +#[cfg_attr(feature = "schemars", schemars(extend("discriminator" = {"propertyName": "type"})))] #[non_exhaustive] pub enum SessionConfigKind { /// Single-value selector (dropdown). @@ -2295,7 +2337,8 @@ pub enum SessionConfigKind { /// A session configuration option selector and its current state. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigOption { @@ -2305,12 +2348,12 @@ pub struct SessionConfigOption { pub name: String, /// Optional description for the Client to display to the user. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Optional semantic category for this option (UX only). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub category: Option, /// Type-specific fields for this configuration option. @@ -2322,7 +2365,7 @@ pub struct SessionConfigOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2411,7 +2454,8 @@ impl SessionConfigOption { /// kind. For example every option kind that picks from a list of ids /// (`select`, `radio`, …) would use [`ValueId`](Self::ValueId), while a /// future freeform text option would get its own variant. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum SessionConfigOptionValue { @@ -2488,8 +2532,9 @@ impl From<&str> for SessionConfigOptionValue { /// Request parameters for setting a session configuration option. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetSessionConfigOptionRequest { @@ -2509,7 +2554,7 @@ pub struct SetSessionConfigOptionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2546,14 +2591,15 @@ impl SetSessionConfigOptionRequest { /// Response to `session/set_config_option` method. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetSessionConfigOptionResponse { /// The full set of configuration options and their current values. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub config_options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -2561,7 +2607,7 @@ pub struct SetSessionConfigOptionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2597,7 +2643,8 @@ impl SetSessionConfigOptionResponse { /// processing prompts. /// /// See protocol docs: [MCP Servers](https://agentclientprotocol.com/protocol/session-setup#mcp-servers) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum McpServer { @@ -2629,7 +2676,8 @@ pub enum McpServer { /// HTTP transport configuration for MCP. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpServerHttp { @@ -2645,7 +2693,7 @@ pub struct McpServerHttp { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2685,7 +2733,8 @@ impl McpServerHttp { /// SSE transport configuration for MCP. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpServerSse { @@ -2701,7 +2750,7 @@ pub struct McpServerSse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2748,7 +2797,8 @@ impl McpServerSse { /// used by `mcp/connect` to route connection requests back to the component that declared the /// server. #[cfg(feature = "unstable_mcp_over_acp")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -2774,7 +2824,8 @@ impl McpServerAcpId { #[serde_as] #[skip_serializing_none] #[cfg(feature = "unstable_mcp_over_acp")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpServerAcp { @@ -2791,7 +2842,7 @@ pub struct McpServerAcp { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2824,7 +2875,8 @@ impl McpServerAcp { /// Stdio transport configuration for MCP. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpServerStdio { @@ -2842,7 +2894,7 @@ pub struct McpServerStdio { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2890,7 +2942,8 @@ impl McpServerStdio { /// An environment variable to set when launching an MCP server. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct EnvVariable { @@ -2904,7 +2957,7 @@ pub struct EnvVariable { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2936,7 +2989,8 @@ impl EnvVariable { /// An HTTP header to set when making requests to the MCP server. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct HttpHeader { @@ -2950,7 +3004,7 @@ pub struct HttpHeader { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2988,8 +3042,9 @@ impl HttpHeader { /// See protocol docs: [User Message](https://agentclientprotocol.com/protocol/prompt-turn#1-user-message) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PromptRequest { @@ -3015,7 +3070,7 @@ pub struct PromptRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3049,8 +3104,9 @@ impl PromptRequest { /// See protocol docs: [Check for Completion](https://agentclientprotocol.com/protocol/prompt-turn#4-check-for-completion) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PromptResponse { @@ -3063,7 +3119,7 @@ pub struct PromptResponse { /// Token usage for this turn (optional). #[cfg(feature = "unstable_end_turn_token_usage")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub usage: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -3072,7 +3128,7 @@ pub struct PromptResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3117,7 +3173,8 @@ impl PromptResponse { /// Reasons why an agent stops processing a prompt turn. /// /// See protocol docs: [Stop Reasons](https://agentclientprotocol.com/protocol/prompt-turn#stop-reasons) -#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum StopReason { @@ -3149,7 +3206,8 @@ pub enum StopReason { #[cfg(feature = "unstable_end_turn_token_usage")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Usage { @@ -3161,17 +3219,17 @@ pub struct Usage { pub output_tokens: u64, /// Total thought/reasoning tokens #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub thought_tokens: Option, /// Total cache read tokens. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cached_read_tokens: Option, /// Total cache write tokens. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cached_write_tokens: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -3180,7 +3238,7 @@ pub struct Usage { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3248,7 +3306,8 @@ impl Usage { /// Protocol names beginning with `_` are free for custom use, like other ACP extension methods. /// Protocol names that do not begin with `_` are reserved for the ACP spec. #[cfg(feature = "unstable_llm_providers")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] #[expect(clippy::doc_markdown)] @@ -3277,7 +3336,8 @@ pub enum LlmProtocol { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ProviderCurrentConfig { @@ -3291,7 +3351,7 @@ pub struct ProviderCurrentConfig { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3327,7 +3387,8 @@ impl ProviderCurrentConfig { /// /// Unique identifier for a configurable LLM provider. #[cfg(feature = "unstable_llm_providers")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -3350,7 +3411,8 @@ impl ProviderId { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ProviderInfo { @@ -3358,7 +3420,7 @@ pub struct ProviderInfo { pub provider_id: ProviderId, /// Supported protocol types for this provider. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub supported: Vec, /// Whether this provider is mandatory and cannot be disabled via `providers/disable`. /// If true, clients must not call `providers/disable` for this provider ID. @@ -3373,7 +3435,7 @@ pub struct ProviderInfo { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3418,8 +3480,9 @@ impl ProviderInfo { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListProvidersRequest { @@ -3429,7 +3492,7 @@ pub struct ListProvidersRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3463,8 +3526,9 @@ impl ListProvidersRequest { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListProvidersResponse { @@ -3476,7 +3540,7 @@ pub struct ListProvidersResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3515,8 +3579,9 @@ impl ListProvidersResponse { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetProviderRequest { @@ -3536,7 +3601,7 @@ pub struct SetProviderRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3588,8 +3653,9 @@ impl SetProviderRequest { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetProviderResponse { @@ -3599,7 +3665,7 @@ pub struct SetProviderResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3633,8 +3699,9 @@ impl SetProviderResponse { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DisableProviderRequest { @@ -3646,7 +3713,7 @@ pub struct DisableProviderRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3683,8 +3750,9 @@ impl DisableProviderRequest { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DisableProviderResponse { @@ -3694,7 +3762,7 @@ pub struct DisableProviderResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3730,33 +3798,34 @@ impl DisableProviderResponse { /// See protocol docs: [Agent Capabilities](https://agentclientprotocol.com/protocol/initialization#agent-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AgentCapabilities { /// Whether the agent supports `session/load`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub load_session: bool, /// Prompt capabilities supported by the agent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub prompt_capabilities: PromptCapabilities, /// MCP capabilities supported by the agent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mcp_capabilities: McpCapabilities, /// Session lifecycle and prompt capabilities advertised by the agent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub session_capabilities: SessionCapabilities, /// Authentication-related capabilities supported by the agent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub auth: AgentAuthCapabilities, /// **UNSTABLE** @@ -3769,7 +3838,7 @@ pub struct AgentCapabilities { /// Supplying `{}` means the agent supports provider configuration methods. #[cfg(feature = "unstable_llm_providers")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub providers: Option, /// **UNSTABLE** @@ -3782,7 +3851,7 @@ pub struct AgentCapabilities { /// for NES methods. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub nes: Option, /// **UNSTABLE** @@ -3792,7 +3861,7 @@ pub struct AgentCapabilities { /// The position encoding selected by the agent from the client's supported encodings. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub position_encoding: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -3801,7 +3870,7 @@ pub struct AgentCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3908,7 +3977,8 @@ impl AgentCapabilities { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct ProvidersCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -3917,7 +3987,7 @@ pub struct ProvidersCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3954,7 +4024,8 @@ impl ProvidersCapabilities { /// See protocol docs: [Session Capabilities](https://agentclientprotocol.com/protocol/initialization#session-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionCapabilities { @@ -3963,7 +4034,7 @@ pub struct SessionCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports listing sessions. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub list: Option, /// Whether the agent supports `session/delete`. @@ -3971,7 +4042,7 @@ pub struct SessionCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports deleting sessions from `session/list`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub delete: Option, /// Whether the agent supports `additionalDirectories` on supported session lifecycle requests. @@ -3984,7 +4055,7 @@ pub struct SessionCapabilities { /// `SessionInfo.additionalDirectories` to report the complete ordered /// additional-root list associated with a listed session. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub additional_directories: Option, /// **UNSTABLE** @@ -3997,7 +4068,7 @@ pub struct SessionCapabilities { /// Supplying `{}` means the agent supports forking sessions. #[cfg(feature = "unstable_session_fork")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub fork: Option, /// Whether the agent supports `session/resume`. @@ -4005,7 +4076,7 @@ pub struct SessionCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports resuming sessions. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub resume: Option, /// Whether the agent supports `session/close`. @@ -4013,7 +4084,7 @@ pub struct SessionCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports closing sessions. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub close: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4022,7 +4093,7 @@ pub struct SessionCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4121,7 +4192,8 @@ impl SessionCapabilities { /// Supplying `{}` means the agent supports listing sessions. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionListCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4130,7 +4202,7 @@ pub struct SessionListCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4160,7 +4232,8 @@ impl SessionListCapabilities { /// Supplying `{}` means the agent supports deleting sessions from `session/list`. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionDeleteCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4169,7 +4242,7 @@ pub struct SessionDeleteCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4202,7 +4275,8 @@ impl SessionDeleteCapabilities { /// complete ordered additional-root list associated with a listed session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionAdditionalDirectoriesCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4211,7 +4285,7 @@ pub struct SessionAdditionalDirectoriesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4246,7 +4320,8 @@ impl SessionAdditionalDirectoriesCapabilities { #[cfg(feature = "unstable_session_fork")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionForkCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4255,7 +4330,7 @@ pub struct SessionForkCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4286,7 +4361,8 @@ impl SessionForkCapabilities { /// Supplying `{}` means the agent supports resuming sessions. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionResumeCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4295,7 +4371,7 @@ pub struct SessionResumeCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4325,7 +4401,8 @@ impl SessionResumeCapabilities { /// Supplying `{}` means the agent supports closing sessions. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionCloseCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4334,7 +4411,7 @@ pub struct SessionCloseCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4373,18 +4450,19 @@ impl SessionCloseCapabilities { /// See protocol docs: [Prompt Capabilities](https://agentclientprotocol.com/protocol/initialization#prompt-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PromptCapabilities { /// Agent supports [`ContentBlock::Image`]. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub image: bool, /// Agent supports [`ContentBlock::Audio`]. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub audio: bool, /// Agent supports embedded context in `session/prompt` requests. @@ -4392,7 +4470,7 @@ pub struct PromptCapabilities { /// When enabled, the Client is allowed to include [`ContentBlock::Resource`] /// in prompt requests for pieces of context that are referenced in the message. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub embedded_context: bool, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4401,7 +4479,7 @@ pub struct PromptCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4453,18 +4531,19 @@ impl PromptCapabilities { /// MCP capabilities supported by the agent #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpCapabilities { /// Agent supports [`McpServer::Http`]. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub http: bool, /// Agent supports [`McpServer::Sse`]. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub sse: bool, /// **UNSTABLE** @@ -4474,7 +4553,7 @@ pub struct McpCapabilities { /// Agent supports [`McpServer::Acp`]. #[cfg(feature = "unstable_mcp_over_acp")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub acp: bool, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4483,7 +4562,7 @@ pub struct McpCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4707,9 +4786,10 @@ pub(crate) const LOGOUT_METHOD_NAME: &str = "logout"; /// to use this directly. /// /// This enum encompasses all method calls from client to agent. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] #[allow(clippy::large_enum_variant)] pub enum ClientRequest { @@ -4934,9 +5014,10 @@ impl ClientRequest { /// to use this directly - the responses are handled automatically by the connection. /// /// These are responses to the corresponding `ClientRequest` variants. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] #[allow(clippy::large_enum_variant)] pub enum AgentResponse { @@ -4998,9 +5079,10 @@ pub enum AgentResponse { /// to use this directly. /// /// Notifications do not expect a response. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] #[allow(clippy::large_enum_variant)] pub enum ClientNotification { @@ -5099,8 +5181,9 @@ impl ClientNotification { /// See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/prompt-turn#cancellation) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_CANCEL_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_CANCEL_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CancelNotification { @@ -5112,7 +5195,7 @@ pub struct CancelNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -5346,7 +5429,7 @@ mod test_serialization { ); } - #[cfg(feature = "unstable_mcp_over_acp")] + #[cfg(all(feature = "unstable_mcp_over_acp", feature = "schemars"))] #[test] fn test_mcp_server_acp_schema() { let mcp_server_schema = serde_json::to_value(schemars::schema_for!(McpServer)).unwrap(); @@ -5366,7 +5449,7 @@ mod test_serialization { assert!(json_contains_key(&capabilities_schema, "acp")); } - #[cfg(feature = "unstable_mcp_over_acp")] + #[cfg(all(feature = "unstable_mcp_over_acp", feature = "schemars"))] fn json_contains_entry( value: &serde_json::Value, key: &str, @@ -5386,7 +5469,7 @@ mod test_serialization { } } - #[cfg(feature = "unstable_mcp_over_acp")] + #[cfg(all(feature = "unstable_mcp_over_acp", feature = "schemars"))] fn json_contains_key(value: &serde_json::Value, key: &str) -> bool { match value { serde_json::Value::Object(map) => { diff --git a/agent-client-protocol-schema/src/v1/client.rs b/agent-client-protocol-schema/src/v1/client.rs index 6be8ad4f3..aff20ebed 100644 --- a/agent-client-protocol-schema/src/v1/client.rs +++ b/agent-client-protocol-schema/src/v1/client.rs @@ -6,7 +6,6 @@ use std::{path::PathBuf, sync::Arc}; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -42,8 +41,9 @@ use super::{ClientNesCapabilities, PositionEncodingKind}; /// See protocol docs: [Agent Reports Output](https://agentclientprotocol.com/protocol/prompt-turn#3-agent-reports-output) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "client", "x-method" = SESSION_UPDATE_NOTIFICATION))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = SESSION_UPDATE_NOTIFICATION)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionNotification { @@ -57,7 +57,7 @@ pub struct SessionNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -91,9 +91,10 @@ impl SessionNotification { /// These updates provide real-time feedback about the agent's progress. /// /// See protocol docs: [Agent Reports Output](https://agentclientprotocol.com/protocol/prompt-turn#3-agent-reports-output) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "sessionUpdate", rename_all = "snake_case")] -#[schemars(extend("discriminator" = {"propertyName": "sessionUpdate"}))] +#[cfg_attr(feature = "schemars", schemars(extend("discriminator" = {"propertyName": "sessionUpdate"})))] #[non_exhaustive] pub enum SessionUpdate { /// A chunk of the user's message being streamed. @@ -142,7 +143,8 @@ pub enum SessionUpdate { /// See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CurrentModeUpdate { @@ -154,7 +156,7 @@ pub struct CurrentModeUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -185,13 +187,14 @@ impl CurrentModeUpdate { /// Session configuration options have been updated. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ConfigOptionUpdate { /// The full set of configuration options and their current values. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub config_options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -199,7 +202,7 @@ pub struct ConfigOptionUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -233,18 +236,19 @@ impl ConfigOptionUpdate { /// This allows clients to display dynamic session names and track session state changes. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionInfoUpdate { /// Human-readable title for the session. Set to null to clear. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub title: MaybeUndefined, /// ISO 8601 timestamp of last activity. Set to null to clear. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub updated_at: MaybeUndefined, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -253,7 +257,7 @@ pub struct SessionInfoUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -295,7 +299,8 @@ impl SessionInfoUpdate { /// Context window and cost update for a session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct UsageUpdate { @@ -305,7 +310,7 @@ pub struct UsageUpdate { pub size: u64, /// Cumulative session cost (optional). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cost: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -314,7 +319,7 @@ pub struct UsageUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -354,7 +359,8 @@ impl UsageUpdate { /// Cost information for a session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Cost { @@ -368,7 +374,7 @@ pub struct Cost { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -400,7 +406,8 @@ impl Cost { /// A streamed item of content #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ContentChunk { @@ -411,7 +418,7 @@ pub struct ContentChunk { /// All chunks belonging to the same message share the same `messageId`. /// A change in `messageId` indicates a new message has started. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub message_id: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -420,7 +427,7 @@ pub struct ContentChunk { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -460,7 +467,8 @@ impl ContentChunk { } /// Unique identifier for a message within a session. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -483,13 +491,14 @@ impl IntoOption for &str { /// Available commands are ready or have changed #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AvailableCommandsUpdate { /// Commands the agent can execute #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub available_commands: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -497,7 +506,7 @@ pub struct AvailableCommandsUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -528,7 +537,8 @@ impl AvailableCommandsUpdate { /// Information about a command. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AvailableCommand { @@ -538,7 +548,7 @@ pub struct AvailableCommand { pub description: String, /// Input for the command if required #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub input: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -547,7 +557,7 @@ pub struct AvailableCommand { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -585,7 +595,8 @@ impl AvailableCommand { } /// The input specification for a command. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(untagged, rename_all = "camelCase")] #[non_exhaustive] pub enum AvailableCommandInput { @@ -596,7 +607,8 @@ pub enum AvailableCommandInput { /// All text that was typed after the command name is provided as input. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct UnstructuredCommandInput { @@ -608,7 +620,7 @@ pub struct UnstructuredCommandInput { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -645,8 +657,9 @@ impl UnstructuredCommandInput { /// See protocol docs: [Requesting Permission](https://agentclientprotocol.com/protocol/tool-calls#requesting-permission) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RequestPermissionRequest { @@ -662,7 +675,7 @@ pub struct RequestPermissionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -699,7 +712,8 @@ impl RequestPermissionRequest { /// An option presented to the user when requesting permission. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PermissionOption { @@ -715,7 +729,7 @@ pub struct PermissionOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -750,7 +764,8 @@ impl PermissionOption { } /// Unique identifier for a permission option. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -767,7 +782,8 @@ impl PermissionOptionId { /// The type of permission option being presented to the user. /// /// Helps clients choose appropriate icons and UI treatment. -#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum PermissionOptionKind { @@ -784,8 +800,9 @@ pub enum PermissionOptionKind { /// Response to a permission request. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RequestPermissionResponse { @@ -798,7 +815,7 @@ pub struct RequestPermissionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -827,9 +844,10 @@ impl RequestPermissionResponse { } /// The outcome of a permission request. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "outcome", rename_all = "snake_case")] -#[schemars(extend("discriminator" = {"propertyName": "outcome"}))] +#[cfg_attr(feature = "schemars", schemars(extend("discriminator" = {"propertyName": "outcome"})))] #[non_exhaustive] pub enum RequestPermissionOutcome { /// The prompt turn was cancelled before the user responded. @@ -848,7 +866,8 @@ pub enum RequestPermissionOutcome { /// The user selected one of the provided options. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SelectedPermissionOutcome { @@ -860,7 +879,7 @@ pub struct SelectedPermissionOutcome { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -895,8 +914,9 @@ impl SelectedPermissionOutcome { /// Only available if the client supports the `fs.writeTextFile` capability. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "client", "x-method" = FS_WRITE_TEXT_FILE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = FS_WRITE_TEXT_FILE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct WriteTextFileRequest { @@ -912,7 +932,7 @@ pub struct WriteTextFileRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -949,9 +969,10 @@ impl WriteTextFileRequest { /// Response to `fs/write_text_file` #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = FS_WRITE_TEXT_FILE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = FS_WRITE_TEXT_FILE_METHOD_NAME)))] #[non_exhaustive] pub struct WriteTextFileResponse { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -960,7 +981,7 @@ pub struct WriteTextFileResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -992,8 +1013,9 @@ impl WriteTextFileResponse { /// Only available if the client supports the `fs.readTextFile` capability. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "client", "x-method" = FS_READ_TEXT_FILE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = FS_READ_TEXT_FILE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ReadTextFileRequest { @@ -1003,12 +1025,12 @@ pub struct ReadTextFileRequest { pub path: PathBuf, /// Line number to start reading from (1-based). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub line: Option, /// Maximum number of lines to read. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub limit: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1017,7 +1039,7 @@ pub struct ReadTextFileRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1065,8 +1087,9 @@ impl ReadTextFileRequest { /// Response containing the contents of a text file. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "client", "x-method" = FS_READ_TEXT_FILE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = FS_READ_TEXT_FILE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ReadTextFileResponse { @@ -1078,7 +1101,7 @@ pub struct ReadTextFileResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1109,7 +1132,8 @@ impl ReadTextFileResponse { // Terminals /// Typed identifier used for terminal values on the wire. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -1126,9 +1150,10 @@ impl TerminalId { /// Request to create a new terminal and execute a command. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_CREATE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_CREATE_METHOD_NAME)))] #[non_exhaustive] pub struct CreateTerminalRequest { /// The session ID for this request. @@ -1137,17 +1162,17 @@ pub struct CreateTerminalRequest { pub command: String, /// Array of command arguments. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub args: Vec, /// Environment variables for the command. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub env: Vec, /// Working directory for the command. Must be an absolute path. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cwd: Option, /// Maximum number of output bytes to retain. @@ -1159,7 +1184,7 @@ pub struct CreateTerminalRequest { /// string output, even if this means the retained output is slightly less than the /// specified limit. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub output_byte_limit: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1168,7 +1193,7 @@ pub struct CreateTerminalRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1239,9 +1264,10 @@ impl CreateTerminalRequest { /// Response containing the ID of the created terminal. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_CREATE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_CREATE_METHOD_NAME)))] #[non_exhaustive] pub struct CreateTerminalResponse { /// The unique identifier for the created terminal. @@ -1252,7 +1278,7 @@ pub struct CreateTerminalResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1283,9 +1309,10 @@ impl CreateTerminalResponse { /// Request to get the current output and status of a terminal. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_OUTPUT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_OUTPUT_METHOD_NAME)))] #[non_exhaustive] pub struct TerminalOutputRequest { /// The session ID for this request. @@ -1298,7 +1325,7 @@ pub struct TerminalOutputRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1330,9 +1357,10 @@ impl TerminalOutputRequest { /// Response containing the terminal output and exit status. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_OUTPUT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_OUTPUT_METHOD_NAME)))] #[non_exhaustive] pub struct TerminalOutputResponse { /// The terminal output captured so far. @@ -1341,7 +1369,7 @@ pub struct TerminalOutputResponse { pub truncated: bool, /// Exit status if the command has completed. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub exit_status: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1350,7 +1378,7 @@ pub struct TerminalOutputResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1390,9 +1418,10 @@ impl TerminalOutputResponse { /// Request to release a terminal and free its resources. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_RELEASE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_RELEASE_METHOD_NAME)))] #[non_exhaustive] pub struct ReleaseTerminalRequest { /// The session ID for this request. @@ -1405,7 +1434,7 @@ pub struct ReleaseTerminalRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1437,9 +1466,10 @@ impl ReleaseTerminalRequest { /// Response to terminal/release method #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_RELEASE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_RELEASE_METHOD_NAME)))] #[non_exhaustive] pub struct ReleaseTerminalResponse { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1448,7 +1478,7 @@ pub struct ReleaseTerminalResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1476,9 +1506,10 @@ impl ReleaseTerminalResponse { /// Request to kill a terminal without releasing it. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_KILL_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_KILL_METHOD_NAME)))] #[non_exhaustive] pub struct KillTerminalRequest { /// The session ID for this request. @@ -1491,7 +1522,7 @@ pub struct KillTerminalRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1523,9 +1554,10 @@ impl KillTerminalRequest { /// Response to `terminal/kill` method #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_KILL_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_KILL_METHOD_NAME)))] #[non_exhaustive] pub struct KillTerminalResponse { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1534,7 +1566,7 @@ pub struct KillTerminalResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1562,9 +1594,10 @@ impl KillTerminalResponse { /// Request to wait for a terminal command to exit. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_WAIT_FOR_EXIT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_WAIT_FOR_EXIT_METHOD_NAME)))] #[non_exhaustive] pub struct WaitForTerminalExitRequest { /// The session ID for this request. @@ -1577,7 +1610,7 @@ pub struct WaitForTerminalExitRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1609,9 +1642,10 @@ impl WaitForTerminalExitRequest { /// Response containing the exit status of a terminal command. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = TERMINAL_WAIT_FOR_EXIT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = TERMINAL_WAIT_FOR_EXIT_METHOD_NAME)))] #[non_exhaustive] pub struct WaitForTerminalExitResponse { /// The exit status of the terminal command. @@ -1623,7 +1657,7 @@ pub struct WaitForTerminalExitResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1654,18 +1688,19 @@ impl WaitForTerminalExitResponse { /// Exit status of a terminal command. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TerminalExitStatus { /// The process exit code (may be null if terminated by signal). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub exit_code: Option, /// The signal that terminated the process (may be null if exited normally). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub signal: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1674,7 +1709,7 @@ pub struct TerminalExitStatus { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1723,19 +1758,20 @@ impl TerminalExitStatus { /// See protocol docs: [Client Capabilities](https://agentclientprotocol.com/protocol/initialization#client-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ClientCapabilities { /// File system capabilities supported by the client. /// Determines which file operations the agent can request. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub fs: FileSystemCapabilities, /// Whether the Client support all `terminal/*` methods. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub terminal: bool, /// Session-related capabilities supported by the client. @@ -1743,7 +1779,7 @@ pub struct ClientCapabilities { /// Optional. Omitted or `null` both mean the client does not advertise any /// session-related extensions. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub session: Option, /// **UNSTABLE** @@ -1756,7 +1792,7 @@ pub struct ClientCapabilities { /// Supplying `{}` means the client can receive both update types. #[cfg(feature = "unstable_plan_operations")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub plan: Option, /// **UNSTABLE** @@ -1768,7 +1804,7 @@ pub struct ClientCapabilities { /// in its `InitializeResponse`. #[cfg(feature = "unstable_auth_methods")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub auth: AuthCapabilities, /// Elicitation capabilities supported by the client. @@ -1777,7 +1813,7 @@ pub struct ClientCapabilities { /// Optional. Omitted or `null` both mean the client does not advertise /// elicitation support. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub elicitation: Option, /// **UNSTABLE** @@ -1790,7 +1826,7 @@ pub struct ClientCapabilities { /// NES suggestion-kind extensions. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub nes: Option, /// **UNSTABLE** @@ -1800,7 +1836,7 @@ pub struct ClientCapabilities { /// The position encodings supported by the client, in order of preference. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub position_encodings: Vec, @@ -1810,7 +1846,7 @@ pub struct ClientCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1917,7 +1953,8 @@ impl ClientCapabilities { /// Session-related capabilities supported by the client. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ClientSessionCapabilities { @@ -1926,7 +1963,7 @@ pub struct ClientSessionCapabilities { /// Omitted or `null` both mean the client does not advertise support for any /// config option extensions. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub config_options: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1935,7 +1972,7 @@ pub struct ClientSessionCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1976,7 +2013,8 @@ impl ClientSessionCapabilities { /// Session configuration option capabilities supported by the client. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigOptionsCapabilities { @@ -1987,7 +2025,7 @@ pub struct SessionConfigOptionsCapabilities { /// `configOptions`, and the client may send `session/set_config_option` /// requests with `type: "boolean"` and a boolean `value`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub boolean: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1996,7 +2034,7 @@ pub struct SessionConfigOptionsCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2038,7 +2076,8 @@ impl SessionConfigOptionsCapabilities { /// Supplying `{}` means the client supports boolean session configuration options. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct BooleanConfigOptionCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2047,7 +2086,7 @@ pub struct BooleanConfigOptionCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2084,7 +2123,8 @@ impl BooleanConfigOptionCapabilities { #[cfg(feature = "unstable_auth_methods")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthCapabilities { @@ -2094,7 +2134,7 @@ pub struct AuthCapabilities { /// configured agent invocation in an interactive terminal. When `true`, the /// agent may include `terminal` entries in its authentication methods. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub terminal: bool, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2103,7 +2143,7 @@ pub struct AuthCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2146,18 +2186,19 @@ impl AuthCapabilities { /// See protocol docs: [FileSystem](https://agentclientprotocol.com/protocol/initialization#filesystem) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct FileSystemCapabilities { /// Whether the Client supports `fs/read_text_file` requests. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub read_text_file: bool, /// Whether the Client supports `fs/write_text_file` requests. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub write_text_file: bool, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2166,7 +2207,7 @@ pub struct FileSystemCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2296,9 +2337,10 @@ pub(crate) const ELICITATION_COMPLETE_NOTIFICATION: &str = "elicitation/complete /// to use this directly. /// /// This enum encompasses all method calls from agent to client. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] #[allow(clippy::large_enum_variant)] pub enum AgentRequest { @@ -2445,9 +2487,10 @@ impl AgentRequest { /// to use this directly - the responses are handled automatically by the connection. /// /// These are responses to the corresponding `AgentRequest` variants. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum ClientResponse { /// Successful result returned for a `fs/write_text_file` request. @@ -2487,10 +2530,11 @@ pub enum ClientResponse { /// to use this directly. /// /// Notifications do not expect a response. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] #[expect(clippy::large_enum_variant)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum AgentNotification { /// Handles session update notifications from the agent. diff --git a/agent-client-protocol-schema/src/v1/content.rs b/agent-client-protocol-schema/src/v1/content.rs index 6f6477f5e..6fd1fad0c 100644 --- a/agent-client-protocol-schema/src/v1/content.rs +++ b/agent-client-protocol-schema/src/v1/content.rs @@ -9,7 +9,6 @@ //! //! See: [Content](https://agentclientprotocol.com/protocol/content) -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -31,9 +30,10 @@ use super::Meta; /// agents to seamlessly forward content from MCP tool outputs without transformation. /// /// See protocol docs: [Content](https://agentclientprotocol.com/protocol/content) -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(tag = "type", rename_all = "snake_case")] -#[schemars(extend("discriminator" = {"propertyName": "type"}))] +#[cfg_attr(feature = "schemars", schemars(extend("discriminator" = {"propertyName": "type"})))] #[non_exhaustive] pub enum ContentBlock { /// Text content. May be plain text or formatted with Markdown. @@ -64,12 +64,13 @@ pub enum ContentBlock { /// Text provided to or from an LLM. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[non_exhaustive] pub struct TextContent { /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// Text payload carried by this content block. @@ -80,7 +81,7 @@ pub struct TextContent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -125,13 +126,14 @@ impl> From for ContentBlock { /// An image provided to or from an LLM. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ImageContent { /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// Base64-encoded media payload. @@ -140,7 +142,7 @@ pub struct ImageContent { pub mime_type: String, /// URI associated with this resource or media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub uri: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -149,7 +151,7 @@ pub struct ImageContent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -197,13 +199,14 @@ impl ImageContent { /// Audio provided to or from an LLM. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AudioContent { /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// Base64-encoded media payload. @@ -216,7 +219,7 @@ pub struct AudioContent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -256,12 +259,13 @@ impl AudioContent { /// The contents of a resource, embedded into a prompt or tool call result. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[non_exhaustive] pub struct EmbeddedResource { /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// Embedded resource payload, either text or binary data. @@ -272,7 +276,7 @@ pub struct EmbeddedResource { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -309,7 +313,8 @@ impl EmbeddedResource { } /// Resource content that can be embedded in a message. -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(untagged)] #[non_exhaustive] pub enum EmbeddedResourceResource { @@ -322,13 +327,14 @@ pub enum EmbeddedResourceResource { /// Text-based resource contents. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TextResourceContents { /// MIME type describing the encoded media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// Text payload carried by this content block. @@ -341,7 +347,7 @@ pub struct TextResourceContents { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -381,7 +387,8 @@ impl TextResourceContents { /// Binary resource contents. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct BlobResourceContents { @@ -389,7 +396,7 @@ pub struct BlobResourceContents { pub blob: String, /// MIME type describing the encoded media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// URI associated with this resource or media payload. @@ -400,7 +407,7 @@ pub struct BlobResourceContents { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -440,35 +447,36 @@ impl BlobResourceContents { /// A resource that the server is capable of reading, included in a prompt or tool call result. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ResourceLink { /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// Optional human-readable details shown with this protocol object. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// MIME type describing the encoded media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// Human-readable name shown for this protocol object. pub name: String, /// Optional size of the linked resource in bytes, if known. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub size: Option, /// Optional display title for end-user UI. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// URI associated with this resource or media payload. @@ -479,7 +487,7 @@ pub struct ResourceLink { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -551,23 +559,24 @@ impl ResourceLink { /// Optional annotations for the client. The client can use annotations to inform how objects are used or displayed #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, Default)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Default)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Annotations { /// Intended recipients for this content, such as the user or assistant. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub audience: Option>, /// Timestamp indicating when the underlying resource was last modified. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub last_modified: Option, /// Relative importance of this content when clients choose what to surface. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub priority: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -576,7 +585,7 @@ pub struct Annotations { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -623,7 +632,8 @@ impl Annotations { } /// The sender or recipient of messages and data in a conversation. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub enum Role { diff --git a/agent-client-protocol-schema/src/v1/elicitation.rs b/agent-client-protocol-schema/src/v1/elicitation.rs index 328243e7b..06d156cff 100644 --- a/agent-client-protocol-schema/src/v1/elicitation.rs +++ b/agent-client-protocol-schema/src/v1/elicitation.rs @@ -6,20 +6,21 @@ use std::{collections::BTreeMap, sync::Arc}; use derive_more::{Display, From}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; use crate::IntoOption; use crate::SkipListener; -use super::{ - ELICITATION_COMPLETE_NOTIFICATION, ELICITATION_CREATE_METHOD_NAME, Meta, RequestId, SessionId, - ToolCallId, -}; +#[cfg(feature = "schemars")] +use super::{ELICITATION_COMPLETE_NOTIFICATION, ELICITATION_CREATE_METHOD_NAME}; +use super::{Meta, RequestId, SessionId, ToolCallId}; /// Unique identifier for an elicitation. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -34,7 +35,8 @@ impl ElicitationId { } /// String format types for string properties in elicitation schemas. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] #[non_exhaustive] pub enum StringFormat { @@ -49,7 +51,8 @@ pub enum StringFormat { } /// Type discriminator for elicitation schemas. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationSchemaType { @@ -61,7 +64,8 @@ pub enum ElicitationSchemaType { /// A titled enum option with a const value, human-readable title, and optional description. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[non_exhaustive] pub struct EnumOption { /// The constant value for this option. @@ -73,7 +77,7 @@ pub struct EnumOption { /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -84,7 +88,7 @@ pub struct EnumOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -129,7 +133,8 @@ impl EnumOption { /// with `"type": "string"`. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct StringPropertySchema { @@ -137,14 +142,14 @@ pub struct StringPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum string length. @@ -171,7 +176,7 @@ pub struct StringPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// Enum values for untitled single-select enums. @@ -194,7 +199,7 @@ pub struct StringPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -323,7 +328,8 @@ impl StringPropertySchema { /// Schema for number (floating-point) properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NumberPropertySchema { @@ -331,14 +337,14 @@ pub struct NumberPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum value (inclusive). @@ -355,7 +361,7 @@ pub struct NumberPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -366,7 +372,7 @@ pub struct NumberPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -431,7 +437,8 @@ impl NumberPropertySchema { /// Schema for integer properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct IntegerPropertySchema { @@ -439,14 +446,14 @@ pub struct IntegerPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum value (inclusive). @@ -463,7 +470,7 @@ pub struct IntegerPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -474,7 +481,7 @@ pub struct IntegerPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -539,7 +546,8 @@ impl IntegerPropertySchema { /// Schema for boolean properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct BooleanPropertySchema { @@ -547,21 +555,21 @@ pub struct BooleanPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Default value. /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -572,7 +580,7 @@ pub struct BooleanPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -623,7 +631,8 @@ impl BooleanPropertySchema { /// String item schema for multi-select enum properties. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[non_exhaustive] pub struct StringMultiSelectItems { /// Allowed enum values. @@ -637,7 +646,7 @@ pub struct StringMultiSelectItems { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -667,7 +676,8 @@ impl StringMultiSelectItems { /// Items definition for titled multi-select enum properties. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[non_exhaustive] pub struct TitledMultiSelectItems { /// Titled enum options. @@ -681,7 +691,7 @@ pub struct TitledMultiSelectItems { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -716,9 +726,10 @@ impl TitledMultiSelectItems { /// This preserves unknown item `type` values and the rest of the `items` /// payload for clients that store, replay, proxy, or forward elicitation /// requests. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, JsonSchema)] -#[schemars(inline)] -#[schemars(transform = other_multi_select_items_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_multi_select_items_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherMultiSelectItems { @@ -775,6 +786,7 @@ fn is_known_multi_select_item_type(type_: &str) -> bool { KNOWN_MULTI_SELECT_ITEM_TYPES.contains(&type_) } +#[cfg(feature = "schemars")] fn other_multi_select_items_schema(schema: &mut Schema) { schema.insert( "not".into(), @@ -796,7 +808,8 @@ fn other_multi_select_items_schema(schema: &mut Schema) { } /// Items for a multi-select (array) property schema. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum MultiSelectItems { @@ -813,7 +826,8 @@ pub enum MultiSelectItems { /// Schema for multi-select (array) properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct MultiSelectPropertySchema { @@ -821,14 +835,14 @@ pub struct MultiSelectPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum number of items to select. @@ -847,7 +861,7 @@ pub struct MultiSelectPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default selections are provided. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub default: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -858,7 +872,7 @@ pub struct MultiSelectPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -947,7 +961,8 @@ impl MultiSelectPropertySchema { /// Each variant corresponds to a JSON Schema `"type"` value. /// Single-select enums use the `String` variant with `enum` or `oneOf` set. /// Multi-select enums use the `Array` variant. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationPropertySchema { @@ -979,9 +994,10 @@ pub enum ElicitationPropertySchema { /// This preserves the unknown `type` discriminator and the rest of the property /// schema object for clients that store, replay, proxy, or forward elicitation /// requests. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, JsonSchema)] -#[schemars(inline)] -#[schemars(transform = other_elicitation_property_schema_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_elicitation_property_schema_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherElicitationPropertySchema { @@ -1039,6 +1055,7 @@ fn is_known_elicitation_property_schema_type(type_: &str) -> bool { KNOWN_ELICITATION_PROPERTY_SCHEMA_TYPES.contains(&type_) } +#[cfg(feature = "schemars")] fn other_elicitation_property_schema_schema(schema: &mut Schema) { let known_value_schemas: Vec<_> = KNOWN_ELICITATION_PROPERTY_SCHEMA_TYPES .iter() @@ -1104,20 +1121,21 @@ fn default_object_type() -> ElicitationSchemaType { /// as required by the elicitation specification. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationSchema { /// Type discriminator. Always `"object"`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(rename = "type", default = "default_object_type")] pub type_: ElicitationSchemaType, /// Optional title for the schema. /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Property definitions (must be primitive types). @@ -1132,7 +1150,7 @@ pub struct ElicitationSchema { /// /// Optional. Omitted and `null` are equivalent and mean no schema description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1143,7 +1161,7 @@ pub struct ElicitationSchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1281,7 +1299,8 @@ impl ElicitationSchema { /// Elicitation capabilities supported by the client. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationCapabilities { @@ -1290,7 +1309,7 @@ pub struct ElicitationCapabilities { /// Optional. Omitted and `null` are equivalent and mean form support is not advertised. /// Supplying `{}` explicitly advertises form support. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub form: Option, /// Whether the client supports URL-based elicitation. @@ -1298,7 +1317,7 @@ pub struct ElicitationCapabilities { /// Optional. Omitted or `null` both mean the client does not advertise support. /// Supplying `{}` means the client supports URL-based elicitation. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub url: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1309,7 +1328,7 @@ pub struct ElicitationCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1377,7 +1396,8 @@ impl ElicitationCapabilities { /// Supplying `{}` means the client supports form-based elicitation. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationFormCapabilities { @@ -1389,7 +1409,7 @@ pub struct ElicitationFormCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1421,7 +1441,8 @@ impl ElicitationFormCapabilities { /// Supplying `{}` means the client supports URL-based elicitation. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationUrlCapabilities { @@ -1433,7 +1454,7 @@ pub struct ElicitationUrlCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1461,7 +1482,8 @@ impl ElicitationUrlCapabilities { } /// The scope of an elicitation request, determining what context it's tied to. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(untagged)] #[non_exhaustive] pub enum ElicitationScope { @@ -1479,7 +1501,8 @@ pub enum ElicitationScope { /// during a tool call and needs to redirect it to the user. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationSessionScope { @@ -1490,7 +1513,7 @@ pub struct ElicitationSessionScope { /// Optional. Omitted and `null` are equivalent and mean the elicitation is scoped to the /// session without a specific tool call. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub tool_call_id: Option, } @@ -1515,7 +1538,8 @@ impl ElicitationSessionScope { /// Request-scoped elicitation, tied to a specific JSON-RPC request outside of a session /// (e.g., during auth/configuration phases before any session is started). -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationRequestScope { @@ -1552,8 +1576,9 @@ impl From for ElicitationScope { /// Elicitations are tied to a session (optionally a tool call) or a request. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "client", "x-method" = ELICITATION_CREATE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = ELICITATION_CREATE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CreateElicitationRequest { @@ -1570,7 +1595,7 @@ pub struct CreateElicitationRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1608,7 +1633,8 @@ impl CreateElicitationRequest { } /// The mode of elicitation, determining how user input is collected. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "mode", rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationMode { @@ -1634,9 +1660,10 @@ pub enum ElicitationMode { /// This preserves the unknown `mode` discriminator and the rest of the mode /// object for clients that store, replay, proxy, or forward elicitation /// requests. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq)] -#[schemars(inline)] -#[schemars(transform = other_elicitation_mode_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_elicitation_mode_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherElicitationMode { @@ -1717,6 +1744,7 @@ fn remove_elicitation_scope_fields(fields: &mut BTreeMap = KNOWN_ELICITATION_MODES .iter() @@ -1773,7 +1801,8 @@ impl ElicitationMode { } /// Form-based elicitation mode where the client renders a form from the provided schema. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationFormMode { @@ -1796,7 +1825,8 @@ impl ElicitationFormMode { } /// URL-based elicitation mode where the client directs the user to a URL. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationUrlMode { @@ -1806,7 +1836,7 @@ pub struct ElicitationUrlMode { /// The unique identifier for this elicitation. pub elicitation_id: ElicitationId, /// The URL to direct the user to. - #[schemars(extend("format" = "uri"))] + #[cfg_attr(feature = "schemars", schemars(extend("format" = "uri")))] pub url: String, } @@ -1829,8 +1859,9 @@ impl ElicitationUrlMode { /// Response from the client to an elicitation request. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "client", "x-method" = ELICITATION_CREATE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = ELICITATION_CREATE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CreateElicitationResponse { @@ -1845,7 +1876,7 @@ pub struct CreateElicitationResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1876,7 +1907,8 @@ impl CreateElicitationResponse { } /// The user's action in response to an elicitation. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "action", rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationAction { @@ -1904,9 +1936,10 @@ pub enum ElicitationAction { /// This preserves the unknown `action` discriminator and the rest of the /// response object for agents that store, replay, proxy, or forward elicitation /// responses. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq)] -#[schemars(inline)] -#[schemars(transform = other_elicitation_action_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_elicitation_action_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherElicitationAction { @@ -1962,6 +1995,7 @@ fn is_known_elicitation_action(action: &str) -> bool { KNOWN_ELICITATION_ACTIONS.contains(&action) } +#[cfg(feature = "schemars")] fn other_elicitation_action_schema(schema: &mut Schema) { let known_value_schemas: Vec<_> = KNOWN_ELICITATION_ACTIONS .iter() @@ -2002,7 +2036,8 @@ impl From for ElicitationAction { /// The user accepted the elicitation and provided content. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationAcceptAction { @@ -2030,7 +2065,8 @@ impl ElicitationAcceptAction { } /// Allowed wire representations for [`ElicitationContentValue`]. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(untagged)] #[non_exhaustive] pub enum ElicitationContentValue { @@ -2103,8 +2139,9 @@ impl Default for ElicitationAcceptAction { /// Notification sent by the agent when a URL-based elicitation is complete. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "client", "x-method" = ELICITATION_COMPLETE_NOTIFICATION))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = ELICITATION_COMPLETE_NOTIFICATION)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CompleteElicitationNotification { @@ -2118,7 +2155,7 @@ pub struct CompleteElicitationNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, diff --git a/agent-client-protocol-schema/src/v1/error.rs b/agent-client-protocol-schema/src/v1/error.rs index da468fa89..a7f719b01 100644 --- a/agent-client-protocol-schema/src/v1/error.rs +++ b/agent-client-protocol-schema/src/v1/error.rs @@ -12,7 +12,8 @@ use std::{fmt::Display, str}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, serde_as, skip_serializing_none}; @@ -29,7 +30,8 @@ pub type Result = std::result::Result; /// See protocol docs: [JSON-RPC Error Object](https://www.jsonrpc.org/specification#error_object) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct Error { /// A number indicating the error type that occurred. @@ -41,7 +43,7 @@ pub struct Error { /// Optional primitive or structured value that contains additional information about the error. /// This may include debugging information or context-specific details. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub data: Option, } @@ -138,52 +140,53 @@ impl Error { /// /// These codes follow the JSON-RPC 2.0 specification for standard errors /// and use the reserved range (-32000 to -32099) for protocol-specific errors. -#[derive(Clone, Copy, Deserialize, Eq, JsonSchema, PartialEq, Serialize, strum::Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Copy, Deserialize, Eq, PartialEq, Serialize, strum::Display)] #[cfg_attr(test, derive(strum::EnumIter))] #[serde(from = "i32", into = "i32")] -#[schemars(!from, !into)] +#[cfg_attr(feature = "schemars", schemars(!from, !into))] #[non_exhaustive] pub enum ErrorCode { // Standard errors /// Invalid JSON was received by the server. /// An error occurred on the server while parsing the JSON text. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Parse error")] ParseError, // -32700 /// The JSON sent is not a valid Request object. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Invalid request")] InvalidRequest, // -32600 /// The method does not exist or is not available. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Method not found")] MethodNotFound, // -32601 /// Invalid method parameter(s). - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Invalid params")] InvalidParams, // -32602 /// Internal JSON-RPC error. /// Reserved for implementation-defined server errors. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Internal error")] InternalError, // -32603 /// Execution of the method was aborted either due to a cancellation request from the caller or /// because of resource constraints or shutdown. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Request cancelled")] RequestCancelled, // -32800 // Custom errors /// Authentication is required before this operation can be performed. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Authentication required")] AuthRequired, // -32000 /// A given resource, such as a file, was not found. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Resource not found")] ResourceNotFound, // -32002 /// Other undefined error code. - #[schemars(untagged)] + #[cfg_attr(feature = "schemars", schemars(untagged))] #[strum(to_string = "Unknown error")] Other(i32), } @@ -226,6 +229,7 @@ impl std::fmt::Debug for ErrorCode { } } +#[cfg(feature = "schemars")] fn error_code_transform(schema: &mut Schema) { let name = schema .get("const") @@ -326,7 +330,8 @@ mod tests { #[test] fn serialize_error_code_equality() { - // Make sure this doesn't panic + // Make sure schema generation doesn't panic when enabled. + #[cfg(feature = "schemars")] let _schema = schemars::schema_for!(ErrorCode); for error in ErrorCode::iter() { assert_eq!( diff --git a/agent-client-protocol-schema/src/v1/ext.rs b/agent-client-protocol-schema/src/v1/ext.rs index f0c759d59..0cc4e9b5e 100644 --- a/agent-client-protocol-schema/src/v1/ext.rs +++ b/agent-client-protocol-schema/src/v1/ext.rs @@ -1,6 +1,5 @@ //! Extension types and constants for protocol extensibility. use derive_more::From; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::value::RawValue; use std::sync::Arc; @@ -19,7 +18,8 @@ pub type Meta = serde_json::Map; /// protocol compatibility. /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(transparent)] #[non_exhaustive] pub struct ExtRequest { @@ -29,7 +29,7 @@ pub struct ExtRequest { #[serde(skip)] // this is used for routing, but when serializing we only want the params pub method: Arc, /// Raw JSON parameters for this extension message. - #[schemars(with = "serde_json::Value")] + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub params: Arc, } @@ -49,10 +49,13 @@ impl ExtRequest { /// protocol compatibility. /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, From)] #[serde(transparent)] #[non_exhaustive] -pub struct ExtResponse(#[schemars(with = "serde_json::Value")] pub Arc); +pub struct ExtResponse( + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub Arc, +); impl ExtResponse { /// Builds [`ExtResponse`] with the required response fields set; optional fields start unset or empty. @@ -67,7 +70,8 @@ impl ExtResponse { /// while maintaining protocol compatibility. /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(transparent)] #[non_exhaustive] pub struct ExtNotification { @@ -77,7 +81,7 @@ pub struct ExtNotification { #[serde(skip)] // this is used for routing, but when serializing we only want the params pub method: Arc, /// Raw JSON parameters for this extension message. - #[schemars(with = "serde_json::Value")] + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub params: Arc, } diff --git a/agent-client-protocol-schema/src/v1/mcp.rs b/agent-client-protocol-schema/src/v1/mcp.rs index e1762a311..365ad9601 100644 --- a/agent-client-protocol-schema/src/v1/mcp.rs +++ b/agent-client-protocol-schema/src/v1/mcp.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::value::RawValue; use serde_with::{DefaultOnError, serde_as, skip_serializing_none}; @@ -17,7 +16,8 @@ use super::{McpServerAcpId, Meta}; /// This capability is not part of the spec yet, and may be removed or changed at any point. /// /// A unique identifier for an active MCP-over-ACP connection. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -38,9 +38,10 @@ impl McpConnectionId { /// Request parameters for `mcp/connect`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct ConnectMcpRequest { /// The ACP MCP server ID that was provided by the component declaring the MCP server. @@ -51,7 +52,7 @@ pub struct ConnectMcpRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -86,9 +87,10 @@ impl ConnectMcpRequest { /// Response to `mcp/connect`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct ConnectMcpResponse { /// The unique identifier for this MCP-over-ACP connection. @@ -99,7 +101,7 @@ pub struct ConnectMcpResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -134,9 +136,10 @@ impl ConnectMcpResponse { /// Request parameters for `mcp/message`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME)))] #[non_exhaustive] pub struct MessageMcpRequest { /// The MCP-over-ACP connection this message is sent on. @@ -154,7 +157,7 @@ pub struct MessageMcpRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -206,9 +209,10 @@ impl MessageMcpRequest { /// envelope has no `id`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME)))] #[non_exhaustive] pub struct MessageMcpNotification { /// The MCP-over-ACP connection this message is sent on. @@ -219,7 +223,7 @@ pub struct MessageMcpNotification { /// /// If omitted or set to `null`, the inner MCP message has no params. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub params: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -228,7 +232,7 @@ pub struct MessageMcpNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -277,11 +281,14 @@ impl MessageMcpNotification { /// Response to `mcp/message`. /// /// This is the inner MCP response result payload. Any JSON value is valid. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, From)] #[serde(transparent)] -#[schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME)))] #[non_exhaustive] -pub struct MessageMcpResponse(#[schemars(with = "serde_json::Value")] pub Arc); +pub struct MessageMcpResponse( + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub Arc, +); impl MessageMcpResponse { /// Builds [`MessageMcpResponse`] with the required response fields set; optional fields start unset or empty. @@ -298,9 +305,10 @@ impl MessageMcpResponse { /// Request parameters for `mcp/disconnect`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct DisconnectMcpRequest { /// The MCP-over-ACP connection to close. @@ -311,7 +319,7 @@ pub struct DisconnectMcpRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -346,9 +354,10 @@ impl DisconnectMcpRequest { /// Response to `mcp/disconnect`. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct DisconnectMcpResponse { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -357,7 +366,7 @@ pub struct DisconnectMcpResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, diff --git a/agent-client-protocol-schema/src/v1/mod.rs b/agent-client-protocol-schema/src/v1/mod.rs index 9756ab8ce..8c135e65c 100644 --- a/agent-client-protocol-schema/src/v1/mod.rs +++ b/agent-client-protocol-schema/src/v1/mod.rs @@ -34,7 +34,6 @@ pub use tool_call::*; /// JSON-RPC response envelope using this protocol version's error type. pub type Response = crate::rpc::Response; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::sync::Arc; @@ -44,7 +43,8 @@ use std::sync::Arc; /// allowing multiple independent interactions with the same agent. /// /// See protocol docs: [Session ID](https://agentclientprotocol.com/protocol/session-setup#session-id) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] diff --git a/agent-client-protocol-schema/src/v1/nes.rs b/agent-client-protocol-schema/src/v1/nes.rs index f51a3ce80..f4d68c8b4 100644 --- a/agent-client-protocol-schema/src/v1/nes.rs +++ b/agent-client-protocol-schema/src/v1/nes.rs @@ -7,7 +7,6 @@ use std::sync::Arc; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -39,7 +38,8 @@ pub(crate) const DOCUMENT_DID_SAVE_METHOD_NAME: &str = "document/didSave"; pub(crate) const DOCUMENT_DID_FOCUS_METHOD_NAME: &str = "document/didFocus"; /// Unique identifier for a next edit suggestion. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -58,7 +58,8 @@ impl NesSuggestionId { /// The encoding used for character offsets in positions. /// /// Follows the same conventions as LSP 3.17. The default is UTF-16. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum PositionEncodingKind { /// Character offsets count UTF-16 code units. This is the default. @@ -77,7 +78,8 @@ pub enum PositionEncodingKind { /// The meaning of `character` depends on the negotiated position encoding. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Position { @@ -91,7 +93,7 @@ pub struct Position { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -123,7 +125,8 @@ impl Position { /// A range in a text document, expressed as start and end positions. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Range { @@ -137,7 +140,7 @@ pub struct Range { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -171,18 +174,19 @@ impl Range { /// NES capabilities advertised by the agent during initialization. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesCapabilities { /// Events the agent wants to receive. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub events: Option, /// Context the agent wants attached to each suggestion request. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub context: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -191,7 +195,7 @@ pub struct NesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -233,13 +237,14 @@ impl NesCapabilities { /// Event capabilities the agent can consume. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEventCapabilities { /// Document event capabilities. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub document: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -248,7 +253,7 @@ pub struct NesEventCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -283,33 +288,34 @@ impl NesEventCapabilities { /// Document event capabilities the agent wants to receive. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentEventCapabilities { /// Whether the agent wants `document/didOpen` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_open: Option, /// Whether the agent wants `document/didChange` events, and the sync kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_change: Option, /// Whether the agent wants `document/didClose` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_close: Option, /// Whether the agent wants `document/didSave` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_save: Option, /// Whether the agent wants `document/didFocus` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_focus: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -318,7 +324,7 @@ pub struct NesDocumentEventCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -390,7 +396,8 @@ impl NesDocumentEventCapabilities { /// Marker for `document/didOpen` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidOpenCapabilities { @@ -400,7 +407,7 @@ pub struct NesDocumentDidOpenCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -417,7 +424,8 @@ impl NesDocumentDidOpenCapabilities { /// Capabilities for `document/didChange` events. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidChangeCapabilities { @@ -429,7 +437,7 @@ pub struct NesDocumentDidChangeCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -458,7 +466,8 @@ impl NesDocumentDidChangeCapabilities { } /// How the agent wants document changes delivered. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum TextDocumentSyncKind { /// Client sends the entire file content on each change. @@ -472,7 +481,8 @@ pub enum TextDocumentSyncKind { /// Marker for `document/didClose` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidCloseCapabilities { @@ -482,7 +492,7 @@ pub struct NesDocumentDidCloseCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -499,7 +509,8 @@ impl NesDocumentDidCloseCapabilities { /// Marker for `document/didSave` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidSaveCapabilities { @@ -509,7 +520,7 @@ pub struct NesDocumentDidSaveCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -526,7 +537,8 @@ impl NesDocumentDidSaveCapabilities { /// Marker for `document/didFocus` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidFocusCapabilities { @@ -536,7 +548,7 @@ pub struct NesDocumentDidFocusCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -553,38 +565,39 @@ impl NesDocumentDidFocusCapabilities { /// Context capabilities the agent wants attached to each suggestion request. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesContextCapabilities { /// Whether the agent wants recent files context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub recent_files: Option, /// Whether the agent wants related snippets context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub related_snippets: Option, /// Whether the agent wants edit history context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub edit_history: Option, /// Whether the agent wants user actions context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub user_actions: Option, /// Whether the agent wants open files context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub open_files: Option, /// Whether the agent wants diagnostics context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub diagnostics: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -593,7 +606,7 @@ pub struct NesContextCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -675,13 +688,14 @@ impl NesContextCapabilities { /// Capabilities for recent files context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRecentFilesCapabilities { /// Maximum number of recent files the agent can use. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub max_count: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -690,7 +704,7 @@ pub struct NesRecentFilesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -707,7 +721,8 @@ impl NesRecentFilesCapabilities { /// Capabilities for related snippets context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRelatedSnippetsCapabilities { @@ -717,7 +732,7 @@ pub struct NesRelatedSnippetsCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -734,13 +749,14 @@ impl NesRelatedSnippetsCapabilities { /// Capabilities for edit history context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEditHistoryCapabilities { /// Maximum number of edit history entries the agent can use. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub max_count: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -749,7 +765,7 @@ pub struct NesEditHistoryCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -766,13 +782,14 @@ impl NesEditHistoryCapabilities { /// Capabilities for user actions context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesUserActionsCapabilities { /// Maximum number of user actions the agent can use. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub max_count: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -781,7 +798,7 @@ pub struct NesUserActionsCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -798,7 +815,8 @@ impl NesUserActionsCapabilities { /// Capabilities for open files context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesOpenFilesCapabilities { @@ -808,7 +826,7 @@ pub struct NesOpenFilesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -825,7 +843,8 @@ impl NesOpenFilesCapabilities { /// Capabilities for diagnostics context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDiagnosticsCapabilities { @@ -835,7 +854,7 @@ pub struct NesDiagnosticsCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -854,23 +873,24 @@ impl NesDiagnosticsCapabilities { /// NES capabilities advertised by the client during initialization. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ClientNesCapabilities { /// Whether the client supports the `jump` suggestion kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub jump: Option, /// Whether the client supports the `rename` suggestion kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub rename: Option, /// Whether the client supports the `searchAndReplace` suggestion kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub search_and_replace: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -879,7 +899,7 @@ pub struct ClientNesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -931,7 +951,8 @@ impl ClientNesCapabilities { /// Marker for jump suggestion support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesJumpCapabilities { @@ -941,7 +962,7 @@ pub struct NesJumpCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -958,7 +979,8 @@ impl NesJumpCapabilities { /// Marker for rename suggestion support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRenameCapabilities { @@ -968,7 +990,7 @@ pub struct NesRenameCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -985,7 +1007,8 @@ impl NesRenameCapabilities { /// Marker for search and replace suggestion support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesSearchAndReplaceCapabilities { @@ -995,7 +1018,7 @@ pub struct NesSearchAndReplaceCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1014,8 +1037,9 @@ impl NesSearchAndReplaceCapabilities { /// Notification sent when a file is opened in the editor. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_OPEN_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_OPEN_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidOpenDocumentNotification { @@ -1035,7 +1059,7 @@ pub struct DidOpenDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1076,8 +1100,9 @@ impl DidOpenDocumentNotification { /// Notification sent when a file is edited. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CHANGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CHANGE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidChangeDocumentNotification { @@ -1089,7 +1114,7 @@ pub struct DidChangeDocumentNotification { pub version: i64, /// The content changes. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub content_changes: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -1097,7 +1122,7 @@ pub struct DidChangeDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1139,7 +1164,8 @@ impl DidChangeDocumentNotification { /// When `range` is `Some`, `text` replaces the given range. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TextDocumentContentChangeEvent { @@ -1154,7 +1180,7 @@ pub struct TextDocumentContentChangeEvent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1196,8 +1222,9 @@ impl TextDocumentContentChangeEvent { /// Notification sent when a file is closed. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidCloseDocumentNotification { @@ -1211,7 +1238,7 @@ pub struct DidCloseDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1243,8 +1270,9 @@ impl DidCloseDocumentNotification { /// Notification sent when a file is saved. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_SAVE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_SAVE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidSaveDocumentNotification { @@ -1258,7 +1286,7 @@ pub struct DidSaveDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1290,8 +1318,9 @@ impl DidSaveDocumentNotification { /// Notification sent when a file becomes the active editor tab. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_FOCUS_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_FOCUS_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidFocusDocumentNotification { @@ -1311,7 +1340,7 @@ pub struct DidFocusDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1354,14 +1383,15 @@ impl DidFocusDocumentNotification { /// Request to start an NES session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct StartNesRequest { /// The root URI of the workspace. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub workspace_uri: Option, /// The workspace folders. @@ -1369,7 +1399,7 @@ pub struct StartNesRequest { pub workspace_folders: Option>, /// Repository metadata, if the workspace is a git repository. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub repository: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1378,7 +1408,7 @@ pub struct StartNesRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1441,7 +1471,8 @@ impl Default for StartNesRequest { /// A workspace folder. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct WorkspaceFolder { @@ -1455,7 +1486,7 @@ pub struct WorkspaceFolder { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1487,7 +1518,8 @@ impl WorkspaceFolder { /// Repository metadata for an NES session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRepository { @@ -1503,7 +1535,7 @@ pub struct NesRepository { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1540,8 +1572,9 @@ impl NesRepository { /// Response to `nes/start`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct StartNesResponse { @@ -1553,7 +1586,7 @@ pub struct StartNesResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1589,8 +1622,9 @@ impl StartNesResponse { /// and then free up any resources associated with the session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseNesRequest { @@ -1602,7 +1636,7 @@ pub struct CloseNesRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1633,8 +1667,9 @@ impl CloseNesRequest { /// Response from closing an NES session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseNesResponse { @@ -1644,7 +1679,7 @@ pub struct CloseNesResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1672,7 +1707,8 @@ impl CloseNesResponse { // NES suggest request /// What triggered the suggestion request. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum NesTriggerKind { /// Triggered by user typing or cursor movement. @@ -1689,8 +1725,9 @@ pub enum NesTriggerKind { /// Request for a code suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SuggestNesRequest { @@ -1716,7 +1753,7 @@ pub struct SuggestNesRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1773,7 +1810,8 @@ impl SuggestNesRequest { /// Context attached to a suggestion request. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesSuggestContext { @@ -1801,7 +1839,7 @@ pub struct NesSuggestContext { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1874,7 +1912,8 @@ impl NesSuggestContext { /// A recently accessed file. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRecentFile { @@ -1890,7 +1929,7 @@ pub struct NesRecentFile { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1927,7 +1966,8 @@ impl NesRecentFile { /// A related code snippet from a file. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRelatedSnippet { @@ -1941,7 +1981,7 @@ pub struct NesRelatedSnippet { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1973,7 +2013,8 @@ impl NesRelatedSnippet { /// A code excerpt from a file. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesExcerpt { @@ -1989,7 +2030,7 @@ pub struct NesExcerpt { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2022,7 +2063,8 @@ impl NesExcerpt { /// An entry in the edit history. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEditHistoryEntry { @@ -2036,7 +2078,7 @@ pub struct NesEditHistoryEntry { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2068,7 +2110,8 @@ impl NesEditHistoryEntry { /// A user action (typing, cursor movement, etc.). #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesUserAction { @@ -2086,7 +2129,7 @@ pub struct NesUserAction { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2125,7 +2168,8 @@ impl NesUserAction { /// An open file in the editor. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesOpenFile { @@ -2135,12 +2179,12 @@ pub struct NesOpenFile { pub language_id: String, /// The visible range in the editor, if any. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub visible_range: Option, /// Timestamp in milliseconds since epoch of when the file was last focused. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub last_focused_ms: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2149,7 +2193,7 @@ pub struct NesOpenFile { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2197,7 +2241,8 @@ impl NesOpenFile { /// A diagnostic (error, warning, etc.). #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDiagnostic { @@ -2215,7 +2260,7 @@ pub struct NesDiagnostic { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2252,7 +2297,8 @@ impl NesDiagnostic { } /// Severity of a diagnostic. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum NesDiagnosticSeverity { /// An error. @@ -2274,8 +2320,9 @@ pub enum NesDiagnosticSeverity { /// Response to `nes/suggest`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SuggestNesResponse { @@ -2287,7 +2334,7 @@ pub struct SuggestNesResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2316,9 +2363,10 @@ impl SuggestNesResponse { } /// A suggestion returned by the agent. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "kind", rename_all = "camelCase")] -#[schemars(extend("discriminator" = {"propertyName": "kind"}))] +#[cfg_attr(feature = "schemars", schemars(extend("discriminator" = {"propertyName": "kind"})))] #[non_exhaustive] pub enum NesSuggestion { /// A text edit suggestion. @@ -2334,7 +2382,8 @@ pub enum NesSuggestion { /// A text edit suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEditSuggestion { @@ -2346,7 +2395,7 @@ pub struct NesEditSuggestion { pub edits: Vec, /// Optional suggested cursor position after applying edits. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cursor_position: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2355,7 +2404,7 @@ pub struct NesEditSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2400,7 +2449,8 @@ impl NesEditSuggestion { /// A text edit within a suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesTextEdit { @@ -2414,7 +2464,7 @@ pub struct NesTextEdit { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2446,7 +2496,8 @@ impl NesTextEdit { /// A jump-to-location suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesJumpSuggestion { @@ -2462,7 +2513,7 @@ pub struct NesJumpSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2495,7 +2546,8 @@ impl NesJumpSuggestion { /// A rename symbol suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRenameSuggestion { @@ -2513,7 +2565,7 @@ pub struct NesRenameSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2552,7 +2604,8 @@ impl NesRenameSuggestion { /// A search-and-replace suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesSearchAndReplaceSuggestion { @@ -2573,7 +2626,7 @@ pub struct NesSearchAndReplaceSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2622,8 +2675,9 @@ impl NesSearchAndReplaceSuggestion { /// Notification sent when a suggestion is accepted. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_ACCEPT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_ACCEPT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AcceptNesNotification { @@ -2637,7 +2691,7 @@ pub struct AcceptNesNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2669,8 +2723,9 @@ impl AcceptNesNotification { /// Notification sent when a suggestion is rejected. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_REJECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_REJECT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RejectNesNotification { @@ -2680,7 +2735,7 @@ pub struct RejectNesNotification { pub id: NesSuggestionId, /// The reason for rejection. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub reason: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2689,7 +2744,7 @@ pub struct RejectNesNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2727,7 +2782,8 @@ impl RejectNesNotification { } /// The reason a suggestion was rejected. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum NesRejectReason { /// The user explicitly dismissed the suggestion. diff --git a/agent-client-protocol-schema/src/v1/plan.rs b/agent-client-protocol-schema/src/v1/plan.rs index dcc01808d..c0425854d 100644 --- a/agent-client-protocol-schema/src/v1/plan.rs +++ b/agent-client-protocol-schema/src/v1/plan.rs @@ -10,7 +10,6 @@ use std::sync::Arc; #[cfg(feature = "unstable_plan_operations")] use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -27,7 +26,8 @@ use super::Meta; /// See protocol docs: [Agent Plan](https://agentclientprotocol.com/protocol/agent-plan) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Plan { @@ -36,7 +36,7 @@ pub struct Plan { /// When updating a plan, the agent must send a complete list of all entries /// with their current status. The client replaces the entire plan with each update. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub entries: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -44,7 +44,7 @@ pub struct Plan { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -78,7 +78,8 @@ impl Plan { /// /// Unique identifier for a plan within a session. #[cfg(feature = "unstable_plan_operations")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -101,7 +102,8 @@ impl PlanId { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanUpdate { @@ -113,7 +115,7 @@ pub struct PlanUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -145,9 +147,10 @@ impl PlanUpdate { /// /// Updated content for a plan. #[cfg(feature = "unstable_plan_operations")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] -#[schemars(extend("discriminator" = {"propertyName": "type"}))] +#[cfg_attr(feature = "schemars", schemars(extend("discriminator" = {"propertyName": "type"})))] #[non_exhaustive] pub enum PlanUpdateContent { /// Structured plan entries. @@ -187,7 +190,8 @@ impl PlanUpdateContent { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanItems { @@ -198,7 +202,7 @@ pub struct PlanItems { /// When updating an item-based plan, the agent must send a complete list of all entries /// with their current status. The client replaces that plan with each update. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub entries: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -206,7 +210,7 @@ pub struct PlanItems { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -244,7 +248,8 @@ impl PlanItems { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanFile { @@ -258,7 +263,7 @@ pub struct PlanFile { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -296,7 +301,8 @@ impl PlanFile { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanMarkdown { @@ -310,7 +316,7 @@ pub struct PlanMarkdown { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -348,7 +354,8 @@ impl PlanMarkdown { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanRemoved { @@ -360,7 +367,7 @@ pub struct PlanRemoved { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -397,7 +404,8 @@ impl PlanRemoved { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanCapabilities { @@ -407,7 +415,7 @@ pub struct PlanCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -440,7 +448,8 @@ impl PlanCapabilities { /// See protocol docs: [Plan Entries](https://agentclientprotocol.com/protocol/agent-plan#plan-entries) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanEntry { @@ -457,7 +466,7 @@ pub struct PlanEntry { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -496,7 +505,8 @@ impl PlanEntry { /// Used to indicate the relative importance or urgency of different /// tasks in the execution plan. /// See protocol docs: [Plan Entries](https://agentclientprotocol.com/protocol/agent-plan#plan-entries) -#[derive(Deserialize, Serialize, JsonSchema, Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum PlanEntryPriority { @@ -512,7 +522,8 @@ pub enum PlanEntryPriority { /// /// Tracks the lifecycle of each task from planning through completion. /// See protocol docs: [Plan Entries](https://agentclientprotocol.com/protocol/agent-plan#plan-entries) -#[derive(Deserialize, Serialize, JsonSchema, Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum PlanEntryStatus { diff --git a/agent-client-protocol-schema/src/v1/protocol_level.rs b/agent-client-protocol-schema/src/v1/protocol_level.rs index 54f873ede..cb8f891f1 100644 --- a/agent-client-protocol-schema/src/v1/protocol_level.rs +++ b/agent-client-protocol-schema/src/v1/protocol_level.rs @@ -1,4 +1,3 @@ -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, serde_as, skip_serializing_none}; @@ -11,8 +10,9 @@ use super::{Meta, RequestId}; /// See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/cancellation) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "protocol", "x-method" = CANCEL_REQUEST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "protocol", "x-method" = CANCEL_REQUEST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CancelRequestNotification { @@ -24,7 +24,7 @@ pub struct CancelRequestNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -83,9 +83,10 @@ pub(crate) const CANCEL_REQUEST_METHOD_NAME: &str = "$/cancel_request"; /// notifications starting with '$/' it is free to ignore the notification. /// /// Notifications do not expect a response. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum ProtocolLevelNotification { /// Cancels an ongoing request. diff --git a/agent-client-protocol-schema/src/v1/tool_call.rs b/agent-client-protocol-schema/src/v1/tool_call.rs index fb764a850..83b1061aa 100644 --- a/agent-client-protocol-schema/src/v1/tool_call.rs +++ b/agent-client-protocol-schema/src/v1/tool_call.rs @@ -7,7 +7,6 @@ use std::{path::PathBuf, sync::Arc}; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -23,7 +22,8 @@ use super::{ContentBlock, Error, Meta, TerminalId}; /// See protocol docs: [Tool Calls](https://agentclientprotocol.com/protocol/tool-calls) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCall { @@ -41,39 +41,39 @@ pub struct ToolCall { /// tool name is available. #[cfg(feature = "unstable_tool_call_name")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub name: Option, /// The category of tool being invoked. /// Helps clients choose appropriate icons and UI treatment. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "ToolKind::is_default")] pub kind: ToolKind, /// Current execution status of the tool call. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "ToolCallStatus::is_default")] pub status: ToolCallStatus, /// Content produced by the tool call. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub content: Vec, /// File locations affected by this tool call. /// Enables "follow-along" features in clients. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub locations: Vec, /// Raw input parameters sent to the tool. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub raw_input: Option, /// Raw output returned by the tool. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub raw_output: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -82,7 +82,7 @@ pub struct ToolCall { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -213,7 +213,8 @@ impl ToolCall { /// See protocol docs: [Updating](https://agentclientprotocol.com/protocol/tool-calls#updating) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCallUpdate { @@ -228,7 +229,7 @@ pub struct ToolCallUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -265,23 +266,24 @@ impl ToolCallUpdate { /// See protocol docs: [Updating](https://agentclientprotocol.com/protocol/tool-calls#updating) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCallUpdateFields { /// Update the tool kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub kind: Option, /// Update the execution status. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub status: Option, /// Update the human-readable title. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// **UNSTABLE** @@ -294,27 +296,27 @@ pub struct ToolCallUpdateFields { /// the existing name is left unchanged. #[cfg(feature = "unstable_tool_call_name")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub name: Option, /// Replace the content collection. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub content: Option>, /// Replace the locations collection. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub locations: Option>, /// Update the raw input. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub raw_input: Option, /// Update the raw output. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub raw_output: Option, } @@ -463,7 +465,8 @@ impl From for ToolCallUpdate { } /// Unique identifier for a tool call within a session. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &'static str)] #[non_exhaustive] @@ -489,7 +492,8 @@ impl IntoOption for &str { /// display tool execution progress. /// /// See protocol docs: [Creating](https://agentclientprotocol.com/protocol/tool-calls#creating) -#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum ToolKind { @@ -529,7 +533,8 @@ impl ToolKind { /// Tool calls progress through different statuses during their lifecycle. /// /// See protocol docs: [Status](https://agentclientprotocol.com/protocol/tool-calls#status) -#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum ToolCallStatus { @@ -558,9 +563,10 @@ impl ToolCallStatus { /// standard content blocks (text, images) or file diffs. /// /// See protocol docs: [Content](https://agentclientprotocol.com/protocol/tool-calls#content) -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] -#[schemars(extend("discriminator" = {"propertyName": "type"}))] +#[cfg_attr(feature = "schemars", schemars(extend("discriminator" = {"propertyName": "type"})))] #[non_exhaustive] #[expect(clippy::large_enum_variant)] pub enum ToolCallContent { @@ -591,7 +597,8 @@ impl From for ToolCallContent { /// Standard content block (text, images, resources). #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Content { @@ -603,7 +610,7 @@ pub struct Content { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -638,7 +645,8 @@ impl Content { /// See protocol docs: [Terminal](https://agentclientprotocol.com/protocol/terminals) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Terminal { @@ -650,7 +658,7 @@ pub struct Terminal { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -685,7 +693,8 @@ impl Terminal { /// See protocol docs: [Content](https://agentclientprotocol.com/protocol/tool-calls#content) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Diff { @@ -693,7 +702,7 @@ pub struct Diff { pub path: PathBuf, /// The original content (None for new files). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub old_text: Option, /// The new content after modification. @@ -704,7 +713,7 @@ pub struct Diff { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -749,7 +758,8 @@ impl Diff { /// See protocol docs: [Following the Agent](https://agentclientprotocol.com/protocol/tool-calls#following-the-agent) #[serde_as] #[skip_serializing_none] -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCallLocation { @@ -757,7 +767,7 @@ pub struct ToolCallLocation { pub path: PathBuf, /// Optional line number within the file. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub line: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -766,7 +776,7 @@ pub struct ToolCallLocation { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, diff --git a/agent-client-protocol-schema/src/v2/agent.rs b/agent-client-protocol-schema/src/v2/agent.rs index 77cbefc90..0689e98f1 100644 --- a/agent-client-protocol-schema/src/v2/agent.rs +++ b/agent-client-protocol-schema/src/v2/agent.rs @@ -9,7 +9,8 @@ use std::{borrow::Cow, collections::BTreeMap, sync::Arc}; use std::collections::HashMap; use derive_more::{Display, From}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -49,8 +50,9 @@ use super::{ /// See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct InitializeRequest { @@ -60,7 +62,7 @@ pub struct InitializeRequest { pub info: Implementation, /// Capabilities supported by the client. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub capabilities: ClientCapabilities, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -69,7 +71,7 @@ pub struct InitializeRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -113,8 +115,9 @@ impl InitializeRequest { /// See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = INITIALIZE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct InitializeResponse { @@ -127,7 +130,7 @@ pub struct InitializeResponse { pub info: Implementation, /// Capabilities supported by the agent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub capabilities: AgentCapabilities, /// Authentication methods supported by the agent. @@ -136,7 +139,7 @@ pub struct InitializeResponse { /// authentication method surface. Supplying one or more valid methods means /// the agent MUST support both `auth/login` and `auth/logout`. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub auth_methods: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -145,7 +148,7 @@ pub struct InitializeResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -198,7 +201,8 @@ impl InitializeResponse { /// title for UI representation. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Implementation { @@ -210,7 +214,7 @@ pub struct Implementation { /// /// If not provided, the name should be used for display. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Version of the implementation. Can be displayed to the user or used @@ -222,7 +226,7 @@ pub struct Implementation { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -273,8 +277,9 @@ impl Implementation { /// when `authMethods` was omitted or empty. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGIN_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGIN_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LoginAuthRequest { @@ -287,7 +292,7 @@ pub struct LoginAuthRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -318,8 +323,9 @@ impl LoginAuthRequest { /// Response to the `auth/login` method. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGIN_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGIN_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LoginAuthResponse { @@ -329,7 +335,7 @@ pub struct LoginAuthResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -365,8 +371,9 @@ impl LoginAuthResponse { /// when `authMethods` was omitted or empty. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGOUT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGOUT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LogoutAuthRequest { @@ -376,7 +383,7 @@ pub struct LogoutAuthRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -404,8 +411,9 @@ impl LogoutAuthRequest { /// Response to the `auth/logout` method. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGOUT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = AUTH_LOGOUT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct LogoutAuthResponse { @@ -415,7 +423,7 @@ pub struct LogoutAuthResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -447,7 +455,8 @@ impl LogoutAuthResponse { /// `initialize` response. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AgentAuthCapabilities { @@ -457,7 +466,7 @@ pub struct AgentAuthCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -483,7 +492,8 @@ impl AgentAuthCapabilities { } /// Typed identifier used for auth method values on the wire. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -500,7 +510,8 @@ impl AuthMethodId { /// Describes an available authentication method. /// /// The `type` field acts as the discriminator in the serialized JSON form. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum AuthMethod { @@ -582,9 +593,10 @@ impl AuthMethod { /// Custom or future authentication method payload. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_auth_method_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_auth_method_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherAuthMethod { @@ -601,7 +613,7 @@ pub struct OtherAuthMethod { pub name: String, /// Optional description providing more details about this authentication method. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -610,7 +622,7 @@ pub struct OtherAuthMethod { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -709,6 +721,7 @@ fn is_known_auth_method_type(type_: &str) -> bool { } } +#[cfg(feature = "schemars")] fn other_auth_method_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -726,7 +739,8 @@ fn other_auth_method_schema(schema: &mut Schema) { /// The `type` discriminator value is `agent`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthMethodAgent { @@ -736,7 +750,7 @@ pub struct AuthMethodAgent { pub name: String, /// Optional description providing more details about this authentication method. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -745,7 +759,7 @@ pub struct AuthMethodAgent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -796,7 +810,8 @@ impl AuthMethodAgent { #[cfg(feature = "unstable_auth_methods")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthMethodTerminal { @@ -806,19 +821,19 @@ pub struct AuthMethodTerminal { pub name: String, /// Optional description providing more details about this authentication method. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Additional arguments to append to the configured agent invocation for terminal auth. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub args: Vec, /// Additional environment variables to set on the configured agent invocation for terminal auth. /// Names MUST be unique. These values override same-named variables in the /// base launch configuration. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub env: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -827,7 +842,7 @@ pub struct AuthMethodTerminal { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -890,8 +905,9 @@ impl AuthMethodTerminal { /// See protocol docs: [Creating a Session](https://agentclientprotocol.com/protocol/session-setup#creating-a-session) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NewSessionRequest { @@ -903,12 +919,12 @@ pub struct NewSessionRequest { /// remains the base for relative paths. When omitted or empty, no /// additional roots are activated for the new session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// List of MCP (Model Context Protocol) servers the agent should connect to. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub mcp_servers: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -917,7 +933,7 @@ pub struct NewSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -970,8 +986,9 @@ impl NewSessionRequest { /// See protocol docs: [Creating a Session](https://agentclientprotocol.com/protocol/session-setup#creating-a-session) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_NEW_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NewSessionResponse { @@ -981,7 +998,7 @@ pub struct NewSessionResponse { pub session_id: SessionId, /// Initial session configuration options. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub config_options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -990,7 +1007,7 @@ pub struct NewSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1041,8 +1058,9 @@ impl NewSessionResponse { #[cfg(feature = "unstable_session_fork")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ForkSessionRequest { @@ -1056,12 +1074,12 @@ pub struct ForkSessionRequest { /// this is the complete resulting additional-root list for the forked /// session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// List of MCP servers to connect to for this session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub mcp_servers: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1070,7 +1088,7 @@ pub struct ForkSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1128,8 +1146,9 @@ impl ForkSessionRequest { #[cfg(feature = "unstable_session_fork")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_FORK_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ForkSessionResponse { @@ -1137,7 +1156,7 @@ pub struct ForkSessionResponse { pub session_id: SessionId, /// Initial session configuration options. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub config_options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1146,7 +1165,7 @@ pub struct ForkSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1191,8 +1210,9 @@ impl ForkSessionResponse { /// history according to `replayFrom`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ResumeSessionRequest { @@ -1207,12 +1227,12 @@ pub struct ResumeSessionRequest { /// session. It may differ from any previously used or reported list as long as /// the request `cwd` matches the session's `cwd`. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// List of MCP servers to connect to for this session. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub mcp_servers: Vec, /// Inclusive cursor describing where conversation replay should begin. @@ -1223,7 +1243,7 @@ pub struct ResumeSessionRequest { /// `{ "type": "start" }` means the Agent should replay the whole /// conversation before responding. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub replay_from: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1232,7 +1252,7 @@ pub struct ResumeSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1298,7 +1318,8 @@ impl ResumeSessionRequest { /// Inclusive cursor describing where replayed session history should begin. /// /// Replay includes the position identified by the cursor. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum ReplayFrom { @@ -1326,7 +1347,8 @@ impl From for ReplayFrom { /// Inclusive replay cursor requesting replay from the start of the conversation. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ReplayFromStart { @@ -1336,7 +1358,7 @@ pub struct ReplayFromStart { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1364,9 +1386,10 @@ impl ReplayFromStart { /// Custom or future replay cursor payload. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_replay_from_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_replay_from_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherReplayFrom { @@ -1383,7 +1406,7 @@ pub struct OtherReplayFrom { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1452,6 +1475,7 @@ fn is_known_replay_from_type(type_: &str) -> bool { matches!(type_, "start") } +#[cfg(feature = "schemars")] fn other_replay_from_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators(schema, "type", &["start"]); } @@ -1459,14 +1483,15 @@ fn other_replay_from_schema(schema: &mut Schema) { /// Response from resuming an existing session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_RESUME_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ResumeSessionResponse { /// Initial session configuration options. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub config_options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1475,7 +1500,7 @@ pub struct ResumeSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1516,8 +1541,9 @@ impl ResumeSessionResponse { /// with the session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseSessionRequest { @@ -1529,7 +1555,7 @@ pub struct CloseSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1560,8 +1586,9 @@ impl CloseSessionRequest { /// Response from closing a session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseSessionResponse { @@ -1571,7 +1598,7 @@ pub struct CloseSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1599,7 +1626,8 @@ impl CloseSessionResponse { // List sessions /// An opaque cursor used to paginate `session/list` results. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &str, &mut str, Box, Cow<'_, str>)] #[non_exhaustive] @@ -1646,8 +1674,9 @@ impl_session_list_cursor_option_conversion!(Cow<'_, str>); /// Request parameters for listing existing sessions. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListSessionsRequest { @@ -1663,7 +1692,7 @@ pub struct ListSessionsRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1705,19 +1734,20 @@ impl ListSessionsRequest { /// Response from listing sessions. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListSessionsResponse { /// Array of session information objects. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub sessions: Vec, /// Opaque cursor token. If present, pass this in the next request's cursor parameter /// to fetch the next page. If absent, there are no more results. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub next_cursor: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1726,7 +1756,7 @@ pub struct ListSessionsResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1769,8 +1799,9 @@ impl ListSessionsResponse { /// Only available if the Agent supports the `session.delete` capability. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DeleteSessionRequest { @@ -1782,7 +1813,7 @@ pub struct DeleteSessionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1813,8 +1844,9 @@ impl DeleteSessionRequest { /// Response from deleting a session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_DELETE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DeleteSessionResponse { @@ -1824,7 +1856,7 @@ pub struct DeleteSessionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1852,7 +1884,8 @@ impl DeleteSessionResponse { /// Information about a session returned by session/list #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionInfo { @@ -1866,18 +1899,18 @@ pub struct SessionInfo { /// by the Agent. Omitted and empty values are equivalent: the response /// reports no additional roots. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub additional_directories: Vec, /// Human-readable title for the session #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// RFC 3339 timestamp of last activity. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true, "format" = "date-time"))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "format" = "date-time")))] #[serde(default)] pub updated_at: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1886,7 +1919,7 @@ pub struct SessionInfo { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1946,7 +1979,8 @@ impl SessionInfo { // Session config options /// Unique identifier for a session configuration option. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From, Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From, Display)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -1961,7 +1995,8 @@ impl SessionConfigId { } /// Unique identifier for a session configuration option value. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From, Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From, Display)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -1976,7 +2011,8 @@ impl SessionConfigValueId { } /// Unique identifier for a session configuration option value group. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From, Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From, Display)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -1993,7 +2029,8 @@ impl SessionConfigGroupId { /// A possible value for a session configuration option. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigSelectOption { @@ -2003,7 +2040,7 @@ pub struct SessionConfigSelectOption { pub name: String, /// Optional description for this option value. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2012,7 +2049,7 @@ pub struct SessionConfigSelectOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2052,7 +2089,8 @@ impl SessionConfigSelectOption { /// A group of possible values for a session configuration option. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigSelectGroup { @@ -2062,7 +2100,7 @@ pub struct SessionConfigSelectGroup { pub name: String, /// The set of option values in this group. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -2070,7 +2108,7 @@ pub struct SessionConfigSelectGroup { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2105,7 +2143,8 @@ impl SessionConfigSelectGroup { } /// Possible values for a session configuration option. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(untagged)] #[non_exhaustive] pub enum SessionConfigSelectOptions { @@ -2129,7 +2168,8 @@ impl From> for SessionConfigSelectOptions { /// A single-value selector (dropdown) session configuration option payload. #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigSelect { @@ -2155,7 +2195,8 @@ impl SessionConfigSelect { /// A boolean on/off toggle session configuration option payload. #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigBoolean { @@ -2180,7 +2221,8 @@ impl SessionConfigBoolean { /// /// Category names beginning with `_` are free for custom use, like other ACP extension methods. /// Category names that do not begin with `_` are reserved for the ACP spec. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum SessionConfigOptionCategory { @@ -2202,7 +2244,8 @@ pub enum SessionConfigOptionCategory { } /// Type-specific session configuration option payload. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum SessionConfigKind { @@ -2224,9 +2267,10 @@ pub enum SessionConfigKind { } /// Custom or future session configuration option payload. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_session_config_kind_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_session_config_kind_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherSessionConfigKind { @@ -2282,6 +2326,7 @@ fn is_known_session_config_kind_type(type_: &str) -> bool { matches!(type_, "select" | "boolean") } +#[cfg(feature = "schemars")] fn other_session_config_kind_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators(schema, "type", &["select", "boolean"]); } @@ -2289,7 +2334,8 @@ fn other_session_config_kind_schema(schema: &mut Schema) { /// A session configuration option selector and its current state. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionConfigOption { @@ -2299,12 +2345,12 @@ pub struct SessionConfigOption { pub name: String, /// Optional description for the Client to display to the user. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Optional semantic category for this option (UX only). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub category: Option, /// Type-specific fields for this configuration option. @@ -2316,7 +2362,7 @@ pub struct SessionConfigOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2403,7 +2449,8 @@ impl SessionConfigOption { /// kind. For example every option kind that picks from a list of ids /// (`select`, `radio`, …) would use [`Id`](Self::Id), while a future freeform /// text option would get its own variant. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum SessionConfigOptionValue { @@ -2427,9 +2474,10 @@ pub enum SessionConfigOptionValue { } /// Custom or future session configuration option value payload. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_session_config_option_value_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_session_config_option_value_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherSessionConfigOptionValue { @@ -2544,6 +2592,7 @@ fn is_known_session_config_option_value_type(type_: &str) -> bool { matches!(type_, "id" | "boolean") } +#[cfg(feature = "schemars")] fn other_session_config_option_value_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators(schema, "type", &["id", "boolean"]); } @@ -2604,8 +2653,9 @@ impl From<&str> for SessionConfigOptionValue { /// Request parameters for setting a session configuration option. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetSessionConfigOptionRequest { @@ -2624,7 +2674,7 @@ pub struct SetSessionConfigOptionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2661,14 +2711,15 @@ impl SetSessionConfigOptionRequest { /// Response to `session/set_config_option` method. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_SET_CONFIG_OPTION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetSessionConfigOptionResponse { /// The full set of configuration options and their current values. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub config_options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -2676,7 +2727,7 @@ pub struct SetSessionConfigOptionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2712,7 +2763,8 @@ impl SetSessionConfigOptionResponse { /// processing prompts. /// /// See protocol docs: [MCP Servers](https://agentclientprotocol.com/protocol/session-setup#mcp-servers) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum McpServer { @@ -2748,9 +2800,10 @@ pub enum McpServer { } /// Custom or future MCP server transport payload. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_mcp_server_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_mcp_server_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherMcpServer { @@ -2810,6 +2863,7 @@ fn is_known_mcp_server_type(type_: &str) -> bool { } } +#[cfg(feature = "schemars")] fn other_mcp_server_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -2826,14 +2880,15 @@ fn other_mcp_server_schema(schema: &mut Schema) { /// HTTP transport configuration for MCP. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpServerHttp { /// Human-readable name identifying this MCP server. pub name: String, /// URL to the MCP server. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub url: String, /// HTTP headers to set when making requests to the MCP server. #[serde(default, skip_serializing_if = "Vec::is_empty")] @@ -2844,7 +2899,7 @@ pub struct McpServerHttp { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2891,7 +2946,8 @@ impl McpServerHttp { /// used by `mcp/connect` to route connection requests back to the component that declared the /// server. #[cfg(feature = "unstable_mcp_over_acp")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -2917,7 +2973,8 @@ impl McpServerAcpId { #[serde_as] #[skip_serializing_none] #[cfg(feature = "unstable_mcp_over_acp")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpServerAcp { @@ -2934,7 +2991,7 @@ pub struct McpServerAcp { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2967,7 +3024,8 @@ impl McpServerAcp { /// Stdio transport configuration for MCP. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpServerStdio { @@ -2987,7 +3045,7 @@ pub struct McpServerStdio { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3035,7 +3093,8 @@ impl McpServerStdio { /// An environment variable to set when launching a process. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct EnvVariable { @@ -3049,7 +3108,7 @@ pub struct EnvVariable { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3081,7 +3140,8 @@ impl EnvVariable { /// An HTTP header to set when making requests to the MCP server. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct HttpHeader { @@ -3095,7 +3155,7 @@ pub struct HttpHeader { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3133,8 +3193,9 @@ impl HttpHeader { /// See protocol docs: [User Message](https://agentclientprotocol.com/protocol/prompt-lifecycle#1-user-message) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PromptRequest { @@ -3160,7 +3221,7 @@ pub struct PromptRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3197,8 +3258,9 @@ impl PromptRequest { /// See protocol docs: [Prompt Accepted](https://agentclientprotocol.com/protocol/prompt-lifecycle#2-prompt-accepted) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_PROMPT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PromptResponse { @@ -3208,7 +3270,7 @@ pub struct PromptResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3236,7 +3298,8 @@ impl PromptResponse { /// Reasons why an agent stops active session work. /// /// See protocol docs: [Stop Reasons](https://agentclientprotocol.com/protocol/prompt-lifecycle#stop-reasons) -#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum StopReason { @@ -3274,7 +3337,8 @@ pub enum StopReason { #[cfg(feature = "unstable_end_turn_token_usage")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Usage { @@ -3286,17 +3350,17 @@ pub struct Usage { pub output_tokens: u64, /// Total thought/reasoning tokens #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub thought_tokens: Option, /// Total cache read tokens. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cached_read_tokens: Option, /// Total cache write tokens. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cached_write_tokens: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -3305,7 +3369,7 @@ pub struct Usage { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3373,7 +3437,8 @@ impl Usage { /// Protocol names beginning with `_` are free for custom use, like other ACP extension methods. /// Protocol names that do not begin with `_` are reserved for the ACP spec. #[cfg(feature = "unstable_llm_providers")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] #[expect(clippy::doc_markdown)] @@ -3406,14 +3471,15 @@ pub enum LlmProtocol { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ProviderCurrentConfig { /// Protocol currently used by this provider. pub api_type: LlmProtocol, /// Base URL currently used by this provider. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub base_url: String, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -3421,7 +3487,7 @@ pub struct ProviderCurrentConfig { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3457,7 +3523,8 @@ impl ProviderCurrentConfig { /// /// Unique identifier for a configurable LLM provider. #[cfg(feature = "unstable_llm_providers")] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -3480,7 +3547,8 @@ impl ProviderId { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ProviderInfo { @@ -3488,7 +3556,7 @@ pub struct ProviderInfo { pub provider_id: ProviderId, /// Supported protocol types for this provider. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub supported: Vec, /// Whether this provider is mandatory and cannot be disabled via `providers/disable`. /// If true, clients must not call `providers/disable` for this provider ID. @@ -3503,7 +3571,7 @@ pub struct ProviderInfo { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3548,8 +3616,9 @@ impl ProviderInfo { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListProvidersRequest { @@ -3559,7 +3628,7 @@ pub struct ListProvidersRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3593,8 +3662,9 @@ impl ListProvidersRequest { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_LIST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ListProvidersResponse { @@ -3606,7 +3676,7 @@ pub struct ListProvidersResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3645,8 +3715,9 @@ impl ListProvidersResponse { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetProviderRequest { @@ -3655,7 +3726,7 @@ pub struct SetProviderRequest { /// Protocol type for this provider. pub api_type: LlmProtocol, /// Base URL for requests sent through this provider. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub base_url: String, /// Full headers map for this provider. /// May include authorization, routing, or other integration-specific headers. @@ -3667,7 +3738,7 @@ pub struct SetProviderRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3719,8 +3790,9 @@ impl SetProviderRequest { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_SET_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SetProviderResponse { @@ -3730,7 +3802,7 @@ pub struct SetProviderResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3764,8 +3836,9 @@ impl SetProviderResponse { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DisableProviderRequest { @@ -3777,7 +3850,7 @@ pub struct DisableProviderRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3814,8 +3887,9 @@ impl DisableProviderRequest { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = PROVIDERS_DISABLE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DisableProviderResponse { @@ -3825,7 +3899,7 @@ pub struct DisableProviderResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -3861,7 +3935,8 @@ impl DisableProviderResponse { /// See protocol docs: [Agent Capabilities](https://agentclientprotocol.com/protocol/initialization#agent-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AgentCapabilities { @@ -3872,7 +3947,7 @@ pub struct AgentCapabilities { /// baseline session methods: `session/new`, `session/prompt`, /// `session/cancel`, and `session/update`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub session: Option, /// Authentication-related extension capabilities supported by the agent. @@ -3882,7 +3957,7 @@ pub struct AgentCapabilities { /// for `auth/login` or `auth/logout`; those methods are advertised by a /// non-empty `authMethods` list in the `initialize` response. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub auth: Option, /// **UNSTABLE** @@ -3895,7 +3970,7 @@ pub struct AgentCapabilities { /// Supplying `{}` means the agent supports provider configuration methods. #[cfg(feature = "unstable_llm_providers")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub providers: Option, /// **UNSTABLE** @@ -3908,7 +3983,7 @@ pub struct AgentCapabilities { /// for NES methods. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub nes: Option, /// **UNSTABLE** @@ -3918,7 +3993,7 @@ pub struct AgentCapabilities { /// The position encoding selected by the agent from the client's supported encodings. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub position_encoding: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -3927,7 +4002,7 @@ pub struct AgentCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4020,7 +4095,8 @@ impl AgentCapabilities { #[cfg(feature = "unstable_llm_providers")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct ProvidersCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4029,7 +4105,7 @@ pub struct ProvidersCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4068,7 +4144,8 @@ impl ProvidersCapabilities { /// See protocol docs: [Session Capabilities](https://agentclientprotocol.com/protocol/initialization#session-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionCapabilities { @@ -4078,7 +4155,7 @@ pub struct SessionCapabilities { /// prompt extensions beyond the baseline text and resource-link content /// required by `session/prompt`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub prompt: Option, /// MCP capabilities supported by the agent for session lifecycle requests. @@ -4086,7 +4163,7 @@ pub struct SessionCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise MCP /// server transport support for sessions. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mcp: Option, /// Whether the agent supports `session/delete`. @@ -4094,7 +4171,7 @@ pub struct SessionCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports deleting sessions from `session/list`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub delete: Option, /// Whether the agent supports `additionalDirectories` on supported session lifecycle requests. @@ -4106,7 +4183,7 @@ pub struct SessionCapabilities { /// Agents may return `SessionInfo.additionalDirectories` to report the /// complete ordered additional-root list associated with a listed session. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub additional_directories: Option, /// **UNSTABLE** @@ -4119,7 +4196,7 @@ pub struct SessionCapabilities { /// Supplying `{}` means the agent supports forking sessions. #[cfg(feature = "unstable_session_fork")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub fork: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4128,7 +4205,7 @@ pub struct SessionCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4217,7 +4294,8 @@ impl SessionCapabilities { /// Supplying `{}` means the agent supports deleting sessions from `session/list`. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionDeleteCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4226,7 +4304,7 @@ pub struct SessionDeleteCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4259,7 +4337,8 @@ impl SessionDeleteCapabilities { /// complete ordered additional-root list associated with a listed session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionAdditionalDirectoriesCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4268,7 +4347,7 @@ pub struct SessionAdditionalDirectoriesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4303,7 +4382,8 @@ impl SessionAdditionalDirectoriesCapabilities { #[cfg(feature = "unstable_session_fork")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct SessionForkCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4312,7 +4392,7 @@ pub struct SessionForkCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4352,7 +4432,8 @@ impl SessionForkCapabilities { /// See protocol docs: [Prompt Capabilities](https://agentclientprotocol.com/protocol/initialization#prompt-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PromptCapabilities { @@ -4361,7 +4442,7 @@ pub struct PromptCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports image content in prompts. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub image: Option, /// Agent supports [`ContentBlock::Audio`]. @@ -4369,7 +4450,7 @@ pub struct PromptCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports audio content in prompts. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub audio: Option, /// Agent supports embedded context in `session/prompt` requests. @@ -4380,7 +4461,7 @@ pub struct PromptCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports embedded context in prompts. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub embedded_context: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4389,7 +4470,7 @@ pub struct PromptCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4455,7 +4536,8 @@ impl PromptCapabilities { /// Supplying `{}` means the agent supports image content in prompts. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct PromptImageCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4464,7 +4546,7 @@ pub struct PromptImageCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4494,7 +4576,8 @@ impl PromptImageCapabilities { /// Supplying `{}` means the agent supports audio content in prompts. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct PromptAudioCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4503,7 +4586,7 @@ pub struct PromptAudioCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4533,7 +4616,8 @@ impl PromptAudioCapabilities { /// Supplying `{}` means the agent supports embedded context in prompts. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct PromptEmbeddedContextCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4542,7 +4626,7 @@ pub struct PromptEmbeddedContextCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4570,7 +4654,8 @@ impl PromptEmbeddedContextCapabilities { /// MCP capabilities supported by the agent for session lifecycle requests. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct McpCapabilities { @@ -4579,7 +4664,7 @@ pub struct McpCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports stdio MCP server transports. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub stdio: Option, /// Agent supports [`McpServer::Http`]. @@ -4587,7 +4672,7 @@ pub struct McpCapabilities { /// Optional. Omitted or `null` both mean the agent does not advertise support. /// Supplying `{}` means the agent supports HTTP MCP server transports. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub http: Option, /// **UNSTABLE** @@ -4600,7 +4685,7 @@ pub struct McpCapabilities { /// Supplying `{}` means the agent supports ACP MCP server transports. #[cfg(feature = "unstable_mcp_over_acp")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub acp: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4609,7 +4694,7 @@ pub struct McpCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4674,7 +4759,8 @@ impl McpCapabilities { /// Supplying `{}` means the agent supports stdio MCP server transports. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct McpStdioCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4683,7 +4769,7 @@ pub struct McpStdioCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4713,7 +4799,8 @@ impl McpStdioCapabilities { /// Supplying `{}` means the agent supports HTTP MCP server transports. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct McpHttpCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4722,7 +4809,7 @@ pub struct McpHttpCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4757,7 +4844,8 @@ impl McpHttpCapabilities { #[cfg(feature = "unstable_mcp_over_acp")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct McpAcpCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -4766,7 +4854,7 @@ pub struct McpAcpCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -4797,8 +4885,9 @@ impl McpAcpCapabilities { /// See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/prompt-lifecycle#cancellation) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = SESSION_CANCEL_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = SESSION_CANCEL_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CancelSessionNotification { @@ -4810,7 +4899,7 @@ pub struct CancelSessionNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -5001,9 +5090,10 @@ pub(crate) const AUTH_LOGOUT_METHOD_NAME: &str = "auth/logout"; /// to use this directly. /// /// This enum encompasses all method calls from client to agent. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum ClientRequest { /// Establishes the connection with a client and negotiates protocol capabilities. @@ -5204,9 +5294,10 @@ impl ClientRequest { /// to use this directly - the responses are handled automatically by the connection. /// /// These are responses to the corresponding `ClientRequest` variants. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum AgentResponse { /// Successful result returned for a `initialize` request. @@ -5263,9 +5354,10 @@ pub enum AgentResponse { /// to use this directly. /// /// Notifications do not expect a response. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum ClientNotification { /// Cancels ongoing operations for a session. @@ -5602,6 +5694,7 @@ mod test_serialization { } } + #[cfg(feature = "schemars")] #[test] fn mcp_server_http_schema_marks_url_as_uri() { let schema = serde_json::to_value(schemars::schema_for!(McpServerHttp)).unwrap(); diff --git a/agent-client-protocol-schema/src/v2/client.rs b/agent-client-protocol-schema/src/v2/client.rs index 9fe2d35fc..f2fb4025e 100644 --- a/agent-client-protocol-schema/src/v2/client.rs +++ b/agent-client-protocol-schema/src/v2/client.rs @@ -6,7 +6,8 @@ use std::{collections::BTreeMap, sync::Arc}; use derive_more::{Display, From}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -44,8 +45,9 @@ use super::{ClientNesCapabilities, PositionEncodingKind}; /// See protocol docs: [Agent Reports Output](https://agentclientprotocol.com/protocol/prompt-lifecycle#3-agent-reports-output) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "client", "x-method" = SESSION_UPDATE_NOTIFICATION))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = SESSION_UPDATE_NOTIFICATION)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct UpdateSessionNotification { @@ -59,7 +61,7 @@ pub struct UpdateSessionNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -93,7 +95,8 @@ impl UpdateSessionNotification { /// These updates report messages, progress, and other session activity. /// /// See protocol docs: [Agent Reports Output](https://agentclientprotocol.com/protocol/prompt-lifecycle#3-agent-reports-output) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "sessionUpdate", rename_all = "snake_case")] #[non_exhaustive] pub enum SessionUpdate { @@ -167,9 +170,10 @@ pub enum SessionUpdate { /// This preserves the unknown `sessionUpdate` discriminator and the rest of the /// update object for clients that store, replay, proxy, or forward session /// history. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq)] -#[schemars(inline)] -#[schemars(transform = other_session_update_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_session_update_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherSessionUpdate { @@ -252,6 +256,7 @@ fn is_known_session_update(session_update: &str) -> bool { ) } +#[cfg(feature = "schemars")] fn other_session_update_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -282,13 +287,14 @@ fn other_session_update_schema(schema: &mut Schema) { /// Session configuration options have been updated. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ConfigOptionUpdate { /// The full set of configuration options and their current values. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub config_options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -296,7 +302,7 @@ pub struct ConfigOptionUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -333,18 +339,19 @@ impl ConfigOptionUpdate { /// corresponding value. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SessionInfoUpdate { /// Human-readable title for the session. Set to null to clear. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub title: MaybeUndefined, /// RFC 3339 timestamp of last activity. Set to null to clear. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true, "format" = "date-time"))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "format" = "date-time")))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub updated_at: MaybeUndefined, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -353,7 +360,7 @@ pub struct SessionInfoUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde( rename = "_meta", default, @@ -398,7 +405,8 @@ impl SessionInfoUpdate { /// Context window and cost update for a session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct UsageUpdate { @@ -408,7 +416,7 @@ pub struct UsageUpdate { pub size: u64, /// Cumulative session cost (optional). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cost: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -417,7 +425,7 @@ pub struct UsageUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -458,7 +466,8 @@ impl UsageUpdate { /// /// Background activity can continue and emit other `session/update` notifications /// while `idle`. Those notifications do not change this state. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "state", rename_all = "snake_case")] #[non_exhaustive] pub enum StateUpdate { @@ -480,7 +489,8 @@ pub enum StateUpdate { /// Foreground work is in progress. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RunningStateUpdate { @@ -490,7 +500,7 @@ pub struct RunningStateUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -518,7 +528,8 @@ impl RunningStateUpdate { /// The agent is ready to process a new prompt. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct IdleStateUpdate { @@ -527,7 +538,7 @@ pub struct IdleStateUpdate { /// Optional. Omitted or `null` both mean the agent is not reporting a stop reason. /// Agents SHOULD include this when the idle transition ends foreground work. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub stop_reason: Option, /// **UNSTABLE** @@ -540,7 +551,7 @@ pub struct IdleStateUpdate { /// usage for this state update. #[cfg(feature = "unstable_end_turn_token_usage")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub usage: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -549,7 +560,7 @@ pub struct IdleStateUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -596,7 +607,8 @@ impl IdleStateUpdate { /// Foreground work is blocked on user action. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RequiresActionStateUpdate { @@ -606,7 +618,7 @@ pub struct RequiresActionStateUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -635,9 +647,10 @@ impl RequiresActionStateUpdate { /// /// This preserves the unknown `state` discriminator and the rest of the state /// object for clients that store, replay, proxy, or forward session history. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq)] -#[schemars(inline)] -#[schemars(transform = other_state_update_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_state_update_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherStateUpdate { @@ -692,6 +705,7 @@ fn is_known_state_update(state: &str) -> bool { matches!(state, "running" | "idle" | "requires_action") } +#[cfg(feature = "schemars")] fn other_state_update_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -703,14 +717,15 @@ fn other_state_update_schema(schema: &mut Schema) { /// Cost information for a session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Cost { /// Total cumulative cost for session. pub amount: f64, /// ISO 4217 currency code (e.g., "USD", "EUR"). - #[schemars(pattern(r"^[A-Z]{3}$"))] + #[cfg_attr(feature = "schemars", schemars(pattern(r"^[A-Z]{3}$")))] pub currency: String, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -718,7 +733,7 @@ pub struct Cost { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -750,7 +765,8 @@ impl Cost { /// A streamed item of message content. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ContentChunk { @@ -767,7 +783,7 @@ pub struct ContentChunk { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -811,7 +827,8 @@ impl ContentChunk { /// content. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct UserMessage { @@ -819,7 +836,7 @@ pub struct UserMessage { pub message_id: MessageId, /// Complete replacement content for this message. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub content: MaybeUndefined>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -828,7 +845,7 @@ pub struct UserMessage { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde( rename = "_meta", default, @@ -882,7 +899,8 @@ impl UserMessage { /// content. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AgentMessage { @@ -890,7 +908,7 @@ pub struct AgentMessage { pub message_id: MessageId, /// Complete replacement content for this message. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub content: MaybeUndefined>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -899,7 +917,7 @@ pub struct AgentMessage { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde( rename = "_meta", default, @@ -953,7 +971,8 @@ impl AgentMessage { /// content. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AgentThought { @@ -961,7 +980,7 @@ pub struct AgentThought { pub message_id: MessageId, /// Complete replacement content for this thought message. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub content: MaybeUndefined>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -970,7 +989,7 @@ pub struct AgentThought { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde( rename = "_meta", default, @@ -1010,7 +1029,8 @@ impl AgentThought { } /// Unique identifier for a message within a session. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -1027,13 +1047,14 @@ impl MessageId { /// Available commands are ready or have changed #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AvailableCommandsUpdate { /// Commands the agent can execute. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub available_commands: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -1041,7 +1062,7 @@ pub struct AvailableCommandsUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1072,7 +1093,8 @@ impl AvailableCommandsUpdate { /// Information about a command. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AvailableCommand { @@ -1082,7 +1104,7 @@ pub struct AvailableCommand { pub description: String, /// Input for the command if required #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub input: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1091,7 +1113,7 @@ pub struct AvailableCommand { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1129,7 +1151,8 @@ impl AvailableCommand { } /// The input specification for a command. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum AvailableCommandInput { @@ -1151,9 +1174,10 @@ pub enum AvailableCommandInput { } /// Custom or future command input specification. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_available_command_input_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_available_command_input_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherAvailableCommandInput { @@ -1210,6 +1234,7 @@ fn is_known_available_command_input_type(type_: &str) -> bool { KNOWN_AVAILABLE_COMMAND_INPUT_TYPES.contains(&type_) } +#[cfg(feature = "schemars")] fn other_available_command_input_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -1221,7 +1246,8 @@ fn other_available_command_input_schema(schema: &mut Schema) { /// All text that was typed after the command name is provided as input. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TextCommandInput { @@ -1233,7 +1259,7 @@ pub struct TextCommandInput { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1270,8 +1296,9 @@ impl TextCommandInput { /// See protocol docs: [Requesting Permission](https://agentclientprotocol.com/protocol/tool-calls#requesting-permission) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RequestPermissionRequest { @@ -1288,7 +1315,7 @@ pub struct RequestPermissionRequest { /// subject's displayed content. Omitted or `null` both mean no separate /// permission description was provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Optional structured context about the operation requiring permission. @@ -1298,7 +1325,7 @@ pub struct RequestPermissionRequest { pub subject: Option, /// Available permission options for the user to choose from. /// Must contain at least one option. - #[schemars(length(min = 1))] + #[cfg_attr(feature = "schemars", schemars(length(min = 1)))] pub options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -1306,7 +1333,7 @@ pub struct RequestPermissionRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1357,7 +1384,8 @@ impl RequestPermissionRequest { } /// The operation requiring permission. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum RequestPermissionSubject { @@ -1398,7 +1426,8 @@ impl From for RequestPermissionSubject { } /// Permission request details for a tool call. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCallPermissionSubject { @@ -1417,7 +1446,8 @@ impl ToolCallPermissionSubject { /// Permission request details for a command. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CommandPermissionSubject { @@ -1427,12 +1457,12 @@ pub struct CommandPermissionSubject { pub cwd: AbsolutePath, /// The associated tool call, when known. Omitted and `null` are equivalent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub tool_call_id: Option, /// The associated terminal, when already known. Omitted and `null` are equivalent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub terminal_id: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1441,7 +1471,7 @@ pub struct CommandPermissionSubject { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1483,9 +1513,10 @@ impl CommandPermissionSubject { } /// Custom or future permission subject payload. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq)] -#[schemars(inline)] -#[schemars(transform = other_request_permission_subject_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_request_permission_subject_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherRequestPermissionSubject { @@ -1540,6 +1571,7 @@ fn is_known_request_permission_subject_type(type_: &str) -> bool { matches!(type_, "tool_call" | "command") } +#[cfg(feature = "schemars")] fn other_request_permission_subject_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -1551,7 +1583,8 @@ fn other_request_permission_subject_schema(schema: &mut Schema) { /// An option presented to the user when requesting permission. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PermissionOption { @@ -1567,7 +1600,7 @@ pub struct PermissionOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1602,7 +1635,8 @@ impl PermissionOption { } /// Unique identifier for a permission option. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -1619,7 +1653,8 @@ impl PermissionOptionId { /// The type of permission option being presented to the user. /// /// Helps clients choose appropriate icons and UI treatment. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum PermissionOptionKind { @@ -1643,8 +1678,9 @@ pub enum PermissionOptionKind { /// Response to a permission request. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = SESSION_REQUEST_PERMISSION_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RequestPermissionResponse { @@ -1656,7 +1692,7 @@ pub struct RequestPermissionResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1685,7 +1721,8 @@ impl RequestPermissionResponse { } /// The outcome of a permission request. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "outcome", rename_all = "snake_case")] #[non_exhaustive] pub enum RequestPermissionOutcome { @@ -1719,9 +1756,10 @@ pub enum RequestPermissionOutcome { /// This preserves the unknown `outcome` discriminator and the rest of the /// outcome object for agents that store, replay, proxy, or forward permission /// responses. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_request_permission_outcome_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_request_permission_outcome_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherRequestPermissionOutcome { @@ -1778,6 +1816,7 @@ fn is_known_request_permission_outcome(outcome: &str) -> bool { matches!(outcome, "cancelled" | "selected") } +#[cfg(feature = "schemars")] fn other_request_permission_outcome_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -1789,7 +1828,8 @@ fn other_request_permission_outcome_schema(schema: &mut Schema) { /// The user selected one of the provided options. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SelectedPermissionOutcome { @@ -1801,7 +1841,7 @@ pub struct SelectedPermissionOutcome { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1839,7 +1879,8 @@ impl SelectedPermissionOutcome { /// See protocol docs: [Client Capabilities](https://agentclientprotocol.com/protocol/initialization#client-capabilities) #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ClientCapabilities { @@ -1855,7 +1896,7 @@ pub struct ClientCapabilities { /// authentication-method extensions. #[cfg(feature = "unstable_auth_methods")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub auth: Option, /// Elicitation capabilities supported by the client. @@ -1864,7 +1905,7 @@ pub struct ClientCapabilities { /// Optional. Omitted or `null` both mean the client does not advertise /// elicitation support. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub elicitation: Option, /// **UNSTABLE** @@ -1877,7 +1918,7 @@ pub struct ClientCapabilities { /// NES suggestion-kind extensions. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub nes: Option, /// **UNSTABLE** @@ -1887,7 +1928,7 @@ pub struct ClientCapabilities { /// The position encodings supported by the client, in order of preference. #[cfg(feature = "unstable_nes")] #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "Vec::is_empty")] pub position_encodings: Vec, @@ -1897,7 +1938,7 @@ pub struct ClientCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1976,7 +2017,8 @@ impl ClientCapabilities { #[cfg(feature = "unstable_auth_methods")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AuthCapabilities { @@ -1987,7 +2029,7 @@ pub struct AuthCapabilities { /// agent invocation in an interactive terminal. Supplying `{}` means the /// agent may include `terminal` entries in its authentication methods. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub terminal: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1996,7 +2038,7 @@ pub struct AuthCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2047,7 +2089,8 @@ impl AuthCapabilities { #[cfg(feature = "unstable_auth_methods")] #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct TerminalAuthCapabilities { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2056,7 +2099,7 @@ pub struct TerminalAuthCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2138,9 +2181,10 @@ pub(crate) const ELICITATION_COMPLETE_NOTIFICATION: &str = "elicitation/complete /// to use this directly. /// /// This enum encompasses all method calls from agent to client. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum AgentRequest { /// Requests permission from the user for an operation. @@ -2213,9 +2257,10 @@ impl AgentRequest { /// to use this directly - the responses are handled automatically by the connection. /// /// These are responses to the corresponding `AgentRequest` variants. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum ClientResponse { /// Successful result returned for a `session/request_permission` request. @@ -2241,9 +2286,10 @@ pub enum ClientResponse { /// to use this directly. /// /// Notifications do not expect a response. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum AgentNotification { /// Handles session update notifications from the agent. diff --git a/agent-client-protocol-schema/src/v2/content.rs b/agent-client-protocol-schema/src/v2/content.rs index 262ecbfc4..20ce5f919 100644 --- a/agent-client-protocol-schema/src/v2/content.rs +++ b/agent-client-protocol-schema/src/v2/content.rs @@ -12,7 +12,8 @@ use std::{borrow::Cow, collections::BTreeMap, sync::Arc}; use derive_more::{Display, From}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -20,7 +21,8 @@ use super::Meta; use crate::{IntoOption, SkipListener}; /// An Internet media type identifying the format of protocol content. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(Arc, String, &str, &mut str, Box, Cow<'_, str>)] #[non_exhaustive] @@ -79,7 +81,8 @@ impl_media_type_option_conversion!(Cow<'_, str>); /// agents to seamlessly forward content from MCP tool outputs without transformation. /// /// See protocol docs: [Content](https://agentclientprotocol.com/protocol/content) -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum ContentBlock { @@ -120,9 +123,10 @@ pub enum ContentBlock { } /// Custom or future content block payload. -#[derive(Debug, Clone, PartialEq, Serialize, JsonSchema)] -#[schemars(inline)] -#[schemars(transform = other_content_block_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_content_block_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherContentBlock { @@ -180,6 +184,7 @@ fn is_known_content_block_type(type_: &str) -> bool { ) } +#[cfg(feature = "schemars")] fn other_content_block_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -191,14 +196,15 @@ fn other_content_block_schema(schema: &mut Schema) { /// Text provided to or from an LLM. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[non_exhaustive] pub struct TextContent { /// Text payload carried by this content block. pub text: String, /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -207,7 +213,7 @@ pub struct TextContent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -252,24 +258,25 @@ impl> From for ContentBlock { /// An image provided to or from an LLM. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ImageContent { /// Base64-encoded media payload. - #[schemars(extend("contentEncoding" = "base64"))] + #[cfg_attr(feature = "schemars", schemars(extend("contentEncoding" = "base64")))] pub data: String, /// MIME type describing the encoded media payload. pub mime_type: MediaType, /// URI associated with this resource or media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] + #[cfg_attr(feature = "schemars", schemars(url))] #[serde(default)] pub uri: Option, /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -278,7 +285,7 @@ pub struct ImageContent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -326,18 +333,19 @@ impl ImageContent { /// Audio provided to or from an LLM. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AudioContent { /// Base64-encoded media payload. - #[schemars(extend("contentEncoding" = "base64"))] + #[cfg_attr(feature = "schemars", schemars(extend("contentEncoding" = "base64")))] pub data: String, /// MIME type describing the encoded media payload. pub mime_type: MediaType, /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -346,7 +354,7 @@ pub struct AudioContent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -386,14 +394,15 @@ impl AudioContent { /// The contents of a resource, embedded into a prompt or tool call result. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[non_exhaustive] pub struct EmbeddedResource { /// Embedded resource payload, either text or binary data. pub resource: EmbeddedResourceResource, /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -402,7 +411,7 @@ pub struct EmbeddedResource { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -439,7 +448,8 @@ impl EmbeddedResource { } /// Resource content that can be embedded in a message. -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(untagged)] #[non_exhaustive] pub enum EmbeddedResourceResource { @@ -452,18 +462,19 @@ pub enum EmbeddedResourceResource { /// Text-based resource contents. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TextResourceContents { /// Text payload carried by this content block. pub text: String, /// URI associated with this resource or media payload. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// MIME type describing the encoded media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -472,7 +483,7 @@ pub struct TextResourceContents { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -512,19 +523,20 @@ impl TextResourceContents { /// Binary resource contents. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct BlobResourceContents { /// Base64-encoded bytes for a binary resource payload. - #[schemars(extend("contentEncoding" = "base64"))] + #[cfg_attr(feature = "schemars", schemars(extend("contentEncoding" = "base64")))] pub blob: String, /// URI associated with this resource or media payload. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// MIME type describing the encoded media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -533,7 +545,7 @@ pub struct BlobResourceContents { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -573,43 +585,44 @@ impl BlobResourceContents { /// A resource that the server is capable of reading, included in a prompt or tool call result. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ResourceLink { /// Human-readable name shown for this protocol object. pub name: String, /// URI associated with this resource or media payload. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// Optional display title for end-user UI. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Optional human-readable details shown with this protocol object. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Optional set of sized icons that the client can display in a user interface. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub icons: Option>, /// MIME type describing the encoded media payload. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// Optional size of the linked resource in bytes, if known. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub size: Option, /// Optional annotations that help clients decide how to display or route this content. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub annotations: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -618,7 +631,7 @@ pub struct ResourceLink { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -698,16 +711,17 @@ impl ResourceLink { /// An optionally-sized icon that can be displayed in a user interface. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Icon { /// A standard URI pointing to an icon resource. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub src: String, /// Optional MIME type override if the source MIME type is missing or generic. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// Optional array of strings that specify sizes at which the icon can be used. @@ -716,12 +730,12 @@ pub struct Icon { /// /// If not provided, the client should assume that the icon can be used at any size. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub sizes: Option>, /// Optional theme this icon is designed for. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub theme: Option, } @@ -761,7 +775,8 @@ impl Icon { } /// Theme an icon is designed for. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub enum IconTheme { @@ -781,26 +796,27 @@ pub enum IconTheme { /// Optional annotations for the client. The client can use annotations to inform how objects are used or displayed #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, Default)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Default)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Annotations { /// Intended recipients for this content, such as the user or assistant. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub audience: Option>, /// Timestamp indicating when the underlying resource was last modified. /// /// Must be an RFC 3339 formatted string (e.g., "2025-01-12T15:00:58Z"). #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true, "format" = "date-time"))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "format" = "date-time")))] #[serde(default)] pub last_modified: Option, /// Relative importance of this content when clients choose what to surface. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] - #[schemars(range(min = 0, max = 1))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] + #[cfg_attr(feature = "schemars", schemars(range(min = 0, max = 1)))] #[serde(default)] pub priority: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -809,7 +825,7 @@ pub struct Annotations { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -856,7 +872,8 @@ impl Annotations { } /// The sender or recipient of messages and data in a conversation. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub enum Role { @@ -1028,6 +1045,7 @@ mod tests { assert_eq!(link, parsed); } + #[cfg(feature = "schemars")] #[test] fn annotations_priority_schema_matches_mcp_bounds() { let schema = schemars::schema_for!(Annotations); @@ -1038,6 +1056,7 @@ mod tests { assert_eq!(json["properties"]["lastModified"]["format"], "date-time"); } + #[cfg(feature = "schemars")] #[test] fn content_schema_uses_standard_string_annotations() { let image = serde_json::to_value(schemars::schema_for!(ImageContent)).unwrap(); diff --git a/agent-client-protocol-schema/src/v2/elicitation.rs b/agent-client-protocol-schema/src/v2/elicitation.rs index 176369174..32b39a163 100644 --- a/agent-client-protocol-schema/src/v2/elicitation.rs +++ b/agent-client-protocol-schema/src/v2/elicitation.rs @@ -6,19 +6,20 @@ use std::{collections::BTreeMap, sync::Arc}; use derive_more::{Display, From}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; -use super::{ - ELICITATION_COMPLETE_NOTIFICATION, ELICITATION_CREATE_METHOD_NAME, Meta, RequestId, SessionId, - ToolCallId, -}; +#[cfg(feature = "schemars")] +use super::{ELICITATION_COMPLETE_NOTIFICATION, ELICITATION_CREATE_METHOD_NAME}; +use super::{Meta, RequestId, SessionId, ToolCallId}; use crate::IntoOption; use crate::SkipListener; /// Unique identifier for an elicitation. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -33,7 +34,8 @@ impl ElicitationId { } /// String format types for string properties in elicitation schemas. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] #[non_exhaustive] pub enum StringFormat { @@ -54,7 +56,8 @@ pub enum StringFormat { } /// Type discriminator for elicitation schemas. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationSchemaType { @@ -66,7 +69,8 @@ pub enum ElicitationSchemaType { /// A titled enum option with a const value, human-readable title, and optional description. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[non_exhaustive] pub struct EnumOption { /// The constant value for this option. @@ -78,7 +82,7 @@ pub struct EnumOption { /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -89,7 +93,7 @@ pub struct EnumOption { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -134,7 +138,8 @@ impl EnumOption { /// with `"type": "string"`. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct StringPropertySchema { @@ -142,14 +147,14 @@ pub struct StringPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum string length. @@ -165,7 +170,7 @@ pub struct StringPropertySchema { /// Pattern the string must match. /// /// Optional. Omitted and `null` are equivalent and mean there is no pattern constraint. - #[schemars(extend("format" = "regex"))] + #[cfg_attr(feature = "schemars", schemars(extend("format" = "regex")))] #[serde(default)] pub pattern: Option, /// String format. @@ -177,14 +182,14 @@ pub struct StringPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// Enum values for untitled single-select enums. /// Must contain at least one value when present. /// Optional. Omitted and `null` are equivalent and mean no untitled single-select choices are /// declared by `enum`. - #[schemars(length(min = 1))] + #[cfg_attr(feature = "schemars", schemars(length(min = 1)))] #[serde(default)] #[serde(rename = "enum")] pub enum_values: Option>, @@ -192,7 +197,7 @@ pub struct StringPropertySchema { /// Must contain at least one option when present. /// Optional. Omitted and `null` are equivalent and mean no titled single-select choices are /// declared by `oneOf`. - #[schemars(length(min = 1))] + #[cfg_attr(feature = "schemars", schemars(length(min = 1)))] #[serde(default)] #[serde(rename = "oneOf")] pub one_of: Option>, @@ -204,7 +209,7 @@ pub struct StringPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -333,7 +338,8 @@ impl StringPropertySchema { /// Schema for number (floating-point) properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NumberPropertySchema { @@ -341,14 +347,14 @@ pub struct NumberPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum value (inclusive). @@ -365,7 +371,7 @@ pub struct NumberPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -376,7 +382,7 @@ pub struct NumberPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -441,7 +447,8 @@ impl NumberPropertySchema { /// Schema for integer properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct IntegerPropertySchema { @@ -449,14 +456,14 @@ pub struct IntegerPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum value (inclusive). @@ -473,7 +480,7 @@ pub struct IntegerPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -484,7 +491,7 @@ pub struct IntegerPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -549,7 +556,8 @@ impl IntegerPropertySchema { /// Schema for boolean properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct BooleanPropertySchema { @@ -557,21 +565,21 @@ pub struct BooleanPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Default value. /// /// Optional. Omitted and `null` are equivalent and mean no default value is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub default: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -582,7 +590,7 @@ pub struct BooleanPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -633,11 +641,12 @@ impl BooleanPropertySchema { /// String item schema for multi-select enum properties. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[non_exhaustive] pub struct StringMultiSelectItems { /// Allowed enum values. Must contain at least one value. - #[schemars(length(min = 1))] + #[cfg_attr(feature = "schemars", schemars(length(min = 1)))] #[serde(rename = "enum")] pub values: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -648,7 +657,7 @@ pub struct StringMultiSelectItems { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -678,11 +687,12 @@ impl StringMultiSelectItems { /// Items definition for titled multi-select enum properties. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[non_exhaustive] pub struct TitledMultiSelectItems { /// Titled enum options. Must contain at least one option. - #[schemars(length(min = 1))] + #[cfg_attr(feature = "schemars", schemars(length(min = 1)))] #[serde(rename = "anyOf")] pub options: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -693,7 +703,7 @@ pub struct TitledMultiSelectItems { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -728,9 +738,10 @@ impl TitledMultiSelectItems { /// This preserves unknown item `type` values and the rest of the `items` /// payload for clients that store, replay, proxy, or forward elicitation /// requests. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, JsonSchema)] -#[schemars(inline)] -#[schemars(transform = other_multi_select_items_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_multi_select_items_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherMultiSelectItems { @@ -787,6 +798,7 @@ fn is_known_multi_select_item_type(type_: &str) -> bool { KNOWN_MULTI_SELECT_ITEM_TYPES.contains(&type_) } +#[cfg(feature = "schemars")] fn other_multi_select_items_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -796,7 +808,8 @@ fn other_multi_select_items_schema(schema: &mut Schema) { } /// Items for a multi-select (array) property schema. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum MultiSelectItems { @@ -813,7 +826,8 @@ pub enum MultiSelectItems { /// Schema for multi-select (array) properties in an elicitation form. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct MultiSelectPropertySchema { @@ -821,14 +835,14 @@ pub struct MultiSelectPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Human-readable description. /// /// Optional. Omitted and `null` are equivalent and mean no description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// Minimum number of items to select. @@ -847,7 +861,7 @@ pub struct MultiSelectPropertySchema { /// /// Optional. Omitted and `null` are equivalent and mean no default selections are provided. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default)] pub default: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -858,7 +872,7 @@ pub struct MultiSelectPropertySchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -950,7 +964,8 @@ impl MultiSelectPropertySchema { /// Each variant corresponds to a JSON Schema `"type"` value. /// Single-select enums use the `String` variant with `enum` or `oneOf` set. /// Multi-select enums use the `Array` variant. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationPropertySchema { @@ -982,9 +997,10 @@ pub enum ElicitationPropertySchema { /// This preserves the unknown `type` discriminator and the rest of the property /// schema object for clients that store, replay, proxy, or forward elicitation /// requests. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, JsonSchema)] -#[schemars(inline)] -#[schemars(transform = other_elicitation_property_schema_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_elicitation_property_schema_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherElicitationPropertySchema { @@ -1042,6 +1058,7 @@ fn is_known_elicitation_property_schema_type(type_: &str) -> bool { KNOWN_ELICITATION_PROPERTY_SCHEMA_TYPES.contains(&type_) } +#[cfg(feature = "schemars")] fn other_elicitation_property_schema_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -1090,20 +1107,21 @@ fn default_object_type() -> ElicitationSchemaType { /// as required by the elicitation specification. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationSchema { /// Type discriminator. Always `"object"`. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(rename = "type", default = "default_object_type")] pub type_: ElicitationSchemaType, /// Optional title for the schema. /// /// Optional. Omitted and `null` are equivalent and mean no title is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub title: Option, /// Property definitions (must be primitive types). @@ -1118,7 +1136,7 @@ pub struct ElicitationSchema { /// /// Optional. Omitted and `null` are equivalent and mean no schema description is provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub description: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1129,7 +1147,7 @@ pub struct ElicitationSchema { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1267,7 +1285,8 @@ impl ElicitationSchema { /// Elicitation capabilities supported by the client. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationCapabilities { @@ -1276,7 +1295,7 @@ pub struct ElicitationCapabilities { /// Optional. Omitted and `null` are equivalent and mean form support is not advertised. /// Supplying `{}` explicitly advertises form support. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub form: Option, /// Whether the client supports URL-based elicitation. @@ -1284,7 +1303,7 @@ pub struct ElicitationCapabilities { /// Optional. Omitted or `null` both mean the client does not advertise support. /// Supplying `{}` means the client supports URL-based elicitation. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub url: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1295,7 +1314,7 @@ pub struct ElicitationCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1363,7 +1382,8 @@ impl ElicitationCapabilities { /// Supplying `{}` means the client supports form-based elicitation. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationFormCapabilities { @@ -1375,7 +1395,7 @@ pub struct ElicitationFormCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1407,7 +1427,8 @@ impl ElicitationFormCapabilities { /// Supplying `{}` means the client supports URL-based elicitation. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationUrlCapabilities { @@ -1419,7 +1440,7 @@ pub struct ElicitationUrlCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1447,7 +1468,8 @@ impl ElicitationUrlCapabilities { } /// The scope of an elicitation request, determining what context it's tied to. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(untagged)] #[non_exhaustive] pub enum ElicitationScope { @@ -1465,7 +1487,8 @@ pub enum ElicitationScope { /// during a tool call and needs to redirect it to the user. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationSessionScope { @@ -1476,7 +1499,7 @@ pub struct ElicitationSessionScope { /// Optional. Omitted and `null` are equivalent and mean the elicitation is scoped to the /// session without a specific tool call. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub tool_call_id: Option, } @@ -1501,7 +1524,8 @@ impl ElicitationSessionScope { /// Request-scoped elicitation, tied to a specific JSON-RPC request outside of a session /// (e.g., during auth/configuration phases before any session is started). -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationRequestScope { @@ -1538,8 +1562,9 @@ impl From for ElicitationScope { /// Elicitations are tied to a session (optionally a tool call) or a request. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -#[schemars(extend("x-side" = "client", "x-method" = ELICITATION_CREATE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = ELICITATION_CREATE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CreateElicitationRequest { @@ -1556,7 +1581,7 @@ pub struct CreateElicitationRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1594,7 +1619,8 @@ impl CreateElicitationRequest { } /// The mode of elicitation, determining how user input is collected. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "mode", rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationMode { @@ -1620,9 +1646,10 @@ pub enum ElicitationMode { /// This preserves the unknown `mode` discriminator and the rest of the mode /// object for clients that store, replay, proxy, or forward elicitation /// requests. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq)] -#[schemars(inline)] -#[schemars(transform = other_elicitation_mode_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_elicitation_mode_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherElicitationMode { @@ -1703,6 +1730,7 @@ fn remove_elicitation_scope_fields(fields: &mut BTreeMap, @@ -1841,7 +1872,8 @@ impl CreateElicitationResponse { } /// The user's action in response to an elicitation. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(tag = "action", rename_all = "snake_case")] #[non_exhaustive] pub enum ElicitationAction { @@ -1869,9 +1901,10 @@ pub enum ElicitationAction { /// This preserves the unknown `action` discriminator and the rest of the /// response object for agents that store, replay, proxy, or forward elicitation /// responses. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq)] -#[schemars(inline)] -#[schemars(transform = other_elicitation_action_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_elicitation_action_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherElicitationAction { @@ -1927,6 +1960,7 @@ fn is_known_elicitation_action(action: &str) -> bool { KNOWN_ELICITATION_ACTIONS.contains(&action) } +#[cfg(feature = "schemars")] fn other_elicitation_action_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -1950,7 +1984,8 @@ impl From for ElicitationAction { /// The user accepted the elicitation and provided content. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ElicitationAcceptAction { @@ -1978,7 +2013,8 @@ impl ElicitationAcceptAction { } /// Allowed wire representations for [`ElicitationContentValue`]. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(untagged)] #[non_exhaustive] pub enum ElicitationContentValue { @@ -2051,8 +2087,9 @@ impl Default for ElicitationAcceptAction { /// Notification sent by the agent when a URL-based elicitation is complete. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "client", "x-method" = ELICITATION_COMPLETE_NOTIFICATION))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = ELICITATION_COMPLETE_NOTIFICATION)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CompleteElicitationNotification { @@ -2066,7 +2103,7 @@ pub struct CompleteElicitationNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, diff --git a/agent-client-protocol-schema/src/v2/error.rs b/agent-client-protocol-schema/src/v2/error.rs index da468fa89..a7f719b01 100644 --- a/agent-client-protocol-schema/src/v2/error.rs +++ b/agent-client-protocol-schema/src/v2/error.rs @@ -12,7 +12,8 @@ use std::{fmt::Display, str}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, serde_as, skip_serializing_none}; @@ -29,7 +30,8 @@ pub type Result = std::result::Result; /// See protocol docs: [JSON-RPC Error Object](https://www.jsonrpc.org/specification#error_object) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct Error { /// A number indicating the error type that occurred. @@ -41,7 +43,7 @@ pub struct Error { /// Optional primitive or structured value that contains additional information about the error. /// This may include debugging information or context-specific details. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub data: Option, } @@ -138,52 +140,53 @@ impl Error { /// /// These codes follow the JSON-RPC 2.0 specification for standard errors /// and use the reserved range (-32000 to -32099) for protocol-specific errors. -#[derive(Clone, Copy, Deserialize, Eq, JsonSchema, PartialEq, Serialize, strum::Display)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Copy, Deserialize, Eq, PartialEq, Serialize, strum::Display)] #[cfg_attr(test, derive(strum::EnumIter))] #[serde(from = "i32", into = "i32")] -#[schemars(!from, !into)] +#[cfg_attr(feature = "schemars", schemars(!from, !into))] #[non_exhaustive] pub enum ErrorCode { // Standard errors /// Invalid JSON was received by the server. /// An error occurred on the server while parsing the JSON text. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Parse error")] ParseError, // -32700 /// The JSON sent is not a valid Request object. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Invalid request")] InvalidRequest, // -32600 /// The method does not exist or is not available. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Method not found")] MethodNotFound, // -32601 /// Invalid method parameter(s). - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Invalid params")] InvalidParams, // -32602 /// Internal JSON-RPC error. /// Reserved for implementation-defined server errors. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Internal error")] InternalError, // -32603 /// Execution of the method was aborted either due to a cancellation request from the caller or /// because of resource constraints or shutdown. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Request cancelled")] RequestCancelled, // -32800 // Custom errors /// Authentication is required before this operation can be performed. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Authentication required")] AuthRequired, // -32000 /// A given resource, such as a file, was not found. - #[schemars(transform = error_code_transform)] + #[cfg_attr(feature = "schemars", schemars(transform = error_code_transform))] #[strum(to_string = "Resource not found")] ResourceNotFound, // -32002 /// Other undefined error code. - #[schemars(untagged)] + #[cfg_attr(feature = "schemars", schemars(untagged))] #[strum(to_string = "Unknown error")] Other(i32), } @@ -226,6 +229,7 @@ impl std::fmt::Debug for ErrorCode { } } +#[cfg(feature = "schemars")] fn error_code_transform(schema: &mut Schema) { let name = schema .get("const") @@ -326,7 +330,8 @@ mod tests { #[test] fn serialize_error_code_equality() { - // Make sure this doesn't panic + // Make sure schema generation doesn't panic when enabled. + #[cfg(feature = "schemars")] let _schema = schemars::schema_for!(ErrorCode); for error in ErrorCode::iter() { assert_eq!( diff --git a/agent-client-protocol-schema/src/v2/ext.rs b/agent-client-protocol-schema/src/v2/ext.rs index f0c759d59..0cc4e9b5e 100644 --- a/agent-client-protocol-schema/src/v2/ext.rs +++ b/agent-client-protocol-schema/src/v2/ext.rs @@ -1,6 +1,5 @@ //! Extension types and constants for protocol extensibility. use derive_more::From; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::value::RawValue; use std::sync::Arc; @@ -19,7 +18,8 @@ pub type Meta = serde_json::Map; /// protocol compatibility. /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(transparent)] #[non_exhaustive] pub struct ExtRequest { @@ -29,7 +29,7 @@ pub struct ExtRequest { #[serde(skip)] // this is used for routing, but when serializing we only want the params pub method: Arc, /// Raw JSON parameters for this extension message. - #[schemars(with = "serde_json::Value")] + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub params: Arc, } @@ -49,10 +49,13 @@ impl ExtRequest { /// protocol compatibility. /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, From)] #[serde(transparent)] #[non_exhaustive] -pub struct ExtResponse(#[schemars(with = "serde_json::Value")] pub Arc); +pub struct ExtResponse( + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub Arc, +); impl ExtResponse { /// Builds [`ExtResponse`] with the required response fields set; optional fields start unset or empty. @@ -67,7 +70,8 @@ impl ExtResponse { /// while maintaining protocol compatibility. /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(transparent)] #[non_exhaustive] pub struct ExtNotification { @@ -77,7 +81,7 @@ pub struct ExtNotification { #[serde(skip)] // this is used for routing, but when serializing we only want the params pub method: Arc, /// Raw JSON parameters for this extension message. - #[schemars(with = "serde_json::Value")] + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub params: Arc, } diff --git a/agent-client-protocol-schema/src/v2/mcp.rs b/agent-client-protocol-schema/src/v2/mcp.rs index 5dbf4edb6..c80a0ab71 100644 --- a/agent-client-protocol-schema/src/v2/mcp.rs +++ b/agent-client-protocol-schema/src/v2/mcp.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::value::RawValue; use serde_with::{DefaultOnError, serde_as, skip_serializing_none}; @@ -16,7 +15,8 @@ use crate::IntoOption; /// This capability is not part of the spec yet, and may be removed or changed at any point. /// /// A unique identifier for an active MCP-over-ACP connection. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -37,9 +37,10 @@ impl McpConnectionId { /// Request parameters for `mcp/connect`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct ConnectMcpRequest { /// The ACP MCP server ID that was provided by the component declaring the MCP server. @@ -50,7 +51,7 @@ pub struct ConnectMcpRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -85,9 +86,10 @@ impl ConnectMcpRequest { /// Response to `mcp/connect`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_CONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct ConnectMcpResponse { /// The unique identifier for this MCP-over-ACP connection. @@ -98,7 +100,7 @@ pub struct ConnectMcpResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -133,9 +135,10 @@ impl ConnectMcpResponse { /// Request parameters for `mcp/message`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME)))] #[non_exhaustive] pub struct MessageMcpRequest { /// The MCP-over-ACP connection this message is sent on. @@ -153,7 +156,7 @@ pub struct MessageMcpRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -205,9 +208,10 @@ impl MessageMcpRequest { /// envelope has no `id`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME)))] #[non_exhaustive] pub struct MessageMcpNotification { /// The MCP-over-ACP connection this message is sent on. @@ -218,7 +222,7 @@ pub struct MessageMcpNotification { /// /// If omitted or set to `null`, the inner MCP message has no params. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub params: Option>, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -227,7 +231,7 @@ pub struct MessageMcpNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -276,11 +280,14 @@ impl MessageMcpNotification { /// Response to `mcp/message`. /// /// This is the inner MCP response result payload. Any JSON value is valid. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, From)] #[serde(transparent)] -#[schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "both", "x-method" = MCP_MESSAGE_METHOD_NAME)))] #[non_exhaustive] -pub struct MessageMcpResponse(#[schemars(with = "serde_json::Value")] pub Arc); +pub struct MessageMcpResponse( + #[cfg_attr(feature = "schemars", schemars(with = "serde_json::Value"))] pub Arc, +); impl MessageMcpResponse { /// Builds [`MessageMcpResponse`] with the required response fields set; optional fields start unset or empty. @@ -297,9 +304,10 @@ impl MessageMcpResponse { /// Request parameters for `mcp/disconnect`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct DisconnectMcpRequest { /// The MCP-over-ACP connection to close. @@ -310,7 +318,7 @@ pub struct DisconnectMcpRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -345,9 +353,10 @@ impl DisconnectMcpRequest { /// Response to `mcp/disconnect`. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] -#[schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "client", "x-method" = MCP_DISCONNECT_METHOD_NAME)))] #[non_exhaustive] pub struct DisconnectMcpResponse { /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -356,7 +365,7 @@ pub struct DisconnectMcpResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, diff --git a/agent-client-protocol-schema/src/v2/mod.rs b/agent-client-protocol-schema/src/v2/mod.rs index cef2c2369..8104eeef9 100644 --- a/agent-client-protocol-schema/src/v2/mod.rs +++ b/agent-client-protocol-schema/src/v2/mod.rs @@ -21,6 +21,7 @@ mod mcp; mod nes; mod plan; mod protocol_level; +#[cfg(feature = "schemars")] pub(crate) mod schema_util; mod terminal; mod tool_call; @@ -46,7 +47,6 @@ pub use tool_call::*; /// JSON-RPC response envelope using this protocol version's error type. pub type Response = crate::rpc::Response; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::{ borrow::Cow, @@ -56,7 +56,8 @@ use std::{ }; /// An absolute filesystem path used by the protocol. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -136,7 +137,8 @@ impl> crate::IntoMaybeUndefined for &T { /// allowing multiple independent interactions with the same agent. /// /// See protocol docs: [Session ID](https://agentclientprotocol.com/protocol/session-setup#session-id) -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] diff --git a/agent-client-protocol-schema/src/v2/nes.rs b/agent-client-protocol-schema/src/v2/nes.rs index 771675a25..d683fff11 100644 --- a/agent-client-protocol-schema/src/v2/nes.rs +++ b/agent-client-protocol-schema/src/v2/nes.rs @@ -7,7 +7,8 @@ use std::{collections::BTreeMap, sync::Arc}; use derive_more::{Display, From}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -30,7 +31,8 @@ pub(crate) const NES_REJECT_METHOD_NAME: &str = "nes/reject"; /// This capability is not part of the spec yet, and may be removed or changed at any point. /// /// Unique identifier for an NES suggestion. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -61,7 +63,8 @@ pub(crate) const DOCUMENT_DID_FOCUS_METHOD_NAME: &str = "document/didFocus"; /// The encoding used for character offsets in positions. /// /// Follows the same conventions as LSP 3.17. The default is UTF-16. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum PositionEncodingKind { /// Character offsets count UTF-16 code units. This is the default. @@ -80,7 +83,8 @@ pub enum PositionEncodingKind { /// The meaning of `character` depends on the negotiated position encoding. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Position { @@ -94,7 +98,7 @@ pub struct Position { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -126,7 +130,8 @@ impl Position { /// A range in a text document, expressed as start and end positions. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Range { @@ -140,7 +145,7 @@ pub struct Range { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -177,18 +182,19 @@ impl Range { /// `null` both mean the agent does not advertise support for `nes/*` methods. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesCapabilities { /// Events the agent wants to receive. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub events: Option, /// Context the agent wants attached to each suggestion request. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub context: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -197,7 +203,7 @@ pub struct NesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -239,13 +245,14 @@ impl NesCapabilities { /// Event capabilities the agent can consume. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEventCapabilities { /// Document event capabilities. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub document: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -254,7 +261,7 @@ pub struct NesEventCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -289,33 +296,34 @@ impl NesEventCapabilities { /// Document event capabilities the agent wants to receive. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentEventCapabilities { /// Whether the agent wants `document/didOpen` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_open: Option, /// Whether the agent wants `document/didChange` events, and the sync kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_change: Option, /// Whether the agent wants `document/didClose` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_close: Option, /// Whether the agent wants `document/didSave` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_save: Option, /// Whether the agent wants `document/didFocus` events. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub did_focus: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -324,7 +332,7 @@ pub struct NesDocumentEventCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -396,7 +404,8 @@ impl NesDocumentEventCapabilities { /// Marker for `document/didOpen` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidOpenCapabilities { @@ -406,7 +415,7 @@ pub struct NesDocumentDidOpenCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -423,7 +432,8 @@ impl NesDocumentDidOpenCapabilities { /// Capabilities for `document/didChange` events. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidChangeCapabilities { @@ -435,7 +445,7 @@ pub struct NesDocumentDidChangeCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -464,7 +474,8 @@ impl NesDocumentDidChangeCapabilities { } /// How the agent wants document changes delivered. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum TextDocumentSyncKind { /// Client sends the entire file content on each change. @@ -478,7 +489,8 @@ pub enum TextDocumentSyncKind { /// Marker for `document/didClose` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidCloseCapabilities { @@ -488,7 +500,7 @@ pub struct NesDocumentDidCloseCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -505,7 +517,8 @@ impl NesDocumentDidCloseCapabilities { /// Marker for `document/didSave` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidSaveCapabilities { @@ -515,7 +528,7 @@ pub struct NesDocumentDidSaveCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -532,7 +545,8 @@ impl NesDocumentDidSaveCapabilities { /// Marker for `document/didFocus` capability support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDocumentDidFocusCapabilities { @@ -542,7 +556,7 @@ pub struct NesDocumentDidFocusCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -559,38 +573,39 @@ impl NesDocumentDidFocusCapabilities { /// Context capabilities the agent wants attached to each suggestion request. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesContextCapabilities { /// Whether the agent wants recent files context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub recent_files: Option, /// Whether the agent wants related snippets context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub related_snippets: Option, /// Whether the agent wants edit history context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub edit_history: Option, /// Whether the agent wants user actions context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub user_actions: Option, /// Whether the agent wants open files context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub open_files: Option, /// Whether the agent wants diagnostics context. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub diagnostics: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -599,7 +614,7 @@ pub struct NesContextCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -681,13 +696,14 @@ impl NesContextCapabilities { /// Capabilities for recent files context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRecentFilesCapabilities { /// Maximum number of recent files the agent can use. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub max_count: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -696,7 +712,7 @@ pub struct NesRecentFilesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -713,7 +729,8 @@ impl NesRecentFilesCapabilities { /// Capabilities for related snippets context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRelatedSnippetsCapabilities { @@ -723,7 +740,7 @@ pub struct NesRelatedSnippetsCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -740,13 +757,14 @@ impl NesRelatedSnippetsCapabilities { /// Capabilities for edit history context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEditHistoryCapabilities { /// Maximum number of edit history entries the agent can use. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub max_count: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -755,7 +773,7 @@ pub struct NesEditHistoryCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -772,13 +790,14 @@ impl NesEditHistoryCapabilities { /// Capabilities for user actions context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesUserActionsCapabilities { /// Maximum number of user actions the agent can use. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub max_count: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -787,7 +806,7 @@ pub struct NesUserActionsCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -804,7 +823,8 @@ impl NesUserActionsCapabilities { /// Capabilities for open files context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesOpenFilesCapabilities { @@ -814,7 +834,7 @@ pub struct NesOpenFilesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -831,7 +851,8 @@ impl NesOpenFilesCapabilities { /// Capabilities for diagnostics context. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDiagnosticsCapabilities { @@ -841,7 +862,7 @@ pub struct NesDiagnosticsCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -860,23 +881,24 @@ impl NesDiagnosticsCapabilities { /// NES capabilities advertised by the client during initialization. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ClientNesCapabilities { /// Whether the client supports the `jump` suggestion kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub jump: Option, /// Whether the client supports the `rename` suggestion kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub rename: Option, /// Whether the client supports the `searchAndReplace` suggestion kind. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub search_and_replace: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -885,7 +907,7 @@ pub struct ClientNesCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -937,7 +959,8 @@ impl ClientNesCapabilities { /// Marker for jump suggestion support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesJumpCapabilities { @@ -947,7 +970,7 @@ pub struct NesJumpCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -964,7 +987,8 @@ impl NesJumpCapabilities { /// Marker for rename suggestion support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRenameCapabilities { @@ -974,7 +998,7 @@ pub struct NesRenameCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -991,7 +1015,8 @@ impl NesRenameCapabilities { /// Marker for search and replace suggestion support. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesSearchAndReplaceCapabilities { @@ -1001,7 +1026,7 @@ pub struct NesSearchAndReplaceCapabilities { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1020,15 +1045,16 @@ impl NesSearchAndReplaceCapabilities { /// Notification sent when a file is opened in the editor. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_OPEN_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_OPEN_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidOpenDocumentNotification { /// The session ID for this notification. pub session_id: SessionId, /// The URI of the opened document. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The language identifier of the document (e.g., "rust", "python"). pub language_id: String, @@ -1042,7 +1068,7 @@ pub struct DidOpenDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1083,21 +1109,22 @@ impl DidOpenDocumentNotification { /// Notification sent when a file is edited. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CHANGE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CHANGE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidChangeDocumentNotification { /// The session ID for this notification. pub session_id: SessionId, /// The URI of the changed document. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The new version number of the document. pub version: i64, /// The content changes. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub content_changes: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -1105,7 +1132,7 @@ pub struct DidChangeDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1147,7 +1174,8 @@ impl DidChangeDocumentNotification { /// When `range` is `Some`, `text` replaces the given range. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TextDocumentContentChangeEvent { @@ -1162,7 +1190,7 @@ pub struct TextDocumentContentChangeEvent { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1204,15 +1232,16 @@ impl TextDocumentContentChangeEvent { /// Notification sent when a file is closed. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidCloseDocumentNotification { /// The session ID for this notification. pub session_id: SessionId, /// The URI of the closed document. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -1220,7 +1249,7 @@ pub struct DidCloseDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1252,15 +1281,16 @@ impl DidCloseDocumentNotification { /// Notification sent when a file is saved. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_SAVE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_SAVE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidSaveDocumentNotification { /// The session ID for this notification. pub session_id: SessionId, /// The URI of the saved document. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -1268,7 +1298,7 @@ pub struct DidSaveDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1300,15 +1330,16 @@ impl DidSaveDocumentNotification { /// Notification sent when a file becomes the active editor tab. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_FOCUS_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = DOCUMENT_DID_FOCUS_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DidFocusDocumentNotification { /// The session ID for this notification. pub session_id: SessionId, /// The URI of the focused document. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The version number of the document. pub version: i64, @@ -1322,7 +1353,7 @@ pub struct DidFocusDocumentNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1365,15 +1396,16 @@ impl DidFocusDocumentNotification { /// Request to start an NES session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct StartNesRequest { /// The root URI of the workspace. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] + #[cfg_attr(feature = "schemars", schemars(url))] #[serde(default)] pub workspace_uri: Option, /// The workspace folders. @@ -1381,7 +1413,7 @@ pub struct StartNesRequest { pub workspace_folders: Option>, /// Repository metadata, if the workspace is a git repository. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub repository: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -1390,7 +1422,7 @@ pub struct StartNesRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1453,12 +1485,13 @@ impl Default for StartNesRequest { /// A workspace folder. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct WorkspaceFolder { /// The URI of the folder. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The display name of the folder. pub name: String, @@ -1468,7 +1501,7 @@ pub struct WorkspaceFolder { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1500,7 +1533,8 @@ impl WorkspaceFolder { /// Repository metadata for an NES session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRepository { @@ -1516,7 +1550,7 @@ pub struct NesRepository { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1553,8 +1587,9 @@ impl NesRepository { /// Response to `nes/start`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_START_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct StartNesResponse { @@ -1566,7 +1601,7 @@ pub struct StartNesResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1602,8 +1637,9 @@ impl StartNesResponse { /// and then free up any resources associated with the session. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseNesRequest { @@ -1615,7 +1651,7 @@ pub struct CloseNesRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1646,8 +1682,9 @@ impl CloseNesRequest { /// Response from closing an NES session. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_CLOSE_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CloseNesResponse { @@ -1657,7 +1694,7 @@ pub struct CloseNesResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1685,7 +1722,8 @@ impl CloseNesResponse { // NES suggest request /// What triggered the suggestion request. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum NesTriggerKind { /// Triggered by user typing or cursor movement. @@ -1709,15 +1747,16 @@ pub enum NesTriggerKind { /// Request for a code suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SuggestNesRequest { /// The session ID for this request. pub session_id: SessionId, /// The URI of the document to suggest for. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The version number of the document. pub version: i64, @@ -1737,7 +1776,7 @@ pub struct SuggestNesRequest { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1794,7 +1833,8 @@ impl SuggestNesRequest { /// Context attached to a suggestion request. #[serde_as] #[skip_serializing_none] -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesSuggestContext { @@ -1822,7 +1862,7 @@ pub struct NesSuggestContext { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1895,12 +1935,13 @@ impl NesSuggestContext { /// A recently accessed file. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRecentFile { /// The URI of the file. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The language identifier. pub language_id: String, @@ -1912,7 +1953,7 @@ pub struct NesRecentFile { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1949,12 +1990,13 @@ impl NesRecentFile { /// A related code snippet from a file. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRelatedSnippet { /// The URI of the file containing the snippets. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The code excerpts. pub excerpts: Vec, @@ -1964,7 +2006,7 @@ pub struct NesRelatedSnippet { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -1996,7 +2038,8 @@ impl NesRelatedSnippet { /// A code excerpt from a file. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesExcerpt { @@ -2012,7 +2055,7 @@ pub struct NesExcerpt { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2045,12 +2088,13 @@ impl NesExcerpt { /// An entry in the edit history. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEditHistoryEntry { /// The URI of the edited file. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// A diff representing the edit. pub diff: String, @@ -2060,7 +2104,7 @@ pub struct NesEditHistoryEntry { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2092,14 +2136,15 @@ impl NesEditHistoryEntry { /// A user action (typing, cursor movement, etc.). #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesUserAction { /// The kind of action (e.g., "insertChar", "cursorMovement"). pub action: String, /// The URI of the file where the action occurred. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The position where the action occurred. pub position: Position, @@ -2111,7 +2156,7 @@ pub struct NesUserAction { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2150,23 +2195,24 @@ impl NesUserAction { /// An open file in the editor. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesOpenFile { /// The URI of the file. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The language identifier. pub language_id: String, /// The visible range in the editor, if any. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub visible_range: Option, /// Timestamp in milliseconds since epoch of when the file was last focused. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub last_focused_ms: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2175,7 +2221,7 @@ pub struct NesOpenFile { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2223,12 +2269,13 @@ impl NesOpenFile { /// A diagnostic (error, warning, etc.). #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesDiagnostic { /// The URI of the file containing the diagnostic. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The range of the diagnostic. pub range: Range, @@ -2242,7 +2289,7 @@ pub struct NesDiagnostic { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2279,7 +2326,8 @@ impl NesDiagnostic { } /// Severity of a diagnostic. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum NesDiagnosticSeverity { /// An error. @@ -2308,8 +2356,9 @@ pub enum NesDiagnosticSeverity { /// Response to `nes/suggest`. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_SUGGEST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct SuggestNesResponse { @@ -2321,7 +2370,7 @@ pub struct SuggestNesResponse { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2350,7 +2399,8 @@ impl SuggestNesResponse { } /// A suggestion returned by the agent. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "kind", rename_all = "camelCase")] #[non_exhaustive] pub enum NesSuggestion { @@ -2376,9 +2426,10 @@ pub enum NesSuggestion { } /// Custom or future NES suggestion payload. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_nes_suggestion_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_nes_suggestion_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherNesSuggestion { @@ -2450,6 +2501,7 @@ fn is_known_nes_suggestion_kind(kind: &str) -> bool { matches!(kind, "edit" | "jump" | "rename" | "searchAndReplace") } +#[cfg(feature = "schemars")] fn other_nes_suggestion_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -2461,21 +2513,22 @@ fn other_nes_suggestion_schema(schema: &mut Schema) { /// A text edit suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesEditSuggestion { /// Unique identifier for accept/reject tracking. pub suggestion_id: NesSuggestionId, /// The URI of the file to edit. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The text edits to apply. Must contain at least one edit. - #[schemars(length(min = 1))] + #[cfg_attr(feature = "schemars", schemars(length(min = 1)))] pub edits: Vec, /// Optional suggested cursor position after applying edits. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub cursor_position: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2484,7 +2537,7 @@ pub struct NesEditSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2529,7 +2582,8 @@ impl NesEditSuggestion { /// A text edit within a suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesTextEdit { @@ -2543,7 +2597,7 @@ pub struct NesTextEdit { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2575,14 +2629,15 @@ impl NesTextEdit { /// A jump-to-location suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesJumpSuggestion { /// Unique identifier for accept/reject tracking. pub suggestion_id: NesSuggestionId, /// The file to navigate to. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The target position within the file. pub position: Position, @@ -2592,7 +2647,7 @@ pub struct NesJumpSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2629,14 +2684,15 @@ impl NesJumpSuggestion { /// A rename symbol suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesRenameSuggestion { /// Unique identifier for accept/reject tracking. pub suggestion_id: NesSuggestionId, /// The file URI containing the symbol. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The position of the symbol to rename. pub position: Position, @@ -2648,7 +2704,7 @@ pub struct NesRenameSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2687,14 +2743,15 @@ impl NesRenameSuggestion { /// A search-and-replace suggestion. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct NesSearchAndReplaceSuggestion { /// Unique identifier for accept/reject tracking. pub suggestion_id: NesSuggestionId, /// The file URI to search within. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The text or pattern to find. pub search: String, @@ -2709,7 +2766,7 @@ pub struct NesSearchAndReplaceSuggestion { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2758,8 +2815,9 @@ impl NesSearchAndReplaceSuggestion { /// Notification sent when a suggestion is accepted. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_ACCEPT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_ACCEPT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct AcceptNesNotification { @@ -2773,7 +2831,7 @@ pub struct AcceptNesNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2808,8 +2866,9 @@ impl AcceptNesNotification { /// Notification sent when a suggestion is rejected. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "agent", "x-method" = NES_REJECT_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "agent", "x-method" = NES_REJECT_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct RejectNesNotification { @@ -2819,7 +2878,7 @@ pub struct RejectNesNotification { pub suggestion_id: NesSuggestionId, /// The reason for rejection. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub reason: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -2828,7 +2887,7 @@ pub struct RejectNesNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -2869,7 +2928,8 @@ impl RejectNesNotification { } /// The reason a suggestion was rejected. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub enum NesRejectReason { /// The user explicitly dismissed the suggestion. diff --git a/agent-client-protocol-schema/src/v2/plan.rs b/agent-client-protocol-schema/src/v2/plan.rs index 6ec1c499b..3e3b52924 100644 --- a/agent-client-protocol-schema/src/v2/plan.rs +++ b/agent-client-protocol-schema/src/v2/plan.rs @@ -8,7 +8,7 @@ use std::{collections::BTreeMap, sync::Arc}; use derive_more::{Display, From}; -use schemars::JsonSchema; +#[cfg(feature = "schemars")] use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -17,7 +17,8 @@ use super::Meta; use crate::{IntoOption, SkipListener}; /// Unique identifier for a plan within a session. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -34,7 +35,8 @@ impl PlanId { /// A content update for a plan identified by ID. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanUpdate { @@ -46,7 +48,7 @@ pub struct PlanUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -72,7 +74,8 @@ impl PlanUpdate { } /// Updated content for a plan. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum PlanUpdateContent { @@ -106,9 +109,10 @@ pub enum PlanUpdateContent { } /// Custom or future plan update content payload. -#[derive(Debug, Clone, Serialize, JsonSchema, PartialEq, Eq)] -#[schemars(inline)] -#[schemars(transform = other_plan_update_content_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_plan_update_content_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherPlanUpdateContent { @@ -181,6 +185,7 @@ fn is_known_plan_update_content_type(type_: &str) -> bool { KNOWN_PLAN_UPDATE_CONTENT_TYPES.contains(&type_) } +#[cfg(feature = "schemars")] fn other_plan_update_content_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -216,7 +221,8 @@ impl PlanUpdateContent { /// A plan represented as structured entries. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanItems { @@ -227,7 +233,7 @@ pub struct PlanItems { /// When updating an item-based plan, the agent must send a complete list of all entries /// with their current status. The client replaces that plan with each update. #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] pub entries: Vec, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -235,7 +241,7 @@ pub struct PlanItems { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -272,14 +278,15 @@ impl PlanItems { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanFile { /// The plan ID to update. pub plan_id: PlanId, /// The URI of the file containing the plan. - #[schemars(url)] + #[cfg_attr(feature = "schemars", schemars(url))] pub uri: String, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -287,7 +294,7 @@ pub struct PlanFile { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -325,7 +332,8 @@ impl PlanFile { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanMarkdown { @@ -339,7 +347,7 @@ pub struct PlanMarkdown { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -377,7 +385,8 @@ impl PlanMarkdown { #[cfg(feature = "unstable_plan_operations")] #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanRemoved { @@ -389,7 +398,7 @@ pub struct PlanRemoved { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -425,7 +434,8 @@ impl PlanRemoved { /// See protocol docs: [Plan Entries](https://agentclientprotocol.com/protocol/agent-plan#plan-entries) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct PlanEntry { @@ -442,7 +452,7 @@ pub struct PlanEntry { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -481,7 +491,8 @@ impl PlanEntry { /// Used to indicate the relative importance or urgency of different /// tasks in the execution plan. /// See protocol docs: [Plan Entries](https://agentclientprotocol.com/protocol/agent-plan#plan-entries) -#[derive(Deserialize, Serialize, JsonSchema, Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum PlanEntryPriority { @@ -504,7 +515,8 @@ pub enum PlanEntryPriority { /// /// Tracks the lifecycle of each task from planning through completion. /// See protocol docs: [Plan Entries](https://agentclientprotocol.com/protocol/agent-plan#plan-entries) -#[derive(Deserialize, Serialize, JsonSchema, Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum PlanEntryStatus { diff --git a/agent-client-protocol-schema/src/v2/protocol_level.rs b/agent-client-protocol-schema/src/v2/protocol_level.rs index d861cd597..7ba8f065c 100644 --- a/agent-client-protocol-schema/src/v2/protocol_level.rs +++ b/agent-client-protocol-schema/src/v2/protocol_level.rs @@ -1,4 +1,3 @@ -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, serde_as, skip_serializing_none}; @@ -10,8 +9,9 @@ use crate::IntoOption; /// See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/cancellation) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[schemars(extend("x-side" = "protocol", "x-method" = CANCEL_REQUEST_METHOD_NAME))] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", schemars(extend("x-side" = "protocol", "x-method" = CANCEL_REQUEST_METHOD_NAME)))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct CancelRequestNotification { @@ -23,7 +23,7 @@ pub struct CancelRequestNotification { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -82,9 +82,10 @@ pub(crate) const CANCEL_REQUEST_METHOD_NAME: &str = "$/cancel_request"; /// notifications starting with '$/' it is free to ignore the notification. /// /// Notifications do not expect a response. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] -#[schemars(inline)] +#[cfg_attr(feature = "schemars", schemars(inline))] #[non_exhaustive] pub enum ProtocolLevelNotification { /// Cancels an ongoing request. diff --git a/agent-client-protocol-schema/src/v2/terminal.rs b/agent-client-protocol-schema/src/v2/terminal.rs index 1469d14f8..2095f12c6 100644 --- a/agent-client-protocol-schema/src/v2/terminal.rs +++ b/agent-client-protocol-schema/src/v2/terminal.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, serde_as, skip_serializing_none}; @@ -11,7 +10,8 @@ use super::{AbsolutePath, Meta}; use crate::{IntoMaybeUndefined, IntoOption, MaybeUndefined}; /// Unique identifier for an agent-owned terminal within a session. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -37,7 +37,8 @@ impl IntoOption for &str { /// [`TerminalUpdate`] and [`TerminalOutputChunk`]. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Terminal { @@ -50,7 +51,7 @@ pub struct Terminal { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -77,12 +78,13 @@ impl Terminal { /// An authoritative replacement snapshot of terminal output bytes. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TerminalOutput { /// Base64-encoded replacement terminal output bytes. - #[schemars(extend("contentEncoding" = "base64"))] + #[cfg_attr(feature = "schemars", schemars(extend("contentEncoding" = "base64")))] pub data: String, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -91,7 +93,7 @@ pub struct TerminalOutput { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -121,13 +123,14 @@ impl TerminalOutput { /// an exit code nor a signal is known. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TerminalExitStatus { /// Process exit code, when known. Omitted and `null` are equivalent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub exit_code: Option, /// Signal that terminated the process, when known. @@ -136,7 +139,7 @@ pub struct TerminalExitStatus { /// include `SIGTERM`, `SIGKILL`, and `SIGINT`. Other platforms may use a /// platform-specific name. Omitted and `null` are equivalent. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub signal: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -146,7 +149,7 @@ pub struct TerminalExitStatus { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -188,7 +191,8 @@ impl TerminalExitStatus { /// it, and concrete values replace it. When the terminal ID is new, omitted /// fields start unknown. #[serde_as] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TerminalUpdate { @@ -196,22 +200,22 @@ pub struct TerminalUpdate { pub terminal_id: TerminalId, /// The command being run. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub command: MaybeUndefined, /// The absolute working directory of the command. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub cwd: MaybeUndefined, /// An authoritative replacement snapshot of terminal output bytes. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub output: MaybeUndefined, /// Exit information. A concrete object marks the terminal as exited. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub exit_status: MaybeUndefined, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -220,7 +224,7 @@ pub struct TerminalUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde( rename = "_meta", default, @@ -305,14 +309,15 @@ impl TerminalUpdate { /// A chunk of bytes appended to an agent-owned terminal's output. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct TerminalOutputChunk { /// The terminal receiving these bytes. pub terminal_id: TerminalId, /// Independently base64-encoded terminal output bytes. - #[schemars(extend("contentEncoding" = "base64"))] + #[cfg_attr(feature = "schemars", schemars(extend("contentEncoding" = "base64")))] pub data: String, /// The _meta property is reserved by ACP to allow clients and agents to attach additional /// metadata to their interactions. Implementations MUST NOT make assumptions about values at @@ -321,7 +326,7 @@ pub struct TerminalOutputChunk { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -492,6 +497,7 @@ mod tests { ); } + #[cfg(feature = "schemars")] #[test] fn terminal_output_fields_use_base64_content_encoding() { let output = serde_json::to_value(schemars::schema_for!(TerminalOutput)).unwrap(); diff --git a/agent-client-protocol-schema/src/v2/tool_call.rs b/agent-client-protocol-schema/src/v2/tool_call.rs index bb341b47e..b398ffca1 100644 --- a/agent-client-protocol-schema/src/v2/tool_call.rs +++ b/agent-client-protocol-schema/src/v2/tool_call.rs @@ -7,7 +7,8 @@ use std::{collections::BTreeMap, sync::Arc}; use derive_more::{Display, From}; -use schemars::{JsonSchema, Schema}; +#[cfg(feature = "schemars")] +use schemars::Schema; use serde::{Deserialize, Serialize}; use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none}; @@ -29,7 +30,8 @@ use crate::{IntoMaybeUndefined, IntoOption, MaybeUndefined, SkipListener}; /// See protocol docs: [Tool Calls](https://agentclientprotocol.com/protocol/tool-calls) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCallUpdate { @@ -47,44 +49,44 @@ pub struct ToolCallUpdate { /// tool name is available. #[cfg(feature = "unstable_tool_call_name")] #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub name: MaybeUndefined, /// Human-readable title describing what the tool is doing. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub title: MaybeUndefined, /// The category of tool being invoked. /// Helps clients choose appropriate icons and UI treatment. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub kind: MaybeUndefined, /// Current execution status of the tool call. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub status: MaybeUndefined, /// Content produced by the tool call. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub content: MaybeUndefined>, /// File locations affected by this tool call. /// Enables "follow-along" features in clients. #[serde_as(deserialize_as = "DefaultOnError>>")] - #[schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true, "x-deserialize-skip-invalid-items" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub locations: MaybeUndefined>, /// Raw input parameters sent to the tool. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub raw_input: MaybeUndefined, /// Raw output returned by the tool. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default, skip_serializing_if = "MaybeUndefined::is_undefined")] pub raw_output: MaybeUndefined, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -93,7 +95,7 @@ pub struct ToolCallUpdate { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError>")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde( rename = "_meta", default, @@ -240,7 +242,8 @@ impl ToolCallUpdate { /// collection instead. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCallContentChunk { @@ -254,7 +257,7 @@ pub struct ToolCallContentChunk { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -284,7 +287,8 @@ impl ToolCallContentChunk { } /// Unique identifier for a tool call within a session. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash, Display, From)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Display, From)] #[serde(transparent)] #[from(forward)] #[non_exhaustive] @@ -310,7 +314,8 @@ impl IntoOption for &str { /// display tool execution progress. /// /// See protocol docs: [Creating](https://agentclientprotocol.com/protocol/tool-calls#creating) -#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum ToolKind { @@ -349,7 +354,8 @@ pub enum ToolKind { /// Tool calls progress through different statuses during their lifecycle. /// /// See protocol docs: [Status](https://agentclientprotocol.com/protocol/tool-calls#status) -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum ToolCallStatus { @@ -380,7 +386,8 @@ pub enum ToolCallStatus { /// content blocks (text, images), file diffs, or display-only terminals. /// /// See protocol docs: [Content](https://agentclientprotocol.com/protocol/tool-calls#content) -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] #[non_exhaustive] pub enum ToolCallContent { @@ -404,9 +411,10 @@ pub enum ToolCallContent { } /// Custom or future tool call content payload. -#[derive(Debug, Clone, PartialEq, Serialize, JsonSchema)] -#[schemars(inline)] -#[schemars(transform = other_tool_call_content_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_tool_call_content_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherToolCallContent { @@ -461,6 +469,7 @@ fn is_known_tool_call_content_type(type_: &str) -> bool { matches!(type_, "content" | "diff" | "terminal") } +#[cfg(feature = "schemars")] fn other_tool_call_content_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -490,7 +499,8 @@ impl From for ToolCallContent { /// Standard content block (text, images, resources). #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Content { @@ -502,7 +512,7 @@ pub struct Content { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -540,7 +550,8 @@ impl Content { /// See protocol docs: [Content](https://agentclientprotocol.com/protocol/tool-calls#content) #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct Diff { @@ -548,14 +559,14 @@ pub struct Diff { /// /// Clients can use this field without parsing patch text to determine affected paths. #[serde_as(deserialize_as = "VecSkipError<_, SkipListener>")] - #[schemars(extend("x-deserialize-skip-invalid-items" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-skip-invalid-items" = true)))] pub changes: Vec, /// Renderable patch text for some or all of the structured changes. /// /// Agents SHOULD provide patch text whenever feasible. Omitted or `null` /// means no renderable patch text was provided. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub patch: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -564,7 +575,7 @@ pub struct Diff { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -607,7 +618,8 @@ impl Diff { } /// Renderable patch text and its format. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DiffPatch { @@ -629,7 +641,8 @@ impl DiffPatch { } /// Text patch format used by [`DiffPatch`]. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum DiffPatchFormat { @@ -648,7 +661,8 @@ pub enum DiffPatchFormat { } /// Kind of file content represented by a diff change. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub enum DiffFileType { @@ -675,7 +689,8 @@ pub enum DiffFileType { /// operations without parsing the text patch. #[serde_as] #[skip_serializing_none] -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DiffChange { @@ -683,14 +698,14 @@ pub struct DiffChange { /// /// Omitted or `null` means the content kind is unknown. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub file_type: Option, /// MIME type of the file contents. /// /// Omitted or `null` means the MIME type is unknown. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub mime_type: Option, /// File operation-specific fields. @@ -702,7 +717,7 @@ pub struct DiffChange { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, @@ -785,7 +800,8 @@ impl DiffChange { } /// File operation for a [`DiffChange`]. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(tag = "operation", rename_all = "snake_case")] #[non_exhaustive] pub enum DiffChangeOperation { @@ -809,7 +825,8 @@ pub enum DiffChangeOperation { } /// Operation metadata for add, delete, and modify changes. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DiffPathChange { @@ -826,7 +843,8 @@ impl DiffPathChange { } /// Operation metadata for move and copy changes. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct DiffPathPairChange { @@ -848,9 +866,10 @@ impl DiffPathPairChange { } /// Custom or future file operation payload. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, JsonSchema)] -#[schemars(inline)] -#[schemars(transform = other_diff_change_schema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[cfg_attr(feature = "schemars", schemars(inline))] +#[cfg_attr(feature = "schemars", schemars(transform = other_diff_change_schema))] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct OtherDiffChange { @@ -913,6 +932,7 @@ fn is_known_diff_change_operation(operation: &str) -> bool { matches!(operation, "add" | "delete" | "modify" | "move" | "copy") } +#[cfg(feature = "schemars")] fn other_diff_change_schema(schema: &mut Schema) { super::schema_util::reject_known_string_discriminators( schema, @@ -929,7 +949,8 @@ fn other_diff_change_schema(schema: &mut Schema) { /// See protocol docs: [Following the Agent](https://agentclientprotocol.com/protocol/tool-calls#following-the-agent) #[serde_as] #[skip_serializing_none] -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[non_exhaustive] pub struct ToolCallLocation { @@ -937,7 +958,7 @@ pub struct ToolCallLocation { pub path: AbsolutePath, /// Optional line number within the file. #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] pub line: Option, /// The _meta property is reserved by ACP to allow clients and agents to attach additional @@ -946,7 +967,7 @@ pub struct ToolCallLocation { /// /// See protocol docs: [Extensibility](https://agentclientprotocol.com/protocol/extensibility) #[serde_as(deserialize_as = "DefaultOnError")] - #[schemars(extend("x-deserialize-default-on-error" = true))] + #[cfg_attr(feature = "schemars", schemars(extend("x-deserialize-default-on-error" = true)))] #[serde(default)] #[serde(rename = "_meta")] pub meta: Option, diff --git a/agent-client-protocol-schema/src/version.rs b/agent-client-protocol-schema/src/version.rs index f46f6c1a3..95fe0b736 100644 --- a/agent-client-protocol-schema/src/version.rs +++ b/agent-client-protocol-schema/src/version.rs @@ -1,24 +1,13 @@ use derive_more::{Display, From}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; /// Protocol version identifier. /// /// This version is only bumped for breaking changes. /// Non-breaking changes should be introduced via capabilities. +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive( - Debug, - Clone, - Copy, - Serialize, - Deserialize, - JsonSchema, - PartialEq, - Eq, - PartialOrd, - Ord, - From, - Display, + Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, From, Display, )] pub struct ProtocolVersion(u16); diff --git a/package.json b/package.json index 4e4e0848a..bdf1676c1 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "spellcheck": "./scripts/spellcheck.sh", "spellcheck:fix": "./scripts/spellcheck.sh --write-changes", "generate:registry": "python3 scripts/generate_registry_docs.py", - "check": "cargo clippy && cargo clippy --all-targets --all-features && npm run format:check && npm run spellcheck && cargo test --all-features", + "check": "cargo clippy && cargo clippy -p agent-client-protocol-schema --all-targets --no-default-features --features unstable,unstable_protocol_v2,tracing && cargo clippy --all-targets --all-features && npm run format:check && npm run spellcheck && cargo test --all-features", "docs": "cd docs && npx mint dev" }, "devDependencies": { diff --git a/schema-generator/Cargo.toml b/schema-generator/Cargo.toml index ec224ed36..9ce07c59f 100644 --- a/schema-generator/Cargo.toml +++ b/schema-generator/Cargo.toml @@ -15,7 +15,7 @@ unstable = ["agent-client-protocol-schema/unstable"] unstable_protocol_v2 = ["agent-client-protocol-schema/unstable_protocol_v2"] [dependencies] -agent-client-protocol-schema = { workspace = true } +agent-client-protocol-schema = { workspace = true, features = ["schemars"] } schemars = "1" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] }