fix: restore dead orchestrators from session detail

This commit is contained in:
harshitsinghbhandari 2026-04-20 13:18:49 +05:30
parent eee8e66ffc
commit dcd003fbd6
2 changed files with 40 additions and 13 deletions

View File

@ -594,25 +594,23 @@ export function SessionDetail({
</div>
) : null}
{/* Kill / Restore — only for non-orchestrator worker sessions */}
{!isOrchestrator && (
isRestorable ? (
<button type="button" className="dashboard-app-btn" onClick={handleRestore}>
<svg className="h-3 w-3" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
<polyline points="1 4 1 10 7 10" />
<path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10" />
</svg>
<span className="topbar-btn-label">Restore</span>
</button>
) : !terminalEnded ? (
{/* Restore is available for any restorable session; Kill stays worker-only. */}
{isRestorable ? (
<button type="button" className="dashboard-app-btn" onClick={handleRestore}>
<svg className="h-3 w-3" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
<polyline points="1 4 1 10 7 10" />
<path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10" />
</svg>
<span className="topbar-btn-label">Restore</span>
</button>
) : !isOrchestrator && !terminalEnded ? (
<button type="button" className="dashboard-app-btn dashboard-app-btn--danger" onClick={handleKill}>
<svg className="h-3.5 w-3.5" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
<path d="M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
</svg>
<span className="topbar-btn-label">Kill</span>
</button>
) : null
)}
) : null}
{!isOrchestrator && orchestratorHref ? (
<a

View File

@ -195,6 +195,35 @@ describe("SessionDetail desktop layout", () => {
expect(screen.queryByTestId("direct-terminal")).not.toBeInTheDocument();
});
it("shows restore for restorable orchestrator sessions", () => {
render(
<SessionDetail
session={makeSession({
id: "my-app-orchestrator",
projectId: "my-app",
status: "terminated",
activity: "exited",
summary: "Project orchestrator",
pr: null,
})}
isOrchestrator
orchestratorZones={{
merge: 1,
respond: 0,
review: 0,
pending: 0,
working: 2,
done: 3,
}}
projectOrchestratorId="my-app-orchestrator"
projects={[{ id: "my-app", name: "My App", path: "/tmp/my-app" }]}
/>,
);
expect(within(screen.getByRole("banner")).getByRole("button", { name: "Restore" })).toBeInTheDocument();
expect(within(screen.getByRole("banner")).queryByRole("button", { name: "Kill" })).not.toBeInTheDocument();
});
it("hides the desktop orchestrator button on orchestrator session pages", () => {
render(
<SessionDetail