Skip to content

feat(jetbrains): add checkpoint settings and revert guidance - #14512

Merged
kirillk merged 13 commits into
mainfrom
clever-keyboard
Sep 25, 2026
Merged

kirillk merged 13 commits into
mainfrom
clever-keyboard

Conversation

@kirillk

@kirillk kirillk commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Issue

Ports #14464 to the JetBrains plugin and completes the missing Checkpoints settings parity needed by its revert notice.

Fixes #

Context

PR #14464 fixed the CLI so a revert in a non-Git folder reports a dedicated not-a-git-repo workspace status, and updated the VS Code webview to show a specific notice for that case.

JetBrains did not model the revert workspace status at all: its rollback banner always showed one hardcoded snapshots-disabled message, even when the cause was a missing Git repository or checkpoint. It also had no Checkpoints UI for snapshots or the CLI's machine-wide session retention feature.

Implementation

  • Propagates the CLI's revert.workspace value through the shared session DTO and both backend decode paths.
  • Shows state-specific JetBrains revert notices for restored, snapshots-disabled, unavailable, non-Git, and legacy reverts.
  • Adds a standard JetBrains Settings > Tools > Kilo Code > Checkpoints page built with the existing DraftReadyConfigurable, BaseSettingsUi, SettingsRow, and SettingsToggle classes.
  • Reads the effective snapshot value for the current project and patches that project's config through the split-mode workspace RPC; unset remains enabled by default, matching the CLI and VS Code. Without a project context, it falls back to global config.
  • Adds VS Code-equivalent automatic session cleanup controls backed by global CLI config (retention.enabled, retention.maxAgeDays), with disabled/30-day defaults, validation, Apply/Reset behavior, confirmation, progress, errors, and persisted last-run results from the CLI.
  • Uses the existing machine-wide CLI retention endpoints rather than reimplementing deletion. The CLI remains responsible for activity/fork protection, recursive deletion, cross-project scanning, failure accounting, and its persisted retention state.
  • Starts an idempotent backend scheduler two minutes after the plugin opens and repeats 24 hours after each attempt. Manual cleanup remains available when automatic cleanup is disabled by temporarily enabling the saved policy for the forced pass and restoring it afterward.
  • Adds an Enable snapshots link to the snapshots-disabled revert notice which opens the Checkpoints settings page directly. Other revert reasons do not show the link.
  • Places Checkpoints immediately after Context in both the settings tree and root-page links.

No CLI, SDK, or VS Code files are changed; this is scoped to packages/kilo-jetbrains/.

Screenshots / Video

Screen Shot 2026-09-25 at 12 59 29 PM Screen Shot 2026-09-25 at 1 00 07 PM

How to Test

  1. Open Settings > Tools > Kilo Code > Checkpoints.
  2. Confirm Enable snapshots is on when snapshot is absent from the effective project config.
  3. Turn it off, apply settings, and confirm the current project's Kilo config contains "snapshot": false.
  4. Reopen settings, turn it on, and confirm the project config contains "snapshot": true.
  5. Enable automatic session cleanup, set retention days, apply settings, and confirm global Kilo config contains retention.enabled and retention.maxAgeDays.
  6. Confirm Run Cleanup Now remains enabled when automatic cleanup is off, is disabled for dirty/invalid/running states, and prompts before running.
  7. Run cleanup and confirm progress and the last result (deleted/scanned/skipped/failed/duration) update from CLI status.
  8. Revert a conversation when snapshots are disabled and confirm the banner shows Enable snapshots; click it and confirm the Checkpoints page opens directly.
  9. Confirm the link is absent when the revert reason is unavailable, non-Git, restored, or legacy.

Automated verification covers nested retention config parsing/patching, generated endpoint mapping, forced/scheduled cleanup, scheduler timing, settings defaults/apply/reset/scope, confirmation, ordering, localization, revert reasons, and banner-link visibility/action. Local checks: the CLI's 26 retention tests, plus ./gradlew typecheck, ./gradlew test, and ./gradlew buildPlugin from packages/kilo-jetbrains/.

