use std::path::Path;
use super::{AgentProvider, ProviderKind, ProviderOptions, SameThreadContinuation};
pub(crate) struct CodexProvider;
impl AgentProvider for CodexProvider {
fn kind(&self) -> ProviderKind {
ProviderKind::Codex
}
fn same_thread_continuation(&self) -> SameThreadContinuation {
SameThreadContinuation::ProviderAssignedId
}
fn build_command(
&self,
prompt: &str,
working_dir: &Path,
options: &ProviderOptions,
) -> tokio::process::Command {
let mut cmd = tokio::process::Command::new("codex");
cmd.arg("exec");
if let Some(session_id) = &options.session_id {
cmd.args(["resume", session_id]);
}
cmd.args(["--sandbox", "workspace-write", "--skip-git-repo-check"]);
if let Some(model) = &options.model {
cmd.args(["--model", model]);
}
if options.codex_json {
cmd.arg("--json");
}
let merged_prompt = match &options.system_prompt {
Some(sys) if !sys.is_empty() => format!("{sys}\n\n---\n\n{prompt}"),
_ => prompt.to_string(),
};
cmd.arg(&merged_prompt);
cmd.current_dir(working_dir);
cmd
}
}