feat(desktop): one Call tab, read as a coding agent's tab, Luke's work under the line that asked for it (call tab 3/3)

Merged
DA
6d ago
+1290-1032

Third and last of the Call tab rollout. Dean picked design A (mockups): one Call tab that reads like a coding agent's tab, the way a ChatGPT Voice call lands in its chat thread. It replaces the side panel's Transcript and Work tabs. It's built on #2365's transcript part view, and on #2368 (the line↔turn link) and #2369 (the thread model).

Call tab, live call, light
Call tab, live call, dark

What it draws (plan-call.tsx; every row is the agent tab's own AgentMessage):

  • Spoken lines: the developer's lines are the developer's bubbles, a run of them one bubble. Luke's spoken lines are the agent's messages, with no "Luke" label, and each has a Copy button.
  • Work under the line that asked for it (call-thread.ts): each planning turn is drawn as an agent's turn. Its calls are grouped and fold once it finishes, subagents and coding-agent starts get rows of their own, and Worked for with the turn card sits under it.
    • A turn still working ends on the working line.
    • A turn that ended without answering ends on the agent's Stopped / Failed line.
  • The voice↔brain plumbing is not drawn. A spoken turn's words are left out of its rows because Luke said them, and his saying them is the line after the work.
  • Call boundaries stay: the date checkpoint (Live on the standing call) and the Call ended · length line with its card.
  • Paging of earlier turns and version history's Open (a call, or a moment) both land in the Call tab.

The tab kinds: SIDE_PANEL_TAB is now Board, Code, Call. transcript and work are retired, so a kept panel naming them still reads and lets them go (new test). The plan holds the Call kind once it has a call or a turn.

Removed:

  • PlanTranscript, and the Work tab's own drawing (SubagentTab stays in plan-work.tsx).
  • WorkIcon, speakerLabel, and WORK_EMPTY_LINE, which are now unused.

The planning fixture's turns name the lines that asked for them, so a capture shows the work under its line.

Not in this PR, by Dean's call:

  • The notetaker's plan edits are not interleaved.
  • The turn hover card has no "voice handoff" detail.
  • The tab glyph stays static (TranscriptIcon), without a working mark.

Tests:

  • New (plan-call.test.ts):
    • Work stands under its line and Luke's said words aren't repeated.
    • A running turn ends on the working line under it.
    • An unlinked turn keeps its words and stands by time.
  • Ported: the Transcript and Work tabs' tests now target the Call tab. The asserted behaviors are unchanged except:
    • The "Luke" speaker label is gone, by design.
    • A turn's Failed/Stopped is read from its end line instead of a per-turn checkpoint.
    • The Work tab's own empty line is gone; the empty state is the Transcript tab's line under TranscriptIcon.
    • Strip tests (drag, arrows, close, scroll, fades) were re-expressed over three fixed kinds, adding a subagent tab where a rule needs a fourth tab.

Mac evidence: CI cannot verify the Mac UI, and ./scripts/verify.sh was not run (Linux VM). LUKE-159 is the manual Mac pass. The screenshots above are the real renderer bundle built from this branch, run in headless Chrome against its own stylesheet on the planning-work fixture, behind a stub preload bridge.

🤖 Generated with Claude Code