mirror of
https://github.com/openai/codex.git
synced 2026-10-21 17:48:44 +00:00
## Why Normal app-server protocol builds do not need the `ts-rs` and `schemars` implementations used to generate schema exports. ## What changed - Embed compressed stable and experimental TypeScript and JSON schema exports, and serve the existing export APIs from those artifacts. - Use no-op schema derives in non-test builds while keeping the real generators available for fixture regeneration and tests. - Move schema fixture regeneration behind a Python helper and update `just write-app-server-schema --experimental` to refresh the experimental embedded exports. ## Testing - Verify embedded exports match freshly generated stable and experimental schemas. - Verify export options and on-disk output remain compatible. GitOrigin-RevId: e8536338b457e6eec34bdf29ec0684144bd13734
205 lines
7.9 KiB
Rust
205 lines
7.9 KiB
Rust
use crate::JsonSchema;
|
|
use crate::TS;
|
|
use codex_utils_absolute_path::AbsolutePathBuf;
|
|
use serde::Deserialize;
|
|
use serde::Serialize;
|
|
use std::collections::HashMap;
|
|
|
|
/// PTY size in character cells for `process/spawn` PTY sessions.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessTerminalSize {
|
|
/// Terminal height in character cells.
|
|
pub rows: u16,
|
|
/// Terminal width in character cells.
|
|
pub cols: u16,
|
|
}
|
|
|
|
/// Spawn a standalone process (argv vector) without a Codex sandbox on the host
|
|
/// where the app server is running.
|
|
///
|
|
/// `process/spawn` returns after the process has started and the connection-scoped
|
|
/// `processHandle` has been registered. Process output and exit are reported via
|
|
/// `process/outputDelta` and `process/exited` notifications.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessSpawnParams {
|
|
/// Command argv vector. Empty arrays are rejected.
|
|
pub command: Vec<String>,
|
|
/// Client-supplied, connection-scoped process handle.
|
|
///
|
|
/// Duplicate active handles are rejected on the same connection. The same
|
|
/// handle can be reused after the prior process exits.
|
|
pub process_handle: String,
|
|
/// Absolute working directory for the process.
|
|
pub cwd: AbsolutePathBuf,
|
|
/// Enable PTY mode.
|
|
///
|
|
/// This implies `streamStdin` and `streamStdoutStderr`.
|
|
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
|
|
pub tty: bool,
|
|
/// Allow follow-up `process/writeStdin` requests to write stdin bytes.
|
|
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
|
|
pub stream_stdin: bool,
|
|
/// Stream stdout/stderr via `process/outputDelta` notifications.
|
|
///
|
|
/// Streamed bytes are not duplicated into the `process/exited` notification.
|
|
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
|
|
pub stream_stdout_stderr: bool,
|
|
/// Optional per-stream stdout/stderr capture cap in bytes.
|
|
///
|
|
/// When omitted, the server default applies. Set to `null` to disable the
|
|
/// cap.
|
|
#[serde(
|
|
default,
|
|
deserialize_with = "crate::protocol::serde_helpers::deserialize_double_option",
|
|
serialize_with = "crate::protocol::serde_helpers::serialize_double_option",
|
|
skip_serializing_if = "Option::is_none"
|
|
)]
|
|
#[ts(type = "number | null")]
|
|
#[ts(optional = nullable)]
|
|
pub output_bytes_cap: Option<Option<usize>>,
|
|
/// Optional timeout in milliseconds.
|
|
///
|
|
/// When omitted, the server default applies. Set to `null` to disable the
|
|
/// timeout.
|
|
#[serde(
|
|
default,
|
|
deserialize_with = "crate::protocol::serde_helpers::deserialize_double_option",
|
|
serialize_with = "crate::protocol::serde_helpers::serialize_double_option",
|
|
skip_serializing_if = "Option::is_none"
|
|
)]
|
|
#[ts(type = "number | null")]
|
|
#[ts(optional = nullable)]
|
|
pub timeout_ms: Option<Option<i64>>,
|
|
/// Optional environment overrides merged into the app-server process
|
|
/// environment.
|
|
///
|
|
/// Matching names override inherited values. Set a key to `null` to unset
|
|
/// an inherited variable.
|
|
#[ts(optional = nullable)]
|
|
pub env: Option<HashMap<String, Option<String>>>,
|
|
/// Optional initial PTY size in character cells. Only valid when `tty` is
|
|
/// true.
|
|
#[ts(optional = nullable)]
|
|
pub size: Option<ProcessTerminalSize>,
|
|
}
|
|
|
|
/// Successful response for `process/spawn`.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessSpawnResponse {}
|
|
|
|
/// Write stdin bytes to a running `process/spawn` session, close stdin, or
|
|
/// both.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessWriteStdinParams {
|
|
/// Client-supplied, connection-scoped `processHandle` from `process/spawn`.
|
|
pub process_handle: String,
|
|
/// Optional base64-encoded stdin bytes to write.
|
|
#[ts(optional = nullable)]
|
|
pub delta_base64: Option<String>,
|
|
/// Close stdin after writing `deltaBase64`, if present.
|
|
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
|
|
pub close_stdin: bool,
|
|
}
|
|
|
|
/// Empty success response for `process/writeStdin`.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessWriteStdinResponse {}
|
|
|
|
/// Terminate a running `process/spawn` session.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessKillParams {
|
|
/// Client-supplied, connection-scoped `processHandle` from `process/spawn`.
|
|
pub process_handle: String,
|
|
}
|
|
|
|
/// Empty success response for `process/kill`.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessKillResponse {}
|
|
|
|
/// Resize a running PTY-backed `process/spawn` session.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessResizePtyParams {
|
|
/// Client-supplied, connection-scoped `processHandle` from `process/spawn`.
|
|
pub process_handle: String,
|
|
/// New PTY size in character cells.
|
|
pub size: ProcessTerminalSize,
|
|
}
|
|
|
|
/// Empty success response for `process/resizePty`.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessResizePtyResponse {}
|
|
|
|
/// Stream label for `process/outputDelta` notifications.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub enum ProcessOutputStream {
|
|
/// stdout stream. PTY mode multiplexes terminal output here.
|
|
Stdout,
|
|
/// stderr stream.
|
|
Stderr,
|
|
}
|
|
|
|
/// Base64-encoded output chunk emitted for a streaming `process/spawn` request.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessOutputDeltaNotification {
|
|
/// Client-supplied, connection-scoped `processHandle` from `process/spawn`.
|
|
pub process_handle: String,
|
|
/// Output stream this chunk belongs to.
|
|
pub stream: ProcessOutputStream,
|
|
/// Base64-encoded output bytes.
|
|
pub delta_base64: String,
|
|
/// True on the final streamed chunk for this stream when output was
|
|
/// truncated by `outputBytesCap`.
|
|
pub cap_reached: bool,
|
|
}
|
|
|
|
/// Final process exit notification for `process/spawn`.
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export_to = "v2/")]
|
|
pub struct ProcessExitedNotification {
|
|
/// Client-supplied, connection-scoped `processHandle` from `process/spawn`.
|
|
pub process_handle: String,
|
|
/// Process exit code.
|
|
pub exit_code: i32,
|
|
/// Buffered stdout capture.
|
|
///
|
|
/// Empty when stdout was streamed via `process/outputDelta`.
|
|
pub stdout: String,
|
|
/// Whether stdout reached `outputBytesCap`.
|
|
///
|
|
/// In streaming mode, stdout is empty and cap state is also reported on the
|
|
/// final stdout `process/outputDelta` notification.
|
|
pub stdout_cap_reached: bool,
|
|
/// Buffered stderr capture.
|
|
///
|
|
/// Empty when stderr was streamed via `process/outputDelta`.
|
|
pub stderr: String,
|
|
/// Whether stderr reached `outputBytesCap`.
|
|
///
|
|
/// In streaming mode, stderr is empty and cap state is also reported on the
|
|
/// final stderr `process/outputDelta` notification.
|
|
pub stderr_cap_reached: bool,
|
|
}
|