From 560a88ad6c5f735eab2491313df5a971e7ccfeb2 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:19:53 -0700 Subject: [PATCH 01/37] feat(native-chat): show each interrupted chat's workspace as its read-only sidebar card The resume-on-restart dialog listed workspaces as a bare name and glyph, so users could not tell their sessions apart. It now renders each workspace with the sidebar's own WorktreeCard in a new read-only mode, with the offered chats in place of its live agent rows, and nests child workspaces under a listed parent the way the sidebar does. The dialog is wider and the chat rows use the sidebar's compact agent row layout. Co-Authored-By: Claude --- .../NativeChatResumeOnRestartAgentRow.tsx | 32 ++- .../NativeChatResumeOnRestartGroups.tsx | 233 ++++++++++++------ .../NativeChatResumeOnRestartModal.tsx | 55 +++-- ...ve-chat-resume-on-restart-grouping.test.ts | 30 +++ .../native-chat-resume-on-restart-grouping.ts | 33 +++ .../WorktreeCard.affiliate-list-mode.test.tsx | 69 ++++++ .../src/components/sidebar/WorktreeCard.tsx | 6 +- .../sidebar/use-worktree-card-controller.ts | 4 +- .../use-worktree-card-secondary-details.ts | 7 +- .../sidebar/worktree-card-header.tsx | 7 +- .../components/sidebar/worktree-card-model.ts | 6 + .../sidebar/worktree-card-presentation.tsx | 18 +- .../sidebar/worktree-card-secondary-rows.tsx | 20 +- .../sidebar/worktree-card-surface.tsx | 10 +- 14 files changed, 393 insertions(+), 137 deletions(-) diff --git a/src/renderer/src/components/NativeChatResumeOnRestartAgentRow.tsx b/src/renderer/src/components/NativeChatResumeOnRestartAgentRow.tsx index 3c7e376c00f1..8662bef2d99e 100644 --- a/src/renderer/src/components/NativeChatResumeOnRestartAgentRow.tsx +++ b/src/renderer/src/components/NativeChatResumeOnRestartAgentRow.tsx @@ -12,8 +12,9 @@ import { ResumeFailureGuidanceLine, ResumeFailureStatus } from './NativeChatResu import { resumeActivityLabel } from './native-chat-resume-activity-label' /** - * One offered chat, laid out like the sidebar's compact agent row: provider glyph, the chat's name, - * then the model and an age on the right. + * One offered chat, laid out like the sidebar's compact agent row — provider glyph, then "name - + * what it was doing" on one line, then the model and an age on the right — with the checkbox in + * the state dot's slot. It sits inside the workspace's own read-only sidebar card. * * The sidebar's own `CompactAgentRow` cannot be reused — it takes a `DashboardAgentRow`, which * requires a live pane, tab and status entry, and every chat here is by definition stopped. The @@ -26,7 +27,7 @@ import { resumeActivityLabel } from './native-chat-resume-activity-label' * a fault, `done` a finish, `working` a spinner. A missing dot beats a dot that says these agents * are running. * - * Under the name, what the chat was doing when Orca went away — mid-reply, waiting on the user, + * After the name, what the chat was doing when Orca went away — mid-reply, waiting on the user, * subagents or monitoring — so rows the sidebar showed as working for different reasons differ. * * A chat an earlier resume could not carry on is the same row — selectable where a retry can run, @@ -60,7 +61,8 @@ export function ResumeCandidateRow({ const model = candidate.model?.trim() ?? '' const activity = resumeActivityLabel(candidate.activity) const row = ( -