From d28b51bab500b8aad1b38da658c04f705dcd17c3 Mon Sep 17 00:00:00 2001 From: Daniel Stojanovic Date: Fri, 15 May 2026 17:18:34 +0200 Subject: [PATCH] feat(acp): route session/setTitle to the new schema types Wires the SetSessionTitleRequest / SetSessionTitleResponse types into the agent-side JSON-RPC dispatch tables. Companion to https://github.com/agentclientprotocol/agent-client-protocol/pull/1199, which adds the schema definitions for session/setTitle. This PR is the Rust SDK half of the round trip: once the schema crate ships a release with the new types, ACP-backed agents can implement Agent::set_session_title and have it dispatched here. --- Cargo.lock | 3 +-- Cargo.toml | 4 ++++ .../src/schema/client_to_agent/requests.rs | 6 ++++++ .../src/schema/enum_impls.rs | 1 + src/agent-client-protocol/tests/protocol_v2.rs | 17 ++++++++++++++--- .../tests/schema_elicitation.rs | 6 +++++- 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf41b5f..2ce90d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,8 +116,7 @@ dependencies = [ [[package]] name = "agent-client-protocol-schema" version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c290bfa00c6b52339db66f8e9cf711d5f08530800529f7d619ff24d6cba253d0" +source = "git+https://github.com/daniel-agentee/agent-client-protocol?rev=23977c0193c786d0747464a46b5a561ca15c62e2#23977c0193c786d0747464a46b5a561ca15c62e2" dependencies = [ "anyhow", "derive_more", diff --git a/Cargo.toml b/Cargo.toml index 17ee29b..a1e509b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -105,3 +105,7 @@ struct_field_names = "allow" too_many_lines = "allow" type_complexity = "allow" wildcard_imports = "allow" + +[patch.crates-io] +# Temporary: consume session/setTitle schema types before they are released. +agent-client-protocol-schema = { git = "https://github.com/daniel-agentee/agent-client-protocol", rev = "23977c0193c786d0747464a46b5a561ca15c62e2" } diff --git a/src/agent-client-protocol/src/schema/client_to_agent/requests.rs b/src/agent-client-protocol/src/schema/client_to_agent/requests.rs index 536263f..d26d66f 100644 --- a/src/agent-client-protocol/src/schema/client_to_agent/requests.rs +++ b/src/agent-client-protocol/src/schema/client_to_agent/requests.rs @@ -5,6 +5,7 @@ use crate::schema::{ LogoutRequest, LogoutResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, ResumeSessionRequest, ResumeSessionResponse, SetSessionConfigOptionRequest, SetSessionConfigOptionResponse, SetSessionModeRequest, SetSessionModeResponse, + SetSessionTitleRequest, SetSessionTitleResponse, }; #[cfg(feature = "unstable_session_fork")] use crate::schema::{ForkSessionRequest, ForkSessionResponse}; @@ -31,6 +32,11 @@ impl_jsonrpc_request!( SetSessionConfigOptionResponse, "session/set_config_option" ); +impl_jsonrpc_request!( + SetSessionTitleRequest, + SetSessionTitleResponse, + "session/setTitle" +); #[cfg(feature = "unstable_session_fork")] impl_jsonrpc_request!(ForkSessionRequest, ForkSessionResponse, "session/fork"); diff --git a/src/agent-client-protocol/src/schema/enum_impls.rs b/src/agent-client-protocol/src/schema/enum_impls.rs index ab024f8..de34626 100644 --- a/src/agent-client-protocol/src/schema/enum_impls.rs +++ b/src/agent-client-protocol/src/schema/enum_impls.rs @@ -24,6 +24,7 @@ impl_jsonrpc_request_enum!(ClientRequest { CloseSessionRequest => "session/close", SetSessionModeRequest => "session/set_mode", SetSessionConfigOptionRequest => "session/set_config_option", + SetSessionTitleRequest => "session/setTitle", PromptRequest => "session/prompt", #[cfg(feature = "unstable_mcp_over_acp")] MessageMcpRequest => "mcp/message", diff --git a/src/agent-client-protocol/tests/protocol_v2.rs b/src/agent-client-protocol/tests/protocol_v2.rs index d6692ec..7cd1209 100644 --- a/src/agent-client-protocol/tests/protocol_v2.rs +++ b/src/agent-client-protocol/tests/protocol_v2.rs @@ -49,6 +49,13 @@ fn cwd() -> Result { std::env::current_dir().map_err(Error::into_internal_error) } +fn v2_initialize_response_with_session( + protocol_version: ProtocolVersion, +) -> v2::InitializeResponse { + v2::InitializeResponse::new(protocol_version) + .capabilities(v2::AgentCapabilities::new().session(v2::SessionCapabilities::new())) +} + #[cfg(feature = "unstable_mcp_over_acp")] fn json_value(value: impl Serialize) -> Result { serde_json::to_value(value).map_err(Error::into_internal_error) @@ -215,7 +222,9 @@ async fn role_builder_v1_client_downgrades_initialize_for_v2_agent() -> Result<( let agent = Agent.v2().on_receive_request( async |initialize: v2::InitializeRequest, responder, _cx| { assert_eq!(initialize.protocol_version, ProtocolVersion::V2); - responder.respond(v2::InitializeResponse::new(initialize.protocol_version)) + responder.respond(v2_initialize_response_with_session( + initialize.protocol_version, + )) }, agent_client_protocol::on_receive_request!(), ); @@ -451,7 +460,7 @@ async fn v2_agent_serves_v1_client_with_v2_handlers() -> Result<(), Error> { async |initialize: v2::InitializeRequest, responder, _cx| { assert_eq!(initialize.protocol_version, ProtocolVersion::V2); // The compatibility layer should force this back to the negotiated v1 wire version. - responder.respond(v2::InitializeResponse::new(ProtocolVersion::V2)) + responder.respond(v2_initialize_response_with_session(ProtocolVersion::V2)) }, agent_client_protocol::on_receive_request!(), ) @@ -515,7 +524,9 @@ async fn v2_client_and_agent_negotiate_v2() -> Result<(), Error> { .on_receive_request( async |initialize: v2::InitializeRequest, responder, _cx| { assert_eq!(initialize.protocol_version, ProtocolVersion::V2); - responder.respond(v2::InitializeResponse::new(initialize.protocol_version)) + responder.respond(v2_initialize_response_with_session( + initialize.protocol_version, + )) }, agent_client_protocol::on_receive_request!(), ) diff --git a/src/agent-client-protocol/tests/schema_elicitation.rs b/src/agent-client-protocol/tests/schema_elicitation.rs index 49e1c33..2e30518 100644 --- a/src/agent-client-protocol/tests/schema_elicitation.rs +++ b/src/agent-client-protocol/tests/schema_elicitation.rs @@ -196,7 +196,11 @@ async fn v2_agent_can_elicit_from_v1_client() -> Result<(), Error> { .on_receive_request( async |initialize: v2::InitializeRequest, responder, _cx| { assert_eq!(initialize.protocol_version, ProtocolVersion::V2); - responder.respond(v2::InitializeResponse::new(ProtocolVersion::V2)) + responder.respond( + v2::InitializeResponse::new(ProtocolVersion::V2).capabilities( + v2::AgentCapabilities::new().session(v2::SessionCapabilities::new()), + ), + ) }, agent_client_protocol::on_receive_request!(), )