Skip to content

feat(jetbrains): add session copy controls - #11324

Merged
kirillk merged 17 commits into
mainfrom
leather-peace
Jun 17, 2026
Merged

feat(jetbrains): add session copy controls#11324
kirillk merged 17 commits into
mainfrom
leather-peace

Conversation

@kirillk

@kirillk kirillk commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Summary

Add copy controls to JetBrains session messages so users can copy prompts and assistant responses directly from the session transcript.

Demo

GIF Recording 2026-06-16 at 9 43 52 PM

Features

  • Add a hover copy overlay for session content.
  • Add a per-message copy toolbar for user prompts and assistant responses.
  • Copy the latest non-empty assistant response in a turn by default.
  • Preserve prompt whitespace when copying user prompts.
  • Show copy confirmation feedback and keep the copy button background opaque while hovered.
  • Add tests covering copy target selection, toolbar visibility, streaming updates, and clipboard behavior.

Refactoring

  • Extract shared copy button behavior into SessionCopyButton.
  • Extract reusable message toolbar UI into MessageToolbar.
  • Reuse the shared copy button from the hover overlay instead of duplicating clipboard and confirmation logic.

@kilo-code-bot

kilo-code-bot Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 1 Issue Found (unchanged from prior review) | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
packages/kilo-jetbrains/.../SessionHoverCopyOverlay.kt 126 Empty dispose() override is misleading — delegates cleanup to child disposables
Previously Resolved (from prior review round)
File Issue
packages/kilo-jetbrains/.../SessionTargetResolver.kt deepest() mutates Swing visibility without @RequiresEdt — rewritten with non-mutating deepestSkipping()
packages/kilo-jetbrains/.../MessageView.kt Redundant syncPromptToolbar() call — MessageToolbar.paint() now handles no-op internally
Changes Since Last Review (0 code files)
  • Deleted .kilo/plans/jetbrains-session-copy-context.md
  • Deleted .kilo/plans/jetbrains-session-copy-review-fixes.md

No code files changed. All previous findings carry forward.

Files Reviewed (7 files)
  • packages/kilo-jetbrains/.../SessionHoverCopyOverlay.kt — new overlay for hover copy
  • packages/kilo-jetbrains/.../SessionTargetResolver.kt — session target resolution
  • packages/kilo-jetbrains/.../SessionSelectionManager.kt — selection management
  • packages/kilo-jetbrains/.../MessageView.kt — per-message copy toolbar
  • packages/kilo-jetbrains/.../SessionEditorStyle.kt — disposal guard
  • packages/kilo-jetbrains/.../SessionUiUpdateTest.kt — test assertion refinement
  • packages/kilo-jetbrains/.../SessionCopyButton.kt — shared copy button

Fix these issues in Kilo Cloud

Previous Review Summaries (3 snapshots, latest commit 29d2cc4)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 29d2cc4)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
packages/kilo-jetbrains/.../SessionHoverCopyOverlay.kt 126 Empty dispose() override is misleading — delegates cleanup to child disposables
Resolved in this update (2 issues)
File Previous Issue Resolution
packages/kilo-jetbrains/.../SessionTargetResolver.kt deepest() mutates Swing visibility without @RequiresEdt Rewrote with non-mutating deepestSkipping() recursive approach, added @RequiresEdt
packages/kilo-jetbrains/.../MessageView.kt Redundant syncPromptToolbar() call in setPromptHovered MessageToolbar.paint() now handles no-op internally via button.isEnabled == value check
Incremental Review (since 2cbd155)

