fix(ui): batch completed read-only tools into ReadOnlyBatch, unify card body styles#4059
Merged
esengine merged 2 commits intoJun 12, 2026
Merged
Conversation
added 2 commits
June 11, 2026 23:31
…gent nesting
- ReadOnlyBatch: extract to standalone component, fix JS reference bug
(items={[...roBatch]} instead of items={roBatch})
- Skip partial tool_dispatch events so tool name + args appear at once
- WarmTurnItems + TurnCollapse: use isReadOnlyTool(name) for read-only
batching instead of it.readOnly boolean (which is false for history)
- Running tools render directly (not folded) in compact/minimal mode
- TurnCollapse body: group completed read-only tools into ReadOnlyBatch
- Add .tool--subagent border-left on body for task/explore/research cards
- Add ⊞N nested count indicator on sub-agent tool heads
- Remove dead .tool__summary CSS and related selectors
- Unify reasoning__body, notice__body, warm-turn__body padding/font
- Clean up .tool__nested styling with recursive nesting border
- Add isReadOnlyTool() for session restore (useController.ts)
- i18n: add tool.otherReadCount key
…th inline label - Move CopyButton from CodeViewer wrapper into HljsCode's <pre> so it renders inside the code block's grey background, not outside it - Remove Tooltip/portal (broken by <pre> overflow:auto) and native title (1s browser delay), replace with .copybtn__label-inline: zero-delay CSS hover that slides the Copy text inside the button via max-width - Remove unused showLabel prop from CopyButton type - Remove unused CopyButton import from CodeViewer.tsx
esengine
approved these changes
Jun 12, 2026
esengine
left a comment
Owner
There was a problem hiding this comment.
Thanks — extracting ReadOnlyBatch into its own file (breaking the circular dep) and the sub-agent nesting visuals (⊞N + tool--subagent) are a clean improvement, and the session-restore readOnly fix is the right call. CI is green across the board. Merging.
Follow-up on our side: consolidate the duplicated isReadOnlyTool list (it lives in both useController.ts and Transcript.tsx and mirrors the Go ReadOnly() classification, so it'll drift), and improve live-thinking + writer-output visibility in minimal mode.
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
Three related UI improvements to the transcript, focused on compact/minimal display modes in the desktop app.
Changes
1. ReadOnly batch for completed read-only tools
ReadOnlyBatchcomponent)ReadOnlyBatch.tsxto break circular dependenciesTurnCollapse(folded steps),WarmTurnItems(expanded history), and final step renderingisReadOnlyTool(name)for tool identification to work aroundreadOnlybeingfalsein session restore data2. Sub-agent card nesting visuals
tool--subagentclass: left border ontool__bodyfor task/explore/research/review/run_skill cards with⊞Ncounttool__nestedstyling with recursive nesting border for deeper sub-agent levels.tool__summaryCSS (outcome line + "⎿ " prefix)3. Code copy button placement
CopyButtoninside<pre>element so it renders within the code block background, not outside itTooltip/portal (broken by<pre> overflow:auto) and nativetitle(1s browser delay) with CSSmax-widthinline label4. Cleanup
reasoning__body,notice__body,warm-turn__bodypadding/font to matchtool__bodytool_dispatchevents so tool name + args appear at onceFiles changed
ReadOnlyBatch.tsxToolCard.tsxTranscript.tsxCopyButton.tsxHljsCode.tsxstyles.csslocales/en.ts,zh.tstool.otherReadCounti18n keyApp.tsxshowLabelpropTest status
go test ./...passes (one pre-existing failureTestSaveToScopesUserAndProjectFiles— permission issue on dev machine, unrelated to changes)gofmt -l .cleanpnpm buildsucceeds