Skip to content

Commit 4708c10

Browse files
committed
feat(acp): add unstable session delete support
1 parent ef67cca commit 4708c10

7 files changed

Lines changed: 69 additions & 3 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ agent-client-protocol-trace-viewer = { path = "src/agent-client-protocol-trace-v
3030
yopo = { package = "agent-client-protocol-yopo", path = "src/yopo" }
3131

3232
# Protocol
33-
agent-client-protocol-schema = { version = "=0.13.0", features = ["tracing"] }
33+
agent-client-protocol-schema = { version = "=0.13.1", features = ["tracing"] }
3434

3535
# Core async runtime
3636
tokio = { version = "1.52", features = ["full"] }

src/agent-client-protocol/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
### Added
1111

12+
- *(unstable)* Add support for `session/delete` method.
1213
- `McpConnectionTo::acp_id()` method.
1314

1415
### Deprecated

src/agent-client-protocol/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ unstable = [
2222
"unstable_mcp_over_acp",
2323
"unstable_message_id",
2424
"unstable_session_additional_directories",
25+
"unstable_session_delete",
2526
"unstable_session_fork",
2627
"unstable_session_model",
2728
"unstable_session_usage",
@@ -32,6 +33,7 @@ unstable_logout = ["agent-client-protocol-schema/unstable_logout"]
3233
unstable_mcp_over_acp = ["agent-client-protocol-schema/unstable_mcp_over_acp"]
3334
unstable_message_id = ["agent-client-protocol-schema/unstable_message_id"]
3435
unstable_session_additional_directories = ["agent-client-protocol-schema/unstable_session_additional_directories"]
36+
unstable_session_delete = ["agent-client-protocol-schema/unstable_session_delete"]
3537
unstable_session_fork = ["agent-client-protocol-schema/unstable_session_fork"]
3638
unstable_session_model = ["agent-client-protocol-schema/unstable_session_model"]
3739
unstable_session_usage = ["agent-client-protocol-schema/unstable_session_usage"]

src/agent-client-protocol/src/schema/client_to_agent/requests.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use crate::schema::{
55
PromptResponse, ResumeSessionRequest, ResumeSessionResponse, SetSessionConfigOptionRequest,
66
SetSessionConfigOptionResponse, SetSessionModeRequest, SetSessionModeResponse,
77
};
8+
#[cfg(feature = "unstable_session_delete")]
9+
use crate::schema::{DeleteSessionRequest, DeleteSessionResponse};
810
#[cfg(feature = "unstable_session_fork")]
911
use crate::schema::{ForkSessionRequest, ForkSessionResponse};
1012
#[cfg(feature = "unstable_logout")]
@@ -18,6 +20,12 @@ impl_jsonrpc_request!(AuthenticateRequest, AuthenticateResponse, "authenticate")
1820
impl_jsonrpc_request!(LogoutRequest, LogoutResponse, "logout");
1921
impl_jsonrpc_request!(LoadSessionRequest, LoadSessionResponse, "session/load");
2022
impl_jsonrpc_request!(ListSessionsRequest, ListSessionsResponse, "session/list");
23+
#[cfg(feature = "unstable_session_delete")]
24+
impl_jsonrpc_request!(
25+
DeleteSessionRequest,
26+
DeleteSessionResponse,
27+
"session/delete"
28+
);
2129
impl_jsonrpc_request!(NewSessionRequest, NewSessionResponse, "session/new");
2230
impl_jsonrpc_request!(PromptRequest, PromptResponse, "session/prompt");
2331
impl_jsonrpc_request!(

src/agent-client-protocol/src/schema/enum_impls.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ impl_jsonrpc_request_enum!(ClientRequest {
1515
NewSessionRequest => "session/new",
1616
LoadSessionRequest => "session/load",
1717
ListSessionsRequest => "session/list",
18+
#[cfg(feature = "unstable_session_delete")]
19+
DeleteSessionRequest => "session/delete",
1820
#[cfg(feature = "unstable_session_fork")]
1921
ForkSessionRequest => "session/fork",
2022
ResumeSessionRequest => "session/resume",
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#![cfg(feature = "unstable_session_delete")]
2+
3+
use agent_client_protocol::schema::{ClientRequest, DeleteSessionRequest, DeleteSessionResponse};
4+
use agent_client_protocol::{JsonRpcMessage, JsonRpcRequest, JsonRpcResponse};
5+
use serde_json::json;
6+
7+
fn assert_request_response_pair<T: JsonRpcRequest<Response = DeleteSessionResponse>>() {}
8+
9+
#[test]
10+
fn delete_session_request_has_jsonrpc_metadata() {
11+
let request = DeleteSessionRequest::new("sess_abc123");
12+
13+
assert_eq!(request.method(), "session/delete");
14+
assert!(DeleteSessionRequest::matches_method("session/delete"));
15+
assert!(!DeleteSessionRequest::matches_method("session/close"));
16+
17+
let untyped = request.to_untyped_message().unwrap();
18+
assert_eq!(untyped.method, "session/delete");
19+
assert_eq!(untyped.params, json!({ "sessionId": "sess_abc123" }));
20+
21+
let parsed = DeleteSessionRequest::parse_message(
22+
"session/delete",
23+
&json!({ "sessionId": "sess_abc123" }),
24+
)
25+
.unwrap();
26+
assert_eq!(parsed.session_id.0.as_ref(), "sess_abc123");
27+
}
28+
29+
#[test]
30+
fn delete_session_participates_in_client_request_enum() {
31+
let request = ClientRequest::DeleteSessionRequest(DeleteSessionRequest::new("sess_abc123"));
32+
33+
assert_eq!(request.method(), "session/delete");
34+
assert!(ClientRequest::matches_method("session/delete"));
35+
36+
let parsed =
37+
ClientRequest::parse_message("session/delete", &json!({ "sessionId": "sess_abc123" }))
38+
.unwrap();
39+
assert!(matches!(parsed, ClientRequest::DeleteSessionRequest(_)));
40+
}
41+
42+
#[test]
43+
fn delete_session_response_round_trips_json() {
44+
let value = DeleteSessionResponse::new()
45+
.into_json("session/delete")
46+
.unwrap();
47+
assert_eq!(value, json!({}));
48+
49+
let parsed = DeleteSessionResponse::from_value("session/delete", value).unwrap();
50+
assert_eq!(parsed, DeleteSessionResponse::new());
51+
52+
assert_request_response_pair::<DeleteSessionRequest>();
53+
}

0 commit comments

Comments
 (0)