From f92875bc3e1cc5570df10d712167bc30fdd9dd61 Mon Sep 17 00:00:00 2001 From: 0xbyt4 <35742124+0xbyt4@users.noreply.github.com> Date: Thu, 26 Feb 2026 23:55:07 +0300 Subject: [PATCH] fix(cli): reduce spinner flickering under patch_stdout KawaiiSpinner used a two-phase clear+redraw approach: first write \r + spaces to blank the line, then \r + new frame. When running inside prompt_toolkit's patch_stdout proxy, each phase could trigger a separate repaint, causing visible flickering every 120ms. Replace with a single \r\033[K (carriage return + ANSI erase-to-EOL) write so the line is cleared and redrawn atomically. --- agent/display.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/agent/display.py b/agent/display.py index 6ba02b59d..0da773395 100644 --- a/agent/display.py +++ b/agent/display.py @@ -182,8 +182,9 @@ class KawaiiSpinner: frame = self.spinner_frames[self.frame_idx % len(self.spinner_frames)] elapsed = time.time() - self.start_time line = f" {frame} {self.message} ({elapsed:.1f}s)" - clear = '\r' + ' ' * self.last_line_len + '\r' - self._write(clear + line, end='', flush=True) + # Use \r + ANSI erase-to-EOL in a single write to avoid the + # two-phase clear+redraw that flickers under patch_stdout. + self._write(f"\r\033[K{line}", end='', flush=True) self.last_line_len = len(line) self.frame_idx += 1 time.sleep(0.12) @@ -203,7 +204,7 @@ class KawaiiSpinner: self.running = False if self.thread: self.thread.join(timeout=0.5) - self._write('\r' + ' ' * (self.last_line_len + 5) + '\r', end='', flush=True) + self._write('\r\033[K', end='', flush=True) if final_message: self._write(f" {final_message}", flush=True)