diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index fc1ace449b54..e4576c29ae65 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -1178,7 +1178,6 @@ impl Agent { ).await?; let mut no_tools_called = true; - let mut messages_to_add = Conversation::default(); let mut tools_updated = false; let mut did_recovery_compact_this_iteration = false; let mut exit_chat = false; @@ -1233,7 +1232,8 @@ impl Agent { if !text.is_empty() { last_assistant_text = text; } - messages_to_add.push(response.clone()); + session_manager.add_message(&session_config.id, &response).await?; + conversation.push(response); continue; } @@ -1429,7 +1429,8 @@ impl Agent { response.created, thinking_content, ).with_id(format!("msg_{}", Uuid::new_v4())); - messages_to_add.push(thinking_msg); + session_manager.add_message(&session_config.id, &thinking_msg).await?; + conversation.push(thinking_msg); } // Collect reasoning content to attach to tool request messages @@ -1457,11 +1458,14 @@ impl Agent { request.metadata.as_ref(), request.tool_meta.clone(), ); - messages_to_add.push(request_msg); let final_response = tool_response_messages[idx] .lock().await.clone(); - yield AgentEvent::Message(final_response.clone()); - messages_to_add.push(final_response); + // Persist the tool request and response as a pair + session_manager.add_message(&session_config.id, &request_msg).await?; + session_manager.add_message(&session_config.id, &final_response).await?; + conversation.push(request_msg); + conversation.push(final_response.clone()); + yield AgentEvent::Message(final_response); } else { error!( "Tool call could not be parsed: {}", @@ -1598,11 +1602,13 @@ impl Agent { if final_output_tool.final_output.is_none() { warn!("Final output tool has not been called yet. Continuing agent loop."); let message = Message::user().with_text(FINAL_OUTPUT_CONTINUATION_MESSAGE); - messages_to_add.push(message.clone()); + session_manager.add_message(&session_config.id, &message).await?; + conversation.push(message.clone()); yield AgentEvent::Message(message); } else { let message = Message::assistant().with_text(final_output_tool.final_output.clone().unwrap()); - messages_to_add.push(message.clone()); + session_manager.add_message(&session_config.id, &message).await?; + conversation.push(message.clone()); yield AgentEvent::Message(message); exit_chat = true; } @@ -1613,6 +1619,8 @@ impl Agent { Ok(should_retry) => { if should_retry { info!("Retry logic triggered, restarting agent loop"); + session_manager.replace_conversation(&session_config.id, &conversation).await?; + yield AgentEvent::HistoryReplaced(conversation.clone()); } else { exit_chat = true; } @@ -1653,17 +1661,14 @@ impl Agent { }).await?; } conversation = Conversation::new_unvalidated(updated_messages); - messages_to_add.push(summary_msg); + session_manager.add_message(&session_config.id, &summary_msg).await?; + conversation.push(summary_msg); } else { warn!("Expected a tool request/reply pair, but found {} matching messages", matching.len()); } } - for msg in &messages_to_add { - session_manager.add_message(&session_config.id, msg).await?; - } - conversation.extend(messages_to_add); if exit_chat { break; }