diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock
index 02103c6c49..94906b3cc9 100644
--- a/codex-rs/Cargo.lock
+++ b/codex-rs/Cargo.lock
@@ -2168,6 +2168,7 @@ dependencies = [
"tempfile",
"tokio",
"tokio-tungstenite",
+ "windows-sys 0.52.0",
]
[[package]]
diff --git a/codex-rs/app-server-daemon/Cargo.toml b/codex-rs/app-server-daemon/Cargo.toml
index fee5732197..171379539f 100644
--- a/codex-rs/app-server-daemon/Cargo.toml
+++ b/codex-rs/app-server-daemon/Cargo.toml
@@ -38,3 +38,6 @@ tokio-tungstenite = { workspace = true }
[dev-dependencies]
pretty_assertions = { workspace = true }
tempfile = { workspace = true }
+
+[target.'cfg(windows)'.dependencies]
+windows-sys = { version = "0.52", features = ["Win32_Foundation", "Win32_Storage_FileSystem", "Win32_System_IO", "Win32_System_JobObjects", "Win32_Security", "Win32_Security_Authorization", "Win32_System_Threading"] }
diff --git a/codex-rs/app-server-daemon/src/backend/mod.rs b/codex-rs/app-server-daemon/src/backend/mod.rs
index d40df07a0e..faa99a5a17 100644
--- a/codex-rs/app-server-daemon/src/backend/mod.rs
+++ b/codex-rs/app-server-daemon/src/backend/mod.rs
@@ -1,4 +1,6 @@
mod pid;
+#[cfg(windows)]
+pub(crate) mod windows;
use std::path::Path;
use std::path::PathBuf;
diff --git a/codex-rs/app-server-daemon/src/backend/pid.rs b/codex-rs/app-server-daemon/src/backend/pid.rs
index 77de413a3b..2deb9f37b8 100644
--- a/codex-rs/app-server-daemon/src/backend/pid.rs
+++ b/codex-rs/app-server-daemon/src/backend/pid.rs
@@ -1,4 +1,4 @@
-//! PID reservations serialize launches and protect stale-record cleanup.
+//! PID reservations serialize detached launches; creation times protect stale-record cleanup.
use std::io::SeekFrom;
use std::path::Path;
@@ -8,7 +8,7 @@ use std::time::Duration;
use anyhow::Context;
use anyhow::Result;
use anyhow::bail;
-#[cfg(unix)]
+#[cfg(any(unix, windows))]
use codex_app_server_transport::REMOTE_CONTROL_DISABLED_ENV_VAR;
use serde::Deserialize;
use serde::Serialize;
@@ -26,7 +26,7 @@ const START_TIMEOUT: Duration = Duration::from_secs(10);
const STDERR_LOG_TAIL_BYTES: u64 = 4096;
#[derive(Debug)]
-#[cfg_attr(not(unix), allow(dead_code))]
+#[cfg_attr(not(any(unix, windows)), allow(dead_code))]
pub(crate) struct PidBackend {
codex_bin: PathBuf,
pid_file: PathBuf,
@@ -68,7 +68,7 @@ enum PidFileState {
}
#[derive(Debug, Clone, Copy)]
-#[cfg_attr(not(unix), allow(dead_code))]
+#[cfg_attr(not(any(unix, windows)), allow(dead_code))]
enum PidCommandKind {
AppServer { remote_control_enabled: bool },
UpdateLoop,
@@ -115,7 +115,12 @@ impl PidBackend {
}
}
- #[cfg(not(unix))]
+ #[cfg(any(unix, windows))]
+ pub(crate) async fn start(&self) -> Result