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

View File

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

View File

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

View File

@@ -26,7 +26,7 @@ export type SoundConstants = { sound_files: Array<SoundFile>, sound_labels: Arra
export type ConfigConstants = { editor: EditorConstants, sound: SoundConstants, mode: Environment, }; export type ConfigConstants = { editor: EditorConstants, sound: SoundConstants, mode: Environment, };
export type ExecutorConfig = { "type": "echo" } | { "type": "claude" } | { "type": "claude-plan" } | { "type": "amp" } | { "type": "gemini" } | { "type": "setup-script", script: string, } | { "type": "claude-code-router" } | { "type": "charm-opencode" } | { "type": "sst-opencode" } | { "type": "aider" }; export type ExecutorConfig = { "type": "echo" } | { "type": "claude" } | { "type": "claude-plan" } | { "type": "amp" } | { "type": "gemini" } | { "type": "setup-script", script: string, } | { "type": "claude-code-router" } | { "type": "charm-opencode" } | { "type": "sst-opencode" } | { "type": "aider" } | { "type": "codex" };
export type ExecutorConstants = { executor_types: Array<ExecutorConfig>, executor_labels: Array<string>, }; export type ExecutorConstants = { executor_types: Array<ExecutorConfig>, executor_labels: Array<string>, };
@@ -136,7 +136,8 @@ export const EXECUTOR_TYPES: string[] = [
"charm-opencode", "charm-opencode",
"claude-code-router", "claude-code-router",
"sst-opencode", "sst-opencode",
"aider" "aider",
"codex",
]; ];
export const EDITOR_TYPES: EditorType[] = [ export const EDITOR_TYPES: EditorType[] = [
@@ -157,7 +158,8 @@ export const EXECUTOR_LABELS: Record<string, string> = {
"charm-opencode": "Charm Opencode", "charm-opencode": "Charm Opencode",
"claude-code-router": "Claude Code Router", "claude-code-router": "Claude Code Router",
"sst-opencode": "SST Opencode", "sst-opencode": "SST Opencode",
"aider": "Aider" "aider": "Aider",
"codex": "Codex"
}; };
export const EDITOR_LABELS: Record<string, string> = { export const EDITOR_LABELS: Record<string, string> = {