Adds a group-by-project toggle to the Sessions header. When ON, the flat session list becomes a grouped list — one section per project, preview-capped at 6 agents per project with "Show N more" / "Show less" controls per group. When OFF, the flat list stays as before. Architecture preserves the Phase 7b perf model: - Controller (useSidebarSessionsController) owns groupByProject and expandedProjects state. Expansion resets on grouping-off, host change, and filter change. Group-by persists across hosts as a UI preference. - A new useOrderedAgentProjectShape selector reactively subscribes to per-agent cwd via useStoreWithEqualityFn(..., shallow). When project assignments don't change, the array reference stays stable; when an agent's project changes, the parent re-derives groups. Shape objects are reused across renders when project fields are unchanged. - deriveGroupedSidebarSessions takes the resolved shape directly (no callback indirection) and returns ordered groups with visible/hidden ids based on per-project expansion state. - Header and Footer components are React.memo'd with primitive props only, so they don't re-render on irrelevant agent updates. Per-row status indicators continue to subscribe via the shared tab descriptor path, isolated from parent renders. - Project ordering: first-occurrence in the createdAt-desc id list, matching the user's mental model of "most-recent project first" and avoiding a per-render activity-timestamp computation. Visual primitive shared between the workspace tree project row and the new Sessions group header (packages/app/src/components/sidebar/ sidebar-project-row-visual.tsx) — no two systems for project visuals. The workspace tree wraps it with its own chevron/status; the Sessions header uses it bare. Tests added: state-machine cases on the controller, pure-helper coverage on grouping derivation, render-boundary stability for grouped data references across irrelevant updates and reactivity on project changes, and a footer click test.
Welcome to your Expo app 👋
This is an Expo project created with create-expo-app.
Get started
-
Install dependencies
npm install -
Start the app
npx expo start
In the output, you'll find options to open the app in a
- development build
- Android emulator
- iOS simulator
- Expo Go, a limited sandbox for trying out app development with Expo
You can start developing by editing the files inside the app directory. This project uses file-based routing.
Get a fresh project
When you're ready, run:
npm run reset-project
This command will move the starter code to the app-example directory and create a blank app directory where you can start developing.
Learn more
To learn more about developing your project with Expo, look at the following resources:
- Expo documentation: Learn fundamentals, or go into advanced topics with our guides.
- Learn Expo tutorial: Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web.
Join the community
Join our community of developers creating universal apps.
- Expo on GitHub: View our open source platform and contribute.
- Discord community: Chat with Expo users and ask questions.
Dictation debugging
Set EXPO_PUBLIC_ENABLE_AUDIO_DEBUG=1 before running npx expo start to render the in-app audio debug card. Pair it with the server-side STT_DEBUG_AUDIO_DIR flag so every dictation includes a copyable path to the saved raw audio file.