Skip to content

feat(app): add an independent Side bar mode - #60867

Closed
joe-ieta wants to merge 18 commits into
anomalyco:devfrom
joe-ieta:sidebar-mode
Closed

joe-ieta wants to merge 18 commits into
anomalyco:devfrom
joe-ieta:sidebar-mode

Conversation

@joe-ieta

@joe-ieta joe-ieta commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Issue for this PR

Refs #60241. Supersedes #60446.

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

Choose Side bar under Interface in Settings to work across projects from one navigation panel.

  • Projects groups history by project, with pins, collapse state, unread markers and a five-session preview. The header adds a project picker. Each project shares Home’s menu for editing, opening or importing sessions, copying the path and closing the project. Reopening restores access to its drafts and history.
  • Running lists active sessions and background shells across servers, including sessions without open tabs. It stays visible when project groups are collapsed or closed.
  • Home and Side bar share the newest 500 root sessions per server and live updates. Search reaches older history.

The shared project menu builds on joe-ieta/opencode#2.

How did you verify your code works?

  • Based on official dev@adb0053d09. git merge-tree reports a clean merge.
  • bun run check passed all 33 tasks. The app's typecheck:tsc passed. Windows checks used an equivalent local import for the declaration symlink.
  • All 98 focused app and client unit tests and all 101 production Chromium Home and tabs regressions passed. Chromium ran with five workers and zero retries.

Visual

<svg xmlns="http://www.w3.org/2000/svg" width="240" height="72" viewBox="0 0 240 72" fill="currentColor">
  <style>.menu{animation:menu 3s ease-in-out infinite}@keyframes menu{0%,100%{opacity:.65}40%,80%{opacity:1}}@media(prefers-reduced-motion:reduce){.menu{animation:none}}</style>
  <rect x="7" y="5" width="101" height="62" rx="5" fill="none" stroke="currentColor" opacity=".3"/>
  <text x="14" y="19" font-size="9">Projects</text>
  <path d="M94 15h7m-3.5-3.5v7" stroke="currentColor" opacity=".7"/>
  <rect x="13" y="25" width="89" height="14" rx="3" opacity=".12"/>
  <text x="19" y="35" font-size="8">Web App</text>
  <circle cx="90" cy="32" r="1"/><circle cx="94" cy="32" r="1"/><circle cx="98" cy="32" r="1"/>
  <path d="M20 46h69m-69 6h54m-54 6h42" stroke="currentColor" stroke-width="3" stroke-linecap="round" opacity=".35"/>
  <g class="menu">
    <rect x="115" y="13" width="117" height="47" rx="5" fill="none" stroke="currentColor" opacity=".45"/>
    <text x="123" y="26" font-size="8">New session</text>
    <rect x="120" y="30" width="107" height="13" rx="3" opacity=".12"/>
    <text x="123" y="39" font-size="8">Edit project</text>
    <text x="123" y="52" font-size="8">Close</text>
  </g>
</svg>

Screenshots / recordings

Earlier Side bar Projects and its menu
Earlier Side bar Projects and the shared project menu

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

@joe-ieta

Copy link
Copy Markdown
Contributor Author

@TylonHH @zhuzhutai @rahbi4-source — you offered hands-on grouping tests in #57896 and #59220. Feedback on this alternative Side bar mode would be welcome.

This is an optional fourth interface mode; Top tabs, Side tabs and Inbox keep their current behavior. It combines project-grouped history (or a flat List) with a bounded Running shelf across projects, including unopened sessions and subagents. The shelf stays visible regardless of grouping, so waiting work remains discoverable.

Ways to test:

  • Latest source: joe-ieta:sidebar-mode, targeting current upstream dev (2.2.5).
  • Windows x64 fork preview: v2.2.3-dev-my.4. This is an unsigned fork prerelease on the 2.2.3 base, not an official release; its first manual test has passed. Select Settings → General → Interface → Side bar.

Useful scenarios: several projects/worktrees or same-named paths; switching all four modes; List/By project and More/Show less; running or input/approval-waiting sessions outside the open tabs; child sessions; close/hide followed by Home/search reopen; reload and saved ordering.

Please leave the OS, exact build/commit, selected mode, expected/actual result and reproduction steps here. Screenshots or recordings are welcome. Grouping follows the existing project identity; nested folder trees, archive controls and custom tags are outside this change. Maintainer design review is still pending.

@rahbi4-source

Copy link
Copy Markdown

OS: Windows 11 Pro, version 25H2 (build 26200.9711) Build: source build, branch joe-ieta:sidebar-mode, commit a64180f, run as dev desktop (bun run dev:desktop), tested 2026-11-01 Mode: Side bar (Settings → Preferences → Interface → Side bar); also switched through Top tabs, Side tabs and Inbox for comparison

