android release#535
Merged
Merged
Conversation
* Fix Android dashboard simulator issues * Address Android dashboard review comments * Prevent stale terminal sends * Resolve Android lint warnings
Three crash classes the simulator test plan caught and fixed:
1. AuthGate stuck on RESOLVING after rapid rotation. The LaunchedEffect
reset `phase = RESOLVING` unconditionally on every Activity recreate, so
an authenticated user rotating into a network flap stayed on the
spinner forever. Derive the initial phase from settings; on health
failure, stay AUTHENTICATED when a token is present rather than
bouncing to NEEDS_CONFIG.
2. UnknownHostException killed the process during network drops. The SSE
event handler launched `viewModelScope.launch { refreshRunning() }`
and `{ refreshQueue() }` on every mission status/title/metadata event
without a catch — when wifi was off, `container.api.running()` threw
UnknownHostException straight through to the default handler. Wrap
all such calls in `runCatching`, harden `ApiService.execute()` to
skip resuming continuations that have already been cancelled (avoids
IllegalStateException on the OkHttp dispatcher thread), and add a
CoroutineExceptionHandler to `container.scope` as defense in depth.
3. TEST_PLAN.md Case 11's row-count regex never matched (the dump format
puts a tab after each label), producing false-positive failures.
Count `Delete` action labels instead.
Test-driver upgrades that made all of this discoverable:
- `Modifier.testTag` on ~60 surfaces (auth, nav tabs, control composer
+ top bar, mission switcher, terminal, files, more tiles, settings,
workspaces, automations, FIDO, tasks, runs, desktop). New
`Modifier.tag(NAME)` extension pairs the testTag with the
`testTagsAsResourceId` semantics flag so tags surface as
`resource-id` even inside AlertDialog/Popup windows (which open in a
separate Compose root and don't inherit the flag set at AppRoot).
- `Box(Modifier.tag(...))` wrapper required for `FilterChip` widgets;
the chip's own modifier doesn't propagate the testTag to the
clickable surface that uiautomator records.
- New `test-helpers.sh` with `dump_ui` (writes parsed labels, not raw
XML), `tap_tag`, `type_into_tag` (clears via MOVE_END+DEL so
pre-filled placeholders don't get prepended), `wait_for` polling
(replaces fixed sleeps), `record_result` writing JSONL,
`on_case_fail` trap auto-capturing screenshot+UI+logcat,
`summarise_results` emitting a markdown table.
- TEST_PLAN.md rewritten end to end: express vs full subsets,
selector contract (tap by testTag, never by visible text or
coordinates), text-entry caveats (adb input quoting, soft
keyboard), API-first probes (compare `/api/fs/list` count to
rendered rows), per-case `record_result` + on-failure trap, and a
new diagnostics cheat sheet covering the symptoms we hit during
investigation (DropBox crash buffer for evicted stacks, FilterChip
tag invisibility, AuthGate stuck-spinner signature, etc.).
Verified: 18/18 cases pass against a single-tenant remote backend on
Android 14 (API 34) AVD. The crash sweep no longer detects fatals; the
rotation and network-resilience cases that previously cascaded from the
two bugs now pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Brings the Android dashboard to parity with the iOS reference app: - Ask co-pilot sidecar: streaming threads per mission with a send-answer-to-composer bridge (AskSheet/AskViewModel/AskClient) - Picture-in-Picture for the desktop stream (PipHost) - Message copy: long-press any chat bubble to copy - Inline image rendering for image shared files (Coil, auth headers) - Thoughts panel: expandable inline thinking notes + full reasoning dialog from the top bar - Parallel missions: send the draft as a parallel worker from the composer (gating no longer depends on the nonexistent /api/control/parallel/config endpoint) - SSE→WebSocket fallback for the control stream (/api/control/ws) - On-disk mission cache with a stale-conversation pill; re-syncs and clears on reconnect - Control diagnostics overlay (long-press the connection status) - Settings: persisted default model override, preselected in the new-mission dialog and applied to composer-created missions - History: mission detail screen with metadata, paginated event timeline, event search and per-mission moments - Automations: full editor (inline/library/file sources, variables, fresh-session mode, stop policies, retry config) and richer rows - Workspaces: detail dialog (ID, path, env vars, skills/tools/MCPs) - Files: clickable breadcrumbs, editable path dialog, quick-nav menu - Top bar: status line no longer wraps vertically Verified on a Pixel 9 emulator against a live test instance. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@adrienlacombe is attempting to deploy a commit to the LFG Labs Team on Vercel. A member of the Team first needs to authorize it. |
…arch races - SharedInlineImage attached the dashboard bearer token to every image request, including absolute third-party URLs shared by the agent. The token now rides only on relative URLs resolved against our own backend. - MissionDetailScreen.setQuery gets the same generation fence as AskViewModel so a slow older search response can't overwrite newer results.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.