From 740feed203aee13cef00d5ea806b3f7d283bc412 Mon Sep 17 00:00:00 2001 From: David Wiesen Date: Fri, 10 Apr 2026 14:08:16 -0700 Subject: [PATCH] Skip Windows sandbox setup NUX in yolo mode --- codex-rs/tui/src/lib.rs | 68 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 76609d2c62..a621b2f91e 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -49,6 +49,7 @@ use codex_protocol::config_types::WindowsSandboxLevel; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::RolloutLine; +use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::TurnContextItem; use codex_rollout::state_db::get_state_db; use codex_state::log_db; @@ -1375,9 +1376,8 @@ async fn run_ratatui_app( set_default_client_residency_requirement(config.enforce_residency.value()); let active_profile = config.active_profile.clone(); let should_show_trust_screen = should_show_trust_screen(&config); - let should_prompt_windows_sandbox_nux_at_startup = cfg!(target_os = "windows") - && trust_decision_was_made - && WindowsSandboxLevel::from_config(&config) == WindowsSandboxLevel::Disabled; + let should_prompt_windows_sandbox_nux_at_startup = + should_prompt_windows_sandbox_nux_at_startup(&config, trust_decision_was_made); let Cli { prompt, @@ -1728,6 +1728,31 @@ fn should_show_login_screen(login_status: LoginStatus, config: &Config) -> bool login_status == LoginStatus::NotAuthenticated } +fn should_prompt_windows_sandbox_nux_at_startup( + config: &Config, + trust_decision_was_made: bool, +) -> bool { + should_prompt_windows_sandbox_nux_at_startup_for_platform( + config, + trust_decision_was_made, + cfg!(target_os = "windows"), + ) +} + +fn should_prompt_windows_sandbox_nux_at_startup_for_platform( + config: &Config, + trust_decision_was_made: bool, + is_windows: bool, +) -> bool { + is_windows + && trust_decision_was_made + && WindowsSandboxLevel::from_config(config) == WindowsSandboxLevel::Disabled + && !matches!( + config.permissions.sandbox_policy.get(), + SandboxPolicy::DangerFullAccess + ) +} + #[cfg(test)] mod tests { use super::*; @@ -1997,6 +2022,43 @@ mod tests { Ok(()) } + #[tokio::test] + async fn windows_sandbox_nux_shows_after_trust_decision_without_sandbox() -> std::io::Result<()> + { + let temp_dir = TempDir::new()?; + let mut config = build_config(&temp_dir).await?; + config.set_windows_sandbox_enabled(/*value*/ false); + + let should_show = should_prompt_windows_sandbox_nux_at_startup_for_platform( + &config, /*trust_decision_was_made*/ true, /*is_windows*/ true, + ); + + assert!(should_show); + Ok(()) + } + + #[tokio::test] + async fn yolo_skips_windows_sandbox_nux_after_trust_decision() -> std::io::Result<()> { + let temp_dir = TempDir::new()?; + let overrides = ConfigOverrides { + sandbox_mode: Some(SandboxMode::DangerFullAccess), + ..Default::default() + }; + let mut config = ConfigBuilder::default() + .codex_home(temp_dir.path().to_path_buf()) + .harness_overrides(overrides) + .build() + .await?; + config.set_windows_sandbox_enabled(/*value*/ false); + + let should_show = should_prompt_windows_sandbox_nux_at_startup_for_platform( + &config, /*trust_decision_was_made*/ true, /*is_windows*/ true, + ); + + assert!(!should_show); + Ok(()) + } + #[tokio::test] async fn embedded_app_server_supports_thread_start_rpc() -> color_eyre::Result<()> { let temp_dir = TempDir::new()?;