Codex Executor (#330)
This commit is contained in:
@@ -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> = {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
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 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;
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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> = {
|
||||||
|
|||||||
Reference in New Issue
Block a user