diff --git a/codex-rs/features/src/feature_configs.rs b/codex-rs/features/src/feature_configs.rs index b7992fefd4..7665a4ca8b 100644 --- a/codex-rs/features/src/feature_configs.rs +++ b/codex-rs/features/src/feature_configs.rs @@ -89,6 +89,10 @@ impl FeatureConfig for NetworkProxyConfigToml { fn enabled(&self) -> Option { self.enabled } + + fn set_enabled(&mut self, enabled: bool) { + self.enabled = Some(enabled); + } } #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema)] diff --git a/codex-rs/features/src/lib.rs b/codex-rs/features/src/lib.rs index 95bc297f1f..522ba2f156 100644 --- a/codex-rs/features/src/lib.rs +++ b/codex-rs/features/src/lib.rs @@ -632,6 +632,7 @@ impl FeaturesToml { let Self { multi_agent_v2, apps_mcp_path_override, + network_proxy, entries, } = self; for key in legacy::legacy_feature_keys() { @@ -643,6 +644,8 @@ impl FeaturesToml { materialize_resolved_feature_enabled(multi_agent_v2, enabled); } else if spec.id == Feature::AppsMcpPathOverride { materialize_resolved_feature_enabled(apps_mcp_path_override, enabled); + } else if spec.id == Feature::NetworkProxy { + materialize_resolved_feature_enabled(network_proxy, enabled); } else { entries.insert(spec.key.to_string(), enabled); } diff --git a/codex-rs/features/src/tests.rs b/codex-rs/features/src/tests.rs index d1d7d3cae9..5cc453b559 100644 --- a/codex-rs/features/src/tests.rs +++ b/codex-rs/features/src/tests.rs @@ -551,6 +551,7 @@ fn materialize_resolved_enabled_writes_all_features_and_preserves_custom_config( let mut features = Features::with_defaults(); features.enable(Feature::CodeMode); features.enable(Feature::MultiAgentV2); + features.enable(Feature::NetworkProxy); features.disable(Feature::ToolSearch); let mut features_toml = FeaturesToml { @@ -559,6 +560,11 @@ fn materialize_resolved_enabled_writes_all_features_and_preserves_custom_config( min_wait_timeout_ms: Some(2500), ..Default::default() })), + network_proxy: Some(FeatureToml::Config(crate::NetworkProxyConfigToml { + enabled: Some(false), + proxy_url: Some("http://127.0.0.1:43128".to_string()), + ..Default::default() + })), entries: BTreeMap::from([("include_apply_patch_tool".to_string(), true)]), ..Default::default() }; @@ -583,6 +589,14 @@ fn materialize_resolved_enabled_writes_all_features_and_preserves_custom_config( ..Default::default() })) ); + assert_eq!( + features_toml.network_proxy, + Some(FeatureToml::Config(crate::NetworkProxyConfigToml { + enabled: Some(true), + proxy_url: Some("http://127.0.0.1:43128".to_string()), + ..Default::default() + })) + ); let replayed = Features::from_sources( FeatureConfigSource { features: Some(&features_toml),