Codex Executor (#330)
This commit is contained in:
@@ -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> = {
|
||||
|
||||
@@ -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)
|
||||
|
||||
1001
backend/src/executors/codex.rs
Normal file
1001
backend/src/executors/codex.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 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>, };
|
||||
|
||||
@@ -136,7 +136,8 @@ export const EXECUTOR_TYPES: string[] = [
|
||||
"charm-opencode",
|
||||
"claude-code-router",
|
||||
"sst-opencode",
|
||||
"aider"
|
||||
"aider",
|
||||
"codex",
|
||||
];
|
||||
|
||||
export const EDITOR_TYPES: EditorType[] = [
|
||||
@@ -157,7 +158,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> = {
|
||||
|
||||
Reference in New Issue
Block a user