Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 52 additions & 52 deletions apps/desktop/src/app/contrib/controller.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -810,16 +810,16 @@ export function ContribController() {
<ContribWiring>
<AppContextMenu />
<div
className="flex h-screen min-h-0 w-screen flex-col bg-(--ui-bg-chrome) text-(--ui-text-primary)"
// Window-glass hook: this div and the sidebar-wrapper above it are
// the app shell's two full-window opaque painters; the
// [data-hermes-glass] rules in styles.css clear them so the tint
// painted by <body> is the only thing between the page and the
// vibrancy material.
data-contrib-shell=""
style={{ '--titlebar-height': '0px' } as CSSProperties}
>
{/* Title bar: fixed chrome outside the grid, composable via slots.
className="flex h-screen min-h-0 w-screen flex-col bg-(--ui-bg-chrome) text-(--ui-text-primary)"
// Window-glass hook: this div and the sidebar-wrapper above it are
// the app shell's two full-window opaque painters; the
// [data-hermes-glass] rules in styles.css clear them so the tint
// painted by <body> is the only thing between the page and the
// vibrancy material.
data-contrib-shell=""
style={{ '--titlebar-height': '0px' } as CSSProperties}
>
{/* Title bar: fixed chrome outside the grid, composable via slots.
Layout contract (no contribution can break it):
- a full-bar DRAG BASE underneath (pointer-events-none, like
AppShell's drag strips) — everywhere without content drags
Expand All @@ -830,56 +830,56 @@ export function ContribController() {
tree-published --workspace-left/right vars (pure CSS, no rect
threading), clamped to clear the REAL TitlebarControls
clusters (fixed, z-70); center is truly window-centered. */}
<div className="relative flex h-[34px] shrink-0 items-center bg-(--ui-sidebar-surface-background) text-xs">
{/* Drag strips, AppShell-style: cut to AVOID the fixed control
<div className="relative flex h-[34px] shrink-0 items-center bg-(--ui-sidebar-surface-background) text-xs">
{/* Drag strips, AppShell-style: cut to AVOID the fixed control
clusters instead of overlapping them — Electron's no-drag
carve-out of fixed/transformed elements is unreliable, so a
full-bar drag base kills their clicks. In-flow slot content
still carves via its own no-drag wrapper (the same pattern as
the app's session-title button). */}
<div
aria-hidden="true"
className="pointer-events-none absolute inset-y-0 left-0 w-(--titlebar-controls-left,14px) [-webkit-app-region:drag]"
/>
<div
aria-hidden="true"
className="pointer-events-none absolute inset-y-0 left-[calc(var(--titlebar-controls-left,14px)+(var(--titlebar-control-size,24px)*2)+0.75rem)] right-[calc(var(--titlebar-tools-right,0.75rem)+var(--titlebar-tools-width,5.5rem)+0.75rem)] [-webkit-app-region:drag]"
/>
<TitlebarSlot
area="titleBar.left"
className="pointer-events-auto absolute z-10 flex w-max items-center gap-2 [-webkit-app-region:no-drag]"
style={{
left: 'max(calc(var(--workspace-left, 0px) + 0.5rem), calc(var(--titlebar-controls-left, 14px) + 2 * var(--titlebar-control-size, 24px) + 1rem))'
}}
/>
<TitlebarSlot
area="titleBar.center"
className="pointer-events-auto absolute left-1/2 top-1/2 z-10 flex w-max -translate-x-1/2 -translate-y-1/2 items-center gap-2 [-webkit-app-region:no-drag]"
/>
<TitlebarSlot
area="titleBar.right"
className="pointer-events-auto absolute z-10 flex w-max items-center gap-2 [-webkit-app-region:no-drag]"
style={{
right:
// Five static cluster buttons: four systemTools plus the
// always-present right-sidebar toggle (titlebar-controls.tsx).
// Keep in sync with wiring.tsx's SYSTEM_TOOL_COUNT.
'max(calc(var(--workspace-right, 0px) + 0.5rem), calc(var(--titlebar-tools-right, 0.75rem) + 5 * var(--titlebar-control-size, 24px) + 0.5rem))'
}}
/>
</div>

<LayoutTreeRoot />

{/* "Close running tab?" — the busy/input-blocked tile close gate. */}
<SessionTileCloseConfirm />

{/* The REAL statusbar (model pill, command center, agents, …) with
<div
aria-hidden="true"
className="pointer-events-none absolute inset-y-0 left-0 w-(--titlebar-controls-left,14px) [-webkit-app-region:drag]"
/>
<div
aria-hidden="true"
className="pointer-events-none absolute inset-y-0 left-[calc(var(--titlebar-controls-left,14px)+(var(--titlebar-control-size,24px)*2)+0.75rem)] right-[calc(var(--titlebar-tools-right,0.75rem)+var(--titlebar-tools-width,5.5rem)+0.75rem)] [-webkit-app-region:drag]"
/>
<TitlebarSlot
area="titleBar.left"
className="pointer-events-auto absolute z-10 flex w-max items-center gap-2 [-webkit-app-region:no-drag]"
style={{
left: 'max(calc(var(--workspace-left, 0px) + 0.5rem), calc(var(--titlebar-controls-left, 14px) + 2 * var(--titlebar-control-size, 24px) + 1rem))'
}}
/>
<TitlebarSlot
area="titleBar.center"
className="pointer-events-auto absolute left-1/2 top-1/2 z-10 flex w-max -translate-x-1/2 -translate-y-1/2 items-center gap-2 [-webkit-app-region:no-drag]"
/>
<TitlebarSlot
area="titleBar.right"
className="pointer-events-auto absolute z-10 flex w-max items-center gap-2 [-webkit-app-region:no-drag]"
style={{
right:
// Five static cluster buttons: four systemTools plus the
// always-present right-sidebar toggle (titlebar-controls.tsx).
// Keep in sync with wiring.tsx's SYSTEM_TOOL_COUNT.
'max(calc(var(--workspace-right, 0px) + 0.5rem), calc(var(--titlebar-tools-right, 0.75rem) + 5 * var(--titlebar-control-size, 24px) + 0.5rem))'
}}
/>
</div>

<LayoutTreeRoot />

{/* "Close running tab?" — the busy/input-blocked tile close gate. */}
<SessionTileCloseConfirm />

{/* The REAL statusbar (model pill, command center, agents, …) with
statusBar.left/right contributions merged in. Unmounted — not
just hidden — while toggled off, so its 15s status poll and the
per-turn readouts stop with it. */}
{statusbarVisible && <WiredPane part="statusbar" />}
</div>
{statusbarVisible && <WiredPane part="statusbar" />}
</div>
</ContribWiring>
</SidebarProvider>
)
Expand Down
3 changes: 1 addition & 2 deletions apps/desktop/src/sdk/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,7 @@ const $focusedAwaitingResponse = focusedTurnFlag(
*/
const $focusedSessionProfile = computed(
[$focusedStoredSessionId, $sessions, $activeGatewayProfile],
(focused, sessions, activeProfile) =>
normalizeProfileKey(rememberedSessionProfile(sessions, focused, activeProfile))
(focused, sessions, activeProfile) => normalizeProfileKey(rememberedSessionProfile(sessions, focused, activeProfile))
)

export interface PluginProfileRoute {
Expand Down
7 changes: 2 additions & 5 deletions apps/desktop/src/sdk/profile-routing.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,8 @@ vi.mock('@/store/session', async () => {
$messages: atom([]),
$selectedStoredSessionId: atom(null),
$sessions: atom([]),
rememberedSessionProfile: (
_sessions: unknown,
_sessionId: null | string,
activeProfile: null | string
) => (activeProfile ?? '').trim() || 'default',
rememberedSessionProfile: (_sessions: unknown, _sessionId: null | string, activeProfile: null | string) =>
(activeProfile ?? '').trim() || 'default',
requestSessionResume: vi.fn(),
setResumeExhaustedSessionId: vi.fn()
}
Expand Down
Loading