From c1d9e9a28575f448649e5112dd176c28d101a715 Mon Sep 17 00:00:00 2001 From: teknium1 Date: Tue, 24 Feb 2026 03:48:11 -0800 Subject: [PATCH] refactor: improve stdout handling in KawaiiSpinner class - Captured stdout at spinner creation to prevent redirection issues from child agents. - Replaced direct print statements with a new `_write` method for consistent output handling during spinner animation and final message display. - Enhanced code maintainability and clarity by centralizing output logic. --- agent/display.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/agent/display.py b/agent/display.py index 7320cb7e..74193375 100644 --- a/agent/display.py +++ b/agent/display.py @@ -7,6 +7,7 @@ Used by AIAgent._execute_tool_calls for CLI feedback. import json import os import random +import sys import threading import time @@ -160,6 +161,18 @@ class KawaiiSpinner: self.frame_idx = 0 self.start_time = None self.last_line_len = 0 + # Capture stdout NOW, before any redirect_stdout(devnull) from + # child agents can replace sys.stdout with a black hole. + self._out = sys.stdout + + def _write(self, text: str, end: str = '\n', flush: bool = False): + """Write to the stdout captured at spinner creation time.""" + try: + self._out.write(text + end) + if flush: + self._out.flush() + except (ValueError, OSError): + pass def _animate(self): while self.running: @@ -170,7 +183,7 @@ class KawaiiSpinner: elapsed = time.time() - self.start_time line = f" {frame} {self.message} ({elapsed:.1f}s)" clear = '\r' + ' ' * self.last_line_len + '\r' - print(clear + line, end='', flush=True) + self._write(clear + line, end='', flush=True) self.last_line_len = len(line) self.frame_idx += 1 time.sleep(0.12) @@ -190,9 +203,9 @@ class KawaiiSpinner: self.running = False if self.thread: self.thread.join(timeout=0.5) - print('\r' + ' ' * (self.last_line_len + 5) + '\r', end='', flush=True) + self._write('\r' + ' ' * (self.last_line_len + 5) + '\r', end='', flush=True) if final_message: - print(f" {final_message}", flush=True) + self._write(f" {final_message}", flush=True) def __enter__(self): self.start()