diff --git a/packages/kilo-vscode/tests/unit/agent-project-progress.test.ts b/packages/kilo-vscode/tests/unit/agent-project-progress.test.ts index 0caddba5c5..e4906e9879 100644 --- a/packages/kilo-vscode/tests/unit/agent-project-progress.test.ts +++ b/packages/kilo-vscode/tests/unit/agent-project-progress.test.ts @@ -1,6 +1,11 @@ import { describe, expect, it } from "bun:test" import { createProjectStore } from "../../webview-ui/agent-manager/project/store" -import { clearMultiVersionBusy, markMultiVersionBusy } from "../../webview-ui/agent-manager/project/progress" +import { + clearFailedDelete, + clearMultiVersionBusy, + markMultiVersionBusy, +} from "../../webview-ui/agent-manager/project/progress" +import { createProjectRegistry } from "../../webview-ui/agent-manager/project/registry" const state = (projectId: string) => ({ type: "agentManager.state" as const, @@ -20,6 +25,31 @@ const state = (projectId: string) => ({ }) describe("multi-project progress state", () => { + it.each([undefined, "b"])("clears failed deletion only for the resolved project %s", (projectId) => { + const registry = createProjectRegistry({ persisted: {}, activeId: () => "a" }) + for (const id of ["a", "b"]) { + registry.ensure(id).setBusy( + new Map([ + ["same", { reason: "deleting" as const }], + ["other", { reason: "deleting" as const }], + ]), + ) + } + + const store = registry.ensure(projectId ?? "a") + const peer = registry.ensure(projectId ? "a" : "b") + clearFailedDelete({ type: "error", message: "failed", code: "unrelated", projectId, worktreeId: "same" }, registry) + expect(store.busy().has("same")).toBe(true) + clearFailedDelete( + { type: "error", message: "failed", code: "agentManager.worktreeDeleteFailed", projectId, worktreeId: "same" }, + registry, + ) + + expect(store.busy().has("same")).toBe(false) + expect(peer.busy().has("same")).toBe(true) + expect(store.busy().has("other")).toBe(true) + }) + it("updates only the owning project's grouped worktrees", () => { const first = createProjectStore("a") const second = createProjectStore("b") diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index b5cf7e7d05..5fa343c217 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -104,7 +104,7 @@ import { setReviewOpen, } from "./project/review-state" import { applyRunStatus } from "./project/run-status" -import { clearMultiVersionBusy, markMultiVersionBusy } from "./project/progress" +import { clearFailedDelete, clearMultiVersionBusy, markMultiVersionBusy } from "./project/progress" import { createSessionRestore, createTabMemory, @@ -1386,10 +1386,7 @@ const AgentManagerContent: Component = () => { }) const unsub = vscode.onMessage((msg) => { - if (msg.type === "error" && msg.code === "agentManager.worktreeDeleteFailed" && msg.worktreeId) { - const store = msg.projectId ? registry.ensure(msg.projectId) : registry.active() - store.setBusy((prev) => new Map([...prev].filter(([id]) => id !== msg.worktreeId))) - } + clearFailedDelete(msg, registry) if (msg.type === "agentManager.repoInfo") { const info = msg as AgentManagerRepoInfoMessage setRepoBranch(info.branch) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/project/progress.ts b/packages/kilo-vscode/webview-ui/agent-manager/project/progress.ts index 0a626885c7..02b22cc01f 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/project/progress.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/project/progress.ts @@ -1,4 +1,14 @@ import type { ProjectStore } from "./store" +import type { ExtensionMessage } from "../../src/types/messages" + +export function clearFailedDelete( + msg: ExtensionMessage, + stores: { ensure: (id: string) => ProjectStore; active: () => ProjectStore }, +): void { + if (msg.type !== "error" || msg.code !== "agentManager.worktreeDeleteFailed" || !msg.worktreeId) return + const store = msg.projectId ? stores.ensure(msg.projectId) : stores.active() + store.setBusy((prev) => new Map([...prev].filter(([id]) => id !== msg.worktreeId))) +} /** Clear setup indicators for every worktree in one multi-version group. */ export function clearMultiVersionBusy(store: ProjectStore, groupId: string): void {