diff --git a/codex-rs/app-server/src/codex_message_processor.rs b/codex-rs/app-server/src/codex_message_processor.rs index b9513b259f..8fec01d029 100644 --- a/codex-rs/app-server/src/codex_message_processor.rs +++ b/codex-rs/app-server/src/codex_message_processor.rs @@ -2671,12 +2671,12 @@ impl CodexMessageProcessor { }; let dependency_env = thread.dependency_env().await; - let contains = std::env::var(&key) - .ok() - .is_some_and(|value| !value.trim().is_empty()) - || dependency_env - .get(&key) - .is_some_and(|value| !value.trim().is_empty()); + let contains = match dependency_env.get(&key) { + Some(value) => !value.trim().is_empty(), + None => std::env::var(&key) + .ok() + .is_some_and(|value| !value.trim().is_empty()), + }; self.outgoing .send_response(request_id, ThreadEnvContainsResponse { contains }) .await; diff --git a/codex-rs/app-server/tests/suite/v2/thread_shell_command.rs b/codex-rs/app-server/tests/suite/v2/thread_shell_command.rs index 2dc552d8c5..02459fcb58 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_shell_command.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_shell_command.rs @@ -81,7 +81,7 @@ async fn thread_env_contains_checks_process_env() -> Result<()> { let contains_id = mcp .send_thread_env_contains_request(ThreadEnvContainsParams { - thread_id: thread.id, + thread_id: thread.id.clone(), key: PROCESS_ENV_KEY.to_string(), }) .await?; @@ -93,6 +93,33 @@ async fn thread_env_contains_checks_process_env() -> Result<()> { let contains = to_response::(contains_resp)?; assert_eq!(contains, ThreadEnvContainsResponse { contains: true }); + let set_id = mcp + .send_thread_dependency_env_set_request(ThreadDependencyEnvSetParams { + thread_id: thread.id.clone(), + values: HashMap::from([(PROCESS_ENV_KEY.to_string(), String::new())]), + }) + .await?; + let set_resp: JSONRPCResponse = timeout( + DEFAULT_READ_TIMEOUT, + mcp.read_stream_until_response_message(RequestId::Integer(set_id)), + ) + .await??; + let _: ThreadDependencyEnvSetResponse = to_response(set_resp)?; + + let contains_id = mcp + .send_thread_env_contains_request(ThreadEnvContainsParams { + thread_id: thread.id, + key: PROCESS_ENV_KEY.to_string(), + }) + .await?; + let contains_resp: JSONRPCResponse = timeout( + DEFAULT_READ_TIMEOUT, + mcp.read_stream_until_response_message(RequestId::Integer(contains_id)), + ) + .await??; + let contains = to_response::(contains_resp)?; + assert_eq!(contains, ThreadEnvContainsResponse { contains: false }); + Ok(()) }