Compare commits

...

1 Commits

Author SHA1 Message Date
Dylan
dae588fa36 Add sandbox mode to config profiles 2025-10-17 11:14:51 -07:00
4 changed files with 37 additions and 1 deletions

View File

@@ -507,6 +507,7 @@ pub struct Profile {
pub model_reasoning_summary: Option<ReasoningSummary>,
pub model_verbosity: Option<Verbosity>,
pub chatgpt_base_url: Option<String>,
pub sandbox_mode: Option<SandboxMode>,
}
/// MCP representation of a [`codex_core::config::ToolsToml`].
#[derive(Deserialize, Debug, Clone, PartialEq, Serialize, TS)]

View File

@@ -52,6 +52,7 @@ model_reasoning_summary = "detailed"
model_verbosity = "medium"
model_provider = "openai"
chatgpt_base_url = "https://api.chatgpt.com"
sandbox_mode = "danger-full-access"
"#,
)
}
@@ -111,6 +112,7 @@ async fn get_config_toml_parses_all_fields() {
model_verbosity: Some(Verbosity::Medium),
model_provider: Some("openai".into()),
chatgpt_base_url: Some("https://api.chatgpt.com".into()),
sandbox_mode: Some(SandboxMode::DangerFullAccess),
},
)]),
},

View File

@@ -1026,7 +1026,8 @@ impl Config {
let features = Features::from_config(&cfg, &config_profile, feature_overrides);
let sandbox_policy = cfg.derive_sandbox_policy(sandbox_mode);
let sandbox_policy =
cfg.derive_sandbox_policy(sandbox_mode.or(config_profile.sandbox_mode));
let mut model_providers = built_in_model_providers();
// Merge user-defined providers into the built-in list.
@@ -1509,6 +1510,35 @@ approve_all = true
Ok(())
}
#[test]
fn profile_sandbox_mode_overrides_base_config() -> std::io::Result<()> {
let codex_home = TempDir::new()?;
let mut profiles = HashMap::new();
profiles.insert(
"danger".to_string(),
ConfigProfile {
sandbox_mode: Some(SandboxMode::DangerFullAccess),
..Default::default()
},
);
let cfg = ConfigToml {
sandbox_mode: Some(SandboxMode::ReadOnly),
profiles,
profile: Some("danger".to_string()),
..Default::default()
};
let config = Config::load_from_base_config_with_overrides(
cfg,
ConfigOverrides::default(),
codex_home.path().to_path_buf(),
)?;
assert_eq!(config.sandbox_policy, SandboxPolicy::DangerFullAccess);
Ok(())
}
#[test]
fn feature_table_overrides_legacy_flags() -> std::io::Result<()> {
let codex_home = TempDir::new()?;

View File

@@ -4,6 +4,7 @@ use std::path::PathBuf;
use crate::protocol::AskForApproval;
use codex_protocol::config_types::ReasoningEffort;
use codex_protocol::config_types::ReasoningSummary;
use codex_protocol::config_types::SandboxMode;
use codex_protocol::config_types::Verbosity;
/// Collection of common configuration options that a user can define as a unit
@@ -19,6 +20,7 @@ pub struct ConfigProfile {
pub model_reasoning_summary: Option<ReasoningSummary>,
pub model_verbosity: Option<Verbosity>,
pub chatgpt_base_url: Option<String>,
pub sandbox_mode: Option<SandboxMode>,
pub experimental_instructions_file: Option<PathBuf>,
pub include_plan_tool: Option<bool>,
pub include_apply_patch_tool: Option<bool>,
@@ -44,6 +46,7 @@ impl From<ConfigProfile> for codex_app_server_protocol::Profile {
model_reasoning_summary: config_profile.model_reasoning_summary,
model_verbosity: config_profile.model_verbosity,
chatgpt_base_url: config_profile.chatgpt_base_url,
sandbox_mode: config_profile.sandbox_mode,
}
}
}