From 8ba97af4e3e4719c4371e8d1f4f2711da8c8a56b Mon Sep 17 00:00:00 2001 From: angiejones Date: Sun, 18 Jan 2026 16:05:48 -0600 Subject: [PATCH 1/2] fix(cli): sync all MCP prompt messages to session before agent reply Fixes #6506 When using /prompt in the CLI with multi-message MCP prompts, only the final user message was being interpreted by the model. This happened because: 1. handle_prompt_command added all prompt messages to self.messages (local) 2. process_agent_response only sent self.messages.last() to agent.reply() 3. agent.reply() added that single message to the session, then retrieved the conversation from the session - missing all earlier prompt messages The fix syncs all messages except the last one to the session via session_manager.add_message() before calling process_agent_response. The last message is still added by agent.reply() as normal, ensuring the full conversation context is available to the agent. --- crates/goose-cli/src/session/mod.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/goose-cli/src/session/mod.rs b/crates/goose-cli/src/session/mod.rs index a7678327b731..8a4be45e2307 100644 --- a/crates/goose-cli/src/session/mod.rs +++ b/crates/goose-cli/src/session/mod.rs @@ -1302,9 +1302,9 @@ impl CliSession { Ok(messages) => { let start_len = self.messages.len(); let mut valid = true; + let num_messages = messages.len(); for (i, prompt_message) in messages.into_iter().enumerate() { let msg = Message::from(prompt_message); - // ensure we get a User - Assistant - User type pattern let expected_role = if i % 2 == 0 { rmcp::model::Role::User } else { @@ -1317,7 +1317,6 @@ impl CliSession { expected_role, i, msg.role )); valid = false; - // get rid of everything we added to messages self.messages.truncate(start_len); break; } @@ -1329,6 +1328,17 @@ impl CliSession { } if valid { + if num_messages > 1 { + for i in 0..(num_messages - 1) { + let msg = &self.messages.messages()[start_len + i]; + self.agent + .config + .session_manager + .add_message(&self.session_id, msg) + .await?; + } + } + output::show_thinking(); self.process_agent_response(true, CancellationToken::default()) .await?; From 66177b57554936f889a6d9596dfb5c6f5c38e737 Mon Sep 17 00:00:00 2001 From: angiejones Date: Sun, 18 Jan 2026 16:32:51 -0600 Subject: [PATCH 2/2] re-adding other folks comments I removed --- crates/goose-cli/src/session/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/goose-cli/src/session/mod.rs b/crates/goose-cli/src/session/mod.rs index 8a4be45e2307..4bee1f987f27 100644 --- a/crates/goose-cli/src/session/mod.rs +++ b/crates/goose-cli/src/session/mod.rs @@ -1305,6 +1305,7 @@ impl CliSession { let num_messages = messages.len(); for (i, prompt_message) in messages.into_iter().enumerate() { let msg = Message::from(prompt_message); + // ensure we get a User - Assistant - User type pattern let expected_role = if i % 2 == 0 { rmcp::model::Role::User } else { @@ -1317,6 +1318,7 @@ impl CliSession { expected_role, i, msg.role )); valid = false; + // get rid of everything we added to messages self.messages.truncate(start_len); break; }