Codex Executor (#330)

This commit is contained in:
Solomon
2025-07-24 12:54:08 +01:00
committed by GitHub
parent 9de5c44164
commit 34a9019f92
6 changed files with 1039 additions and 17 deletions

View File

@@ -14,7 +14,8 @@ export const EXECUTOR_TYPES: string[] = [
"charm-opencode",
"claude-code-router",
"sst-opencode",
"aider"
"aider",
"codex",
];
export const EDITOR_TYPES: EditorType[] = [
@@ -35,7 +36,8 @@ export const EXECUTOR_LABELS: Record<string, string> = {
"charm-opencode": "Charm Opencode",
"claude-code-router": "Claude Code Router",
"sst-opencode": "SST Opencode",
"aider": "Aider"
"aider": "Aider",
"codex": "Codex"
};
export const EDITOR_LABELS: Record<string, string> = {

View File

@@ -10,7 +10,7 @@ use crate::{
command_runner::{CommandError, CommandProcess, CommandRunner},
executors::{
AiderExecutor, AmpExecutor, CCRExecutor, CharmOpencodeExecutor, ClaudeExecutor,
EchoExecutor, GeminiExecutor, SetupScriptExecutor, SstOpencodeExecutor,
CodexExecutor, EchoExecutor, GeminiExecutor, SetupScriptExecutor, SstOpencodeExecutor,
},
};
@@ -403,6 +403,7 @@ pub enum ExecutorConfig {
#[serde(alias = "opencode")]
SstOpencode,
Aider,
Codex,
}
// Constants for frontend
@@ -427,6 +428,7 @@ impl FromStr for ExecutorConfig {
"claude-code-router" => Ok(ExecutorConfig::ClaudeCodeRouter),
"sst-opencode" => Ok(ExecutorConfig::SstOpencode),
"aider" => Ok(ExecutorConfig::Aider),
"codex" => Ok(ExecutorConfig::Codex),
"setup-script" => Ok(ExecutorConfig::SetupScript {
script: "setup script".to_string(),
}),
@@ -447,6 +449,7 @@ impl ExecutorConfig {
ExecutorConfig::CharmOpencode => Box::new(CharmOpencodeExecutor),
ExecutorConfig::SstOpencode => Box::new(SstOpencodeExecutor::new()),
ExecutorConfig::Aider => Box::new(AiderExecutor::new()),
ExecutorConfig::Codex => Box::new(CodexExecutor::new()),
ExecutorConfig::SetupScript { script } => {
Box::new(SetupScriptExecutor::new(script.clone()))
}
@@ -481,6 +484,9 @@ impl ExecutorConfig {
}
}
ExecutorConfig::Aider => None,
ExecutorConfig::Codex => {
dirs::home_dir().map(|home| home.join(".codex").join("config.toml"))
}
ExecutorConfig::SetupScript { .. } => None,
}
}
@@ -497,6 +503,7 @@ impl ExecutorConfig {
ExecutorConfig::Gemini => Some(vec!["mcpServers"]),
ExecutorConfig::ClaudeCodeRouter => Some(vec!["mcpServers"]),
ExecutorConfig::Aider => None, // Aider doesn't support MCP. https://github.com/Aider-AI/aider/issues/3314
ExecutorConfig::Codex => None, // Codex uses TOML config, frontend doesn't handle TOML yet
ExecutorConfig::SetupScript { .. } => None, // Setup scripts don't support MCP
}
}
@@ -505,7 +512,10 @@ impl ExecutorConfig {
pub fn supports_mcp(&self) -> bool {
!matches!(
self,
ExecutorConfig::Echo | ExecutorConfig::Aider | ExecutorConfig::SetupScript { .. }
ExecutorConfig::Echo
| ExecutorConfig::Aider
| ExecutorConfig::SetupScript { .. }
| ExecutorConfig::Codex
)
}
@@ -521,6 +531,7 @@ impl ExecutorConfig {
ExecutorConfig::Gemini => "Gemini",
ExecutorConfig::ClaudeCodeRouter => "Claude Code Router",
ExecutorConfig::Aider => "Aider",
ExecutorConfig::Codex => "Codex",
ExecutorConfig::SetupScript { .. } => "Setup Script",
}
}
@@ -538,6 +549,7 @@ impl std::fmt::Display for ExecutorConfig {
ExecutorConfig::CharmOpencode => "charm-opencode",
ExecutorConfig::ClaudeCodeRouter => "claude-code-router",
ExecutorConfig::Aider => "aider",
ExecutorConfig::Codex => "codex",
ExecutorConfig::SetupScript { .. } => "setup-script",
};
write!(f, "{}", s)

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,7 @@ pub mod ccr;
pub mod charm_opencode;
pub mod claude;
pub mod cleanup_script;
pub mod codex;
pub mod dev_server;
pub mod echo;
pub mod gemini;
@@ -16,6 +17,7 @@ pub use ccr::CCRExecutor;
pub use charm_opencode::CharmOpencodeExecutor;
pub use claude::ClaudeExecutor;
pub use cleanup_script::CleanupScriptExecutor;
pub use codex::CodexExecutor;
pub use dev_server::DevServerExecutor;
pub use echo::EchoExecutor;
pub use gemini::GeminiExecutor;

View File

@@ -1,3 +1,5 @@
use std::str::FromStr;
use sqlx::SqlitePool;
use tracing::{debug, info};
use uuid::Uuid;
@@ -702,16 +704,17 @@ impl ProcessService {
/// Resolve executor configuration from string name
fn resolve_executor_config(executor_name: &Option<String>) -> crate::executor::ExecutorConfig {
match executor_name.as_ref().map(|s| s.as_str()) {
Some("claude") => crate::executor::ExecutorConfig::Claude,
Some("claude-plan") => crate::executor::ExecutorConfig::ClaudePlan,
Some("claude-code-router") => crate::executor::ExecutorConfig::ClaudeCodeRouter,
Some("amp") => crate::executor::ExecutorConfig::Amp,
Some("gemini") => crate::executor::ExecutorConfig::Gemini,
Some("charm-opencode") => crate::executor::ExecutorConfig::CharmOpencode,
Some("sst-opencode") => crate::executor::ExecutorConfig::SstOpencode,
Some("aider") => crate::executor::ExecutorConfig::Aider,
_ => crate::executor::ExecutorConfig::Echo, // Default for "echo" or None
if let Some(name) = executor_name {
crate::executor::ExecutorConfig::from_str(name).unwrap_or_else(|_| {
tracing::warn!(
"Unknown executor type '{}', defaulting to EchoExecutor",
name
);
crate::executor::ExecutorConfig::Echo
})
} else {
tracing::warn!("No executor type specified, defaulting to EchoExecutor");
crate::executor::ExecutorConfig::Echo
}
}