Skip to main content

codex/commands/
exec_server.rs

1use tokio::process::Command;
2
3use crate::{
4    builder::{apply_cli_overrides, resolve_cli_overrides},
5    process::spawn_with_retry,
6    CodexClient, CodexError, ExecServerRequest,
7};
8
9impl CodexClient {
10    /// Spawns `codex exec-server` with piped stdio for direct server integration.
11    pub fn start_exec_server(
12        &self,
13        request: ExecServerRequest,
14    ) -> Result<tokio::process::Child, CodexError> {
15        let ExecServerRequest {
16            listen,
17            executor_id,
18            name,
19            working_dir,
20            overrides,
21        } = request;
22
23        let resolved_overrides =
24            resolve_cli_overrides(&self.cli_overrides, &overrides, self.model.as_deref());
25
26        let mut command = Command::new(self.command_env.binary_path());
27        command
28            .stdin(std::process::Stdio::piped())
29            .stdout(std::process::Stdio::piped())
30            .stderr(std::process::Stdio::piped())
31            .kill_on_drop(true)
32            .current_dir(self.sandbox_working_dir(working_dir)?);
33
34        apply_cli_overrides(&mut command, &resolved_overrides, true);
35        command.arg("exec-server");
36
37        if let Some(listen) = listen {
38            command.arg("--listen").arg(listen);
39        }
40
41        if let Some(executor_id) = executor_id {
42            command.arg("--executor-id").arg(executor_id);
43        }
44
45        if let Some(name) = name {
46            command.arg("--name").arg(name);
47        }
48
49        self.command_env.apply(&mut command)?;
50
51        spawn_with_retry(&mut command, self.command_env.binary_path())
52    }
53}