Checklist

  • Issue linked above, or exception explained (ports PR fix: explain file checkpoints require Git in revert notice #14464; no separate tracked issue)
  • Tests/verification described
  • Screenshots/video included for visual changes, or marked N/A
  • Changeset considered for user-facing changes (.changeset/jetbrains-revert-not-a-git-repo-notice.md)
  • I personally reviewed the diff and can explain the changes, including any AI-assisted work.

Get in Touch

…evert

Ports PR #14464 to the JetBrains plugin. VS Code already differentiated
revert-notice reasons (snapshots disabled, checkpoint unavailable, not a
Git repository), but JetBrains had no workspace status field at all and
always showed a single generic 'Snapshots are off' message regardless of
the actual cause.

- Add workspace to the shared SessionRevertDto and parse/map it in the
  backend CLI data parser and session manager (both the direct decode
  path and the reflective fallback for differently-shaped generated
  models).
- Branch the RevertBanner notice on workspace: hidden when restored,
  a specific message for snapshots-disabled / unavailable /
  not-a-git-repo, and a legacy fallback for older reverts that predate
  this field.
- Add the four new revert.banner.workspace.* bundle keys to the base
  properties file and all locale files, and drop the now-unused
  filesNotRestored key.
@kilo-code-bot

kilo-code-bot Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (4 files)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/RevertBanner.kt - prior left-action ordering finding resolved
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/base/DialogView.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/base/DialogViewTest.kt
Previous Review Summaries (10 snapshots, latest commit 2e2b609)

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

Previous review (commit 2e2b609)

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/frontend/src/main/kotlin/ai/kilocode/client/session/ui/RevertBanner.kt 136 Left-action visibility is only re-evaluated when progress is detached, so the Enable snapshots link depends on event ordering during a revert.
Files Reviewed (4 files)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/RevertBanner.kt - 1 suggestion
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/base/DialogView.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/base/DialogViewTest.kt

Fix these issues in Kilo Cloud

Previous review (commit df96365)

Status: No Issues Found | Recommendation: Merge

Incremental review of commit df9636576f (use standard revert settings action). The revert notice now escapes and auto-wraps its text, and the previous stale-text finding is resolved by clearing the label to "" when no notice applies. Enable snapshots moved from an inline ActionLink to a retained DialogView footer action whose visibility is toggled per revert.workspace, with action ordering and tests updated to match. No new issues found in the changed code.

Files Reviewed (2 files)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/RevertBanner.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanelTest.kt

Previous review (commit fb59799)

Status: No Issues Found | Recommendation: Merge

Incremental review of commits 027b6d6a and fb59799f (decouple manual session cleanup; keep it enabled for drafts). The two new commits let Run Cleanup Now work while automatic cleanup is off or the form has unsaved edits: runManualRetention temporarily enables the saved policy, runs a forced pass, and restores it under NonCancellable, and the run button no longer depends on draft.cleanup/dirty. The restore path, job tracking, and use of the last saved (baseline) policy are correct, and no new issues were found. The four findings from the previous review remain resolved.

Files Reviewed (5 files)
  • .changeset/jetbrains-revert-not-a-git-repo-notice.md
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloAppService.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/base/BaseSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUiTest.kt

Previous review (commit 22fbf94)

Status: No Issues Found | Recommendation: Merge

Incremental review of commit 22fbf94a (address checkpoint review feedback). All four findings from the previous review are resolved: the maxAgeDays read is now runCatching-guarded so a malformed value cannot void the whole ConfigDto, retention polling now stops while idle and restarts only for an active/pending run, the forced-run job is tracked in jobs and cancelled on dispose, and Reset/Apply now restore the days field through restoreFields() so a stuck invalid value clears.

Files Reviewed (6 files)
  • 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/settings/base/BaseSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUiTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeAppRpcApi.kt

Previous review (commit 81972e3)

Status: 4 Issues Found | Recommendation: Address before merge

Incremental review of commit 81972e34 (automatic session cleanup). Two correctness/robustness warnings in the new retention parsing and the Checkpoints days field, plus two suggestions on the new retention polling and run job.

Overview

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

WARNING

File Line Issue
packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt 642 retention.maxAgeDays is read without a runCatching guard; a non-primitive value makes jsonPrimitive throw and the outer runCatching discards the entire ConfigDto (model, mcp, agent).
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUi.kt 340 RetentionDaysField.sync early-returns while the text is invalid, so Reset/Apply cannot clear a stuck invalid value; Apply and Run Cleanup then stay disabled with a validation error.

SUGGESTION

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUi.kt 62 Unconditional 1 Hz retention-status polling for the whole page lifetime; prefer polling only while a run is active.
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUi.kt 179 Forced-run job from runRetentionAsync is untracked, so a disposed page can be retained until the RPC returns.
Files Reviewed (44 files)
  • .changeset/jetbrains-revert-not-a-git-repo-notice.md
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendAppService.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendRetentionManager.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendRetentionScheduler.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloAppRpcApiImpl.kt
  • packages/kilo-jetbrains/backend/src/main/resources/kilo.jetbrains.backend.xml
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendAppServiceTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendRetentionSchedulerTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloAppService.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/KiloSettingsConfigurable.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/base/BaseSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsState.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/plugin/KiloBundleLocaleTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/KiloSettingsConfigurableTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsStateTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUiTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeAppRpcApi.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloAppRpcApi.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/dto/KiloAppStateDto.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/dto/RetentionDto.kt
  • 18 KiloBundle_*.properties locale files

Fix these issues in Kilo Cloud

Previous review (commit 65f692e)

Status: No Issues Found | Recommendation: Merge

Incremental review of commit 65f692e (test stabilization only). The reworked backgroundJobs still serves and shares after the last collector left test resolves the shared flow once and filters for the newly polled value, which removes the cache-eviction race and remains deterministic with the default empty-list mock cadence.

Files Reviewed (1 file)
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerBackgroundJobsTest.kt

Previous review (commit f7ee5ef)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (19 files)
  • 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/plugin/KiloBundleLocaleTest.kt

Previous review (commit c481ff5)

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/frontend/src/main/resources/messages/KiloBundle.properties 723 New settings.checkpoints.* keys (and revert.banner.workspace.enableSnapshots) were only added to the default bundle, not mirrored into the 18 localized bundles like the sibling keys.
Files Reviewed (25 files)
  • .changeset/jetbrains-revert-not-a-git-repo-notice.md
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloWorkspaceRpcApiImpl.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendAppServiceTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/rpc/KiloWorkspaceRpcApiImplTest.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/SessionUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/RevertBanner.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/KiloSettingsConfigurable.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/base/BaseSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsConfigurable.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsState.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanelTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/KiloSettingsConfigurableTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsConfigurableTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsStateTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/checkpoints/CheckpointsSettingsUiTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeAppRpcApi.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeWorkspaceRpcApi.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloWorkspaceRpcApi.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/dto/KiloAppStateDto.kt

Fix these issues in Kilo Cloud

Previous review (commit a882dde)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 file)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/RevertBanner.kt

