From 2e6699b31911778caba411a38a3497b42d66a6f7 Mon Sep 17 00:00:00 2001 From: vominh1919 Date: Sat, 25 Apr 2026 09:24:44 +0700 Subject: [PATCH] fix: strip leaked declare-x env dump from terminal output on macOS (#15459) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On macOS (bash 3.2 and some Homebrew bash builds) `source`ing a file that contains `declare -x` statements prints each declaration to stdout. The persistent-shell wrapper in tools/environments/base.py was only redirecting stderr when sourcing the session snapshot, so ~60 lines of env vars leaked into every terminal tool response — blowing out context and triggering HTTP 400s on context-limited providers. Fix: redirect both stdout and stderr when sourcing the snapshot. Linux bash is silent here, so the redirect is harmless there; macOS no longer leaks. Closes #15459 Co-authored-by: Sanjays2402 <51058514+Sanjays2402@users.noreply.github.com> --- tools/environments/base.py | 11 +++++++++-- tools/terminal_tool.py | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tools/environments/base.py b/tools/environments/base.py index 4510b1749f..9ca26405cf 100644 --- a/tools/environments/base.py +++ b/tools/environments/base.py @@ -386,9 +386,16 @@ class BaseEnvironment(ABC): parts = [] - # Source snapshot (env vars from previous commands) + # Source snapshot (env vars from previous commands). + # Redirect stdout to /dev/null: on macOS (bash 3.2 and certain + # Homebrew bash builds) sourcing a file containing ``declare -x`` + # can emit the declarations to stdout, leaking ~60 lines of env + # vars into every tool response (issue #15459). Linux bash is + # silent here, but the redirect is harmless. if self._snapshot_ready: - parts.append(f"source {self._snapshot_path} 2>/dev/null || true") + parts.append( + f"source {self._snapshot_path} >/dev/null 2>&1 || true" + ) # Preserve bare ``~`` expansion, but rewrite ``~/...`` through # ``$HOME`` so suffixes with spaces remain a single shell word. diff --git a/tools/terminal_tool.py b/tools/terminal_tool.py index a2e8a21898..105c5aa858 100644 --- a/tools/terminal_tool.py +++ b/tools/terminal_tool.py @@ -1851,7 +1851,7 @@ def terminal_tool( # Extract output output = result.get("output", "") returncode = result.get("returncode", 0) - + # Add helpful message for sudo failures in messaging context output = _handle_sudo_failure(output, env_type)