From 89a4eec6dafce21486c5a56e6599095e7517c4b1 Mon Sep 17 00:00:00 2001 From: chess Date: Fri, 4 Sep 2026 16:55:31 +0000 Subject: [PATCH] Keep the Windows sandbox command runner hidden (#42801) ## What changed - Build `codex-command-runner` as a Windows-subsystem binary outside tests. - Launch non-TTY sandbox commands without a console window. - Suppress the busy cursor when creating the elevated runner process. GitOrigin-RevId: fc6b70059add7dea642805030bd508915367fe44 --- .../windows-sandbox-rs/src/bin/command_runner/main.rs | 2 ++ .../windows-sandbox-rs/src/bin/command_runner/win.rs | 9 +-------- .../windows-sandbox-rs/src/elevated/runner_client.rs | 2 ++ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/codex-rs/windows-sandbox-rs/src/bin/command_runner/main.rs b/codex-rs/windows-sandbox-rs/src/bin/command_runner/main.rs index 9fe70c8750..1e3c88b443 100644 --- a/codex-rs/windows-sandbox-rs/src/bin/command_runner/main.rs +++ b/codex-rs/windows-sandbox-rs/src/bin/command_runner/main.rs @@ -1,3 +1,5 @@ +#![cfg_attr(all(target_os = "windows", not(test)), windows_subsystem = "windows")] + #[cfg(target_os = "windows")] mod win; diff --git a/codex-rs/windows-sandbox-rs/src/bin/command_runner/win.rs b/codex-rs/windows-sandbox-rs/src/bin/command_runner/win.rs index af4db8400f..b380aa0af9 100644 --- a/codex-rs/windows-sandbox-rs/src/bin/command_runner/win.rs +++ b/codex-rs/windows-sandbox-rs/src/bin/command_runner/win.rs @@ -77,9 +77,6 @@ use windows_sys::Win32::System::Threading::PROCESS_INFORMATION; use windows_sys::Win32::System::Threading::TerminateProcess; use windows_sys::Win32::System::Threading::WaitForSingleObject; -// Kept in sync with codex_exec_server::CODEX_FS_HELPER_ARG1 without introducing -// a dependency cycle. -const FS_HELPER_ARG: &str = "--codex-run-as-fs-helper"; const READ_ACL_MUTEX_NAME: &str = "Local\\CodexSandboxReadAcl"; const TERMINATION_WAIT_MS: u32 = 5_000; const WAIT_TIMEOUT: u32 = 0x0000_0102; @@ -355,11 +352,7 @@ fn spawn_ipc_process(req: &SpawnRequest) -> Result { &req.env, stdin_mode, StderrMode::Separate, - if req.command.get(1).is_some_and(|arg| arg == FS_HELPER_ARG) { - ConsoleMode::NoWindow - } else { - ConsoleMode::Inherit - }, + ConsoleMode::NoWindow, desktop, Some(log_dir.as_path()), )?; diff --git a/codex-rs/windows-sandbox-rs/src/elevated/runner_client.rs b/codex-rs/windows-sandbox-rs/src/elevated/runner_client.rs index 308a824237..697ad33919 100644 --- a/codex-rs/windows-sandbox-rs/src/elevated/runner_client.rs +++ b/codex-rs/windows-sandbox-rs/src/elevated/runner_client.rs @@ -43,6 +43,7 @@ use windows_sys::Win32::System::Threading::CreateProcessWithLogonW; use windows_sys::Win32::System::Threading::GetCurrentProcess; use windows_sys::Win32::System::Threading::GetCurrentThread; use windows_sys::Win32::System::Threading::PROCESS_INFORMATION; +use windows_sys::Win32::System::Threading::STARTF_FORCEOFFFEEDBACK; use windows_sys::Win32::System::Threading::STARTUPINFOW; use windows_sys::Win32::System::Threading::TerminateProcess; use windows_sys::Win32::System::Threading::WaitForSingleObject; @@ -350,6 +351,7 @@ pub(crate) fn spawn_runner_transport( let password_w = to_wide(&sandbox_creds.password); let mut si: STARTUPINFOW = unsafe { std::mem::zeroed() }; si.cb = std::mem::size_of::() as u32; + si.dwFlags = STARTF_FORCEOFFFEEDBACK; let mut pi: PROCESS_INFORMATION = unsafe { std::mem::zeroed() }; let env_block: Option> = None;