fix(desktop): stop reads and edits vetoing tool-call grouping - #72308
Merged
Conversation
A run of 3+ adjacent tool calls collapses into the `.tool-group-scroll` window, but `shouldBoundToolGroup` took `hasUnboundable` as a run-level veto: a single exempt row anywhere in the range disabled collapsing for the entire run. The exempt set was clarify, image_generate, execute_code, read_file and every file-edit tool — which is most of what a coding session does, so in practice runs never collapsed. Replaying a real session's transcript: 84 consecutive calls, 30 of them veto-triggering, zero windows. The code-body entries were never needed. Everything ToolEntry renders carries `data-tool-row`, and the `:has([data-tool-row][data-tool-open])` rule already lifts the cap and the mask. A diff row mounts open, so it frees the group the moment it appears; a collapsed row is a one-line status whose body is not in the DOM at all, so there is nothing to clip. Collapsing the row drops the group back to a compact window, which the JS veto could not do. Narrow the opt-out to the two components that bypass ToolEntry and so can never emit `data-tool-row`: clarify and image_generate.
OutThisLife
enabled auto-merge
July 26, 2026 23:52
Contributor
૮ >ﻌ< ა ci reviewran on 058aa34 ℹ️ InfoDesktop E2E visual evidence · View test artifacts · View job1 visual diff. inline evidence is publishing... |
randlee
pushed a commit
to randlee/hermes-agent
that referenced
this pull request
Aug 11, 2026
…-bounding fix(desktop): stop reads and edits vetoing tool-call grouping
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.
Long runs of adjacent tool calls were supposed to collapse into the bounded
.tool-group-scrollwindow, but in a real coding session they essentially never did.shouldBoundToolGrouptreatedhasUnboundableas a run-level veto — a.some()over the whole range — so one exempt row anywhere disabled collapsing for every row in the run. The exempt set wasclarify,image_generate,execute_code,read_file, plus every file-edit tool, which is most of what a coding session actually does. Replaying a real transcript: 84 consecutive tool calls, 30 veto-triggering, zero windows rendered.The code-body entries turn out to be unnecessary. Everything
ToolEntryrenders carriesdata-tool-row, and the:has([data-tool-row][data-tool-open])rule instyles.cssalready lifts the max-height and the mask. A diff row mounts open (defaultOpen = Boolean(inlineDiff)), so it frees the group the instant it appears; a collapsed row is a one-line status with no body in the DOM, so there is nothing to clip. The CSS path is also strictly better than the veto — collapsing the row drops the group back into a compact window, which the veto could never do.This narrows the opt-out to the two components that bypass
ToolEntryand therefore never emitdata-tool-row:clarifyandimage_generate.Verification
isUnboundableTool/shouldBoundToolGroupunit coverage updated to assert the new contract, including that reads and edits are now boundable.read_filerow with a 200-line result inside a group: mounts collapsed, no<pre>in the DOM, contents absent — nothing to clip.patchrow with an inline diff: mounts withdata-tool-open, matching the CSS break-out selector immediately.vitest run src/components/assistant-ui/tool/ src/components/assistant-ui/thread/— 127 passed.