mirror of
https://github.com/openai/codex.git
synced 2026-05-01 01:47:18 +00:00
utils/pty: add streaming spawn and terminal sizing primitives (#13695)
Enhance pty utils: * Support closing stdin * Separate stderr and stdout streams to allow consumers differentiate them * Provide compatibility helper to merge both streams back into combined one * Support specifying terminal size for pty, including on-demand resizes while process is already running * Support terminating the process while still consuming its outputs
This commit is contained in:
committed by
GitHub
parent
4e68fb96e2
commit
5b04cc657f
@@ -4,22 +4,27 @@ Lightweight helpers for spawning interactive processes either under a PTY (pseud
|
||||
|
||||
## API surface
|
||||
|
||||
- `spawn_pty_process(program, args, cwd, env, arg0)` → `SpawnedProcess`
|
||||
- `spawn_pty_process(program, args, cwd, env, arg0, size)` → `SpawnedProcess`
|
||||
- `spawn_pipe_process(program, args, cwd, env, arg0)` → `SpawnedProcess`
|
||||
- `spawn_pipe_process_no_stdin(program, args, cwd, env, arg0)` → `SpawnedProcess`
|
||||
- `combine_output_receivers(stdout_rx, stderr_rx)` → `broadcast::Receiver<Vec<u8>>`
|
||||
- `conpty_supported()` → `bool` (Windows only; always true elsewhere)
|
||||
- `TerminalSize { rows, cols }` selects PTY dimensions in character cells.
|
||||
- `ProcessHandle` exposes:
|
||||
- `writer_sender()` → `mpsc::Sender<Vec<u8>>` (stdin)
|
||||
- `output_receiver()` → `broadcast::Receiver<Vec<u8>>` (stdout/stderr merged)
|
||||
- `resize(TerminalSize)`
|
||||
- `close_stdin()`
|
||||
- `has_exited()`, `exit_code()`, `terminate()`
|
||||
- `SpawnedProcess` bundles `handle`, `output_rx`, and `exit_rx` (oneshot exit code).
|
||||
- `SpawnedProcess` bundles `session`, `stdout_rx`, `stderr_rx`, and `exit_rx` (oneshot exit code).
|
||||
|
||||
## Usage examples
|
||||
|
||||
```rust
|
||||
use std::collections::HashMap;
|
||||
use std::path::Path;
|
||||
use codex_utils_pty::combine_output_receivers;
|
||||
use codex_utils_pty::spawn_pty_process;
|
||||
use codex_utils_pty::TerminalSize;
|
||||
|
||||
# tokio_test::block_on(async {
|
||||
let env_map: HashMap<String, String> = std::env::vars().collect();
|
||||
@@ -29,13 +34,14 @@ let spawned = spawn_pty_process(
|
||||
Path::new("."),
|
||||
&env_map,
|
||||
&None,
|
||||
TerminalSize::default(),
|
||||
).await?;
|
||||
|
||||
let writer = spawned.session.writer_sender();
|
||||
writer.send(b"exit\n".to_vec()).await?;
|
||||
|
||||
// Collect output until the process exits.
|
||||
let mut output_rx = spawned.output_rx;
|
||||
let mut output_rx = combine_output_receivers(spawned.stdout_rx, spawned.stderr_rx);
|
||||
let mut collected = Vec::new();
|
||||
while let Ok(chunk) = output_rx.try_recv() {
|
||||
collected.extend_from_slice(&chunk);
|
||||
|
||||
Reference in New Issue
Block a user