Rolls up three follow-ups on the sidebar Workspaces/Sessions toggle: Design revamp (Notion-style toggle, History at top): - Toggle pills both carry icons (Folders/MessagesSquare); only the active pill shows its label, with LinearTransition + FadeIn/FadeOut. - Filter trigger now uses lucide ListFilter; History row uses lucide History (clock); History row moved to the top of the sidebar. - Session row content trimmed to icon + name + timestamp (no cwd path); padding/spacing/type ramp matches the existing Workspaces tree rows so the icon and text columns align across History row, toggle pills, and list rows at the canonical 16px column. - Filter dropdown uses sentence-case section labels (Workspace/ Project) and renders project icons (no text-letter fallbacks). - testID rename: sidebar-sessions -> sidebar-history (the navigation row); new toggle pills get sidebar-toggle-workspaces / sidebar-toggle-sessions. Updated callers in helpers and maestro. - No bold or font-weight changes; no uppercase anywhere. Branch names in workspace filter: - The dropdown's Workspaces section was rendering the unhydrated structural workspace.name (often a path-like id) because the selector chain skipped the rehydration step the main sidebar row uses. The hook now reuses createSidebarWorkspaceEntry so the label comes from the same descriptor path WorkspaceRow uses, matching what the user sees in the main sidebar. Splash screen timeout for env-var local daemon: - The 5s give-up timer in _layout.tsx had an explicit early-return exempting waitForConfiguredLocalDaemon, leaving the splash hung forever when EXPO_PUBLIC_LOCAL_DAEMON pointed at an offline daemon. Removed the exemption so the timer applies; the runtime override loop continues retrying in the background and welcome auto-redirects when any host comes online.
Maestro Flows
This directory contains local mobile UI flows. Keep flows small enough that a failure screenshot proves the intended behavior, not just that the app launched.
New Workspace Android Flow
Use these files when debugging or extending workspace creation on Android:
test-workspace-create-android-crash.shruns the full regression harness.workspace-create-android-crash.yamlis the full Maestro flow used by the harness.record-workspace-create-android-focus.shrecords only the focused repro window after setup.workspace-create-android-ready-sidebar.yamlstages the app with the Android sidebar open and a prepared project visible.workspace-create-android-create-focused.yamlstarts from that staged sidebar and performs the actual workspace creation.
The reusable pieces live in flows/:
flows/android-dev-client.yamlhandles Expo dev launcher/dev menu screens.flows/connect-direct-if-welcome.yamlconnects to the local daemon only when the welcome screen is visible.flows/open-prepared-project-sidebar.yamlwaits for the home screen, opens the compact Android sidebar, and waits for the prepared project.flows/new-workspace-open-from-sidebar.yamltaps the project row's new-workspace action and waits for/new.flows/new-workspace-select-codex-gpt54.yamlselects a real provider/model.flows/new-workspace-submit-and-assert-created.yamltapsCreateand proves the app landed on the created workspace.
Compose new workspace scenarios out of these primitives instead of copying the
old full flow. The shell scripts render the top-level flows and every flows/*.yaml
file into the same temp directory, so nested runFlow: flows/... paths keep
working with ${PASEO_MAESTRO_*} placeholders.
The flow is intentionally strict. It must:
- Open a prepared project from the daemon.
- Tap the project row's new-workspace action.
- Select an actual provider/model before tapping
Create. - Tap
Create. - Assert the app lands on a workspace header and the draft composer.
- Assert
New workspace,Select a model, and the Android redbox text are not visible. - For the shell harness, grep logcat for
failed to insert viewandspecified child already has a parent.
Do not weaken this flow to only wait for message-input-root. That can pass on
the wrong route. The header assertion and the New workspace negative assertion
are what prove the redirect actually completed.
The scripts assume a development build with package id sh.paseo.debug, an
already-running local daemon on 127.0.0.1:6767, and a connected Android device
or emulator. They call adb reverse tcp:6767 tcp:6767; they do not restart the
daemon.
bash packages/app/maestro/test-workspace-create-android-crash.sh
bash packages/app/maestro/record-workspace-create-android-focus.sh
Optional environment:
PASEO_MAESTRO_APP_ID=sh.paseo.debug
PASEO_MAESTRO_DIRECT_ENDPOINT=127.0.0.1:6767
PASEO_MAESTRO_DAEMON_WS_URL=ws://127.0.0.1:6767/ws
PASEO_MAESTRO_PROJECT_PATH=/path/to/git/repo