fix(ui): keep a tool-call group collapsed until the reader opens it - #2226
Merged
Conversation
Astro-Han
marked this pull request as ready for review
August 5, 2026 10:45
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A turn with multiple tool calls rendered its group expanded, and it stayed expanded forever.
ToolTrowseeded AstryxChatToolCallswithdefaultIsExpanded={items.some(isInFlightToolStatus)}so a live group would open, but that prop is uncontrolled: it sets the initial state only, and the timeline key is deliberately stable so a disclosure survives mid-turn inserts. A group opened while running therefore never re-collapsed, and every live turn left a trail of permanently open groups behind it.This drops the custom seed and returns to Astryx's own default — collapsed. Opening a group is the reader's move, never the turn's.
The accepted trade-off, now recorded in the comment the workaround used to justify: a collapsed header projects the last call alone, so with parallel calls the last one can settle first and the header may briefly show a settled icon while a sibling still runs. It resolves as the group finishes, and expanding shows every row's real status.
Verification
npm run test -w @maka/ui— 341/341 pass. Three suites asserted the expanded-by-default seed and now assert the collapsed default:tool-activity-presentation,tool-trow-stability,processing-block.node --teston the desktop renderer contracts that touch this surface (streaming-handoff,tool-error-collapse-contract) — 12/12 pass.npm run typecheck,npm run format,npm run lint— clean.apps/desktop/e2e/disclosure-output.spec.tsand thefixtures.tsreadiness selector already gate on a collapsed row (single call), so they are unaffected. The Storybook stories inpackages/ui/stories/tool-activity.stories.tsxrender settled items and already rendered collapsed.npm run test -w @maka/desktopis green except 14 pre-existing failures in project-root/workspace-picker suites, which resolve macOS temp paths and never import the UI package; Playwright E2E was not run locally.