diff --git a/Cargo.lock b/Cargo.lock index 1e237d8438f319348a1408c5b82d74360ace09a2..58d01da63372431e107ea9c0b17fde0700f9050f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -196,9 +196,9 @@ dependencies = [ [[package]] name = "agent-client-protocol" -version = "0.2.0-alpha.4" +version = "0.2.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "603941db1d130ee275840c465b73a2312727d4acef97449550ccf033de71301f" +checksum = "6d02292efd75080932b6466471d428c70e2ac06908ae24792fc7c36ecbaf67ca" dependencies = [ "anyhow", "async-broadcast", diff --git a/Cargo.toml b/Cargo.toml index 3e90af94c56aa7035dc82c1222d2152a6a8e09f0..941c364e0dd85def66ebbc4e310ef0a90458fe44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -430,7 +430,7 @@ zlog_settings = { path = "crates/zlog_settings" } # External crates # -agent-client-protocol = { version = "0.2.0-alpha.4", features = ["unstable"]} +agent-client-protocol = { version = "0.2.0-alpha.6", features = ["unstable"]} aho-corasick = "1.1" alacritty_terminal = { git = "https://github.com/zed-industries/alacritty.git", branch = "add-hush-login-flag" } any_vec = "0.14" diff --git a/crates/acp_thread/src/acp_thread.rs b/crates/acp_thread/src/acp_thread.rs index 804e4683a7cc20ac2bcd80f10139d641aa864b98..dc295369cce2b8fda596e3917724187bd35b7377 100644 --- a/crates/acp_thread/src/acp_thread.rs +++ b/crates/acp_thread/src/acp_thread.rs @@ -785,7 +785,6 @@ pub struct AcpThread { session_id: acp::SessionId, token_usage: Option, prompt_capabilities: acp::PromptCapabilities, - available_commands: Vec, _observe_prompt_capabilities: Task>, determine_shell: Shared>, terminals: HashMap>, @@ -805,6 +804,7 @@ pub enum AcpThreadEvent { LoadError(LoadError), PromptCapabilitiesUpdated, Refusal, + AvailableCommandsUpdated(Vec), } impl EventEmitter for AcpThread {} @@ -860,7 +860,6 @@ impl AcpThread { action_log: Entity, session_id: acp::SessionId, mut prompt_capabilities_rx: watch::Receiver, - available_commands: Vec, cx: &mut Context, ) -> Self { let prompt_capabilities = *prompt_capabilities_rx.borrow(); @@ -900,7 +899,6 @@ impl AcpThread { session_id, token_usage: None, prompt_capabilities, - available_commands, _observe_prompt_capabilities: task, terminals: HashMap::default(), determine_shell, @@ -911,10 +909,6 @@ impl AcpThread { self.prompt_capabilities } - pub fn available_commands(&self) -> Vec { - self.available_commands.clone() - } - pub fn connection(&self) -> &Rc { &self.connection } @@ -1010,6 +1004,9 @@ impl AcpThread { acp::SessionUpdate::Plan(plan) => { self.update_plan(plan, cx); } + acp::SessionUpdate::AvailableCommandsUpdate { available_commands } => { + cx.emit(AcpThreadEvent::AvailableCommandsUpdated(available_commands)) + } } Ok(()) } @@ -3080,7 +3077,6 @@ mod tests { audio: true, embedded_context: true, }), - vec![], cx, ) }); diff --git a/crates/acp_thread/src/connection.rs b/crates/acp_thread/src/connection.rs index 7901b08c907811ac1b6b74b975ca66b6b901868f..1c465a4cdd466e34dcb8fc31ed910f84a4469582 100644 --- a/crates/acp_thread/src/connection.rs +++ b/crates/acp_thread/src/connection.rs @@ -338,7 +338,6 @@ mod test_support { audio: true, embedded_context: true, }), - vec![], cx, ) }); diff --git a/crates/agent2/src/agent.rs b/crates/agent2/src/agent.rs index 241e3d389f96a320d8a43e23493c4738a76802d6..e96b4c0cfa32be910a7a77e58a1911deb7e5357a 100644 --- a/crates/agent2/src/agent.rs +++ b/crates/agent2/src/agent.rs @@ -292,7 +292,6 @@ impl NativeAgent { action_log.clone(), session_id.clone(), prompt_capabilities_rx, - vec![], cx, ) }); diff --git a/crates/agent_servers/src/acp.rs b/crates/agent_servers/src/acp.rs index 7907083e144c3d6188120a8ae8e24aa0ddbd765b..7991c1e3ccedafe8891ef80c57c4939bb19d2fb1 100644 --- a/crates/agent_servers/src/acp.rs +++ b/crates/agent_servers/src/acp.rs @@ -224,7 +224,6 @@ impl AgentConnection for AcpConnection { session_id.clone(), // ACP doesn't currently support per-session prompt capabilities or changing capabilities dynamically. watch::Receiver::constant(self.agent_capabilities.prompt_capabilities), - response.available_commands, cx, ) })?; diff --git a/crates/agent_servers/src/claude.rs b/crates/agent_servers/src/claude.rs index a02d8c37c1ebaa87acdbeee4ce384787758f12b7..194867241baf86cf7b3d3ab168318a00d64d6e25 100644 --- a/crates/agent_servers/src/claude.rs +++ b/crates/agent_servers/src/claude.rs @@ -40,7 +40,7 @@ impl ClaudeCode { Self::PACKAGE_NAME.into(), "node_modules/@anthropic-ai/claude-code/cli.js".into(), true, - None, + Some("0.2.5".parse().unwrap()), cx, ) })? diff --git a/crates/agent_ui/src/acp/thread_view.rs b/crates/agent_ui/src/acp/thread_view.rs index e277caf58da8bfdf97c5991d69a67cbd8006fc5e..50da44e430fd684d0e91d43ee82a0ccb0117111d 100644 --- a/crates/agent_ui/src/acp/thread_view.rs +++ b/crates/agent_ui/src/acp/thread_view.rs @@ -430,6 +430,7 @@ impl AcpThreadView { window, cx, ); + self.available_commands.replace(vec![]); self.new_server_version_available.take(); cx.notify(); } @@ -535,26 +536,6 @@ impl AcpThreadView { Ok(thread) => { let action_log = thread.read(cx).action_log().clone(); - let mut available_commands = thread.read(cx).available_commands(); - - if connection - .auth_methods() - .iter() - .any(|method| method.id.0.as_ref() == "claude-login") - { - available_commands.push(acp::AvailableCommand { - name: "login".to_owned(), - description: "Authenticate".to_owned(), - input: None, - }); - available_commands.push(acp::AvailableCommand { - name: "logout".to_owned(), - description: "Authenticate".to_owned(), - input: None, - }); - } - this.available_commands.replace(available_commands); - this.prompt_capabilities .set(thread.read(cx).prompt_capabilities()); @@ -1343,6 +1324,30 @@ impl AcpThreadView { .set(thread.read(cx).prompt_capabilities()); } AcpThreadEvent::TokenUsageUpdated => {} + AcpThreadEvent::AvailableCommandsUpdated(available_commands) => { + let mut available_commands = available_commands.clone(); + + if thread + .read(cx) + .connection() + .auth_methods() + .iter() + .any(|method| method.id.0.as_ref() == "claude-login") + { + available_commands.push(acp::AvailableCommand { + name: "login".to_owned(), + description: "Authenticate".to_owned(), + input: None, + }); + available_commands.push(acp::AvailableCommand { + name: "logout".to_owned(), + description: "Authenticate".to_owned(), + input: None, + }); + } + + self.available_commands.replace(available_commands); + } } cx.notify(); } @@ -5745,7 +5750,6 @@ pub(crate) mod tests { audio: true, embedded_context: true, }), - vec![], cx, ) }))) @@ -5805,7 +5809,6 @@ pub(crate) mod tests { audio: true, embedded_context: true, }), - Vec::new(), cx, ) }))) diff --git a/crates/agent_ui/src/agent_diff.rs b/crates/agent_ui/src/agent_diff.rs index f9d7321ca8dd72b791a462d50f262ce0f5531fd5..e3688dccce87ab9fb563aa3129fb94c1390d003f 100644 --- a/crates/agent_ui/src/agent_diff.rs +++ b/crates/agent_ui/src/agent_diff.rs @@ -1528,6 +1528,7 @@ impl AgentDiff { | AcpThreadEvent::EntriesRemoved(_) | AcpThreadEvent::ToolAuthorizationRequired | AcpThreadEvent::PromptCapabilitiesUpdated + | AcpThreadEvent::AvailableCommandsUpdated(_) | AcpThreadEvent::Retry(_) => {} } }