cmux NEXT: the agent turn looks like Codex: finished runs fold, one shimmering live line at the bottom, short labels, check and time on hover
The agent chat turn now looks and behaves like the ChatGPT/Codex app (Lawrence + Leo: turn-ours.png ā turn-codex-1/2.png, and Leo's turn-toolcalls-now.png, stack-224..226.png).
Before/after (gallery, tailnet): https://cmux-lawrences-mac-mini.tail137216.ts.net:18796/compare/chat-codex-turn-shape/?entry=agent-pane.transcript. Key states: codex-turn-raw-commands (Leo's screenshot, reproduced), codex-turn-live, codex-turn-run-open, tool-hover-meta, thinking.
What a running turn looks like now:
- "Working for 1m 20s" stays over the work, as before. No call name and no dots on it.
- Finished work folds. Each finished run of tool calls is one summary line between the paragraphs ("Read files, ran commands"), and a run that is one group is its closed line ("Ran 5 commands"). Both open on a click. This applies to the latest run as its calls finish, and to an opened "Worked for" after the turn. Two runs with only a short interim note between them ("Relay the decisions, then answer.", up to 160 characters, no code) become one run, with the note folded in as a quiet line.
- One live line at the bottom, replaced in place by each step. It reads "Thinking" (the word shimmers: a band of the theme accent on the shared clock, still under Reduce Motion and the static status look), then "Running acpmux send 13s" while a call runs (timed from the call's start), then "Thinking" again. It keeps one id from send to the end. While the answer streams it keeps its height but draws nothing. Rows never stack up: the call in flight is never also a row.
- Human labels. A command reads as its Claude Code Bash
description("List acpmux sessions"). Without one, it reads as its meaningful command:export PATH="ā¦",B=~/x;,cd dir &&andVAR=xin front of the command are dropped, soexport PATH="/Applications/cmux NIGHTLY.app/ā¦" acpmux lsreads "Ran acpmux ls". The raw line shows only in the opened row's Shell block. A shell call with no command yet reads "Ran a command" / "Running a command", never "Bash". - Check and time only on hover. A finished call's green check and run time show on hover or focus only. A failure keeps its red mark ("exit 1"). Lone tool rows get the same treatment.
Defaults and toggles:
- Debug
agentPane.debug.codexToolRunsis now on by default; off lists every call as before. - This partly reverses #22658/#22761 ("we're swallowing too many"). That complaint was about the old in-flight behavior, where the run in flight shrank to its newest call. Now nothing live is hidden, and finished work is one click away.
Carries #22363 (steer-default-2's live line as the turn's last row, Debug agentPane.debug.liveLineBelow, on), credited. Its owner was told. With Codex-style runs off, #22363's behavior is unchanged. If #22363 lands first, this PR just merges base.
Sibling PRs from this lane: #23093 (collapse/expand animation, clicked row anchored), #23101 (background task ends on its Ran row; quiet one-line bottom notices), plus the subagent tray and thought rows (in progress).
Changelog
Changed: The agent chat turn looks like the Codex app: finished tool calls fold into summary lines between paragraphs, one shimmering live line at the bottom says what the agent is doing, commands read as what they do, and a call's check and time show on hover.
Observed / Not run
- Ran locally (bun, cosmic-gray): every webviews unit test file that imports the changed modules (turns, TurnRows, ToolRow, CommandRow, ToolGroupRow, Thinking, WorkingFor, toolPaths, direct, codexToolRuns, liveLineBelow), plus
gallery-coverage: 305+ pass, 0 fail. New:test/transcript-codex-live-line.test.tsx(11),test/transcript-codex-turn.test.tsx(6). Updated:transcript-live-runs,transcript-working-line,codex-tool-runs,startedSessions.tsc --noEmitis clean, and the pre-push web lint and prepush gate pass. - Gallery plays:
thinkingasserts the shimmer is the line's only loop.codex-turn-run-openopens a folded run.tool-hover-metaasserts the check is hidden at rest, the failure mark is visible, and the check shows on hover. These run in the gallery advisory job, not locally. - Not run locally: the Swift test
AgentPaneCodexToolRunsTests(default flipped to true) and #22363's Swift tunable. Both need CI compile.
No capture: the native files only add tunables and theme values the webview transcript reads; every visible state is a gallery entry (transcript.gallery.ts), which the gallery advisory run captures.
Agent session: cosmic-gray
š¤ Generated with Claude Code