Conversation
…ool labels The busy indicator was a static 'Haze is thinking' line that never changed, so during the gap between a tool finishing and the next model step (slow or reasoning models, long blocked tool runs) the UI looked frozen even though it was working. With a 5m idle timeout this was ambiguous. - Add turn-elapsed heartbeat: a 1s interval ticks while busy so the busy line always shows rolling elapsed time (e.g. 'Haze is thinking · 12s') even when there is no streamed output and no tool running. - Add tool-specific busy labels via busyToolLabel() so the indicator says what is happening (e.g. 'Reading src/foo.ts', 'Searching', 'Running command') the instant a tool starts, resetting to 'Haze is thinking' when the model resumes.
PR Review — feat(cli): live activity while busy (elapsed heartbeat + tool labels)Good UX improvement with a clean separation between formatter logic and UI heartbeat, but two real correctness issues should be fixed before merge.
🟡 Important
1. Stale `busy` closure can reset elapsed timer
|
BabyKoan
left a comment
There was a problem hiding this comment.
Blocking issues found.
- Stale
busyclosure can reset elapsed timer - Elapsed label can flash
0simmediately
Problem
The `⠧ Haze is thinking` busy indicator was a static line that never changed. During the gap between a tool finishing and the next model step emitting output — especially with slow / reasoning models, or a long blocked tool run — the UI showed no rolling activity at all, so it looked frozen even though work was in progress. Combined with the generous 5-minute idle timeout, this made it hard to tell whether Haze was stuck or still running.
Changes
Files
```
src/cli/commands/chat.tsx | 39 +++++++++++++++++++++++++++++++++------
src/cli/commands/formatters.ts | 36 ++++++++++++++++++++++++++++++++++++
src/cli/commands/streaming.ts | 5 ++++-
tests/cli/formatters.test.ts | 40 ++++++++++++++++++++++++++++++++--
```
Validation