Refactor web stores into atomic slices ready to split ChatView#1708
Refactor web stores into atomic slices ready to split ChatView#1708juliusmarminge merged 19 commits intopingdotgg:mainfrom
Conversation
|
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 |
ApprovabilityVerdict: Needs human review Major refactor of web store architecture from array-based to normalized/atomic slices, restructuring core state management infrastructure across multiple files. The scope and criticality of these internal data structure changes warrant human review to ensure the migration is complete and correct. You can customize Macroscope's approvability policy. Learn more. |
|
fixed CI issues, should now pass :) |
…melegs/t3code into web/atomic-store-refactor
…melegs/t3code into web/atomic-store-refactor
…melegs/t3code into web/atomic-store-refactor
…melegs/t3code into web/atomic-store-refactor
…melegs/t3code into web/atomic-store-refactor
…melegs/t3code into web/atomic-store-refactor
juliusmarminge
left a comment
There was a problem hiding this comment.
Got #1765 stacked on top of this so will merge it as a stack when that one's ready!
…threadId (#2) * Raise slow RPC ack warning threshold to 15s (pingdotgg#1760) * Use active worktree path for workspace saves (pingdotgg#1762) * Stream git status updates over WebSocket (pingdotgg#1763) Co-authored-by: codex <codex@users.noreply.github.com> * fix(web): unwrap windows shell command wrappers (pingdotgg#1719) * Rename "Chat" to "Build" in interaction mode toggle (pingdotgg#1769) Co-authored-by: Julius Marminge <julius0216@outlook.com> * Assign default capabilities to Codex custom models (pingdotgg#1793) * Add project rename support in the sidebar (pingdotgg#1798) * Support multi-select pending user inputs (pingdotgg#1797) * Add Zed support to Open actions via editor command aliases (pingdotgg#1303) Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> * Closes pingdotgg#1795 - Support building and developing in a devcontainer (pingdotgg#1791) * Add explicit timeouts to CI and release workflows (pingdotgg#1825) * fix(web): distinguish singular/plural in pending action submit label (pingdotgg#1826) * Refactor web stores into atomic slices ready to split ChatView (pingdotgg#1708) * Add VSCode Insiders and VSCodium icons (pingdotgg#1847) * Prepare datamodel for multi-environment (pingdotgg#1765) Co-authored-by: justsomelegs <145564979+justsomelegs@users.noreply.github.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com> * Implement server auth bootstrap and pairing flow (pingdotgg#1768) Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Julius Marminge <julius@macmini.local> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com> * Use dev proxy for loopback auth and environment requests (pingdotgg#1853) * Refresh local git status on turn completion (pingdotgg#1821) Co-authored-by: codex <codex@users.noreply.github.com> * fix(desktop): add Copy Link action for chat links (pingdotgg#1835) * fix: map runtime modes to correct permission levels (pingdotgg#1587) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com> * Fix persisted composer image hydration typo (pingdotgg#1831) * Clarify environment and workspace picker labels (pingdotgg#1854) * Scope git toast state by thread ref (pingdotgg#1855) * fix build (pingdotgg#1859) * Stabilize keybindings toast stream setup (pingdotgg#1860) Co-authored-by: Julius Marminge <julius@macmini.local> * feat(web): add embeddable thread route for canvas tile hosts Adds /embed/thread/:environmentId/:threadId — a standalone route that renders the existing ChatView without the app sidebar chrome. This is the iframe target for t3-canvas agent shapes (see rororowyourboat/t3-canvas#3). - New file-based route embed.thread.\$environmentId.\$threadId.tsx - __root.tsx bypasses AppSidebarLayout for any /embed/* pathname so the environment connection + websocket surface + toasts still initialize but the sidebar/diff/plan chrome does not render - minimal=1 search param is parsed and wired to a data attribute on the container for future targeted CSS; chrome hiding (BranchToolbar, PlanSidebar, ThreadTerminalDrawer) stays as a follow-up pass - routeTree.gen.ts regenerated by the @tanstack/router-plugin --------- Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: legs <145564979+justsomelegs@users.noreply.github.com> Co-authored-by: sonder <168988030+heysonder@users.noreply.github.com> Co-authored-by: Adem Ben Abdallah <96244394+AdemBenAbdallah@users.noreply.github.com> Co-authored-by: Kyle Gottfried <6462596+Spitfire1900@users.noreply.github.com> Co-authored-by: Jacob <589761+jvzijp@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <julius@macmini.local> Co-authored-by: Klemencina <56873773+Klemencina@users.noreply.github.com> Co-authored-by: Oskar Sekutowicz <me.oski646@gmail.com> Co-authored-by: Noxire <59626436+noxire-dev@users.noreply.github.com>
What Changed
Refactored the web orchestration store from broad array-based state into a more atomic normalized shape.
Main changes:
projects[]/threads[]as the primary store shape with keyed records and id listsOld Pattern
New Pattern
Why
The old store shape forced many consumers to read broad collections and then search inside them. That made fine-grained subscriptions hard and set us up for unnecessary rerenders once we start breaking large components into smaller ones.
This change establishes the state model we actually want to build on:
Sidebar,ChatView, and other hot UI pathsKeeping this as a store-shape-first PR also keeps the follow-up performance work simpler. Future PRs can focus on splitting components and wiring each subcomponent to only the exact slice it needs.
Checklist
Note
Refactor web store state from arrays to normalized entity maps for projects and threads
projects: Project[]andthreads: Thread[]inAppStatewith normalized maps (projectById,threadShellById,threadSessionById,threadTurnStateById) and id arrays, splitting thread data into immutable shell and volatile turn state slices.selectProjects,selectThreads,createThreadSelector,createProjectSelector, andcreateSidebarThreadSummarySelectorto derive denormalized objects from the new normalized state;createThreadSelectormemoizes by reference equality to avoid unnecessary re-renders.ChatView,BranchToolbar,DiffPanel,Sidebar,GitActionsControl, etc.) and hooks to use selectors or direct map lookups instead of array scans.syncServerReadModelandapplyOrchestrationEventin store.ts to write into normalized slices via newwriteThreadState/removeThreadState/buildThreadStatehelpers.state.projects,state.threads, orstate.sidebarThreadsByIdfields will break; all in-tree callers have been migrated to selectors.Macroscope summarized 025d832.