use codex_cli_sdk::{Codex, CodexConfig, ThreadEvent, ThreadItem, ThreadOptions};
use tokio_stream::StreamExt;
#[tokio::main]
async fn main() -> codex_cli_sdk::Result<()> {
let codex = Codex::new(CodexConfig::default())?;
let mut thread = codex.start_thread(ThreadOptions::default());
let mut stream = thread
.run_streamed("Explain the Rust borrow checker", Default::default())
.await?;
while let Some(event) = stream.next().await {
match event? {
ThreadEvent::ItemUpdated {
item: ThreadItem::AgentMessage { text, .. },
} => {
print!("{text}");
}
ThreadEvent::ItemStarted {
item: ThreadItem::CommandExecution { command, .. },
} => {
println!("\n> Running: {command}");
}
ThreadEvent::ItemCompleted {
item: ThreadItem::CommandExecution { exit_code, .. },
} => {
if let Some(code) = exit_code {
println!(" (exit {code})");
}
}
ThreadEvent::TurnCompleted { usage } => {
println!("\n--- Turn complete ---");
println!(
"Tokens: {} in / {} out",
usage.input_tokens, usage.output_tokens
);
}
ThreadEvent::TurnFailed { error } => {
eprintln!("Turn failed: {}", error.message);
}
_ => {}
}
}
Ok(())
}