mirror of
https://github.com/openai/codex.git
synced 2026-05-19 10:43:38 +00:00
## Why Configured environments need to connect to exec-server instances that are not necessarily already listening on a websocket URL. A command-backed stdio transport lets Codex start an exec-server process, speak JSON-RPC over its stdio streams, and clean up that child process with the client lifetime. **Stack position:** this is PR 2 of 5. It builds on the server-side stdio listener from PR 1 and provides the client transport used by later environment/config PRs. ## What Changed - Add `ExecServerTransport` variants for websocket URLs and stdio shell commands. - Add stdio command connection support for `ExecServerClient`. - Move websocket/stdio transport setup into `client_transport.rs` so `client.rs` stays focused on shared JSON-RPC client, session, HTTP, and notification behavior. - Tie stdio child process cleanup to the JSON-RPC connection lifetime with a RAII lifetime guard. - Keep existing websocket environment behavior by adapting URL-backed remotes to `ExecServerTransport::WebSocketUrl`. ## Stack - 1. https://github.com/openai/codex/pull/20663 - Add stdio exec-server listener - **2. This PR:** https://github.com/openai/codex/pull/20664 - Add stdio exec-server client transport - 3. https://github.com/openai/codex/pull/20665 - Make environment providers own default selection - 4. https://github.com/openai/codex/pull/20666 - Add CODEX_HOME environments TOML provider - 5. https://github.com/openai/codex/pull/20667 - Load configured environments from CODEX_HOME Split from original draft: https://github.com/openai/codex/pull/20508 ## Validation Not run locally; this was split out of the original draft stack and then refactored to separate transport setup from the base client. --------- Co-authored-by: Codex <noreply@openai.com>
74 lines
2.4 KiB
Rust
74 lines
2.4 KiB
Rust
use std::collections::HashMap;
|
|
use std::path::PathBuf;
|
|
use std::time::Duration;
|
|
|
|
use futures::future::BoxFuture;
|
|
|
|
use crate::ExecServerError;
|
|
use crate::HttpRequestParams;
|
|
use crate::HttpRequestResponse;
|
|
use crate::HttpResponseBodyStream;
|
|
|
|
/// Connection options for any exec-server client transport.
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct ExecServerClientConnectOptions {
|
|
pub client_name: String,
|
|
pub initialize_timeout: Duration,
|
|
pub resume_session_id: Option<String>,
|
|
}
|
|
|
|
/// WebSocket connection arguments for a remote exec-server.
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct RemoteExecServerConnectArgs {
|
|
pub websocket_url: String,
|
|
pub client_name: String,
|
|
pub connect_timeout: Duration,
|
|
pub initialize_timeout: Duration,
|
|
pub resume_session_id: Option<String>,
|
|
}
|
|
|
|
/// Stdio connection arguments for a command-backed exec-server.
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub(crate) struct StdioExecServerConnectArgs {
|
|
pub command: StdioExecServerCommand,
|
|
pub client_name: String,
|
|
pub initialize_timeout: Duration,
|
|
pub resume_session_id: Option<String>,
|
|
}
|
|
|
|
/// Structured process command used to start an exec-server over stdio.
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub(crate) struct StdioExecServerCommand {
|
|
pub program: String,
|
|
pub args: Vec<String>,
|
|
pub env: HashMap<String, String>,
|
|
pub cwd: Option<PathBuf>,
|
|
}
|
|
|
|
/// Parameters used to connect to a remote exec-server environment.
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub(crate) enum ExecServerTransportParams {
|
|
WebSocketUrl(String),
|
|
#[allow(dead_code)]
|
|
StdioCommand(StdioExecServerCommand),
|
|
}
|
|
|
|
/// Sends HTTP requests through a runtime-selected transport.
|
|
///
|
|
/// This is the HTTP capability counterpart to [`crate::ExecBackend`]. Callers
|
|
/// use it when they need environment-owned network requests but should not
|
|
/// depend on the concrete connection type or how that connection is established.
|
|
pub trait HttpClient: Send + Sync {
|
|
/// Perform an HTTP request and buffer the response body.
|
|
fn http_request(
|
|
&self,
|
|
params: HttpRequestParams,
|
|
) -> BoxFuture<'_, Result<HttpRequestResponse, ExecServerError>>;
|
|
|
|
/// Perform an HTTP request and return a streamed body handle.
|
|
fn http_request_stream(
|
|
&self,
|
|
params: HttpRequestParams,
|
|
) -> BoxFuture<'_, Result<(HttpRequestResponse, HttpResponseBodyStream), ExecServerError>>;
|
|
}
|