use clap::Parser; use codex_arg0::Arg0DispatchPaths; use codex_arg0::arg0_dispatch_or_else; use codex_config::LoaderOverrides; use codex_tui::Cli; use codex_tui::ExitReason; use codex_tui::run_main; use codex_utils_cli::CliConfigOverrides; use std::io::Write; use supports_color::Stream; #[derive(Parser, Debug)] struct TopCli { #[clap(flatten)] config_overrides: CliConfigOverrides, #[clap(flatten)] inner: Cli, } fn main() -> anyhow::Result<()> { arg0_dispatch_or_else(|arg0_paths: Arg0DispatchPaths| async move { let top_cli = TopCli::parse(); let mut inner = top_cli.inner; inner .config_overrides .raw_overrides .splice(0..0, top_cli.config_overrides.raw_overrides); let exit_info = run_main( inner, arg0_paths, LoaderOverrides::default(), /*explicit_remote_endpoint*/ None, ) .await?; let is_fatal = match &exit_info.exit_reason { ExitReason::Fatal(message) => { eprintln!("ERROR: {message}"); true } ExitReason::UserRequested | ExitReason::Archived(_) | ExitReason::TurnInterrupted | ExitReason::ThreadRemoved => false, }; let color_enabled = supports_color::on(Stream::Stdout).is_some(); for line in exit_info.format_exit_messages(color_enabled) { println!("{line}"); } if is_fatal { std::io::stdout().flush()?; std::process::exit(1); } Ok(()) }) }