From 254aafb2650ea2482b6dd796e55daa717b3ee03e Mon Sep 17 00:00:00 2001 From: Moritz Bierling Date: Thu, 26 Feb 2026 10:13:31 +0100 Subject: [PATCH] Fix SystemExit traceback during atexit cleanup on Ctrl+C MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The browser_tool signal handler calls sys.exit(130) which raises SystemExit. When this fires during terminal_tool's atexit cleanup (specifically during _cleanup_thread.join()), it produces an unhandled traceback. Wrapping the join in a try/except suppresses the race without changing shutdown behavior. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- tools/terminal_tool.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/terminal_tool.py b/tools/terminal_tool.py index 8af8c9d2f..85c166b1d 100644 --- a/tools/terminal_tool.py +++ b/tools/terminal_tool.py @@ -617,7 +617,10 @@ def _stop_cleanup_thread(): global _cleanup_running _cleanup_running = False if _cleanup_thread is not None: - _cleanup_thread.join(timeout=5) + try: + _cleanup_thread.join(timeout=5) + except (SystemExit, KeyboardInterrupt): + pass def get_active_environments_info() -> Dict[str, Any]: