First attempt to add ACP support

This commit is contained in:
Ryan Ward
2026-07-31 11:09:32 -05:00
parent 1a0aac51b6
commit 7f4891ec7c
25 changed files with 1051 additions and 138 deletions
+48 -1
View File
@@ -8,7 +8,8 @@ use std::time::Duration;
use agent_client_protocol::schema::v1::{
AuthMethod, AuthMethodAgent, AuthMethodId, ContentBlock, ContentChunk, InitializeResponse,
McpServer, McpServerStdio, SessionId, SessionUpdate, TextContent, ToolCall, ToolCallStatus,
McpServer, McpServerStdio, SessionConfigOption, SessionConfigOptionValue,
SessionConfigSelectOption, SessionId, SessionUpdate, TextContent, ToolCall, ToolCallStatus,
ToolCallUpdate, ToolCallUpdateFields, UsageUpdate,
};
use agent_client_protocol::schema::ProtocolVersion;
@@ -139,6 +140,44 @@ fn successful_session_load_does_not_create_a_replacement() {
assert_eq!(create_calls.load(Ordering::Relaxed), 0);
}
#[test]
fn stale_config_values_are_dropped_before_session_application() {
let options = vec![SessionConfigOption::select(
"model",
"Model",
"fast",
vec![SessionConfigSelectOption::new("fast", "Fast")],
)];
let values = std::collections::BTreeMap::from([
(
"model".to_owned(),
SessionConfigOptionValue::value_id("missing"),
),
(
"unknown".to_owned(),
SessionConfigOptionValue::value_id("value"),
),
]);
assert!(valid_config_values(&options, &values).is_empty());
}
#[test]
fn advertised_config_values_are_retained() {
let options = vec![SessionConfigOption::select(
"model",
"Model",
"fast",
vec![SessionConfigSelectOption::new("fast", "Fast")],
)];
let values = std::collections::BTreeMap::from([(
"model".to_owned(),
SessionConfigOptionValue::value_id("fast"),
)]);
assert_eq!(valid_config_values(&options, &values), values);
}
#[test]
fn failed_session_load_is_visible_and_does_not_create_a_replacement() {
let load_calls = Arc::new(AtomicUsize::new(0));
@@ -666,6 +705,8 @@ fn manager_liveness_is_observable() {
let manager = AcpSessionManager {
inner: Arc::new(ManagerInner {
command_tx,
agent_info: Mutex::new(None),
agent_capabilities: Mutex::new(None),
launch: AcpLaunchConfig::new("agent"),
alive: AtomicBool::new(true),
terminal_error: Mutex::new(None),
@@ -696,6 +737,8 @@ fn dropping_the_last_manager_requests_worker_shutdown() {
let manager = AcpSessionManager {
inner: Arc::new(ManagerInner {
command_tx,
agent_info: Mutex::new(None),
agent_capabilities: Mutex::new(None),
launch: AcpLaunchConfig::new("agent"),
alive: AtomicBool::new(true),
terminal_error: Mutex::new(None),
@@ -713,6 +756,8 @@ fn session_handle_cancel_targets_its_exact_turn_and_waits_for_ack() {
let manager = AcpSessionManager {
inner: Arc::new(ManagerInner {
command_tx,
agent_info: Mutex::new(None),
agent_capabilities: Mutex::new(None),
launch: AcpLaunchConfig::new("agent"),
alive: AtomicBool::new(true),
terminal_error: Mutex::new(None),
@@ -750,6 +795,8 @@ fn steering_uses_its_typed_command_and_preserves_unsupported_error() {
let manager = AcpSessionManager {
inner: Arc::new(ManagerInner {
command_tx,
agent_info: Mutex::new(None),
agent_capabilities: Mutex::new(None),
launch: AcpLaunchConfig::new("agent"),
alive: AtomicBool::new(true),
terminal_error: Mutex::new(None),