What works (expected = actual):

Project grouping in the history: groups are correct, my several projects render as separate groups.
Running shelf: running and approval-waiting sessions that are not in open tabs appear on their own shelf and stay visible regardless of grouping — exactly as described in the call for tests.
Switching between all four interface modes: no breakage observed.
List / By project toggle and More / Show less: work as expected.
Child sessions, close/hide followed by Home/search reopen, and saved ordering after a reload: no issues observed with my sessions.
Gap found (expected != actual):

Expected: collapsible project groups, like the Inbox mode's collapsible sections, with the collapsed state persisted across reloads.
Actual: each group shows a fixed five rows (PROJECT_SESSION_LIMIT) plus a "More / Show less" control; there is no way to collapse a group to its header, and the expanded state does not survive a reload.
Repro: enable Side bar with two or more projects having more than five sessions each; click a group header — no collapse control exists; reload the app — previously expanded groups fall back to five rows.
Feature request (why it matters):

I run 7-8 completely different projects/products in parallel. With five visible sessions per group, the Side bar becomes a wall of 35-40 rows and I cannot pick the project I need at a glance. Collapsing a group to its header (persisted across reloads) would make this mode a true daily driver for multi-project work. Not a blocker for me — offered as evolution.

Overall: the mode is already useful as is; I am moving my daily workflow onto this build. Happy to retest on Windows x64 after updates.

@joe-ieta

joe-ieta commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

@rahbi4-source thanks for all ! now collapsible project groups available.

@rahbi4-source

Copy link
Copy Markdown

Hi!
Follow-up on the new commits, same setup as my first review (Windows 11 Pro, version 25H2, build 26200.9711; dev desktop from source), now at b88b94a:

Collapsible project groups: works, thank you! Collapsing a group to its header via the chevron is exactly what I asked for, and it makes my 7-8 project setup navigable again.
One discoverability gap remains, and it is sharper than it first looks. A collapsed group's header shows no indicator when the group contains an unread or reply-waiting session. While the agent is still running or awaiting approval, the Running shelf points at it; but once the agent finishes and the session idles waiting for my reply, the shelf drops it — and with all groups collapsed nothing anywhere shows where I am owed: every header looks identical to a fully idle group. Repro: let a session in a non-current project finish its turn, then collapse every group; no header and no shelf entry marks the session that waits for a reply.
Suggestion, with pointers from sidebar-sessions.tsx: the per-tab unread store already exists (line ~471); aggregate it into a dot/badge on the collapsed header. Also, setSidebarUnread (line ~654) is computed from displayedTabs(), which excludes collapsed groups, so the closed sidebar's toggle misses them too — including collapsed rows there would fix both places at once. Collapsed groups currently render zero rows (line ~633), so nothing feeds either indicator today. Alternatively, treating "agent finished, user reply owed" as a shelf-worthy state would restore discoverability without touching the headers.
With that indicator in place, this mode is my daily driver without caveats. Happy to retest on Windows x64 after the next push.

@joe-ieta

joe-ieta commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

@rahbi4-source Thanks again! You may take a look at the new release.
I'll also closely consider #61296—before this PR is merged, it's probably best not to stray too far from upstream. Any suggestions are welcome!

@rahbi4-source

Copy link
Copy Markdown

Follow-up on the new commits, same setup as my first review (Windows 11 Pro, version 25H2, build 26200.9711; dev desktop from source), now at b88b94a:

Collapsible project groups: works, thank you! Collapsing a group to its header via the chevron is exactly what I asked for, and it makes my 7-8 project setup navigable again.
One discoverability gap remains, and it is sharper than it first looks. A collapsed group's header shows no indicator when the group contains an unread or reply-waiting session. While the agent is still running or awaiting approval, the Running shelf points at it; but once the agent finishes and the session idles waiting for my reply, the shelf drops it — and with all groups collapsed nothing anywhere shows where I am owed: every header looks identical to a fully idle group. Repro: let a session in a non-current project finish its turn, then collapse every group; no header and no shelf entry marks the session that waits for a reply.
Suggestion, with pointers from sidebar-sessions.tsx: the per-tab unread store already exists (line ~471); aggregate it into a dot/badge on the collapsed header. Also, setSidebarUnread (line ~654) is computed from displayedTabs(), which excludes collapsed groups, so the closed sidebar's toggle misses them too — including collapsed rows there would fix both places at once. Collapsed groups currently render zero rows (line ~633), so nothing feeds either indicator today. Alternatively, treating "agent finished, user reply owed" as a shelf-worthy state would restore discoverability without touching the headers.
With that indicator in place, this mode is my daily driver without caveats. Happy to retest on Windows x64 after the next push.

