use crate::agent::{Agent, Started};
use crate::types::ChatResponse;
use anyhow::Result;
pub async fn run_interactive_loop(agent: &Agent<Started>) -> Result<()> {
use std::io::{self, BufRead, Write};
let stdin = io::stdin();
let mut stdout = io::stdout();
loop {
write!(stdout, "\n> ")?;
stdout.flush()?;
let mut input = String::new();
let bytes_read = stdin.lock().read_line(&mut input)?;
if bytes_read == 0 {
println!("\nGoodbye!");
break;
}
let trimmed = input.trim();
if matches!(trimmed.to_lowercase().as_str(), "exit" | "quit" | "q") {
println!("Goodbye!");
break;
}
if trimmed.is_empty() {
continue;
}
match agent.chat(trimmed).await {
Ok(response) => {
print_response(&response);
}
Err(e) => {
eprintln!("Error: {e}");
}
}
}
Ok(())
}
fn print_response(response: &ChatResponse) {
if !response.thinking.is_empty() {
println!("\n💠{}", response.thinking);
}
if !response.text.is_empty() {
println!("\n{}", response.text);
}
let usage = &response.usage_metadata;
if usage.total_token_count > 0 {
println!(
"\n📊 Tokens: {} prompt, {} response, {} total",
usage.prompt_token_count, usage.candidates_token_count, usage.total_token_count
);
}
}