You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Render a semantic activity state in the status ticker, not raw tool names (#419)
* Add closed-set test for the status ticker's activity state
The ticker currently renders whatever raw tool identifier is executing.
This test pins the fix: the rendered label must always be a member of a
small closed set of activity states, never a tool, MCP server, or
plugin name, and stalled/waiting-on-operator must render distinctly.
* Render a semantic activity state in the status ticker, not raw tool names
The ticker rendered whatever tool identifier was currently executing —
internal plumbing vocabulary leaking into a product surface, and
redundant with the transcript, which already shows the tool call.
Replace it with a closed set of human activity states (thinking,
planning, researching, building, working, waiting, stalled, stopping).
The execution-to-state mapping lives in one place with an explicit
fallback to 'working', so an unmapped tool, MCP server, or plugin name
can never reach the ticker and adding a tool needs no ticker change.
Stalled reuses the existing stall-watchdog signal rather than a second
notion of stuck, and waiting on operator approval is now its own state
distinct from active work.
* Make the ticker's closed set compiler-enforced and fix review findings
- AppShell.lockupPhase and LockupFrame.phase in shell.ts are now typed
ActivityState | null instead of string | null, so a raw tool identifier
reaching the ticker is a type error at the setLockupFrame boundary, not
only a test failure. lockup.ts's LockupInput.phase stays a generic string
deliberately — its own tests exercise arbitrary CJK/astral text to check
width math unrelated to the activity vocabulary, and the leak boundary is
already closed one layer up.
- isStalled on resolveTurnLabel is now required, matching resolveRampPhase;
a caller that forgets it is the exact bug this state exists to prevent.
- runtime-bridge.ts's second stall check site now calls isStalledForDisplay
instead of re-deriving 'not quiet' from stallLevel's result, so the two
call sites share one definition of stalled.
- Dropped unread TurnLabelInput.awaitingResponse.
- docs/TUI.md corrected: it described the phase slot as showing 'the running
tool's name', which this change makes false; it now points at
ACTIVITY_STATES as the source of truth.
- Added delete_file/advance_workflow/tool_search/search_agents to the
tool-to-state table.
- Test fallback case swapped from the fictional 'bash' tool to a real MCP
identifier, since 'bash' cannot occur at runtime.
0 commit comments