codex/commands/
exec_server.rs1use 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 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}