ThoughtBubble
Chain-of-thought display — visually distinct from a regular chat bubble with a dashed border, muted tint, and italic body. Pair with a streaming loop: toggle streaming while tokens arrive, set durationMs once thinking concludes. Five roles (planning, reflecting, reasoning, deciding, critiquing) drive the header icon and label.
src/components/ai/thought-bubble.tsxPlanning with duration
role='planning' picks the compass icon. durationMs renders a tabular-nums timer in the header.
All five roles
Each role maps to its own icon — reflecting spins while in-flight. Keep the copy short so the header tag carries the intent.
Streaming in-flight
role='reflecting' spins its loader; streaming appends a blinking cursor to the body while tokens arrive.
Collapsed by default
defaultCollapsed hides the body until the user clicks the chevron — good for long CoT that would otherwise dominate the transcript.