mirror of
https://github.com/openai/codex.git
synced 2026-10-26 07:58:43 +00:00
## What changed - Add a hidden global `--psp` runtime flag and propagate it through TUI, exec, app-server, remote-control, and in-process startup paths. - Attach the `oai-chat-psp=true` cookie to first-party ChatGPT requests when enabled, using a cached cookie-aware client with sensitive request logging disabled. - Keep the routing selection out of persistent configuration layers while preserving it across config refreshes and agent role changes. ## Testing - Cover global flag parsing, app-server propagation, config-layer isolation, and preservation across config rebuilds and role changes. GitOrigin-RevId: 05cdc61ffd7162d8e48fc1e166f4732113e5a816
145 lines
4.3 KiB
Rust
145 lines
4.3 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, Clone, Debug)]
|
||
#[command(version)]
|
||
pub struct Cli {
|
||
/// Process-only PSP routing selected by the parent Codex CLI.
|
||
#[clap(skip)]
|
||
pub psp: bool,
|
||
|
||
/// Optional user prompt to start the session.
|
||
#[arg(value_name = "PROMPT", value_hint = clap::ValueHint::Other)]
|
||
pub prompt: Option<String>,
|
||
|
||
/// Error out when config.toml contains fields that are not recognized by this version of Codex.
|
||
#[arg(long = "strict-config", default_value_t = false)]
|
||
pub strict_config: bool,
|
||
|
||
// 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.
|
||
#[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(Clone, 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")
|
||
})
|
||
.mut_arg("auto_review", |arg| arg.conflicts_with("approval_policy"))
|
||
}
|