diff --git a/src/repl/replay.rs b/src/repl/replay.rs index 79a02c8..fb9f9e9 100644 --- a/src/repl/replay.rs +++ b/src/repl/replay.rs @@ -1,6 +1,6 @@ use anyhow::Result; -use crate::client::{Message, MessageRole}; +use crate::client::{Message, MessageContent, MessageContentToolCalls, MessageRole}; use crate::config::{AppConfig, Session}; use crate::utils::{dimmed_text, replay_label_text}; @@ -52,9 +52,44 @@ fn render_messages(app: &AppConfig, messages: &[Message]) -> Result<()> { println!(); } } + MessageRole::Tool => { + if let MessageContent::ToolCalls(tool_calls) = &message.content { + render_tool_call_rounds(app, tool_calls)?; + } + } _ => {} } } Ok(()) } + +fn render_tool_call_rounds(app: &AppConfig, tool_calls: &MessageContentToolCalls) -> Result<()> { + let mut needs_gap_after_calls = false; + if !tool_calls.text.trim().is_empty() { + println!("{}", replay_label_text("Assistant:")); + app.print_markdown(&tool_calls.text)?; + println!(); + } + + for result in &tool_calls.tool_results { + if let Some(text) = result.text.as_deref().filter(|t| !t.trim().is_empty()) { + if needs_gap_after_calls { + println!(); + } + + println!("{}", replay_label_text("Assistant:")); + app.print_markdown(text)?; + println!(); + } + + println!("{}", dimmed_text(&format!("⚙ {}", result.call.name))); + needs_gap_after_calls = true; + } + + if needs_gap_after_calls { + println!(); + } + + Ok(()) +}