Repository navigation
fix(jetbrains): wrap Swarm board messages, keep board open, add copy all - #14452
Merged
Merged
Conversation
- Extend the shared active-list renderer with an opt-in wrapDescription mode so a row's body wraps to its full height instead of clipping to one line. Existing callers (settings, history, Agent Manager) are unaffected since the flag defaults to false. - Opt the Swarm board into wrapping and stop flattening message bodies to a single line, preserving newlines. - Keep the modeless board open when a row is clicked: open whichever route endpoint is the subagent (both main -> agent and agent -> main open agent) instead of closing the dialog. - Add a Copy all action that fetches the full paginated board history and copies it to the clipboard as plain text. - Add localized strings for the new action across all locale bundles. - Add/extend tests for wrapping, click routing, and copy-all (including pagination and failure handling).
zfralish
approved these changes
Sep 22, 2026
This was referenced Sep 23, 2026
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.
Issue
Fixes #
Context
The JetBrains Kilo Swarm board (
SessionBoardDialog) had three UX problems reported by a user:Implementation
wrapDescriptionflag to the sharedActiveListConfig/ActiveListRenderer(used by many other lists — settings, history, Agent Manager) so only the Swarm board's rows grow to their full wrapped height; every other caller is unaffected since the flag defaults tofalse. The renderer does a real (not just preferred-size) layout pass at the list's current width before reading the row's preferred size, so Swing's variable-height list measurement (ActiveListRowHeight.PREFERRED) gets the true wrapped height. Along the way I found and fixed a latent measurement bug: the discovery pass initially usedShort.MAX_VALUEas a placeholder height, which leaked intoLayeredOverlayPanel's absolutely-positioned overlay/blocker children (no layout manager, so in a renderer that's never been added to a real window they fall back to reporting their current bounds as "preferred size"), corrupting the measured row height. Fixed by using a minimal placeholder height instead, since column widths never depend on it.SessionBoardDialogalso stopped flatteningbody.replace("\n", " "), so multi-line messages keep their line breaks.close(OK_EXIT_CODE)call from the row-click handler. The board is already modeless, so it now stays open behind the newly opened/focused subagent editor tab. Click targeting was also fixed: a route opens whichever endpoint is the actual subagent (main -> agentandagent -> mainboth openagent), a subagent-to-subagent route opens the sender, andmain/ALL-only routes stay inert.Copy allbutton next to Reset. It fetches the entire board history independent of what the dialog has paged in so far (starting fresh from the newest page, then walking every older page via the server's exclusive cursor, de-duplicating by message id), formats each message assender -> recipient [TYPE]\nbody, and writes it to the clipboard viaCopyPasteManagerwith a small balloon confirmation. A fetch/clipboard failure never publishes a partial copy and re-enables the actions. Added the new localized strings across all 19 locale bundles.Screenshots / Video
How to Test
Manual/local verification
./gradlew :frontend:test(full suite) and./gradlew typecheckfrompackages/kilo-jetbrains/— both pass.ActiveListRenderer/LayeredOverlayPanel) until row heights reflected the wrapped text at both wide and narrow list widths; removed all debug instrumentation afterward and reran the suite clean.Reviewer test steps
main -> agentandagent -> mainvariants) and confirm the agent's editor tab opens/focuses while the board dialog stays open.Copy all, then paste into a plain-text editor and confirm every loaded and not-yet-loaded (older, paginated) message appears insender -> recipient [TYPE]/ body format, oldest first.Blocked checks and substitute verification
./gradlew --no-configuration-cache runIdeSplitMode) was not run in this environment; substitute verification was the full automated test suite (ActiveListRowHeightTest,SessionBoardDialogTest,BoardDialogSizeTest,KiloBundleLocaleTest, and the full:frontend:testrun), which exercises the real Swing renderer, real layout managers, and a fake paginated RPC end-to-end.Checklist
Get in Touch