Skip to content

feat(jetbrains): render Mermaid diagrams in chat - #13396

Merged
kirillk merged 12 commits into
mainfrom
mighty-acorn
Aug 27, 2026
Merged

feat(jetbrains): render Mermaid diagrams in chat#13396
kirillk merged 12 commits into
mainfrom
mighty-acorn

Conversation

@kirillk

@kirillk kirillk commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

What

  • Add frontend-only Mermaid rendering for JetBrains chat markdown fences (mermaid and mmd).
  • Support flowchart/graph and sequenceDiagram inputs through a deterministic Swing/Java2D engine with limits, cancellation, and render caching.
  • Show rendered diagrams inline in chat with source fallback while streaming, on render errors, or for unsupported Mermaid types.
  • Add a reusable zoomable diagram viewer shared by the editor tab and chat-opened viewer window.
  • Add a diagram editor tab with a rendered Diagram view and read-only Source view.
  • Support zoom controls, trackpad pinch, Cmd/Ctrl+wheel zoom, drag-to-pan, double-click-to-fit, and PNG copy from both chat and the viewer.

Screenshot

Screen Shot 2026-08-27 at 3 08 31 PM

Why

JetBrains users can now read Mermaid diagrams directly in Kilo conversations without copying code fences into external tools. Keeping the renderer in the frontend avoids CLI/server coupling and lets the plugin support diagrams in split-mode remote development without JCEF.

Notes

  • The engine is intentionally frontend-only and theme-free until paint time: parsing/layout produce a serializable scene IR, then Swing paints it with the active IDE theme.
  • The viewer toolbar uses standard JetBrains action icons and sizing per IntelliJ New UI icon guidance.
  • Copy prefers the rendered PNG when a diagram is visible and falls back to Mermaid source for streaming/error states.
  • Unsupported Mermaid diagram types currently fall back to source with a render error rather than trying to partially render them.

@kilo-code-bot

kilo-code-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 8 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt 81 Stale onFault can hide a later successful diagram
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramContent.kt 61 Theme listener re-renders after dispose and does not ignore stale results
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt 104 coerceAtLeast(0.1) bypasses MAX_HEIGHT for tall scenes
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramViewer.kt 67 Ctrl/Cmd+wheel handled after JScrollPane scrolled; precise wheels consumed without zoom
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramViewer.kt 159 mouseExited aborts an in-progress pan
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramCanvas.kt 151 Fit scale floored at 0.1 clips oversized diagrams with no pan
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ScenePainter.kt 94 Dashed edge stroke reused for Open/Cross arrowheads
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt 49 Later render() does not cancel the in-flight job
Files Reviewed (22 files)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionSurface.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Engine.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Painter.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Flow.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/FlowLayout.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/FlowMarks.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Mermaid.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Seq.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Source.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramCanvas.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramContent.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt - 2 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdViewHybrid.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/CancelTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/LimitsTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/SerializeTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/mermaid/SourceTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanelTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramsTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/md/MdViewDiagramTest.kt - 0 issues

Fix these issues in Kilo Cloud

Previous Review Summaries (4 snapshots, latest commit 4801e43)

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

Previous review (commit 4801e43)

Status: 7 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramContent.kt 58 Theme listener re-renders after dispose and does not ignore stale results
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt 88 coerceAtLeast(0.1) bypasses MAX_HEIGHT for tall scenes
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramViewer.kt 67 Ctrl/Cmd+wheel handled after JScrollPane scrolled; precise wheels consumed without zoom
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramViewer.kt 159 mouseExited aborts an in-progress pan
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramCanvas.kt 146 Fit scale floored at 0.1 clips oversized diagrams with no pan
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ScenePainter.kt 94 Dashed edge stroke reused for Open/Cross arrowheads
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt 44 Later render() does not cancel the in-flight job
Files Reviewed (22 files)
  • .changeset/diagram-viewer-window-jetbrains.md - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/plugin/KiloFrontendDynamicPluginListener.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/selection/SessionCopyButton.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageToolbar.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/Clipboard.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/HoverIcon.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ScenePainter.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramBlock.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramCanvas.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramContent.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramEditorKind.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramViewer.kt - 2 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramWindow.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdViewHybrid.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramEditorKindTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanelTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramViewerTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramWindowTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/md/MdViewDiagramTest.kt - 0 issues

Fix these issues in Kilo Cloud

Previous review (commit dedd439)

