Repository navigation
Replies: 2 comments
|
Would love this. Tool rollups are one of my favorite parts of the Codex experience, and it’d be great to keep them when using plugins. |
|
Another case for this, from Claude Look, a plugin that folds the steps between two replies into one row the same way. Besides the blank rows on phones, grouping in a plugin goes wrong a second way: it mixes sessions.
Reproduced on
Grouping natively as proposed here avoids this too, since Paseo groups each view's own items. Knowing the view is enough to fix it. To check, I made the plugin wrap
If native grouping isn't the direction, passing the view's |




Uh oh!
There was an error while loading. Please reload this page.
What are you trying to do?
Fold a run of consecutive tool calls into one expandable row, so the assistant's next reply isn't pushed far down the chat. Our plugin, Better Paseo, renders every
tool_callthrough a timeline transformer, and a contributor asked for exactly this: RoundRedDot/better-paseo#2.How do you do it today?
Paseo already does it: Settings → Tool call display → Summary groups a run into one row ("Edited 2 files, ran 3 commands") that expands to the calls. With a plugin that transforms
tool_call, Summary has no effect: every call stays its own row.The contributor worked around it inside the plugin. Every call keeps its row; the first draws a header and the rest render empty. Source adjacency comes from reading the agent timeline (up to 10 pages on first mount, one tail read per new call). On web, injected CSS (
div:has(> [data-…]), keyed toagent-chat-scrolland thedisplay: contentswrapper) hides the empty rows' host wrappers. On iOS and Android there is nothing to hide, so on Paseo 0.12 each empty row keeps its 16 pt row margin (#6599): a folded run of 10 calls still leaves about 144 pt of blank space.Where does Paseo get in the way?
createStreamPresentation(agent-stream/presentation.ts) runsprojectPluginTimelineItemsbeforeprepareToolCallHistory, andisGroupableToolCall(tool-calls/detail-level/grouping.ts) accepts onlykind === "tool_call". A projected row iskind: "plugin", so it never joins a run. Transforming first is right: since #4673 a plugin sees every call. But the plugin can't group on its own either: a transformer sees one item, its result is cached per item, and nothing lets it hide a host row or that row's margin.What would a better workflow look like?
Under Summary, plugin rows projected from a groupable
tool_calljoin the run like the native row they replace:sourceKindfrom fix(app): stack plugin-projected tool rows like native tool rows #6602), sobuildOverviewGrouptakes its counts and loading state from the source data. All rows projected from one call count as that one call.Full detail, and plugins that don't transform
tool_call, behave as before. Plugins need no new API, and since Summary is a per-client app setting, people choose it per device, which a plugin's host-scoped settings can't offer.Happy to send a PR with tests and web/iOS QA if this direction works for you.
All reactions