From 549db9fbb33e09fac82e7441db5857d6f8f670de Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Mon, 13 Apr 2026 16:59:17 -0700 Subject: [PATCH] acp_thread: Make UserMessageId required in AgentConnection::prompt (#53850) The `user_message_id` parameter on `AgentConnection::prompt` was `Option`, but `NativeAgentConnection::prompt` immediately called `.expect()` on it, crashing when the value was `None`. Because the `expect` message said `UserMessageId` was required, this PR makes the parameter not optional which makes the panic impossible. This means we also need to unconditionally generate an ID in `send`, where before we gated this on whether `truncate` returned `Some`. Generating IDs unconditionally should be find, especially because the prompt requires them. Release Notes: - N/A --- crates/acp_thread/src/acp_thread.rs | 10 +++------- crates/acp_thread/src/connection.rs | 4 ++-- crates/agent/src/agent.rs | 3 +-- crates/agent/src/tests/mod.rs | 2 +- crates/agent_servers/src/acp.rs | 2 +- crates/agent_ui/src/conversation_view.rs | 16 ++++++++-------- 6 files changed, 16 insertions(+), 21 deletions(-) diff --git a/crates/acp_thread/src/acp_thread.rs b/crates/acp_thread/src/acp_thread.rs index 2f3973fbcc..60054a0c52 100644 --- a/crates/acp_thread/src/acp_thread.rs +++ b/crates/acp_thread/src/acp_thread.rs @@ -2162,17 +2162,13 @@ impl AcpThread { let request = acp::PromptRequest::new(self.session_id.clone(), message.clone()); let git_store = self.project.read(cx).git_store().clone(); - let message_id = if self.connection.truncate(&self.session_id, cx).is_some() { - Some(UserMessageId::new()) - } else { - None - }; + let message_id = UserMessageId::new(); self.run_turn(cx, async move |this, cx| { this.update(cx, |this, cx| { this.push_entry( AgentThreadEntry::UserMessage(UserMessage { - id: message_id.clone(), + id: Some(message_id.clone()), content: block, chunks: message, checkpoint: None, @@ -4469,7 +4465,7 @@ mod tests { fn prompt( &self, - _id: Option, + _id: UserMessageId, params: acp::PromptRequest, cx: &mut App, ) -> Task> { diff --git a/crates/acp_thread/src/connection.rs b/crates/acp_thread/src/connection.rs index fbccdd1b93..58e66a7685 100644 --- a/crates/acp_thread/src/connection.rs +++ b/crates/acp_thread/src/connection.rs @@ -125,7 +125,7 @@ pub trait AgentConnection { fn prompt( &self, - user_message_id: Option, + user_message_id: UserMessageId, params: acp::PromptRequest, cx: &mut App, ) -> Task>; @@ -875,7 +875,7 @@ mod test_support { fn prompt( &self, - _id: Option, + _id: UserMessageId, params: acp::PromptRequest, cx: &mut App, ) -> Task> { diff --git a/crates/agent/src/agent.rs b/crates/agent/src/agent.rs index fe62d851ef..33098cca24 100644 --- a/crates/agent/src/agent.rs +++ b/crates/agent/src/agent.rs @@ -1489,11 +1489,10 @@ impl acp_thread::AgentConnection for NativeAgentConnection { fn prompt( &self, - id: Option, + id: acp_thread::UserMessageId, params: acp::PromptRequest, cx: &mut App, ) -> Task> { - let id = id.expect("UserMessageId is required"); let session_id = params.session_id.clone(); log::info!("Received prompt request for session: {}", session_id); log::debug!("Prompt blocks count: {}", params.prompt.len()); diff --git a/crates/agent/src/tests/mod.rs b/crates/agent/src/tests/mod.rs index ff53136a0d..2f4267b356 100644 --- a/crates/agent/src/tests/mod.rs +++ b/crates/agent/src/tests/mod.rs @@ -3350,7 +3350,7 @@ async fn test_agent_connection(cx: &mut TestAppContext) { let result = cx .update(|cx| { connection.prompt( - Some(acp_thread::UserMessageId::new()), + acp_thread::UserMessageId::new(), acp::PromptRequest::new(session_id.clone(), vec!["ghi".into()]), cx, ) diff --git a/crates/agent_servers/src/acp.rs b/crates/agent_servers/src/acp.rs index dbcaabed1c..54c24c91c8 100644 --- a/crates/agent_servers/src/acp.rs +++ b/crates/agent_servers/src/acp.rs @@ -955,7 +955,7 @@ impl AgentConnection for AcpConnection { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, params: acp::PromptRequest, cx: &mut App, ) -> Task> { diff --git a/crates/agent_ui/src/conversation_view.rs b/crates/agent_ui/src/conversation_view.rs index 7a4b8b02e2..ff5e6292f8 100644 --- a/crates/agent_ui/src/conversation_view.rs +++ b/crates/agent_ui/src/conversation_view.rs @@ -3252,7 +3252,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> { @@ -4314,7 +4314,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> { @@ -4387,7 +4387,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> { @@ -4486,7 +4486,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> { @@ -4555,7 +4555,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> { @@ -4625,7 +4625,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> { @@ -4741,7 +4741,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> { @@ -7343,7 +7343,7 @@ pub(crate) mod tests { fn prompt( &self, - _id: Option, + _id: acp_thread::UserMessageId, _params: acp::PromptRequest, _cx: &mut App, ) -> Task> {