Refine archive management UX across web and mobile - #3552
Conversation
- Group archived threads by project with collapsible sections - Add sortable archived/created columns and inline row actions - Support direct delete and bulk project actions with confirmation
|
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 Plus 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 |
ApprovabilityVerdict: Needs human review This PR introduces significant new archive management features including search ranking, bulk project actions, and collision-safe action locking across web and mobile surfaces. New user-facing capabilities of this scope warrant human review. You can customize Macroscope's approvability policy. Learn more. |
- Replace inline project-level unarchive/delete buttons with a right-click menu - Keep the existing confirmation flow for bulk archived-thread actions
- Add case-insensitive search across archived thread titles - Rank exact phrase, full-term, and partial matches; auto-expand matching projects - Update archive empty states and preserve project actions under search
- Use filtered archive rows for project actions during search
- Use the full project archive list for bulk context actions - Keep search filtering from narrowing project-wide confirmations
- Limit project archive actions to filtered visible threads - Add archive search ranking tests
Selective archive-settings portion of main commit 1c6f66b. Keeps the branch-local extracted search-ranking helper and tests while preserving the project header interaction cleanup.
- Move archived search and grouping into logic helpers - Share bulk action and sort helpers with the panel - Add tests for grouping, sorting, and bulk action concurrency
- Wait for active bulk-action workers before rethrowing - Assert archived project bulk actions cover queued threads
- Aggregate archived bulk action errors - Index archived threads by project - Strengthen archived settings logic tests
- Skip local dialog confirmation when no local API is available
- Encode environment and project ids as tuple keys - Cover colon-containing ids in archive grouping tests
…chive-settings-ux
…chive-settings-ux
…chive-settings-ux
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c281ad8. Configure here.
- Use the oldest project thread timestamp for ascending sorts - Cover overlapping project date ranges in the mobile archive suite
- Compute project sort extrema in one pass for large archives - Preserve oldest-first and newest-first section ordering
…chive-settings-ux
…chive-settings-ux
- Keep alias metadata limited to values consumed by the stack - Clarify where the legacy alias screen binding is owned
…chive-settings-ux
…ngs-ux # Conflicts: # apps/web/src/components/settings/SettingsPanels.logic.test.ts # apps/web/src/components/settings/SettingsPanels.logic.ts # apps/web/src/components/settings/SettingsPanels.tsx
|
Closing in favor of #2829 (orchestration V2). #2829 deletes the V1 orchestration layer this PR builds on — This is not a judgement on the change itself. Several of these are real gaps we still want fixed; the base just moved out from under them. Once #2829 merges, please rebase onto |
|
Re-opening this. The relation to the #2829 work is tangential. the behavior implemented here is entirely unrelated. The branch is routinely kept up-to-date with Together with #4016 and #4384, this provides real value right now that should not by itself be held up by orchestration v2. |

Summary
This replaces the flat Archive settings list with a compact project-grouped browser on web and brings the same information hierarchy and management capabilities to the native Archived Threads screen. Archived conversations can be searched by ranked title matches, sorted by archived or created time, and expanded or collapsed by project.
Both surfaces load archive snapshots for every configured environment and expose scoped per-thread and project-level unarchive/delete actions. Destructive actions preserve each platform's guarded delete behavior, filtered bulk actions affect only matching rows, and bulk execution is bounded and failure-aware.
Native Settings exposes Archived Threads consistently in local-only and T3 Connect-configured modes through a shared settings-tail and route contract, while retaining the legacy waitlist deep-link alias as a distinct sign-in route.
What Changed
ArchiveSettings.tsxand wired the archived settings route directly to the dedicated panel.General,Appearance,Beta,Archive, andAppsettings tail plus archive and legacy waitlist route metadata in a tested contract, preserving the same order and Archive entry in both local-only and configured modes.confirmThreadDeleteon web and native confirmation flows on mobile.forcebefore deletion.BRANCH_DETAILS.md.Why
The previous archive views became difficult to scan and manage for users with large archives, and web and mobile exposed different levels of control. A shared dense hierarchy, consistent search and sort behavior, and actions close to each project or conversation make archive maintenance faster while preserving environment isolation and platform-native interaction patterns.
Validation
pnpm exec vp test run apps/web/src/components/settings/SettingsPanels.logic.test.ts apps/web/src/hooks/useThreadActions.test.ts apps/mobile/src/features/archive/archivedThreadList.test.ts apps/mobile/src/features/home/useThreadListActions.test.tspassed with 4 files and 49 tests.git diff --checkpassed.git diff --checkalso passed.Unarchiveaction; executing it moved the selected row to the live thread list while leaving the other row archived. The simulator was also exposed through the requested serve-sim collaborative browser stream.encodingFailed), so native verification used XcodeBuildMCP semantic UI snapshots and screenshots instead.Proof
Note
Medium Risk
Large UI and state-management change across web and mobile thread lifecycle (unarchive/delete/bulk) with concurrency and snapshot refresh; mistakes could cause duplicate mutations or stale archive views, but behavior is heavily tested and confirmations/guards are preserved.
Overview
Replaces the flat web Archive list with a dense, project-grouped browser in
ArchiveSettings.tsxand aligns native Archived Threads with the same hierarchy: collapsed project sections, ranked title search, sortable Archived / Created columns, environment labels, and per-row unarchive/delete (web hover overlay; native swipe and long-press).Archive data and logic now pull snapshots from all configured environments, exclude non-archived rows from grouping and empty states, fall back to created time when archive timestamps are invalid, and use collision-safe scoped keys for expansion, list identity, and action locks. Search ranking (phrase → all tokens → partial) and sort/group behavior live in
SettingsPanels.logic.tsandarchivedThreadList.tswith expanded tests.Bulk and concurrency: project menus unarchive or delete all or matching rows (search-scoped labels and confirmations; web respects
confirmThreadDelete). Row and bulk actions reserve threads before confirm, show busy only after work starts, reject overlapping duplicates, run bulk work with bounded concurrency and structured partial-failure feedback, and refresh archive snapshots once after bulk attempts. Native thread actions return succeeded / failed / skipped; settings tail and archive route metadata are centralized insettingsContract.ts(legacy waitlist alias unchanged).Docs and server: Archive user guide, encyclopedia entry, and index link; regression that projects with only archived threads still require
forceto delete.Reviewed by Cursor Bugbot for commit 3d969ba. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Refine archived threads UX with search, sorting, bulk actions, and concurrency guards across web and mobile
archivedThreadSearchScore) that scores thread titles by phrase match, all-token match, and partial-token match; non-matching threads are excluded during searchcreatedAt/archivedAt, asc/desc) withnextArchivedThreadSortStateandcompareArchivedThreads; groups reorder based on search score or per-group extremal timestampstryAcquireArchivedThreadActionLock/releaseArchivedThreadActionLock) to prevent concurrent unarchive/delete operations on the same threads, with busy/reserved visual states in both web and mobile UIsrunArchivedThreadActions/runArchivedProjectThreadActionsfor bounded-concurrency bulk actions with structured outcome summaries (ArchivedProjectBulkActionError/ArchivedThreadActionError) and human-readable failure descriptionsFlatList, collapsible project groups, context menus per thread and project, and dual timestamp display; replaces the oldArchivedThreadsPanelon web with a new implementation in ArchiveSettings.tsxuseArchivedThreadListActionsto return a tri-statesucceeded/failed/skippedresult with optional Alert and refresh suppressionArchivedThreadsPanelexport is removed from SettingsPanels.tsx; any consumer still importing it will fail at build timeMacroscope summarized 3d969ba.