feat(frontend): open a live session straight to its pending gate
Opening an in-progress session that has a live Pi runtime now reconnects to its pending gate instead of the empty landing screen that read as "stopped". Cold/completed sessions keep the read-only documents panel with its explicit Resume, so a mere click never spawns a runtime. Backend GET /sessions now reports a per-session `active` flag (live runtime bound) to drive this. Also: - "New session" now closes any open session detail panel (left box). - The model-activity separator can be dragged to a full 50/50 split (was capped at 576px); central-min still guards narrow viewports. Test fixes uncovered along the way: - Node 25 ships an experimental global localStorage that shadows jsdom's and lacks clear(), failing every jsdom test at setup; install a spec-compliant in-memory Storage (feature-detected, inert on CI/LTS). - Fix 4 pre-existing session-mgmt tests that used an ambiguous getByText for a session shown in both nav and header; target the nav item by test id. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@ import type { KeyboardEventHandler, PointerEventHandler, RefObject } from "react
|
||||
|
||||
export const ACTIVITY_PANEL_DEFAULT_WIDTH = 384;
|
||||
export const ACTIVITY_PANEL_MIN_WIDTH = 288;
|
||||
/** Pre-measurement fallback ceiling only; the measured bound is 50% of the container (see below). */
|
||||
export const ACTIVITY_PANEL_MAX_WIDTH = 576;
|
||||
export const ACTIVITY_CENTRAL_MIN_WIDTH = 512;
|
||||
export const ACTIVITY_PANEL_STORAGE_KEY = "thothii:model-activity-panel-width";
|
||||
@@ -10,11 +11,13 @@ export const ACTIVITY_PANEL_STORAGE_KEY = "thothii:model-activity-panel-width";
|
||||
export type ActivityPanelBounds = { min: number; max: number };
|
||||
|
||||
export function getActivityPanelBounds(containerWidth: number): ActivityPanelBounds {
|
||||
// The separator may be dragged out to a full 50/50 split. On containers too narrow
|
||||
// for that (below ~1024px) the central-min guard binds first, keeping the chat usable.
|
||||
return {
|
||||
min: ACTIVITY_PANEL_MIN_WIDTH,
|
||||
max: Math.max(
|
||||
ACTIVITY_PANEL_MIN_WIDTH,
|
||||
Math.min(ACTIVITY_PANEL_MAX_WIDTH, containerWidth - ACTIVITY_CENTRAL_MIN_WIDTH),
|
||||
Math.min(containerWidth * 0.5, containerWidth - ACTIVITY_CENTRAL_MIN_WIDTH),
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user