From 6f44826cd6f4513a431468bfb71c0374694f08d6 Mon Sep 17 00:00:00 2001 From: Andrew White Date: Thu, 23 Jul 2026 18:24:00 -0500 Subject: [PATCH] fix(cli): write exec stderr events to stderr in interactive mode The Stderr arm of the interactive exec event loop locked stdout, so stderr payloads were written to stdout. The non-interactive exec path already handles the same event with stderr. Write stderr payloads to stderr so shell redirection (e.g. 'openshell exec ... 2>err.txt') works in interactive mode. Signed-off-by: Andrew White --- crates/openshell-cli/src/run.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/openshell-cli/src/run.rs b/crates/openshell-cli/src/run.rs index a2ad725a4..56154823c 100644 --- a/crates/openshell-cli/src/run.rs +++ b/crates/openshell-cli/src/run.rs @@ -3108,6 +3108,7 @@ async fn sandbox_exec_interactive_grpc( let mut exit_code = 0i32; let stdout = std::io::stdout(); + let stderr = std::io::stderr(); while let Some(event) = stream.next().await { let event = event.into_diagnostic()?; @@ -3118,7 +3119,7 @@ async fn sandbox_exec_interactive_grpc( handle.flush().into_diagnostic()?; } Some(exec_sandbox_event::Payload::Stderr(err)) => { - let mut handle = stdout.lock(); + let mut handle = stderr.lock(); handle.write_all(&err.data).into_diagnostic()?; handle.flush().into_diagnostic()?; }