Repository navigation
cmux NEXT: list a run's steps in one bordered group, as Claude Code desktop does - #27896
Conversation
…esktop does An opened "Ran N commands" (or reads, searches) group draws as one rounded group in the cards' ring: the thought that led into the run first, in full, then one row per step (a call's one-line summary, a later thought cut to one line), each with its disclosure right after its words, and hairlines between rows. Every step shows; "+K more" is gone. Thoughts that lead into a run of two or more calls now join its group (toolGroups.ts). Each step row is memoized on its activity and the step list is rebuilt only when the group's shape changes, so a streaming call draws again alone. Gallery: agent-pane.claude-desktop-organization (card, tree, zebra arms). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: web / Web status; base red: the same failure on the base c66f534; does not block Gallery before/after for
States
Pick other states with a |
|
Owned by an agent session · session |
|
Found 12 test failures on Blacksmith runners: Failures
...and 2 more test failures. View all on Blacksmith
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa
…transcript-group-rows # Conflicts: # webviews/scripts/design-tokens-baseline.jsonl # webviews/src/agent-session/acpmux/conversation/ThoughtRow.tsx # webviews/src/agent-session/acpmux/conversation/ToolGroupRow.tsx # webviews/src/agent-session/acpmux/conversation/turns.ts # webviews/test/transcript-density.test.tsx # webviews/test/transcript-group-thought-state.test.tsx
…transcript-group-rows # Conflicts: # webviews/src/agent-session/acpmux/conversation/TurnRows.tsx # webviews/src/agent-session/acpmux/conversation/toolGroups.ts # webviews/src/agent-session/acpmux/conversation/turns.ts
…nd command as the group's second step Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (codex gpt-6-astra high, next-review): BLOCK at ff42f14
|
…CommandRow as an element in the render-count test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa
|
Review (codex gpt-6-astra high, router-review): SHIP at 56c70a5 SHIP No blocking findings. Focused tests were not runnable because |
|
Shipped in:
|
…e step tests know the card (base red from #27896) (#28465) * cmux NEXT transcript: a later thought in a run's card is a quiet "Thought" row again; the step tests know the card (base red from #27896) #27896 put an opened run's steps in one bordered card with each step's caret right after its words, and drew a later thought's words where the quiet "Thought" row was. Three react-apps-check tests went red on feat-cmux-next. - Code: a closed non-lead step thought reads "Thought" (or "Thought for 12s") with none of its text inline, and opens to its whole text under that line (Leo 2026-10-20). The thought that leads the run keeps #27896's open full text. - agent-pane-step-rows: every step is still one 22px row; rows outside a card keep zero gaps, and a card's steps sit on one equal pitch of their own. - agent-pane-transcript-chevron-column: rows outside a card keep the shared trailing edge; a card's step carets sit inline after their labels within 4.5px, #28018's criterion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * cmux NEXT transcript: a step thought opens on click under the React Compiler StepThought read its open state from a module Map and forced a redraw with an unread counter, so the compiled render was memoized on `id` and a click never opened or closed the row. The reader's choice is now state (still kept by `id` in the shared Map for rows that mount again). Formatting of the label line and the step-rows test header. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts resolved by hand: - ChatHeaderTools: one letter handler. Base #25661 shortcutLabel and menuItemForShortcut stay; a row also matches its mnemonic, and every key goes through menuLetters (fields, IME, typeahead). - ToolGroupRow: base dropped +K more (#26591, #27896), so the :all disclosure goes; Thinking still opens a group that holds a thought. StepThought follows the transcript view as ThoughtRow does. - ToolRow: base ToolOutput with our useRowDisclosure. - Settings schema, its test, chatDisplay: base rail.side and feature tips beside transcriptView. - Both xcstrings catalogs: base text plus our five keys (scripts/merge-xcstrings.py, per key). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… keeps them, and a stale press is never reused (follow-up to #28780) (#28324) * agent transcript: closing a line at the end keeps it where it was clicked Leo (ask-a736047107): "AND IT'S SO FUCKING AWKWARD TO SEE THEM THERE AT THE BOTTOM SINCE WHEN I EXPAND THEM IT JUMPS ME DOWN AND WHEN I COLLAPSE IT JUMPS ME UP" A click on a transcript disclosure now keeps the content at least as tall as the view's end, so closing a body near the transcript's end leaves room under the rows instead of the browser clamping the offset and bringing every row (and the clicked line) down by what closed. The room follows the view's end as the reader scrolls up and goes once the rows reach it, on a send, on Jump to latest and on a chat switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * agent transcript: every cut row opens to its whole text, and every toggle holds its place Leo (ask-486cb2cec3): "why the fuck did you guys ffucking ellipsis EVERYTHING WITH NO WAY TO EXPAND WHAT WAS SAID TO SEE" - A tool call that is not a shell always opens, and opened its label wraps whole (a long search pattern, URL or path); a call with no output opens to that alone. - A dispatch report keeps its whole text (no 2,000-character cut). - An opened agent message names its other chat whole; an opened sub-session line shows its whole state. - FOLD_TOGGLE now holds every control that opens something in a row (Show more, Show all lines, Raw, +N more, a sent message line, an agent message line's words); one under its body holds its row's top. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * agent transcript: the kept collapse room lets go once the hold ends or the view covers it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * agent transcript: no fold room while following; nested controls are not toggles; an opened name wraps Review findings at d32bcfe: a collapse that leaves room stops following, and a followed view drops the room; a click on a control inside a toggle (a sent line's recipient, Copy) holds nothing; an opened agent message's name wraps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(transcript): fold-keeps-place waits on painted frames, not a fixed time Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Hold every height toggle from the press, and keep holding while the line settles Wrap lines (aria-pressed) and a diagram's chart/code toggle now hold their line. The hold starts on pointerdown, flushes drawn heights synchronously while it holds, extends while the line still moves (capped at 1.5 s, so Reduce Motion gets a real hold), and a sideways wheel no longer lets go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * test(transcript): step the settling hold to its cap Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * agent transcript: the press notes the line's place; only the click holds A hold that started on pointerdown re-placed the row under the pointer, so a tall prompt's Show less got its press and release on different nodes and never clicked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * agent transcript: a fixed minimum hold instead of one that extends while the line moves An extending hold kept putting a tall prompt back while the view was scrolled to it, so its Show less missed its click. A toggle with no fold (Reduce Motion) now holds for at least 400 ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * style: format foldAnchor.test.ts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * agent transcript: the row's own anchored-collapse event keeps the click's pressed place Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * test(transcript): measure trailing chevrons on a run's own rows, not its steps Every call opens now, so a step with no output has a chevron too, and a step's chevron follows its words by design (#27896). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * style: format agent-pane-tool-group-scroll.test.ts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * agent transcript: hold only marked press toggles; a sideways wheel keeps the hold; no dangling aria-controls Pin and Read aloud (aria-pressed, no height change) no longer start a hold that could stop following. Wrap lines and a diagram's toggle say they fold (data-fold-toggle). cancelProgrammatic keeps the hold through a horizontal wheel. A no-output call names no body it does not draw. A keyboard click or a cancelled press never reuses an abandoned press place. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * style: format DiagramBlock.tsx and foldAnchor.test.ts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * agent transcript: an output's Raw and a code block's Wrap hold their line; a file link is no toggle Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * style: format foldAnchor.test.ts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * agent transcript: drop the attributes the base merge doubled; the gallery play names the minimum hold Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 * style: format foldAnchor.test.ts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-06adbde0c46733e12100 --------- Co-authored-by: ci <ci@example.invalid> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…he organized turn (#29168) * Agent chat: one thought branch in toolGroups; a capture fixture for the organized turn toolGroups had two isThought branches in a row: the first took a thought inside an open commands/reads/searches run, the second every other thought. They are now one branch with the two cases inside it, so no reader takes the second for dead code (#27896 review, P3). Behaviour is unchanged. debug.agent_pane seed_rows takes fixture "organization": the gallery's Claude desktop organization turn (answered question, checklist, a thought and five shell steps, prose), so a real-app capture can show it. scripts/cmux-next/media/states/claude-desktop-organization.json drives it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa * organizationFixture: copy the answered question instead of importing it from outside webviews/ A shipped bundle that imports a file outside webviews/ must be listed in the web bundle key's inputs (tests/test_web_bundle_key_inputs.sh); a debug seed does not need that. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-92fa78a91e29868c5eaa * organizationFixture: vp fmt (format only) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo (2026-10-29): "look at these first 4 pictures. we want to have that capabilitiy of rendering like claude code desktop has stuff organized."
PR (a) of three for that ask: grouping and step rows. (b) is the step body (ShellBlock/HighlightedCode), (c) is the question and checklist cards.
What changes
An opened "Ran N commands" group (and "Read N files", "Searched N") now draws the way Claude Code desktop lists a run's steps:
toolGroups.ts). When the run is a single call, the thought keeps its own row as before.GROUP_TAILand "+K more" are removed, because Claude desktop lists every step. fix(chat): show every item when expanding a tool group #26591 has since landed and does the same thing. This branch takes it in: commands, reads and searches draw through the step rows here, and edits groups keep fix(chat): show every item when expanding a tool group #26591's row cache.groupId), so a group keeps its key and its open state when a thought joins it at the front.The gallery has three looks, selected with the
data-tool-steps-lookroot attribute: card (the default I picked), tree (the old tree guide with hairlines) and zebra (no ring, alternate rows filled). Card is the closest match to the reference and reads as one unit that ends before the next paragraph. Tree keeps the old hierarchy but doesn't separate the run from the prose. Zebra is noisy when rows are short.I also added a scenario gallery page,
agent-pane.claude-desktop-organization. It renders through the real transcript path with a public-safe fixture: a paragraph, an answered QuestionCard, a 3-step plan, a thought followed by 5 shell steps, then prose. PRs (b) and (c) will show up on it when they land.Gallery: agent-pane.claude-desktop-organization, agent-pane.tool-group-alignment
Performance
Harness: a temporary bun + JSDOM test (not committed). It renders the real
ToolRowswith an opened group of 13 commands, a leading thought and two merged thoughts, then streams 40 output chunks into the running command. For each chunk it counts CommandRow draws and the wall time. Both runs used the same Linux fast-checks runner (32 vCPU), 3 runs each. Before is the old basebe41ec40; after is this branch's code atc7085c7a, before base was brought in.Since then, base landed #26591, which memoizes rows on its own path. The current head keeps this PR's
Steppath for commands, reads and searches, and #26591'sentryNodespath for edits. I did not re-measure against the newest base, because the shared REST quota refused the dispatch.webviews/test/transcript-group-step-renders.test.tsxkeeps this in place. Across 5 streamed chunks only the streaming call draws, the step list is never rebuilt (stepProbe.build), and when a new call joins, the list is rebuilt once and only the new row draws. No new timers, observers or animation loops.Risk
Medium, contained to the transcript's tool-group rendering. A thought that leads into a run now moves from its own row into the group, as the first step (open). Its open/closed choice is still keyed by the same thought id. Long runs (20+ commands) now list every row instead of the last five.
Tests
transcript-group-step-renders.test.tsx(render counts).transcript-density,transcript-group-thought-state(lead thought, no "+K more"),transcript-consolidated-runs(lead-thought grouping).🤖 Generated with Claude Code
Agent session: agent session