@joe-ieta

joe-ieta commented Nov 3, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the follow-up! The report references b88b94a75d; the collapsed-group unread-indicator fix is included in the current PR head, 703db47378. Could you please update to that commit or newer and check again?

@rahbi4-source

Copy link
Copy Markdown

Hi!
Retest done at the current PR head 703db47 (same setup as before: Windows 11 Pro, version 25H2, build 26200.9711; dev desktop from source), answering your question from Nov 3:

Collapsed-group indicator: fixed. A collapsed group that contains an unread or reply-waiting session now shows an indicator on its header.
Closed-sidebar toggle: fixed as well — it lights up when waiting work hides inside collapsed groups.
Regression found: the Running shelf no longer lists running sessions. On b88b94a the shelf showed running and approval-waiting sessions across projects; at 703db47 the shelf stays empty while a session is actively running. Repro: start any session (open tab or not) and watch the shelf — no entry appears. Pointer: active-sessions.tsx changed in this range (+30/-5): the source list became [...session.active(), ...shell.activeSessions()], and the running duration now derives from time.busy plus background-shell start times; something in that refactor (or the status hoisting in sidebar-sessions.tsx) seems to drop plain running sessions from the shelf.
Everything else held up: collapsed state survives reloads, the other interface modes are unaffected.
On #61296, since you asked for suggestions: as the user who moved his daily workflow onto this mode, I'd rather see this PR merge on its own merits (once the shelf is back) than be held hostage to the plugin-replacement question. A GUI-plugin extension point for the left navigation is a fine long-term track and can coexist with a good native default; my 7-8 project setup is exactly the case where the native grouped default already wins.

Happy to retest the shelf fix on Windows x64 whenever you push.

joe-ieta and others added 4 commits November 5, 2026 22:03
Always group Side bar sessions by project and label the section Projects. Share project menus and folder selection with Home, support closing and reopening projects, and expose session export.

Register new draft tabs before asynchronous navigation so cold page loads cannot skip persistence. Adapt the useful project-management ideas from PR #2 to the current Home implementation.

Co-authored-by: Francesco Boes <[email protected]>
(cherry picked from commit ca61e33)
@joe-ieta
joe-ieta marked this pull request as ready for review November 9, 2026 03:12
@joe-ieta

joe-ieta commented Nov 9, 2026

Copy link
Copy Markdown
Contributor Author

Side bar now uses a single Projects view with Home’s project menus and an Add project button. Closing a project preserves its drafts and keeps active sessions visible in Running. The update merges cleanly with dev@adb0053d09, and all 101 Chromium regressions passed without retries.

@opencodejr opencodejr Bot closed this Nov 9, 2026
@opencodejr

opencodejr Bot commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

Thanks for all the work on this, @joe-ieta, and for the detailed write-up and screenshots!

This PR has about 2,400 changed lines outside tests across 37 files, which is too large to review well in one go. Besides the new Side bar mode, it changes code that other parts of the app use: the shared session index, the server runtime and registry, Home's project menu, and the Inbox and tab components. Could you split it into smaller pull requests that each do one thing and can be reviewed on their own? For example:

  • Shared session index: the 500-root-session limit and live updates in home/sessions/queries.ts and packages/client/src/solid/data.ts, with their tests.
  • Shared project actions: moving Home's project menu and actions (edit, open/import sessions, copy path, close) into reusable code, with no visible change.
  • Running sessions list: active-sessions.tsx and the runtime/registry support it needs to list active sessions and background shells across servers.
  • Side bar mode: the new Interface option and sidebar-mode.tsx, built on the pieces above, with its e2e tests.

It may also help to settle the design in #60241 before the final part, since it is still waiting for maintainer design review. You're welcome to open these as separate pull requests.

@joe-ieta

joe-ieta commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor Author

Split on current upstream dev (12a661ea40), with the design updated in #60241:

  1. Shared session index: refactor(app): share the bounded session index #62845.
  2. Shared project actions: refactor(app): share Home project actions and menus #62850, independent extraction.
  3. Running list: feat(app): add a reusable running sessions list #62851, independent, unmounted component and client tests.
  4. Side bar interface only: isolated under shell/sidebar/; its PR will follow 1–3 and design approval.

Parts 1–3 are ready for independent review. Following review, #62845 is now a pure module move; inventory support is deferred to its actual consumer. No fork release changes are included. Combined validation passed 33 check tasks, 96 unit tests and 102 Chromium regressions; the first three parts were also checked independently. This oversized PR remains closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants