mirror of
https://github.com/openai/codex.git
synced 2026-04-29 10:53:24 +03:00
Addresses #17303 Problem: The standalone codex-tui entrypoint only printed token usage on exit, so resumable sessions could omit the codex resume footer even when thread metadata was available. Solution: Format codex-tui exit output from AppExitInfo so it includes the same resume hint as the main CLI and reports fatal exits consistently.
77 lines
2.1 KiB
Rust
77 lines
2.1 KiB
Rust
use clap::Parser;
|
|
use codex_app_server_client::legacy_core;
|
|
use codex_arg0::Arg0DispatchPaths;
|
|
use codex_arg0::arg0_dispatch_or_else;
|
|
use codex_tui::AppExitInfo;
|
|
use codex_tui::Cli;
|
|
use codex_tui::ExitReason;
|
|
use codex_tui::run_main;
|
|
use codex_utils_cli::CliConfigOverrides;
|
|
use supports_color::Stream;
|
|
|
|
fn format_exit_messages(exit_info: AppExitInfo, color_enabled: bool) -> Vec<String> {
|
|
let AppExitInfo {
|
|
token_usage,
|
|
thread_id,
|
|
thread_name,
|
|
..
|
|
} = exit_info;
|
|
|
|
let mut lines = Vec::new();
|
|
if !token_usage.is_zero() {
|
|
lines.push(codex_protocol::protocol::FinalOutput::from(token_usage).to_string());
|
|
}
|
|
|
|
if let Some(resume_cmd) = legacy_core::util::resume_command(thread_name.as_deref(), thread_id) {
|
|
let command = if color_enabled {
|
|
format!("\u{1b}[36m{resume_cmd}\u{1b}[39m")
|
|
} else {
|
|
resume_cmd
|
|
};
|
|
lines.push(format!("To continue this session, run {command}"));
|
|
}
|
|
|
|
lines
|
|
}
|
|
|
|
#[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,
|
|
legacy_core::config_loader::LoaderOverrides::default(),
|
|
/*remote*/ None,
|
|
/*remote_auth_token*/ None,
|
|
)
|
|
.await?;
|
|
match exit_info.exit_reason {
|
|
ExitReason::Fatal(message) => {
|
|
eprintln!("ERROR: {message}");
|
|
std::process::exit(1);
|
|
}
|
|
ExitReason::UserRequested => {}
|
|
}
|
|
|
|
let color_enabled = supports_color::on(Stream::Stdout).is_some();
|
|
for line in format_exit_messages(exit_info, color_enabled) {
|
|
println!("{line}");
|
|
}
|
|
Ok(())
|
|
})
|
|
}
|