You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Session Picker (Ctrl-R / /sessions) has four usability gaps that make it hard to navigate and trust:
Empty auto-created sessions clutter the list. Sessions with 0 messages and the default title ("Session") appear in the picker, even though the same definition (is_empty_auto_created_session) is already used to hide them from the launch "recent work" list and from --continue/auto-resume. The picker is the odd one out — it shows empty sessions while the other surfaces hide them.
The current session is not highlighted, and its id is not discoverable. Opening the picker from a live session does not indicate which row is the session you are in. There is no command or surface that prints the current session id, so you can only find it by searching text — and even then the list shows only a truncated 8-char id.
PageUp/PageDown scroll the history pane, not the session list. The list scrolls only by one row at a time (arrows/j/k), so navigating a long list is slow; PgUp/PgDn unexpectedly move the preview pane instead.
The list pane is narrow and titles truncate. The two-pane layout gives the list only ~36% of width (history gets ~64%), so session rows (id + title + count + mode + relative time) are squeezed and titles get cut on the right even on wide terminals.
Affected: anyone who uses /sessions / Ctrl-R to resume or inspect sessions, especially with many sessions per workspace.
Proposed solution
Hide empty auto-created sessions in the picker — apply the existing is_empty_auto_created_session filter in the picker's session projection so it matches the launch list and --continue behavior. (One filter condition; no new concept.)
Highlight and identify the current session — mark the row that matches app.current_session_id (e.g. a current tag / distinct style) when the picker opens from a live session; and expose the current session id somewhere usable (status line hint or a /session id-style command), closing the same gap behind Resume hint omits session id; run --continue is ambiguous with multiple sessions per workspace #6001.
Make PgUp/PgDn scroll the list when it owns focus — page the session list by a viewport per press (like the history pane already does for previews), with focus rules for list vs preview (exact behavior is an open question; see below).
Give the list pane a fairer share of width — evaluate 50/50 or list-first split when there is enough terminal width, and consider dropping the id from the row when a meaningful title exists (id stays as a secondary/status detail).
Use case
Open /sessions after a long work week: the list is clean (no "Session" rows), the row you are working in is visibly marked, and you can page down through 40+ sessions to find the one you want instead of arrow-keying line by line.
You need to codewhale exec --session <id> or reference the current session: id is shown without digging.
On a 141-column terminal the list shows actual titles instead of truncated ones.
Alternatives considered
Do nothing (rely on / search): works for finding other sessions, but doesn't help visibility of the current one or the empty-row noise.
Auto-delete empty sessions instead of hiding them: discussed; hiding is consistent with the existing launch/--continue behavior and is non-destructive (sessions may gain messages later via exec --session).
For the width issue: keep history at 64% but make rows denser (drop id when title is meaningful) — a lighter change than re-layout.
Impact
Every /sessions user. Medium-high: the empty-session fix removes visible noise, the current-session highlight answers a common "which one am I in" question, and paging is the difference between a usable and an annoying list past ~20 sessions. All four are picker-only changes; no session-store or data-model changes.
Picker opens via SessionPickerView::new (no preselection) on the Ctrl-R / launch paths; new_selecting(session_id) exists but is used only by callers that already know the target id (sidebar rail, command flows with a preselected session, foreign-session import) — the current-session row is never auto-highlighted on the plain picker path.
List keys: arrows/j/k move selection one row; PageUp/PageDown call scroll_history (preview pane), not list scrolling.
Row format: truncate_id (8 chars) + title (≤32) + message count + mode + relative time, whole row truncated to pane width.
Two-pane split: history 64% / list 36% at widths ≥ 95 columns.
is_empty_auto_created_session (0 messages + default title) is applied in launch-recent and --continue, but not in the picker's select_sessions projection.
Open questions (for maintainers)
Focus model for paging: should PgUp/PgDn always page the list (relegating preview scrolling to arrows/secondary keys), or switch focus list↔preview first (e.g. Tab), or page whichever pane is focused? (Variant A: list-only paging; B: focus-switch + per-pane paging; C: keep preview on PgUp/PgDn, add dedicated list page keys.)
Current-session indicator: inline tag (current), distinct color, or a footer/status line showing session id for the active session — which is preferred given the TUI visual language?
Width: rebalance to 50/50 vs dense rows (drop id when a real title exists) vs keep layout and only fix truncation math.
Acceptance criteria
Empty auto-created sessions (0 messages, default title) are not listed in /sessions / Ctrl-R (consistent with launch list and --continue)
When the picker is opened from a live session, the current session row is visually marked; some surface prints the current session id (status line or command)
PgUp/PgDn page the session list by one viewport per press (per the chosen focus model)
Session rows show meaningful titles without truncation on 141-column terminals (list pane widened or row densified)
Archived / all-workspace toggles (e, x, a) and / search still behave unchanged
Problem
The Session Picker (
Ctrl-R//sessions) has four usability gaps that make it hard to navigate and trust:is_empty_auto_created_session) is already used to hide them from the launch "recent work" list and from--continue/auto-resume. The picker is the odd one out — it shows empty sessions while the other surfaces hide them.j/k), so navigating a long list is slow; PgUp/PgDn unexpectedly move the preview pane instead.Affected: anyone who uses
/sessions/Ctrl-Rto resume or inspect sessions, especially with many sessions per workspace.Proposed solution
is_empty_auto_created_sessionfilter in the picker's session projection so it matches the launch list and--continuebehavior. (One filter condition; no new concept.)app.current_session_id(e.g. acurrenttag / distinct style) when the picker opens from a live session; and expose the current session id somewhere usable (status line hint or a/session id-style command), closing the same gap behind Resume hint omits session id; run --continue is ambiguous with multiple sessions per workspace #6001.Use case
/sessionsafter a long work week: the list is clean (no "Session" rows), the row you are working in is visibly marked, and you can page down through 40+ sessions to find the one you want instead of arrow-keying line by line.codewhale exec --session <id>or reference the current session: id is shown without digging.Alternatives considered
/search): works for finding other sessions, but doesn't help visibility of the current one or the empty-row noise./tree/branch/fork/resume) #5262 flat list: no — the session tree (v0.9.5: session tree (append-only entry journal +/tree/branch/fork/resume) #5262) is better; this issue is about the picker, not the model.--continuebehavior and is non-destructive (sessions may gain messages later viaexec --session).Impact
Every
/sessionsuser. Medium-high: the empty-session fix removes visible noise, the current-session highlight answers a common "which one am I in" question, and paging is the difference between a usable and an annoying list past ~20 sessions. All four are picker-only changes; no session-store or data-model changes.Additional context
/tree/branch/fork/resume) #5262 (session tree / journal — why sessions exist and how titles are derived), v0.9.1: Switching mode or permission must not create empty Work #4629 (related "must not create empty Work" session leak), Resume hint omits session id; run --continue is ambiguous with multiple sessions per workspace #6001 (open — resume hint omits session id; same "id opacity" root).SessionPickerView::new(no preselection) on the Ctrl-R / launch paths;new_selecting(session_id)exists but is used only by callers that already know the target id (sidebar rail, command flows with a preselected session, foreign-session import) — the current-session row is never auto-highlighted on the plain picker path.j/kmove selection one row;PageUp/PageDowncallscroll_history(preview pane), not list scrolling.truncate_id(8 chars) + title (≤32) + message count + mode + relative time, whole row truncated to pane width.is_empty_auto_created_session(0 messages + default title) is applied in launch-recent and--continue, but not in the picker'sselect_sessionsprojection.Open questions (for maintainers)
current), distinct color, or a footer/status line showingsession idfor the active session — which is preferred given the TUI visual language?Acceptance criteria
/sessions/Ctrl-R(consistent with launch list and--continue)PgUp/PgDnpage the session list by one viewport per press (per the chosen focus model)e,x,a) and/search still behave unchanged