Skip to content

feat(sidebar): sync pinned thread order - #5528

Open
f-trycua wants to merge 7 commits into
pingdotgg:mainfrom
trycua:agent/reorder-pinned-threads
Open

feat(sidebar): sync pinned thread order#5528
f-trycua wants to merge 7 commits into
pingdotgg:mainfrom
trycua:agent/reorder-pinned-threads

Conversation

@f-trycua

@f-trycua f-trycua commented Aug 6, 2026

Copy link
Copy Markdown

Pinned threads are global, but their order was fixed by creation time. This adds manual ordering that is stored by the server and follows the user across connected clients.

What changed

  • add a version-skew-safe thread.pin.reorder command and thread.pin-reordered event
  • persist an exact rational order so moving one thread only updates that thread
  • add drag handles and keyboard drag support on web/desktop
  • add Move up / Move down actions on web and mobile
  • keep legacy clients and servers working through optional fields and a separate capability flag
  • document the sidebar behavior and cover contracts, ordering, projections, persistence, web logic, and mobile rendering with focused tests

Screenshots

Before After
Pinned threads before manual ordering Pinned threads after manual ordering

The integrated browser pass moved “Review API changes” from third to first with the keyboard-accessible drag control, confirmed that only the moved thread received a persisted order, and verified the same order after a full reload.

Verification

  • 254 focused tests across 11 files
  • focused typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed files
  • Cua Driver pass in standalone Chrome against isolated synthetic state

Related to #698.

Built with GPT-5 Codex in the Codex desktop harness.


Note

Medium Risk
Cross-cutting orchestration, persistence, and multi-client ordering with multi-thread compaction sequences; rollback limits transient inconsistency if a request fails mid-compaction.

Overview
Pinned threads can now be manually ordered and that order is stored on the server so it syncs across connected clients, instead of being fixed by creation time.

The stack adds PinnedThreadOrder (bounded rational strings), thread.pin.reorder / thread.pin-reordered, a pinned_order DB column (migration 037), and a separate threadPinReordering capability so older pinning servers are not sent reorder commands. Pinned lists use sortPinnedThreads with creation-time fallback when no order exists; moves usually update one thread via a mediant between neighbors, with full-list compaction when gaps are exhausted.

Web gets dnd-kit drag handles on pinned rows, context-menu move up/down, optimistic pending orders, and rollback on failure. Mobile (home + thread sidebar) exposes Move up / Move down in row menus with the same sequential apply/rollback pattern; reorder is disabled when the full pinned set is not visible (filters/shelves). User docs cover organizing threads in the sidebar.

Reviewed by Cursor Bugbot for commit 70e50e6. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add synced pinned thread reordering via drag-and-drop and context menu

  • Introduces a PinnedThreadOrder rational number type (e.g. 3/7) stored on threads to represent manual sort position; threads without an order fall back to creation-time ordering via a stable FNV-1a hash.
  • Adds a thread.pin.reorder command and thread.pin-reordered event through the full stack: contracts, server decider/projector, DB migration (037_ProjectionThreadsPinnedOrder), snapshot queries, and client-runtime reducer.
  • Web sidebar (SidebarV2.tsx) gains drag-and-drop (via DnD Kit) and context-menu move-up/down actions for pinned threads with optimistic updates and rollback on failure.
  • Mobile (ThreadNavigationSidebar.tsx and HomeScreen.tsx) gains move-up/down overflow menu actions on pinned rows with the same optimistic/rollback pattern.
  • Reordering is gated on a new threadPinReordering server capability; mixed-capability environments (e.g. older servers) show an alert/toast instead of partially applying changes.
  • Risk: compaction (full renumber of all pinned threads) is triggered automatically when no valid mediant rational exists between two neighbors, issuing one server call per pinned thread.

Macroscope summarized 70e50e6.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b31015a2-1e13-476b-a6aa-12e5f3b7423e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 6, 2026

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the new web reorder path reuses ThreadPinningUnsupportedError, whose caller-visible message describes pinning rather than pin reordering. Everything else (namespace subpath imports in the new migration, decider/projector event handling, contracts schema additions) follows the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/web/src/hooks/useThreadActions.ts Outdated
@f-trycua
f-trycua marked this pull request as ready for review August 6, 2026 14:36
Comment thread packages/client-runtime/src/state/threadSort.ts
Comment thread apps/server/src/orchestration/projector.ts
Comment thread apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx
Comment thread apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx
Comment thread apps/server/src/orchestration/projector.ts Outdated
@macroscopeapp

macroscopeapp Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR introduces a substantial new feature (synced pinned thread ordering) with new database schema, API commands/events, and cross-platform UI changes. Additionally, there is an unresolved high-severity review comment identifying a potential bug in legacy server handling that requires attention.

You can customize Macroscope's approvability policy. Learn more.

Comment thread packages/client-runtime/src/state/threadSort.ts
Comment thread apps/mobile/src/features/home/HomeScreen.tsx
Comment thread apps/mobile/src/features/home/HomeScreen.tsx
Comment thread apps/web/src/components/SidebarV2.tsx Outdated
@github-actions github-actions Bot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 6, 2026
Comment thread apps/mobile/src/features/home/HomeScreen.tsx

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

There are 3 total unresolved issues (including 2 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5869138. Configure here.

Comment thread apps/mobile/src/features/home/HomeScreen.tsx Outdated
Comment thread apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant