From 7bf25f0c2a9d7d127e4e1a3920e0b9d566da950e Mon Sep 17 00:00:00 2001 From: ronish Date: Wed, 22 Jul 2026 19:56:31 +0530 Subject: [PATCH] fix(web): show Restore button for merged sessions in done strip Sessions with status 'merged' now render the Restore action in both the Kanban done strip (SessionsBoard) and the terminal-ended banner (TerminalPane), on par with 'terminated' sessions. Updates the test that previously asserted the button was absent for merged sessions. Closes #1907 --- frontend/src/renderer/components/SessionsBoard.test.tsx | 4 ++-- frontend/src/renderer/components/SessionsBoard.tsx | 2 +- frontend/src/renderer/components/TerminalPane.tsx | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/renderer/components/SessionsBoard.test.tsx b/frontend/src/renderer/components/SessionsBoard.test.tsx index 632302b0c2..d492ac05ac 100644 --- a/frontend/src/renderer/components/SessionsBoard.test.tsx +++ b/frontend/src/renderer/components/SessionsBoard.test.tsx @@ -618,7 +618,7 @@ describe("SessionsBoard", () => { expect(screen.queryByText("Session can no longer be restored")).not.toBeInTheDocument(); }); - it("opens a merged Done session from the card body without showing restore", async () => { + it("shows restore button for a merged Done session and can invoke it", async () => { workspaceQueryMock.mockReturnValue({ data: [workspaceWithSessions([terminatedSession({ id: "s-merged", title: "merged worker", status: "merged" })])], isError: false, @@ -629,7 +629,7 @@ describe("SessionsBoard", () => { await userEvent.click(screen.getByRole("button", { name: /done \/ terminated/i })); - expect(screen.queryByRole("button", { name: "Restore merged worker" })).not.toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Restore merged worker" })).toBeInTheDocument(); await userEvent.click(screen.getByText("merged worker")); diff --git a/frontend/src/renderer/components/SessionsBoard.tsx b/frontend/src/renderer/components/SessionsBoard.tsx index 95ed0875ab..9a5368ce06 100644 --- a/frontend/src/renderer/components/SessionsBoard.tsx +++ b/frontend/src/renderer/components/SessionsBoard.tsx @@ -312,7 +312,7 @@ export function SessionsBoard({ projectId }: SessionsBoardProps) { key={s.id} session={s} onOpen={() => openSession(s)} - restoreAction={s.status === "terminated" ? (event) => void restoreDoneSession(event, s) : undefined} + restoreAction={s.status === "terminated" || s.status === "merged" ? (event) => void restoreDoneSession(event, s) : undefined} restoreError={restoreErrors[s.id]} isRestoring={restoringSessionId === s.id} isRestoreDisabled={restoringSessionId !== undefined} diff --git a/frontend/src/renderer/components/TerminalPane.tsx b/frontend/src/renderer/components/TerminalPane.tsx index c949039971..98f4eb845b 100644 --- a/frontend/src/renderer/components/TerminalPane.tsx +++ b/frontend/src/renderer/components/TerminalPane.tsx @@ -243,7 +243,9 @@ function AttachedTerminal({ session, theme, daemonReady, terminalTarget, fontSiz const hadAttachmentRef = useRef(false); // A standalone shell is never restorable: there is no session row to restore. const canRestoreSession = - terminalTarget?.kind !== "reviewer" && terminalTarget?.kind !== "shell" && session?.status === "terminated"; + terminalTarget?.kind !== "reviewer" && + terminalTarget?.kind !== "shell" && + (session?.status === "terminated" || session?.status === "merged"); const handleReady = useCallback((handle: AttachableTerminal) => { setTerminal(handle);