mirror of
https://github.com/openai/codex.git
synced 2026-10-31 08:13:51 +00:00
## Why The transport in [openai/codex#26242](https://github.com/openai/codex/pull/26242) needs to be used by every remote orchestrator-to-executor connection before JSON-RPC traffic starts. ## Changes - Generates one executor Noise identity when remote exec-server starts and registers its public key. - Creates a harness identity for each physical remote environment connection. - Fetches a fresh registry bundle before connecting and validates the authenticated harness key before completing the executor handshake. - Multiplexes encrypted logical streams over the existing executor WebSocket. - Adds bounded stream, handshake-failure, and reassembly state. - Adds safe lifecycle diagnostics without logging keys, authorizations, plaintext, or ciphertext. - Covers reconnects, replay rejection, validation failure, framing limits, and encrypted JSON-RPC tool traffic. ## Stack 1. [openai/codex#26242](https://github.com/openai/codex/pull/26242): Noise channel and relay transport 2. **[openai/codex#26245](https://github.com/openai/codex/pull/26245)**: remote registration and runtime activation ## Verification - `just test -p codex-exec-server` - `just fix -p codex-exec-server` - `just bazel-lock-check` - `cargo shear` --------- Co-authored-by: Codex <noreply@openai.com>
35 lines
1.3 KiB
Rust
35 lines
1.3 KiB
Rust
pub(crate) mod executor_stream;
|
|
mod harness;
|
|
mod message_framing;
|
|
mod ordered_ciphertext;
|
|
|
|
use tokio_tungstenite::tungstenite::protocol::WebSocketConfig;
|
|
|
|
use crate::ExecServerError;
|
|
|
|
pub(crate) use harness::NoiseHarnessConnectionArgs;
|
|
pub(crate) use harness::noise_harness_connection_from_websocket;
|
|
|
|
pub(crate) const NOISE_RELAY_RESET_REASON: &str = "noise_relay_protocol_error";
|
|
|
|
// This bounds allocation in tungstenite before protobuf and Noise record
|
|
// validation run. It comfortably fits one maximum Noise record plus metadata.
|
|
const MAX_NOISE_RELAY_WEBSOCKET_MESSAGE_SIZE: usize = 256 * 1024;
|
|
|
|
/// Return the websocket limits required by every Noise relay endpoint.
|
|
pub(crate) fn noise_relay_websocket_config() -> WebSocketConfig {
|
|
WebSocketConfig::default()
|
|
.max_frame_size(Some(MAX_NOISE_RELAY_WEBSOCKET_MESSAGE_SIZE))
|
|
.max_message_size(Some(MAX_NOISE_RELAY_WEBSOCKET_MESSAGE_SIZE))
|
|
}
|
|
|
|
fn take_next_sequence(next_seq: &mut u32) -> Result<u32, ExecServerError> {
|
|
// Never wrap: relay sequence is the explicit ordering key for an implicit
|
|
// Noise nonce. Reusing zero after u32::MAX would be ambiguous and unsafe.
|
|
let seq = *next_seq;
|
|
*next_seq = next_seq.checked_add(1).ok_or_else(|| {
|
|
ExecServerError::Protocol("Noise relay sequence number exhausted".to_string())
|
|
})?;
|
|
Ok(seq)
|
|
}
|