Skip to content

fix(jetbrains): continue failed turns on retry - #13520

Merged
kirillk merged 5 commits into
mainfrom
snappy-hedgehog
Aug 27, 2026
Merged

fix(jetbrains): continue failed turns on retry#13520
kirillk merged 5 commits into
mainfrom
snappy-hedgehog

Conversation

@kirillk

@kirillk kirillk commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Issue

No linked issue; user-reported JetBrains retry regression during local testing.

Context

JetBrains Retry for failed turns was using the rollback/replay path. The CLI's revert semantics widen a whole-message revert to the preceding user message, and the following prompt cleanup can remove that user prompt and everything after it. For a long first turn, that can make the session look like it lost all context and resume from an empty prompt.

This changes Retry to continue the failed turn instead of rolling it back.

Implementation

Retry now reuses the original user message id with an empty part list and does not call revert or delete. That keeps the transcript and workspace untouched, hides the outcome/error card by moving the session to Busy immediately, and lets the continued turn run with the currently selected model and effort.

The failed assistant attempt remains in history when it produced visible output or tool activity; CLI-side recovery already removes output-free failed scaffolding on the next prompt. This intentionally gives up the previous hidden workspace rollback, because reverting behind a Retry button is surprising and the cleanup path can make that rollback unrecoverable.

The retry tests now assert the important safety properties: no revert/delete RPCs, no appended user message, no text part containing "continue", the card leaves failed state on click, double-click retry is blocked by Busy, and live model/effort selections are preserved.

Screenshots / Video

N/A - behavior-only change covered by controller tests.

How to Test

Manual/local verification

  • Agent: ./gradlew :frontend:test --tests "ai.kilocode.client.session.controller.SessionRetryTest" --console=plain from packages/kilo-jetbrains/ passed.
  • Agent: ./gradlew :frontend:test --rerun-tasks --console=plain from packages/kilo-jetbrains/ passed.
  • Agent: ./gradlew typecheck --console=plain from packages/kilo-jetbrains/ passed.
  • Agent: pre-push hook ran bun turbo typecheck "--filter=!@kilocode/kilo-jetbrains" and bun turbo typecheck "--filter=@kilocode/kilo-jetbrains"; both passed.

Reviewer test steps

  1. Start the JetBrains plugin and create a session with a turn that ends in a provider/API failure.
  2. Switch the model or reasoning effort in the picker.
  3. Click Retry.
  4. Confirm the error card disappears, no literal continue user message appears, previous transcript content remains visible, and the new assistant attempt uses the selected model/effort.

Blocked checks and substitute verification

  • ./gradlew :frontend:detekt --console=plain fails on the existing baseline with 1421 weighted issues; this is not part of the documented JetBrains quality gate. Touched-file lint via oxlint had 0 warnings/errors where applicable, and the relevant Gradle test/typecheck checks passed.

Checklist

  • Issue linked above, or exception explained
  • Tests/verification described
  • Screenshots/video included for visual changes, or marked N/A
  • Changeset considered for user-facing changes
  • I personally reviewed the diff and can explain the changes, including any AI-assisted work.

Get in Touch

N/A

@kilo-code-bot

kilo-code-bot Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (35 files)
  • .changeset/jetbrains-incomplete-response.md
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.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/controller/SessionController.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/model/SessionState.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/model/TurnOutcome.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/views/MessageErrorView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/SessionOutcomeView.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/SessionUiLayoutTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/controller/SessionRecoveryTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/controller/TurnLifecycleTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanelTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/SessionOutcomeViewTest.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/dto/ChatDto.kt
Previous Review Summaries (2 snapshots, latest commit 56dc51e)

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

Previous review (commit 56dc51e)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageErrorView.kt 93 Wrapping error text is not width-aware under SessionLayout
Files Reviewed (11 files)
  • .changeset/jetbrains-failed-turn-notification.md
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendActivityManager.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendActivityManagerTest.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/controller/SessionController.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/views/MessageErrorView.kt - 1 issue
  • 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/SessionOutcomeView.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/controller/SessionRecoveryTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanelTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/SessionOutcomeViewTest.kt

Fix these issues in Kilo Cloud

Previous review (commit e702f2a)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (23 files)
  • .changeset/jetbrains-stopped-session-not-an-error.md
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/controller/SessionController.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/controller/SessionRetryTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeSessionRpcApi.kt

Reviewed by grok-4.6 · Input: 157.5K · Output: 17.4K · Cached: 694.5K

Review guidance: REVIEW.md from base branch main

A turn whose provider ended the stream without a terminal stop reason closed as
"completed" with no message error and no session error, so the session simply went
idle and the truncated answer had no explanation.

Plumb the assistant finish reason through to the frontend and render a warning
outcome card for "unknown" and "other", with the raw reason on the icon tooltip.
The notice is seeded from history so it survives reopening the session. "length" is
excluded because the CLI already writes a visible warning text part for it.

Also broaden the branch/changes refresh from Idle to any non-busy state, so a turn
that edited files still refreshes the git indicators when it ends incomplete, failed,
interrupted, or in error.
SessionLayout sizes MessageErrorView and then reads its preferred size, but the
wrapper's BorderLayout asked the text area for a preferred size without passing that
width down. A wrapping JBTextArea answered with one unwrapped line, so a long provider
error was clipped to a single-line slot.

Measure at the available width the way the transcript's other text rows already do.
Dropping the caret reset with it: there is no scroll pane around this area, so its only
effect was to let a new failure card yank the transcript scroll to itself.
@kirillk
kirillk merged commit cf3c00a into main Aug 27, 2026
24 checks passed
@kirillk
kirillk deleted the snappy-hedgehog branch August 27, 2026 22:23
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