Skip to content

fix(jetbrains): polish session links and tool popups - #11871

Merged
kirillk merged 14 commits into
mainfrom
efficacious-fern
Jul 2, 2026
Merged

fix(jetbrains): polish session links and tool popups#11871
kirillk merged 14 commits into
mainfrom
efficacious-fern

Conversation

@kirillk

@kirillk kirillk commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

What

  • Add workspace-aware JetBrains session file links with fallback search and missing-file warnings.
  • Improve markdown/file-reference inline styling and clear link hover state on scroll.
  • Keep shell tool headers clipped, add a full command popup for collapsed shell runs, and show that popup regardless of header cropping.
  • Make todo checklist rows visually consistent with higher-contrast read-only checkboxes.

Why

These changes bring JetBrains session rendering closer to VS Code behavior and make linked files, shell commands, and todo status easier to read and use from the chat transcript.

Demo and screenshots

Links to the files

GIF Recording 2026-07-01 at 3 26 28 PM

Bad link

GIF Recording 2026-07-01 at 3 27 03 PM

ToDo view

Screen Shot 2026-07-01 at 3 27 31 PM

Shell run hints

GIF Recording 2026-07-01 at 3 28 15 PM

Testing

  • ./gradlew :frontend:test --tests "ai.kilocode.client.session.views.todo.TodoWriteViewTest" --rerun-tasks
  • ./gradlew :frontend:test --tests "ai.kilocode.client.session.views.ShellToolViewTest" --tests "ai.kilocode.client.session.SessionFileLinksTest" --rerun-tasks
  • ./gradlew typecheck
  • bun turbo typecheck

kirillk added 8 commits June 30, 2026 10:46
Add a hover popup for collapsed Shell tool headers whose command subtitle
is cropped. The popup renders the full command in the shell code-block
editor, breaking on shell separators (&&, ||, |, ;) outside quotes, and
shares the editor background.

It appears after a 500ms dwell and hides 250ms after the mouse leaves both
the header and the popup, so the user can move into the popup without it
disappearing.
# Conflicts:
#	packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionUi.kt
@kilo-code-bot

kilo-code-bot Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Incremental review of the latest commit (fix(jetbrains): keep progress body during session open), which touches only SessionUi.kt. The change:

  • ViewChanged.ShowSession now shows body(controller.model.state) instead of unconditionally showing messageBody, so re-entering the session view while state is Loading/Retry/Offline correctly shows the progress body instead of forcing the (possibly empty) message list. This mirrors the existing onStateChanged behavior, which already derives the shown panel from body(state).
  • resumeOpen() gains a guard that skips the scroll-to-bottom "open" animation while the currently-selected body isn't messageBody, preventing it from operating on the wrong panel. Any subsequent state change re-triggers layout validation (via refresh()root.revalidate()), which re-invokes resumeOpen() once the message body becomes current, so pending/opening do not get stuck.

No new issues found in this pass.

Files Reviewed in this incremental pass (1 file)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionUi.kt
Previous Review Summaries (5 snapshots, latest commit d916e10)

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

Previous review (commit d916e10)

Status: No Issues Found | Recommendation: Merge

Incremental review of the latest commit, which adds HeaderPopupControllerTest.kt only. This test file directly exercises the guard-disposal mechanism previously flagged as missing coverage:

  • test guard is disposed between repeated hover cycles verifies the guard field is cleared and the prior guard Disposable is disposed on both notifyExit and hideAll, and that a fresh, distinct guard is created on the next show().
  • test disposing hovered view clears pending guard and suppresses popup verifies that disposing the hovered PartView clears the pending guard, clears target, and suppresses the popup (headerPopup() is never invoked).

Both tests correctly reflect the current HeaderPopupController implementation (guard registered via Disposer.register(view, it), captured and disposed inside hideAll(), and the self-nulling dispose to avoid double-dispose). No new issues found in this pass.

Files Reviewed in this incremental pass (1 file)
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopupControllerTest.kt

Previous review (commit 77c6579)

Status: No Issues Found | Recommendation: Merge

Incremental review of the latest commit (fix(jetbrains): clean up header popup disposal guard), which touches only HeaderPopupController.kt. The change correctly resolves both previously-flagged findings on this file:

  • The disposal-safety-net issue (no guard against the hovered PartView being disposed while a popup is pending/showing) is now fixed via an explicit guard: Disposable registered on view.
  • The follow-up leak (each show() call registered a new, never-cleaned-up child Disposable on view) is now fixed: hideAll() captures and explicitly disposes the prior guard before it is cleared/replaced, and the guard nulls itself first to avoid a double-dispose loop when the platform disposes view directly.

One new SUGGESTION was raised: this disposal-safety mechanism still has no dedicated test coverage.

Overview

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

SUGGESTION

File Line Issue
HeaderPopupController.kt 49 No test exercises the guard-disposal fix (no accumulation across show() calls, no double-dispose when the hovered view is disposed)
Files Reviewed in this incremental pass (1 file)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopupController.kt

Previous review (commit cfa4705)

Status: 1 Issue Found | Recommendation: Address before merge

Incremental review since the last pass: all 10 previously-flagged findings (MdCommon.kt false-positive links + dead replace, SessionFileLinks.kt HTML escaping + fallback-search decoding, PromptView.kt import style, TextView.kt link-routing duplication, TodoListPanel.kt checkbox accessibility + icon reallocation, SessionFileLinksTest.kt missing coverage) were verified fixed in the follow-up commits and are no longer flagged. One new issue was introduced by the disposal-safety fix for HeaderPopupController.kt.

