Repository navigation
Session tabs: readable widths, all-tabs list, context menu, pinning, spawned-session groups (#2154) - #2161
Draft
jacktrnr wants to merge 3 commits into
Draft
Session tabs: readable widths, all-tabs list, context menu, pinning, spawned-session groups (#2154)#2161jacktrnr wants to merge 3 commits into
jacktrnr wants to merge 3 commits into
Conversation
added 3 commits
November 8, 2026 10:28
…re (#2154) Pure display-order derivation (pinned first, spawned sessions after their parent) and bulk-close selectors, plus store support: an optional pinned flag that survives migration, a cached spawnedBy on tab info, setPinned, and closeMany (skips pinned tabs, records every closed tab for reopen).
- tabs keep a 160px floor (the active tab its full 224px); past that the strip scrolls (vertical wheel too) instead of squeezing to a dot - truncated titles end in an ellipsis; the active tab is always scrolled into view, however it became active - an all-tabs list (search, status, project) from a chevron once tabs overflow, and from mod+alt+a / the palette - a tab context menu: rename, pin, close, close others / to the right / finished / group; fixes the selector that opened Customize on tabs - pinned tabs: compact status-dot tabs at the left, no close affordance - spawned sessions (metadata.spawned_by) shown after their parent with a shared underline - hover preview after 400ms instead of 2s; tabs expose their full title
…k-close spec (#2154) tab-dblclick-close asserted double-click closes a tab, which the .18 tab rework replaced with rename; tab-close-gestures covers the current close gestures (middle-click, the close button). Manifest refreshed.
Contributor
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #2154. Follow-up: #2160 (open spawned sessions as tabs on their own).
What changes for the user
With many chats open, the tab strip used to squeeze every tab toward 28px, clip titles with a fade, hide them entirely under 64px, and only show the full title after a 2-second hover. Now:
mod+alt+aor from the palette ("Show all tabs"). Arrow keys plus Enter work.metadata.spawned_by, written byamicode_session) are shown right after their parent, joined by a neutral underline. Dragging the parent moves the group.How it works
titlebar-tab-arrange.ts(pure, unit-tested) computes pinned first, then each parent followed by its spawned children. The persisted order only changes when you drag. After a drop the arrangement is re-derived, so a drop across the pinned boundary settles back on its own side.context/tabs.tsx):pinnedflag onSessionTab, kept bymigrateTabs;TabInfo.spawnedBy, a cached spawn parent;setPinned;closeMany, which skips pinned tabs, pushes every closed tab onto the reopen stack (mod+shift+tbrings them back), and re-navigates only if the active tab was closed.normalizeSessionInfodropsmetadata. So each session tab asks the legacyGET /session/:idonce and caches the answer on its tab info. "Not spawned" is only cached for sessions older than 2 minutes, because a fork gets its stamp in a follow-up PATCH.titlebar-tab-popover.tsx(delay plus the note line).Verification
tsgo -b(app typecheck) is clean. I also confirmed it catches a deliberately planted error.oxlinton the touched files: 0 errors, and no new warnings from new code.Unit tests:
bun testoversrc/components,src/contextandsrc/pages/layoutgives 1348 pass and 3 fail. The 3 failures (sync-optimistic×2,server-sessionlive file-edit route) are in upstream-only tests of sync code this PR doesn't touch, and they also fail when run on their own.E2E: the new
e2e/regression/tab-strip-organize.spec.tshas 7 tests covering:It passes 14/14 with
--repeat-each 2(Playwright with the local Chrome channel).tab-dblclick-close.spec.tswas stale: it asserted that double-click closes a tab, which the .18 rework replaced with rename. It is replaced bytab-close-gestures.spec.ts(middle-click, close button), 2/2. The extension'stitlebar_dblclick_close.test.tssource check still passes.tab-navigate-mousedown.spec.ts› "keyboard navigation follows the visible tab order" also fails on main (it never navigates there). With this branch it navigates to the still-loading tab, because that tab renders a visible slot. I left it as is; it needs its own look.Visual check: screenshots in light and dark of the strip, hover preview, menu and list with 12 tabs. The group underline uses
--v2-border-border-strong(no yellow on light), and pinned and status dots use the existing activity tokens.refresh_manifest.mjsanddrift_gate.mjspass.Not in this PR