Three behavior fixes from user feedback after the parity pass landed. R1 — Non-git project headers were missing in grouped Sessions while their child rows still rendered. Sessions had inherited the workspace tree's isSidebarProjectFlattened branch, but only half of it: the header was suppressed and the children continued. Sessions doesn't share the workspace tree's flatten semantics — workspaces flatten because "1 workspace = the project IS the workspace, no children to expand"; in Sessions, even a single-workspace non-git project can still have multiple agents worth grouping. Drop the flatten branch from Sessions entirely. SidebarSessionGroup loses isFlattened. Workspace tree's FlattenedProjectRow stays untouched. R2 — The agent kebab had Close + Archive. Sessions agent rows aren't tabs; there's no open tab to close. Drop Close and the orphan chain that came with it (workspace-tab menu imports, session store reach, confirm dialog wiring, resolveSidebarSessionWorkspaceId, etc.). The menu is now Archive-only; useArchiveAgent is the only handler. R3 — Each project header in grouped Sessions now renders a "+" that opens the new-workspace flow scoped to that project's directory. The shared SidebarProjectTrailingActions is the home — Sessions wires its own createButton config (Plus icon, "New session", route via buildHostNewWorkspaceRoute(serverId, sourceDirectory, headerTitle)). R4 — Meta-audit on the shared sidebar/* abstractions found two depth issues that let R1 and R3 silently slip through: 1. SidebarProjectHeaderRow was a chrome primitive. Consumers could render children without rendering a header (R1 bug). Added SidebarProjectSection — an opinionated wrapper that owns "header + children/footer when expanded" so the silent failure mode no longer compiles. Both consumers refactored. 2. SidebarProjectTrailingActions had showNewWorktreeButton: boolean defaulting false. Sessions silently lost the affordance with no warning (R3 bug). Replaced the boolean with a required createButton prop (literal null to opt out). Each consumer must say what it wants — no default suppression. Surfaced for future iterations (not fixed here): hand-wired hover state in both consumers, chevron native visibility, missing project/agent selection state in Sessions, zero-agent-project filter divergence. Tests cover the new wrapper, the trailing-actions API change, the header-always-renders behavior, and the per-project + button navigation. Workspace tree behavior unchanged.
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.