Status: 4 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramEditorKind.kt 140 Theme listener re-renders after dispose and does not ignore stale results
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt 95 coerceAtLeast(0.1) bypasses MAX_HEIGHT for tall scenes
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ScenePainter.kt 94 Dashed edge stroke is reused for Open/Cross arrowheads
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt 44 Later render() does not cancel the in-flight job
Files Reviewed (37 files)
  • .changeset/mermaid-diagrams-jetbrains.md - 0 issues
  • packages/kilo-jetbrains/AGENTS.md - 0 issues
  • packages/kilo-jetbrains/build.gradle.kts - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/plugin/KiloFrontendDynamicPluginListener.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/selection/SessionCopyTarget.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/selection/SessionHoverCopyOverlay.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/CodeViewField.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ScenePainter.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramBlock.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramEditorKind.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramSource.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramTheme.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdLanguage.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdViewHybrid.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/vfs/KiloEditorKind.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/vfs/KiloFileEditor.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/vfs/KiloFileEditorProvider.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/vfs/KiloSourceEditorProvider.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/vfs/KiloVirtualFileKind.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionSelectionCopyTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramEditorKindTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanelTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/md/MdViewDiagramTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/agents/SkillsConfigurable.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/agents/WorkflowsConfigurable.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/base/SettingsContentEditor.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/rules/RulesSettingsUi.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Mermaid.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Source.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/agents/McpConfigurable.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/base/SettingsInlineListPanel.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/base/SettingsListPanel.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/context/ContextSettingsUi.kt - 0 issues

Fix these issues in Kilo Cloud

Previous review (commit 83ec1b3)

Status: 4 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Mermaid.kt 22 Character cap is checked before tab expansion
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ScenePainter.kt 94 Dashed edge stroke is reused for Open/Cross arrowheads
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt 44 Later render() does not cancel the in-flight job
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt 91 coerceAtLeast(0.1) bypasses MAX_HEIGHT for tall scenes
Files Reviewed (39 files)
  • .changeset/mermaid-diagrams-jetbrains.md - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/selection/SessionTargetResolver.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Engine.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Metrics.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Painter.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Palette.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ScenePainter.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Flow.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Mermaid.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Seq.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/SeqLayout.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Source.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramBlock.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanel.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramSource.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/ui/Diagrams.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdLanguage.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdProjector.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/md/hybrid/MdViewHybrid.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionSelectionCopyTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/CancelTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/DiagramAsserts.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/FlowLayoutTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/InvariantTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/LimitsTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/MetricsTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ScenePainterTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/SeqLayoutTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/mermaid/FlowParseTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/mermaid/SeqParseTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/mermaid/SourceTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramPanelTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ui/DiagramsTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/md/MdLanguageTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/md/MdProjectorTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/md/MdViewDiagramTest.kt - 0 issues

Fix these issues in Kilo Cloud

Previous review (commit ccfd17e)

Status: 6 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Metrics.kt 9 Graphics2D never disposed; unsynchronized cache unsafe off-EDT
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Mermaid.kt 20 Limits applied after clean/parse; pathological input can stall
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Flow.kt 229 Nodes mentioned inside a subgraph do not join the cluster
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/SeqLayout.kt 222 Scene size ignores text width; self-message labels overflow
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/SeqLayout.kt 50 Unmatched activations never draw a bar

SUGGESTION

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Seq.kt 107 Participant ids not unquoted; as alias is case-sensitive
Files Reviewed (31 files)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Art.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Engine.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Measure.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Metrics.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/Type.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Flow.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/FlowLayout.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/FlowMarks.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Mermaid.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Seq.kt - 1 issue
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/SeqLayout.kt - 2 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/diagram/mermaid/Source.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/CancelTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ConformanceTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/DiagramAsserts.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/ErrorTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/FakeMeasure.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/FlowLayoutTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/InvariantTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/LimitsTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/SeqLayoutTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/SerializeTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/TypeTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/mermaid/FlowParseTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/mermaid/SeqParseTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/ui/diagram/mermaid/SourceTest.kt - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/flow-basic.mmd - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/flow-cycle.mmd - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/flow-long.mmd - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/flow-shapes.mmd - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/flow-subgraph.mmd - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/seq-basic.mmd - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/seq-blocks.mmd - 0 issues
  • packages/kilo-jetbrains/frontend/src/test/resources/diagram/seq-notes.mmd - 0 issues

Fix these issues in Kilo Cloud


Reviewed by grok-4.6 · Input: 266.3K · Output: 29.8K · Cached: 1.1M

Review guidance: REVIEW.md from base branch main

Add a scene painter, palette, async render service, and Swing panel so closed
mermaid fences show a real diagram in the transcript instead of source text.

Streaming fences and render errors keep the code block visible, and a source
toggle reveals the fence text on demand. Ship behind the
kilo.diagram.inline.enabled registry key since this changes default rendering.
The hover overlay on a rendered mermaid diagram only offered copy. Expose the
shared copy toolbar with an extra standard open action that puts the mermaid
source in a scratch editor tab, so the diagram keeps the affordances of the code
block it replaces and the source can be edited or previewed with IDE tooling.
Two bugs hid the diagram affordances. The hover resolver always handed the
message-level toolbar to nested targets, so the diagram's copy and open buttons
never appeared, and Stack ignores add() indexes, so the toggle row rendered above
the diagram instead of below it.

