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