sqlite_graphrag/spawn/
codex_adapter.rs1use super::compat_matrix::codex_capabilities;
4use super::executor_version::ExecutorVersion;
5use super::{CompatMode, ParsedOutput, VersionAdapter};
6use crate::errors::AppError;
7use async_trait::async_trait;
8use std::process::Command;
9
10pub struct CodexAdapter;
12
13#[async_trait]
14impl VersionAdapter for CodexAdapter {
15 fn name(&self) -> &'static str {
16 "codex"
17 }
18
19 async fn detect(&self) -> Result<ExecutorVersion, AppError> {
20 let output = Command::new("codex").arg("--version").output();
21 match output {
22 Ok(out) => {
23 let raw = String::from_utf8_lossy(&out.stdout).trim().to_string();
24 if raw.is_empty() {
25 let raw = String::from_utf8_lossy(&out.stderr).trim().to_string();
26 if raw.is_empty() {
27 return Ok(ExecutorVersion::unknown());
28 }
29 return ExecutorVersion::parse(&raw);
30 }
31 ExecutorVersion::parse(&raw)
32 }
33 Err(_) => Ok(ExecutorVersion::unknown()),
34 }
35 }
36
37 fn capabilities_for(&self, version: &ExecutorVersion) -> super::ExecutorCapabilities {
38 codex_capabilities(version)
39 }
40
41 fn build_args(
42 &self,
43 prompt: &str,
44 caps: &super::ExecutorCapabilities,
45 _compat_mode: CompatMode,
46 ) -> Vec<String> {
47 let mut args = vec!["exec".to_string()];
48 args.extend(caps.default_flags.clone());
49 args.push("--json".to_string());
50 args.push(prompt.to_string());
51 args
52 }
53
54 fn parse_output(&self, raw_stdout: &str, raw_stderr: &str, exit_code: i32) -> ParsedOutput {
55 let mut items = Vec::new();
56 for line in raw_stdout.lines() {
57 let trimmed = line.trim();
58 if trimmed.is_empty() {
59 continue;
60 }
61 if let Ok(v) = serde_json::from_str::<serde_json::Value>(trimmed) {
62 items.push(v);
63 } else if let Ok(v) = serde_json::from_str::<serde_json::Value>(&format!("[{trimmed}]"))
64 {
65 if let Some(arr) = v.as_array() {
66 for item in arr {
67 items.push(item.clone());
68 }
69 }
70 }
71 }
72 ParsedOutput {
73 items,
74 raw_stdout: raw_stdout.to_string(),
75 raw_stderr: raw_stderr.to_string(),
76 exit_code,
77 }
78 }
79}