diff --git a/frontend/src/renderer/components/Sidebar.tsx b/frontend/src/renderer/components/Sidebar.tsx index a6d1cc231..b29a12fb3 100644 --- a/frontend/src/renderer/components/Sidebar.tsx +++ b/frontend/src/renderer/components/Sidebar.tsx @@ -185,133 +185,212 @@ export function Sidebar({ collapsible="icon" className={cn("border-border", underTopbar ? "top-14 h-[calc(100svh-3.5rem)]!" : "top-0 h-svh!")} > - - {/* Brand (project-sidebar__brand); in the icon rail it becomes the old + + {/* Brand (project-sidebar__brand); in the icon rail it becomes the old 36px board button wrapping the 22px accent mark. */} -
- - - - - - - - Agent Orchestrator - - {isNightly && ( - - nightly - - )} - {/* On macOS the toggle lives in the titlebar cluster instead. */} - {!isMac && ( +
- - - Collapse sidebar · ⌘B - - )} -
- - - - - {/* Section label (project-sidebar__nav-label) */} -
- - Projects - - -
- - {/* Tree (project-sidebar__tree) */} - - {workspaceError ? ( -
-

Could not load projects.

-

{workspaceError}

-
- ) : workspaces.length === 0 ? ( -
-

No projects yet.

-

- Click + above to register a git repo. -

-
- ) : ( - - {workspaces.map((workspace) => ( - toggleCollapsed(workspace.id)} - onRemoveProject={onRemoveProject} + + + + + + Agent Orchestrator + + {isNightly && ( + + nightly + )} -
-
-
+ {/* On macOS the toggle lives in the titlebar cluster instead. */} + {!isMac && ( + + + + + Collapse sidebar · ⌘B + + )} +
+
- {/* Footer (project-sidebar__footer) — single Settings menu. Divergence + + + {/* Section label (project-sidebar__nav-label) */} +
+ + Projects + + +
+ + {/* Tree (project-sidebar__tree) */} + + {workspaceError ? ( +
+

Could not load projects.

+

{workspaceError}

+
+ ) : workspaces.length === 0 ? ( +
+

No projects yet.

+

+ Click + above to register a git repo. +

+
+ ) : ( + + {workspaces.map((workspace) => ( + toggleCollapsed(workspace.id)} + onRemoveProject={onRemoveProject} + /> + ))} + {isCollapsed && } + + )} +
+
+
+ + {/* Footer (project-sidebar__footer) — single Settings menu. Divergence (user-requested 2026-06-10): the trigger stretches the full row width (flex-1) with a uniform 7px footer inset on all sides (reference uses 12px top, 0 bottom, content-hugging button). The icon rail keeps the icon-only settings action plus expand toggle (off macOS). */} - -
- -
- - + +
+ +
+ + + + + + + {theme === "dark" ? + + + + + + + {selection.activeProjectId && ( + selection.goSettings(selection.activeProjectId!)}> + + )} + + + + + + + + + + daemon {daemonStatus.state} + {eventsConnection === "disconnected" && " · events offline"} + + +
+
+
+ + - - + + Feedback + + + + + + + + + Settings + + {theme === "dark" ? - - - - - - daemon {daemonStatus.state} - {eventsConnection === "disconnected" && " · events offline"} - - + {!isMac && ( + + + + + Expand sidebar · ⌘B + + )}
-
-
- - - - - Feedback - - - - - - - - - Settings - - - - {theme === "dark" ? - - - - - - - {selection.activeProjectId && ( - selection.goSettings(selection.activeProjectId!)}> - - )} - - - - - {!isMac && ( - - - - - Expand sidebar · ⌘B - - )} -
- + -
+
diff --git a/frontend/src/renderer/lib/spawn-orchestrator.ts b/frontend/src/renderer/lib/spawn-orchestrator.ts index c1be2ad62..366353c0e 100644 --- a/frontend/src/renderer/lib/spawn-orchestrator.ts +++ b/frontend/src/renderer/lib/spawn-orchestrator.ts @@ -8,13 +8,7 @@ import { captureRendererEvent } from "./telemetry"; // each call site remembering to instrument itself. Keep in sync with the // allowed-source list in telemetry.ts. export type OrchestratorSpawnSource = - | "board" - | "restore_dialog" - | "topbar" - | "sidebar" - | "project_add" - | "settings" - | "restart"; + "board" | "restore_dialog" | "topbar" | "sidebar" | "project_add" | "settings" | "restart"; /** Spawn the project's orchestrator session via the daemon API. When clean is * true the daemon first tears down any active orchestrator for the project, then