Overview

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

WARNING

File Line Issue
HeaderPopupController.kt 48 New Disposer.register call on every cold show() leaks one child disposable per hover cycle on long-lived PartViews
Files Reviewed in this incremental pass (49 files)
  • .changeset/*.md (6 changesets)
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloWorkspaceRpcApiImpl.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/rpc/WorkspacePathScopingTest.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/WorkspacePath.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloWorkspaceService.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionFileLinks.kt (fixes verified: HTML escaping, decoded fallback search)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopup.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopupController.kt (new leak, see above)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/base/PartView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/{ShellToolView,ReadToolView,ToolSupport}.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/{AttachmentView,MessageView,PlanExitView,PromptView,ReasoningView,TextView,TurnView,ViewFactory}.kt (fixes verified: shared openSessionLink helper, MdView import)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/todo/{TodoListPanel,TodoWriteView}.kt (fixes verified: accessible name/description, icon-reuse short-circuit)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/MdCommon.kt (fixes verified: pathish() guard against bare framework names, dead unescape removed)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdViewHybrid.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle*.properties (i18n additions)
  • plus 20 corresponding test files under frontend/src/test/ and backend/src/test/, including new SessionFileLinksTest coverage for open() fallback search (fix verified)

Fix these issues in Kilo Cloud

Previous review (commit 5d04269)

Status: 10 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
MdCommon.kt 21 New file-ref auto-link regex false-positives on tokens like Next.js/Node.js/Vue.js
SessionFileLinks.kt 69 Unescaped path interpolated into HTML balloon markup
SessionFileLinks.kt 40 Fallback search uses raw percent-encoded basename as query, missing real matches
HeaderPopupController.kt 40 No disposal safety net if hovered PartView is disposed while popup pending/showing
TodoListPanel.kt 117 Read-only checkbox accessibility regression (JBCheckBox to plain JBLabel+Icon)

SUGGESTION

File Line Issue
MdCommon.kt 157 Dead/unreachable defensive & replace
TodoListPanel.kt 135 Icon reallocated unconditionally on every update() call
PromptView.kt 62 Fully-qualified type name instead of import (style inconsistency)
TextView.kt 88 Link-routing logic duplicated across TextView/PlanExitView/ReasoningView
SessionFileLinksTest.kt 6 No test coverage for open() fallback-search / missing-file behavior
Files Reviewed (49 files)
  • .changeset/*.md (6 changesets — clear, user-facing, no issues)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/MdCommon.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/MdView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/MdViewFactory.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdViewHybrid.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionFileLinks.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopup.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopupController.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ShellToolView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ToolSupport.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ReadToolView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/base/PartView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/todo/TodoListPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/todo/TodoWriteView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/AttachmentView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/PlanExitView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/PromptView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/ReasoningView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TextView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/ViewFactory.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloWorkspaceRpcApiImpl.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloWorkspaceService.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloWorkspaceRpcApi.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
  • plus 20 corresponding test files under frontend/src/test/ and backend/src/test/

Fix these issues in Kilo Cloud

Previous review (commit 3365d00)

Status: 10 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
MdCommon.kt 21 New file-ref auto-link regex false-positives on tokens like Next.js/Node.js/Vue.js
SessionFileLinks.kt 69 Unescaped path interpolated into HTML balloon markup
SessionFileLinks.kt 40 Fallback search uses raw percent-encoded basename as query, missing real matches
HeaderPopupController.kt 40 No disposal safety net if hovered PartView is disposed while popup pending/showing
TodoListPanel.kt 117 Read-only checkbox accessibility regression (JBCheckBox to plain JBLabel+Icon)

SUGGESTION

File Line Issue
MdCommon.kt 157 Dead/unreachable defensive & replace
TodoListPanel.kt 135 Icon reallocated unconditionally on every update() call
PromptView.kt 62 Fully-qualified type name instead of import (style inconsistency)
TextView.kt 88 Link-routing logic duplicated across TextView/PlanExitView/ReasoningView
SessionFileLinksTest.kt 6 No test coverage for open() fallback-search / missing-file behavior
Files Reviewed (49 files)
  • .changeset/*.md (6 changesets — clear, user-facing, no issues)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/MdCommon.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/MdView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/MdViewFactory.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdViewHybrid.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionFileLinks.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopup.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/popup/HeaderPopupController.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ShellToolView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ToolSupport.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ReadToolView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/base/PartView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/todo/TodoListPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/todo/TodoWriteView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/AttachmentView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/PlanExitView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/PromptView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/ReasoningView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TextView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/ViewFactory.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloWorkspaceRpcApiImpl.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloWorkspaceService.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloWorkspaceRpcApi.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
  • plus 20 corresponding test files under frontend/src/test/ and backend/src/test/

Fix these issues in Kilo Cloud


Reviewed by claude-sonnet-5-20260630 · Input: 50 · Output: 14.8K · Cached: 1.6M

Review guidance: REVIEW.md from base branch main

@kirillk
kirillk merged commit bfb630d into main Jul 2, 2026
21 checks passed
@kirillk
kirillk deleted the efficacious-fern branch July 2, 2026 11:40
t7tran pushed a commit to t7tran/kilocode that referenced this pull request Aug 14, 2026
fix(jetbrains): polish session links and tool popups
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