Allow idle threads to prewarm and repair WebSocket connections (#47701)

## Why

A previously used WebSocket can close while a thread is idle. Hosts need a way to prepare the connection before the next turn without repeating warmup on a healthy connection.

## What changed

- Expose `CodexThread::prewarm()` using the existing startup warmup and next-turn handoff.
- Reuse healthy connections and pending warmups, retry failed warmups, and repair closed connections. Treat a finished WebSocket reader task as a closed connection.
- Skip scheduling during an active turn or shutdown, and stop warmup admission before shutdown takes the pending task.
- Expose `active_turn_environment_selections()` so hosts can inspect the environments captured by the active turn, including those still starting or failed, when authorizing steering.

## Testing

Add regression coverage for repeated idle prewarm calls, healthy connection reuse with preserved response continuation, reconnection with `generate: false`, and warmup rejection after shutdown. Update delayed MCP discovery coverage to verify prewarm repairs an eagerly closed socket and the first turn reuses it.

GitOrigin-RevId: aa164b91a399de2375eda3bf28397725439fce93
This commit is contained in:
vkg-oai
2026-09-24 00:37:56 +00:00
committed by copyberry
parent 4b3b569f39
commit d838c2346d
14 changed files with 310 additions and 91 deletions
@@ -223,7 +223,11 @@ impl ResponsesWebsocketConnection {
}
pub async fn is_closed(&self) -> bool {
self.stream.lock().await.is_none()
self.stream
.lock()
.await
.as_ref()
.is_none_or(|stream| stream.pump_task.is_finished())
}
#[instrument(