Let the deepest target win when it brings its own toolbar, and make the diagram
block a stable Stack whose children keep a fixed order and switch between diagram
and source by visibility. The block, not the painted panel, is now the hover
target so the toolbar stays put while the pointer moves within the block.
Addresses PR review on the mermaid diagram engine:

- Share AwtMeasure safely. The engine service holds one instance and draws
  off the EDT on the default dispatcher, so the font cache is now a
  ConcurrentHashMap. The Graphics2D that had no dispose() is already gone.
- Refuse pathological sources earlier. A character cap is checked before any
  preprocessing, node and link caps are enforced while the model is built so
  `A & B & ... --> ...` cannot expand first, and both parsers check
  cancellation per line. The `%%{...}%%` mask is a linear scan instead of a
  lazy regex that rescanned to end-of-text per unterminated opener, and the
  message regex can no longer backtrack over a colon-free line.
- Assign subgraph membership on re-mention. `Client --> Gateway` followed by
  `subgraph core` / `Gateway --> Auth` now puts Gateway inside the frame,
  which is how mermaid reads it.
- Report sequence scene size from glyph extents, not anchors, so a
  left-anchored self-message label is inside the bounds a renderer clips to.
- Close activations left open at the end of a script, so `A->>+B: hi` with no
  matching deactivate still draws its bar.
- Parse participant ids through unquote and match ` as ` case-insensitively
  outside quotes, so `participant "Alice"` and `PARTICIPANT C AS Client`
  resolve to one column.

assertInBounds now checks text extents rather than anchors, so this class of
overflow fails in tests instead of clipping at paint time.
@kirillk

kirillk commented Aug 26, 2026

Copy link
Copy Markdown
Contributor Author

All six review findings addressed in 83ec1b3; individual threads have detailed replies and are resolved.

Finding Resolution
AwtMeasure disposal + cache races Graphics2D was already gone; font cache is now a ConcurrentHashMap
Limits applied after clean/parse Limits.chars checked first, node/link caps enforced while building, ensureActive() per line, linear directive mask, non-backtracking message regex
Subgraph membership on re-mention Flow.add inherits the enclosing cluster; first subgraph to mention a node wins
Sequence scene size ignores text width pts() returns glyph extents per anchor; assertInBounds checks extents too
Unmatched activations draw no bar drain() closes remaining stacks at the cursor before scene()
Participant ids not unquoted, as case-sensitive ids go through name(), \s+as\s+ matched case-insensitively outside quotes

Verified with ./gradlew typecheck and ./gradlew :frontend:test :backend:test :shared:test (the root :test aggregate fails to resolve intellijPlatformTestRuntimeFixClasspath locally, unrelated to this change).

@kirillk kirillk changed the title feat(jetbrains): add mermaid diagram engine feat(jetbrains): render Mermaid diagrams in chat Aug 27, 2026
Diagram rendering degraded to the mermaid source correctly for engine
refusals, but three paths could not recover and none of them left a trace
in the log.

Log every failure. An engine crash was converted to a Fault.Internal
carrying only err.message, discarding the throwable, so a parser or layout
bug reached the user as an unactionable red label and left nothing to
report. It now logs with the stack trace, as does a failing completion
callback and a failed image allocation.

Close the fallback holes. The completion callback ran unguarded inside the
render coroutine, so a failure in it was reported as a plugin error and
left the block pending forever. Painters.of used first {}, turning a future
art type without a painter into an exception in both paint and sizing.
Painting itself was unguarded, and by the time it runs the source pane is
already hidden, so a failure left a blank surface with no way back; paint
failures now hand a fallback to the owner, which restores the source.
diagramImage allocated 2x the scene with no ceiling, and Limits caps the
model rather than the geometry, so a legal diagram could ask for a
multi-gigabyte raster on the EDT the moment someone pressed copy.

Bound the work that limits did not cover. Cancellation is only checked
between lines, so one line needed its own cap, and per-index open/quote
scanning is replaced by a single pass because it made a long line
quadratic. FlowMarks was the only phase with no cancellation point at all
and resolved frame members by recursing per cluster, rescanning every node
each time; it now resolves bounds and depth in one reverse pass. The
remaining FlowLayout phases gained per-iteration checks, and a wall clock
ceiling ends a render that outlasts its cooperative checks as a limit
fault instead of an endless "rendering" state.

Unsupported diagram types now read as a muted note rather than an error.
classDiagram, stateDiagram and friends are valid mermaid this engine does
not draw, and marking each one red reported working markdown as broken.
@kirillk
kirillk merged commit 9b72db3 into main Aug 27, 2026
24 checks passed
@kirillk
kirillk deleted the mighty-acorn branch August 27, 2026 20:40
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