Skip to main content

sqlite_graphrag/spawn/
compat_matrix.rs

1//! Executor compatibility matrix (v1.0.75 — G22)
2//!
3//! Static map of which versions support which flags, used by the adapters.
4
5use super::ExecutorCapabilities;
6use crate::spawn::executor_version::ExecutorVersion;
7
8pub fn codex_capabilities(version: &ExecutorVersion) -> ExecutorCapabilities {
9    let mut caps = ExecutorCapabilities::empty();
10    caps.supports_strict_schema = true;
11
12    if version.is_at_least(0, 137, 0) {
13        caps.supports_mcp_map = true;
14        caps.supports_ask_for_approval_flag = false;
15        caps.default_flags
16            .extend(["-a".to_string(), "never".to_string()]);
17        caps.removed_flags.push("--ask-for-approval".to_string());
18    } else if version.is_at_least(0, 134, 0) {
19        // PATCH 2026-06-07: codex CLI 0.134.0 removed BOTH --ask-for-approval AND -a.
20        // Approvals are now controlled via --dangerously-bypass-approvals-and-sandbox.
21        // We skip the approval flag entirely (sandbox=read-only is already strict).
22        caps.supports_mcp_map = true;
23        caps.supports_ask_for_approval_flag = false;
24        caps.removed_flags.push("--ask-for-approval".to_string());
25        caps.removed_flags.push("-a".to_string());
26    } else if version.is_at_least(0, 130, 0) {
27        caps.supports_mcp_map = false;
28        caps.supports_ask_for_approval_flag = true;
29        caps.default_flags
30            .push("--ask-for-approval=never".to_string());
31    } else {
32        caps.supports_ask_for_approval_flag = true;
33        caps.default_flags
34            .push("--ask-for-approval=never".to_string());
35    }
36
37    caps
38}
39
40pub fn claude_capabilities(version: &ExecutorVersion) -> ExecutorCapabilities {
41    let mut caps = ExecutorCapabilities::empty();
42    caps.supports_strict_schema = true;
43    caps.supports_mcp_map = true;
44
45    if version.is_at_least(2, 0, 0) {
46        caps.supports_ask_for_approval_flag = true;
47        caps.default_flags
48            .extend(["--output-format".to_string(), "json".to_string()]);
49    } else {
50        caps.default_flags.push("--output-format=json".to_string());
51    }
52    caps
53}
54
55pub fn opencode_capabilities(_version: &ExecutorVersion) -> ExecutorCapabilities {
56    let mut caps = ExecutorCapabilities::empty();
57    caps.supports_mcp_map = true;
58    caps.supports_ask_for_approval_flag = true;
59    caps.supports_strict_schema = false;
60    caps
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn codex_137_removed_old_flag() {
69        let v = ExecutorVersion::parse("0.137.0").unwrap();
70        let caps = codex_capabilities(&v);
71        assert!(!caps.supports_ask_for_approval_flag);
72        assert!(caps
73            .removed_flags
74            .contains(&"--ask-for-approval".to_string()));
75    }
76
77    #[test]
78    fn codex_130_supports_old_flag() {
79        let v = ExecutorVersion::parse("0.130.0").unwrap();
80        let caps = codex_capabilities(&v);
81        assert!(caps.supports_ask_for_approval_flag);
82    }
83}