KeyboardAvoidingView was causing two issues: scrolling the page to the
top on focus, and not restoring the layout when dismissing the keyboard.
New approach uses Keyboard.addListener to track keyboard height and
applies it as paddingBottom on the message bar directly. This works
reliably on both iOS and Android regardless of softInputMode.
- Removed softwareKeyboardLayoutMode: "pan" from app.json
- Replaced KAV with plain View + dynamic keyboard padding
- Reverted SpawnSession/Settings screens to simple iOS-only KAV
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Set android.softwareKeyboardLayoutMode to "pan" in app.json to prevent
conflict between system adjustResize and KeyboardAvoidingView
- Use behavior="padding" consistently on both platforms
- Add keyboardVerticalOffset on Android to account for nav header
- Applied fix across all screens with keyboard input
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds `packages/mobile` — an Expo SDK 53 React Native app for monitoring
agent sessions from a phone.
Features:
- Home screen: Kanban-style session list sorted by attention level
- Session detail: metadata, PR link, CI status, branch info
- Terminal screen: full xterm.js terminal via WebView (port 14801)
- Settings screen: configurable backend URL (LAN IP or ngrok)
- Push notifications: background polling for attention-level changes
Improvements over PR #235:
- Fixed terminal onmessage handler to filter JSON control messages
(resize echoes no longer render as garbage text)
- Removed duplicate terminal.html (single source of truth in
terminal-html.ts)
- Fixed isDone check to include "cleanup" status using isTerminal()
Tech: Expo SDK 53, React Navigation 6, React Native WebView.
Two server connections: REST API (port 3000) + WebSocket terminal (14801).
The mobile package is excluded from the pnpm workspace to avoid
interfering with the monorepo toolchain.
Closes#265
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>