From 646f7c0a91b8e327d263335da68ae8ef212895ce Mon Sep 17 00:00:00 2001 From: sayan-oai Date: Sun, 9 Aug 2026 02:59:39 +0000 Subject: [PATCH] Advertise environment config read support (#37654) ## What changed - Add `environmentConfigRead` to exec-server environment capabilities and advertise it for local executors. - Default the capability to `false` when deserializing responses from older executors. ## Testing - Verify legacy capability responses remain compatible and the environment config integration reports support. GitOrigin-RevId: c2110fea9e0e6e756eaeaaad096c50a943668c99 --- codex-rs/exec-server-protocol/src/protocol.rs | 23 +++++++++++++++++++ .../exec-server/tests/environment_config.rs | 3 +++ 2 files changed, 26 insertions(+) diff --git a/codex-rs/exec-server-protocol/src/protocol.rs b/codex-rs/exec-server-protocol/src/protocol.rs index 44015eea90..5a342c5152 100644 --- a/codex-rs/exec-server-protocol/src/protocol.rs +++ b/codex-rs/exec-server-protocol/src/protocol.rs @@ -112,6 +112,9 @@ pub struct EnvironmentCapabilities { /// Whether capability discovery applies the filesystem sandbox sent with each root. #[serde(default)] pub capability_discovery_sandbox: bool, + /// Whether this executor supports the `environmentConfig/read` request. + #[serde(default)] + pub environment_config_read: bool, } /// Status returned by an initialized exec-server connection. @@ -169,6 +172,7 @@ impl EnvironmentInfo { capabilities: EnvironmentCapabilities { network_proxy_launch: true, capability_discovery_sandbox: true, + environment_config_read: true, }, } } @@ -903,6 +907,24 @@ mod tests { ); } + #[test] + fn environment_capabilities_accept_legacy_response_without_environment_config_read() { + let capabilities: EnvironmentCapabilities = serde_json::from_value(serde_json::json!({ + "networkProxyLaunch": true, + "capabilityDiscoverySandbox": true, + })) + .expect("legacy environment capabilities should deserialize"); + + assert_eq!( + capabilities, + EnvironmentCapabilities { + network_proxy_launch: true, + capability_discovery_sandbox: true, + environment_config_read: false, + } + ); + } + #[test] fn environment_info_preserves_executor_temporary_directories() { let expected = serde_json::json!({ @@ -912,6 +934,7 @@ mod tests { "capabilities": { "networkProxyLaunch": false, "capabilityDiscoverySandbox": false, + "environmentConfigRead": false, }, }); let info: EnvironmentInfo = serde_json::from_value(expected.clone()) diff --git a/codex-rs/exec-server/tests/environment_config.rs b/codex-rs/exec-server/tests/environment_config.rs index 78d2d96c2c..2dff179253 100644 --- a/codex-rs/exec-server/tests/environment_config.rs +++ b/codex-rs/exec-server/tests/environment_config.rs @@ -44,6 +44,9 @@ unselected = "do not return" .await?; let environment = Environment::create_for_tests(Some(server.websocket_url().to_string()))?; + let environment_info = environment.info().await?; + assert!(environment_info.capabilities.environment_config_read); + let response = environment .read_environment_config(EnvironmentConfigReadParams { cwd: PathUri::from_abs_path(&project),