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),