diff --git a/codex-rs/app-server-protocol/schema/typescript/v2/LoginAccountParams.ts b/codex-rs/app-server-protocol/schema/typescript/v2/LoginAccountParams.ts index e3e8afb680..ef668f9c1a 100644 --- a/codex-rs/app-server-protocol/schema/typescript/v2/LoginAccountParams.ts +++ b/codex-rs/app-server-protocol/schema/typescript/v2/LoginAccountParams.ts @@ -2,16 +2,16 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export type LoginAccountParams = { "type": "apiKey", apiKey: string, } | { "type": "chatgpt" } | { "type": "chatgptAuthTokens", +export type LoginAccountParams = { "type": "apiKey", apiKey: string, } | { "type": "chatgpt" } | { "type": "chatgptAuthTokens", /** * Access token (JWT) supplied by the client. * This token is used for backend API requests and email extraction. */ -accessToken: string, +accessToken: string, /** * Workspace/account identifier supplied by the client. */ -chatgptAccountId: string, +chatgptAccountId: string, /** * Optional plan type supplied by the client. * diff --git a/codex-rs/app-server/src/codex_message_processor.rs b/codex-rs/app-server/src/codex_message_processor.rs index 12243c79cb..b9513b259f 100644 --- a/codex-rs/app-server/src/codex_message_processor.rs +++ b/codex-rs/app-server/src/codex_message_processor.rs @@ -2670,10 +2670,13 @@ impl CodexMessageProcessor { return; }; + let dependency_env = thread.dependency_env().await; let contains = std::env::var(&key) .ok() .is_some_and(|value| !value.trim().is_empty()) - || thread.dependency_env().await.contains_key(&key); + || dependency_env + .get(&key) + .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 65404c8da7..2dc552d8c5 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 @@ -140,6 +140,33 @@ async fn thread_dependency_env_set_is_inherited_by_shell_commands() -> Result<() let contains = to_response::(contains_resp)?; assert_eq!(contains, ThreadEnvContainsResponse { contains: false }); + let set_id = mcp + .send_thread_dependency_env_set_request(ThreadDependencyEnvSetParams { + thread_id: thread.id.clone(), + values: HashMap::from([(DEPENDENCY_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.clone(), + key: DEPENDENCY_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 }); + let set_id = mcp .send_thread_dependency_env_set_request(ThreadDependencyEnvSetParams { thread_id: thread.id.clone(),