From 25f4940d4affcf8c60f96ffec5e3752e1f590b8a Mon Sep 17 00:00:00 2001 From: Benjamin Carlsson Date: Mon, 9 Nov 2026 00:08:57 +0000 Subject: [PATCH] Defer executor readiness when prewarming a selected project (#60309) ## What changed Set `deferred_environment` to `true` in cloud thread prewarm requests when a project is selected. Omit the field for default thread prewarming. ## Testing Update the prewarm request encoding test to verify that only requests with a selected project include the deferred readiness flag. GitOrigin-RevId: e10a646ebde9cc3acbdb01b304af0f73ecc1dbeb --- codex-rs/cloud-client/src/client_tests.rs | 4 ++-- codex-rs/cloud-client/src/prewarm.rs | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/codex-rs/cloud-client/src/client_tests.rs b/codex-rs/cloud-client/src/client_tests.rs index f333509f7e..754c9479a1 100644 --- a/codex-rs/cloud-client/src/client_tests.rs +++ b/codex-rs/cloud-client/src/client_tests.rs @@ -232,7 +232,7 @@ async fn activation_preserves_native_settings_and_thread_metadata() { } #[tokio::test] -async fn prewarm_encodes_blank_and_project_managed_environments() { +async fn prewarm_defers_readiness_only_for_selected_projects() { let mut fixture = fixture_responses(vec![ response(vec![frame(&[])], tonic::Status::ok("")), response(vec![frame(&[])], tonic::Status::ok("")), @@ -274,7 +274,7 @@ async fn prewarm_encodes_blank_and_project_managed_environments() { b"git@github.com:acme/app.git", b"\x0a\x21\x2a\x1f", b"https://github.com/acme/lib.git", - b"\x12\x03App", + b"\x12\x03App\xe8\x01\x01", ] .concat(); assert_request(&mut fixture, "Prewarm", &expected).await; diff --git a/codex-rs/cloud-client/src/prewarm.rs b/codex-rs/cloud-client/src/prewarm.rs index 4597eb9e38..d5461514c8 100644 --- a/codex-rs/cloud-client/src/prewarm.rs +++ b/codex-rs/cloud-client/src/prewarm.rs @@ -37,13 +37,14 @@ impl Client { .await } - /// Prewarm a coding thread with an optional project checkout. + /// Prewarm a coding thread, deferring executor readiness for a selected project checkout. pub async fn prewarm_thread( &self, model: Option, model_provider: Option, project: Option, ) -> Result { + let deferred_environment = project.is_some().then_some(true); let managed = match project { Some(ProjectEnvironment { name, @@ -71,6 +72,7 @@ impl Client { wire::PrewarmRequest { model, model_provider, + deferred_environment, environments: Some(wire::EnvironmentList { values: vec![wire::EnvironmentSelection { managed: Some(managed), @@ -116,6 +118,8 @@ mod wire { pub model: Option, #[prost(string, optional, tag = "16")] pub model_provider: Option, + #[prost(bool, optional, tag = "29")] + pub deferred_environment: Option, } #[derive(Clone, Message)] pub(super) struct EnvironmentList {