diff --git a/.changeset/jetbrains-deleted-session-badge.md b/.changeset/jetbrains-deleted-session-badge.md new file mode 100644 index 0000000000..3697fecf5d --- /dev/null +++ b/.changeset/jetbrains-deleted-session-badge.md @@ -0,0 +1,5 @@ +--- +"@kilocode/kilo-jetbrains": patch +--- + +Stop showing a running badge for a session that was just deleted. diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt index 422859cd88..1c0708b546 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt @@ -124,10 +124,14 @@ class KiloSessionService internal constructor( * Per-session activity for history and session lists. [activity] is the richer source — it also * carries waiting and failed sessions, and it covers sessions that are not open — but it drops * sessions whose directory the backend cannot resolve, so the busy statuses stay as a fallback. + * + * [statuses] and [activity] prune [removed] through separate collectors, so one can still carry + * a deleted session while the other has already dropped it. Subtracting [removed] here keeps the + * merged snapshot consistent instead of briefly badging a deleted session as running. */ internal fun activitySnapshot(): Map { val busy = statuses.value.filterValues { it.type == "busy" }.mapValues { SessionActivityKind.RUNNING } - return busy + activity.value.mapValues { it.value.kind.toKind() } + return (busy + activity.value.mapValues { it.value.kind.toKind() }) - removed.value } suspend fun list(dir: String): SessionListDto { diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt index dd1c2c89f5..ac9231cf65 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt @@ -151,7 +151,9 @@ class KiloSessionServiceTest : BasePlatformTestCase() { "ses_failed" to SessionActivityDto("/repo/wt", SessionActivityKindDto.ERROR), "ses_asking" to SessionActivityDto("/repo/wt", SessionActivityKindDto.QUESTION), ) - service.activity.first { it.isNotEmpty() } + // Both maps feed the snapshot through separate collectors, so wait for each one. + service.statuses.first { it.isNotEmpty() } + service.activity.first { it.size == 2 } assertEquals( mapOf(