Turn status: moon-phase spinner for Waiting for response

The active-turn spinner next to "Waiting for response…" now cycles
the moon phases 🌑🌒🌓🌔🌕🌖🌗🌘 — the official kimi-cli's lunation
animation (rich's `moon` spinner) — matching the welcome-screen moon
logo. New glyphs::moon_spinner_frames() with the same legacy-ConHost
ASCII fallback as every other spinner set; emoji frames are 2 columns
and the status row already measures the rendered frame, so layout
adapts. The ambient "Starting session…" row and other spinners stay
braille.

Verified: kigi-tui lib 6621 + pager-render 963 tests green; real-binary
PTY e2e waiting_for_model_label_shows_before_first_token passes with
the new spinner rendering in a live vt.
This commit is contained in:
2026-07-18 12:00:52 -04:00
parent 0dc98a34a6
commit 82ebcc38b7
2 changed files with 38 additions and 8 deletions
@@ -351,13 +351,13 @@ pub fn render_turn_status(
// ── Build components ──
// While a tool is blocked on a permission prompt or `ask_user_question`,
// swap the running braille spinner for a pulsing `◆`. Same animation
// shape the drain-blocked and plan-approval indicators already use,
// so every "your turn" status reads with one consistent visual cue.
// swap the spinning moon for a pulsing `◆`. Same animation shape the
// drain-blocked and plan-approval indicators already use, so every
// "your turn" status reads with one consistent visual cue.
let spinner_str = if is_pending_user_input {
format!("{} ", crate::glyphs::diamond_filled())
} else {
let frames = crate::glyphs::braille_spinner_frames();
let frames = crate::glyphs::moon_spinner_frames();
let frame_idx = (tick / SPINNER_DIVISOR) as usize % frames.len();
format!("{} ", frames[frame_idx])
};