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