mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
3dc278b68e
## Why The TUI still had a few low-risk dependencies flowing through the transitional `legacy_core` namespace after the app-server migration. These helpers either already have clearer non-core owners or are presentation logic that does not belong in `codex-core`, so moving them out reduces the compatibility surface without changing product behavior. ## What changed This is a low-risk change, almost completely mechanical in nature. - Route TUI Codex-home lookup through `codex-utils-home-dir`, use `Config::log_dir` directly, and call `codex-sandboxing::system_bwrap_warning` without going through `legacy_core`. - Move shared `codex resume` hint formatting from `codex-core` into `codex-utils-cli`. - Update CLI and TUI call sites to use the shared CLI utility, and keep the resume-command behavior covered by tests in its new home. ## Verification - `cargo test -p codex-utils-cli` - `cargo test -p codex-utils-cli resume_command`
76 lines
2.0 KiB
Rust
76 lines
2.0 KiB
Rust
use clap::Parser;
|
|
use codex_arg0::Arg0DispatchPaths;
|
|
use codex_arg0::arg0_dispatch_or_else;
|
|
use codex_config::LoaderOverrides;
|
|
use codex_tui::AppExitInfo;
|
|
use codex_tui::Cli;
|
|
use codex_tui::ExitReason;
|
|
use codex_tui::run_main;
|
|
use codex_utils_cli::CliConfigOverrides;
|
|
use codex_utils_cli::resume_command;
|
|
use supports_color::Stream;
|
|
|
|
fn format_exit_messages(exit_info: AppExitInfo, color_enabled: bool) -> Vec<String> {
|
|
let AppExitInfo {
|
|
token_usage,
|
|
thread_id,
|
|
..
|
|
} = exit_info;
|
|
|
|
let mut lines = Vec::new();
|
|
if !token_usage.is_zero() {
|
|
lines.push(token_usage.to_string());
|
|
}
|
|
|
|
if let Some(resume_cmd) = resume_command(/*thread_name*/ None, 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,
|
|
LoaderOverrides::default(),
|
|
/*explicit_remote_endpoint*/ 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(())
|
|
})
|
|
}
|