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)
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).


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 (SubagentTabstays inplan-work.tsx).WorkIcon,speakerLabel, andWORK_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