Previous review (commit b3da592)

Status: 1 Issue Found | Recommendation: Merge; one optional cleanup suggestion

Overview

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

SUGGESTION

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/RevertBanner.kt 126 Hidden notice label retains stale text when the workspace reason disappears; clear it with notice.text = message ?: "".
Files Reviewed (27 files)
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerTest.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/ui/RevertBanner.kt - 1 suggestion
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanelTest.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/dto/SessionDto.kt
  • .changeset/jetbrains-revert-not-a-git-repo-notice.md
  • 18 KiloBundle*.properties locale/bundle files

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

…lient/session/ui/RevertBanner.kt

Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
Let JetBrains users control snapshot tracking from the standard Kilo settings UI instead of editing config files manually. Resolve the active project across split mode so project-level snapshot overrides, including the CLI slow-repository opt-out, can be changed from the banner link.
@kirillk kirillk changed the title fix(jetbrains): explain why file checkpoints weren't restored after revert feat(jetbrains): add checkpoint settings and revert guidance Sep 24, 2026
Mirror the new Checkpoints settings and revert-banner link strings into every localized bundle so locale resources stay structurally consistent. Add a bundle test that prevents future checkpoint keys from being omitted.
Wait for a changed background-job payload after the previous subscriber leaves instead of accepting the shared flow's replayed empty list. Keep both new subscribers on one resolved flow so the request assertion deterministically measures poller sharing rather than cache-eviction scheduling.
Complete Checkpoints settings parity with VS Code by storing retention policy in global CLI config and using the CLI's machine-wide retention endpoints for scheduling, manual cleanup, progress, and last-run results. Keep snapshot changes project-aware, place Checkpoints after Context, and preserve all CLI activity and fork-safety rules.
Preserve surrounding config when retention days are malformed, restore invalid day input on Reset and successful Apply, stop idle retention polling, and tie forced cleanup requests to the settings page lifecycle.
Keep Run Cleanup Now available when automatic cleanup is disabled. For pinned CLI versions that gate forced retention on an enabled policy, temporarily enable the saved policy for the manual pass and restore it in a non-cancellable cleanup step.
Do not disable Run Cleanup Now merely because automatic cleanup or retention days have unsaved edits. Use the last saved retention policy for the manual pass so running cleanup cannot implicitly apply the draft.
Render Enable snapshots as a retained DialogView footer button before Redo instead of an inline link. Format workspace restoration notices as escaped auto-wrapping HTML so long explanations reflow within narrow chat cards.
Add a shared retained left-action API to DialogView so Enable snapshots uses the standard footer button at the left edge and survives temporary progress content. Mark Redo as the primary action for the common default-button style.
Update retained left-action state even while a temporary progress component occupies the footer slot. Restoring the slot now deterministically shows or clears Enable snapshots based on the latest revert workspace status.
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