mirror of
https://github.com/openai/codex.git
synced 2026-05-15 00:32:51 +00:00
Addresses #18113 Problem: Shared flags provided before the exec subcommand were parsed by the root CLI but not inherited by the exec CLI, so exec sessions could run with stale or default sandbox and model configuration. Solution: Move shared TUI and exec flags into a common option block and merge root selections into exec before dispatch, while preserving exec's global subcommand flag behavior.
138 lines
4.1 KiB
Rust
138 lines
4.1 KiB
Rust
use clap::Args;
|
||
use clap::FromArgMatches;
|
||
use clap::Parser;
|
||
use codex_utils_cli::ApprovalModeCliArg;
|
||
use codex_utils_cli::CliConfigOverrides;
|
||
use codex_utils_cli::SharedCliOptions;
|
||
|
||
#[derive(Parser, Debug)]
|
||
#[command(version)]
|
||
pub struct Cli {
|
||
/// Optional user prompt to start the session.
|
||
#[arg(value_name = "PROMPT", value_hint = clap::ValueHint::Other)]
|
||
pub prompt: Option<String>,
|
||
|
||
// Internal controls set by the top-level `codex resume` subcommand.
|
||
// These are not exposed as user flags on the base `codex` command.
|
||
#[clap(skip)]
|
||
pub resume_picker: bool,
|
||
|
||
#[clap(skip)]
|
||
pub resume_last: bool,
|
||
|
||
/// Internal: resume a specific recorded session by id (UUID). Set by the
|
||
/// top-level `codex resume <SESSION_ID>` wrapper; not exposed as a public flag.
|
||
#[clap(skip)]
|
||
pub resume_session_id: Option<String>,
|
||
|
||
/// Internal: show all sessions (disables cwd filtering and shows CWD column).
|
||
#[clap(skip)]
|
||
pub resume_show_all: bool,
|
||
|
||
/// Internal: include non-interactive sessions in resume listings.
|
||
#[clap(skip)]
|
||
pub resume_include_non_interactive: bool,
|
||
|
||
// Internal controls set by the top-level `codex fork` subcommand.
|
||
// These are not exposed as user flags on the base `codex` command.
|
||
#[clap(skip)]
|
||
pub fork_picker: bool,
|
||
|
||
#[clap(skip)]
|
||
pub fork_last: bool,
|
||
|
||
/// Internal: fork a specific recorded session by id (UUID). Set by the
|
||
/// top-level `codex fork <SESSION_ID>` wrapper; not exposed as a public flag.
|
||
#[clap(skip)]
|
||
pub fork_session_id: Option<String>,
|
||
|
||
/// Internal: show all sessions (disables cwd filtering and shows CWD column).
|
||
#[clap(skip)]
|
||
pub fork_show_all: bool,
|
||
|
||
#[clap(flatten)]
|
||
pub shared: TuiSharedCliOptions,
|
||
|
||
/// Configure when the model requires human approval before executing a command.
|
||
#[arg(long = "ask-for-approval", short = 'a')]
|
||
pub approval_policy: Option<ApprovalModeCliArg>,
|
||
|
||
/// Enable live web search. When enabled, the native Responses `web_search` tool is available to the model (no per‑call approval).
|
||
#[arg(long = "search", default_value_t = false)]
|
||
pub web_search: bool,
|
||
|
||
/// Disable alternate screen mode
|
||
///
|
||
/// Runs the TUI in inline mode, preserving terminal scrollback history. This is useful
|
||
/// in terminal multiplexers like Zellij that follow the xterm spec strictly and disable
|
||
/// scrollback in alternate screen buffers.
|
||
#[arg(long = "no-alt-screen", default_value_t = false)]
|
||
pub no_alt_screen: bool,
|
||
|
||
#[clap(skip)]
|
||
pub config_overrides: CliConfigOverrides,
|
||
}
|
||
|
||
impl std::ops::Deref for Cli {
|
||
type Target = SharedCliOptions;
|
||
|
||
fn deref(&self) -> &Self::Target {
|
||
&self.shared.0
|
||
}
|
||
}
|
||
|
||
impl std::ops::DerefMut for Cli {
|
||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||
&mut self.shared.0
|
||
}
|
||
}
|
||
|
||
#[derive(Debug, Default)]
|
||
pub struct TuiSharedCliOptions(SharedCliOptions);
|
||
|
||
impl TuiSharedCliOptions {
|
||
pub fn into_inner(self) -> SharedCliOptions {
|
||
self.0
|
||
}
|
||
}
|
||
|
||
impl std::ops::Deref for TuiSharedCliOptions {
|
||
type Target = SharedCliOptions;
|
||
|
||
fn deref(&self) -> &Self::Target {
|
||
&self.0
|
||
}
|
||
}
|
||
|
||
impl std::ops::DerefMut for TuiSharedCliOptions {
|
||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||
&mut self.0
|
||
}
|
||
}
|
||
|
||
impl Args for TuiSharedCliOptions {
|
||
fn augment_args(cmd: clap::Command) -> clap::Command {
|
||
mark_tui_args(SharedCliOptions::augment_args(cmd))
|
||
}
|
||
|
||
fn augment_args_for_update(cmd: clap::Command) -> clap::Command {
|
||
mark_tui_args(SharedCliOptions::augment_args_for_update(cmd))
|
||
}
|
||
}
|
||
|
||
impl FromArgMatches for TuiSharedCliOptions {
|
||
fn from_arg_matches(matches: &clap::ArgMatches) -> Result<Self, clap::Error> {
|
||
SharedCliOptions::from_arg_matches(matches).map(Self)
|
||
}
|
||
|
||
fn update_from_arg_matches(&mut self, matches: &clap::ArgMatches) -> Result<(), clap::Error> {
|
||
self.0.update_from_arg_matches(matches)
|
||
}
|
||
}
|
||
|
||
fn mark_tui_args(cmd: clap::Command) -> clap::Command {
|
||
cmd.mut_arg("dangerously_bypass_approvals_and_sandbox", |arg| {
|
||
arg.conflicts_with("approval_policy")
|
||
})
|
||
}
|