Two files changed:

  • SessionEditorStyle.kt — Added try/catch guard in applyToEditor() to silently swallow TraceableDisposable$DisposalException when the editor is disposed between the isDisposed check and the style mutations. Also added an early return on editor.isDisposed. This is a standard defensive pattern for disposal race conditions in IntelliJ plugins.
  • SessionUiUpdateTest.kt — Changed test assertion from assertEquals(1, msg.components.filterIsInstance<TextView>().size) to assertTrue(msg.part("p1") is TextView), which is more precise (validates the specific part's type rather than just counting).

No new issues found in the incremental changes.

Files Reviewed (2 incremental + 1 carried-forward)
  • packages/kilo-jetbrains/.../SessionEditorStyle.kt — disposal guard
  • packages/kilo-jetbrains/.../SessionUiUpdateTest.kt — test assertion refinement

Fix these issues in Kilo Cloud

Previous review (commit 2cbd155)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
packages/kilo-jetbrains/.../SessionHoverCopyOverlay.kt 126 Empty dispose() override is misleading — delegates cleanup to child disposables
Resolved in this update (2 issues)
File Previous Issue Resolution
packages/kilo-jetbrains/.../SessionTargetResolver.kt deepest() mutates Swing visibility without @RequiresEdt Rewrote with non-mutating deepestSkipping() recursive approach, added @RequiresEdt
packages/kilo-jetbrains/.../MessageView.kt Redundant syncPromptToolbar() call in setPromptHovered MessageToolbar.paint() now handles no-op internally via button.isEnabled == value check
Other Observations (not in diff)
File Line Issue
.changeset/*.md (3 files) Three separate changesets (jetbrains-hover-copy-overlay, jetbrains-message-toolbar, jetbrains-session-copy) for a single feature. Consider consolidating into one changeset to avoid fragmented release notes. All three are patch level and describe facets of the same copy-control feature.
Files Reviewed (14 files in incremental diff + 1 new)
  • .kilo/plans/jetbrains-session-copy-review-fixes.md (plan only)
  • packages/kilo-jetbrains/.../SessionContextMenu.kt — trailing blank line removed
  • packages/kilo-jetbrains/.../SessionHoverCopyOverlay.kt — bounds guard fix (&&||)
  • packages/kilo-jetbrains/.../SessionSelection.kt — consolidated copy provider duplication
  • packages/kilo-jetbrains/.../SessionTargetResolver.kt — non-mutating deepest resolution, @RequiresEdt annotations
  • packages/kilo-jetbrains/.../MessageToolbar.kt — removed duplicate paint boolean, derive from button.isEnabled
  • packages/kilo-jetbrains/.../MessageView.kt — prompt box coordinate fix, @RequiresEdt annotations
  • packages/kilo-jetbrains/.../TextView.kt@RequiresEdt annotations
  • packages/kilo-jetbrains/.../TurnView.kt@RequiresEdt on syncCopyToolbars()
  • packages/kilo-jetbrains/.../PromptPanelTest.kt — uses shared CopyProviderSink
  • packages/kilo-jetbrains/.../SessionMessageListPanelTest.kt — streaming stability + prompt box painting tests
  • packages/kilo-jetbrains/.../SessionSelectionCopyTest.kt — disposal tests, uses CopyProviderSink, RGB helper cleanup
  • packages/kilo-jetbrains/.../CopyProviderSink.kt (new) — shared test DataSink helper
  • packages/kilo-jetbrains/.../MdViewHybridTest.kt — uses shared CopyProviderSink

Previous review (commit 358135f)

Status: 3 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 3
Issue Details (click to expand)

SUGGESTION

File Line Issue
packages/kilo-jetbrains/.../SessionHoverCopyOverlay.kt 126 Empty dispose() override is misleading — delegates cleanup to child disposables
packages/kilo-jetbrains/.../SessionTargetResolver.kt 30 deepest() mutates Swing visibility without @RequiresEdt annotation
packages/kilo-jetbrains/.../MessageView.kt 343 Redundant syncPromptToolbar() call when value unchanged
Other Observations (not in diff)
File Line Issue
.changeset/*.md (3 files) Three separate changesets (jetbrains-hover-copy-overlay, jetbrains-message-toolbar, jetbrains-session-copy) for a single feature. Consider consolidating into one changeset to avoid fragmented release notes. All three are patch level and describe facets of the same copy-control feature.
Files Reviewed (16 files)
  • .changeset/jetbrains-hover-copy-overlay.md
  • .changeset/jetbrains-message-toolbar.md
  • .changeset/jetbrains-session-copy.md
  • packages/kilo-jetbrains/.../SessionUi.kt
  • packages/kilo-jetbrains/.../SessionScroll.kt
  • packages/kilo-jetbrains/.../SessionMessageListPanel.kt
  • packages/kilo-jetbrains/.../SessionEditorTextField.kt
  • packages/kilo-jetbrains/.../PromptEditorTextField.kt
  • packages/kilo-jetbrains/.../PromptPanel.kt
  • packages/kilo-jetbrains/.../SessionContextMenu.kt
  • packages/kilo-jetbrains/.../SessionCopyButton.kt
  • packages/kilo-jetbrains/.../SessionCopyTarget.kt
  • packages/kilo-jetbrains/.../SessionHoverCopyOverlay.kt
  • packages/kilo-jetbrains/.../SessionSelection.kt
  • packages/kilo-jetbrains/.../SessionTargetResolver.kt
  • packages/kilo-jetbrains/.../MessageToolbar.kt
  • packages/kilo-jetbrains/.../MessageView.kt
  • packages/kilo-jetbrains/.../TextView.kt
  • packages/kilo-jetbrains/.../TurnView.kt
  • packages/kilo-jetbrains/.../QuestionView.kt
  • packages/kilo-jetbrains/.../ShellToolView.kt
  • packages/kilo-jetbrains/.../ToolSupport.kt
  • packages/kilo-jetbrains/.../ToolView.kt
  • packages/kilo-jetbrains/.../HoverIcon.kt
  • packages/kilo-jetbrains/.../UiStyle.kt
  • packages/kilo-jetbrains/.../MdViewHybrid.kt
  • packages/kilo-jetbrains/.../kilo.jetbrains.frontend.xml
  • packages/kilo-jetbrains/.../KiloBundle.properties
  • packages/kilo-jetbrains/.../HistorySessionActionsTest.kt
  • packages/kilo-jetbrains/.../PromptPanelTest.kt
  • packages/kilo-jetbrains/.../SessionMessageListPanelTest.kt
  • packages/kilo-jetbrains/.../SessionSelectionCopyTest.kt
  • packages/kilo-jetbrains/.../TextViewTest.kt
  • packages/kilo-jetbrains/.../MdViewHybridTest.kt
  • .kilo/plans/jetbrains-session-copy-context.md

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4-pro-20260423 · 181,521 tokens

Review guidance: REVIEW.md from base branch main

@kirillk
kirillk enabled auto-merge June 17, 2026 15:07
@kirillk
kirillk merged commit a91b33b into main Jun 17, 2026
21 checks passed
@kirillk
kirillk deleted the leather-peace branch June 17, 2026 15:34
t7tran pushed a commit to t7tran/kilocode that referenced this pull request Aug 14, 2026
feat(jetbrains): add session copy controls
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants