diff --git a/crates/executors/src/executors/codex.rs b/crates/executors/src/executors/codex.rs index c982c9d3..256dd21e 100644 --- a/crates/executors/src/executors/codex.rs +++ b/crates/executors/src/executors/codex.rs @@ -38,6 +38,17 @@ pub enum SandboxMode { DangerFullAccess, } +/// Approval policy for Codex +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, TS, AsRefStr)] +#[serde(rename_all = "kebab-case")] +#[strum(serialize_all = "kebab-case")] +pub enum ApprovalPolicy { + Untrusted, + OnFailure, + OnRequest, + Never, +} + /// Handles session management for Codex executor pub struct SessionHandler; @@ -198,6 +209,8 @@ pub struct Codex { #[serde(default, skip_serializing_if = "Option::is_none")] pub sandbox: Option, #[serde(default, skip_serializing_if = "Option::is_none")] + pub approval: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] pub oss: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub model: Option, @@ -212,6 +225,9 @@ impl Codex { if let Some(sandbox) = &self.sandbox { builder = builder.extend_params(["--sandbox", sandbox.as_ref()]); + if sandbox == &SandboxMode::DangerFullAccess && self.approval.is_none() { + builder = builder.extend_params(["--dangerously-bypass-approvals-and-sandbox"]); + } } if self.oss.unwrap_or(false) { diff --git a/crates/server/src/bin/generate_types.rs b/crates/server/src/bin/generate_types.rs index 65a2c138..a4878dec 100644 --- a/crates/server/src/bin/generate_types.rs +++ b/crates/server/src/bin/generate_types.rs @@ -70,6 +70,7 @@ fn generate_types_content() -> String { executors::executors::amp::Amp::decl(), executors::executors::codex::Codex::decl(), executors::executors::codex::SandboxMode::decl(), + executors::executors::codex::ApprovalPolicy::decl(), executors::executors::cursor::Cursor::decl(), executors::executors::opencode::Opencode::decl(), executors::executors::qwen::QwenCode::decl(), diff --git a/shared/types.ts b/shared/types.ts index 3db8c268..91661fc8 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -142,10 +142,12 @@ export type GeminiModel = "default" | "flash"; export type Amp = { append_prompt?: string | null, dangerously_allow_all?: boolean | null, base_command_override?: string | null, additional_params?: Array | null, }; -export type Codex = { append_prompt?: string | null, sandbox?: SandboxMode | null, oss?: boolean | null, model?: string | null, base_command_override?: string | null, additional_params?: Array | null, }; +export type Codex = { append_prompt?: string | null, sandbox?: SandboxMode | null, approval?: ApprovalPolicy | null, oss?: boolean | null, model?: string | null, base_command_override?: string | null, additional_params?: Array | null, }; export type SandboxMode = "read-only" | "workspace-write" | "danger-full-access"; +export type ApprovalPolicy = "untrusted" | "on-failure" | "on-request" | "never"; + export type Cursor = { append_prompt?: string | null, force?: boolean | null, model?: string | null, base_command_override?: string | null, additional_params?: Array | null, }; export type Opencode = { append_prompt?: string | null, model?: string | null, agent?: string | null, base_command_override?: string | null, additional_params?: Array | null, };