Add a collapse-idle action to the sidebar#1210
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1831722e98
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
faa7eed to
b3123eb
Compare
|
nice touch , hope they merge |
8a5469e to
3480f72
Compare
5d423b7 to
4a13273
Compare
| runningTerminalThreadIds, | ||
| }), | ||
| [activeProjectId, runningTerminalThreadIds, threadStatusById, threads], | ||
| ); |
There was a problem hiding this comment.
Idle detection considers archived threads the sidebar hides
Medium Severity
The nonIdleProjectIds computation (along with threadStatusById and runningTerminalThreadIds) iterates over threads, which includes archived threads. The rest of the sidebar uses visibleThreads (filtered by archivedAt === null). An archived thread with a stale session status like "Working" would mark its project as non-idle, preventing collapse even though no visible activity exists for that project.
Additional Locations (2)
| [toggleProject], | ||
| ); | ||
|
|
||
| const handleCollapseIdleProjects = useCallback(() => { |
There was a problem hiding this comment.
🔴 Critical components/Sidebar.tsx:1846
In handleCollapseIdleProjects, the loop iterates over projects from useStore, but that array contains raw Project objects without an expanded property. Since project.expanded is always undefined, the condition !project.expanded is always true, so the function calls continue for every project and never collapses anything. The loop should iterate over sidebarProjects (which has the expanded snapshot) or check projectExpandedById[project.id] directly.
🤖 Copy this AI Prompt to have your agent fix this:
In file apps/web/src/components/Sidebar.tsx around line 1846:
In `handleCollapseIdleProjects`, the loop iterates over `projects` from `useStore`, but that array contains raw `Project` objects without an `expanded` property. Since `project.expanded` is always `undefined`, the condition `!project.expanded` is always `true`, so the function calls `continue` for every project and never collapses anything. The loop should iterate over `sidebarProjects` (which has the `expanded` snapshot) or check `projectExpandedById[project.id]` directly.
Evidence trail:
- apps/web/src/components/Sidebar.tsx:441 - `projects` from `useStore((store) => store.projects)`
- apps/web/src/types.ts:81-89 - `Project` interface has no `expanded` property
- apps/web/src/components/Sidebar.tsx:168-170 - `SidebarProjectSnapshot = Project & { expanded: boolean }`
- apps/web/src/components/Sidebar.tsx:514-520 - `sidebarProjects` adds `expanded` property from `projectExpandedById`
- apps/web/src/components/Sidebar.tsx:1846-1852 - `handleCollapseIdleProjects` iterates over `projects` and checks `!project.expanded`
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 2 total unresolved issues (including 1 from previous review).
Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
| } | ||
| setProjectExpanded(project.id, false); | ||
| } | ||
| }, [projects, nonIdleProjectIds, setProjectExpanded]); |
There was a problem hiding this comment.
Wrong variable makes collapse button a no-op
High Severity
handleCollapseIdleProjects iterates over projects (raw Project[] from the store) which lacks an expanded property. Since project.expanded is always undefined, !project.expanded is always true, the continue always executes, and setProjectExpanded is never called. The button does nothing. The code needs to iterate over sidebarProjects instead, which is Project & { expanded: boolean }.



What Changed
Collapse idle projectsaction to the sidebar header.Why
The sidebar can accumulate a lot of expanded projects during normal use. This adds a one-click cleanup path without collapsing the project you are currently in or other projects that still have visible thread activity.
UI Changes
Video:
screenrecording-2026-03-19_16-33-08.mp4
Sorry that the mouse cursor is not visible in the recording.
Screenshot:
Added this tiny icon. Open for suggestions on a more fitting icon.
Checklist
Note
Add a 'Collapse idle projects' button to the sidebar
Adds a
FoldVerticalIconbutton to the Projects section header in the sidebar. Clicking it collapses all expanded projects that have no running terminals and no active thread status, while keeping the currently active project and any projects with activity expanded. The logic is extracted into acollectSidebarNonIdleProjectIdsutility in Sidebar.logic.ts with corresponding tests in Sidebar.logic.test.ts.📊 Macroscope summarized 7c33165. 3 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted
🗂️ Filtered Issues
Note
Low Risk
Low risk UI change that adds a new sidebar action and supporting helper logic; main risk is minor behavioral/performance regressions in how project “activity” is detected for collapsing.
Overview
Adds a “Collapse idle projects” button to the sidebar Projects header that collapses currently-expanded projects that have no active signal.
Introduces
collectSidebarNonIdleProjectIds(with tests) and sidebar wiring to keep the active project, projects with non-null thread status pills, or projects with running terminal threads from being collapsed; includes minor header spacing tweaks and a newFoldVerticalIcontooltip button.Written by Cursor Bugbot for commit 7a62228. This will update automatically on new commits. Configure here.