Skip to content

android release#535

Merged
Th0rgal merged 6 commits into
Th0rgal:masterfrom
adrienlacombe:master
Jun 12, 2026
Merged

android release#535
Th0rgal merged 6 commits into
Th0rgal:masterfrom
adrienlacombe:master

Conversation

@adrienlacombe

Copy link
Copy Markdown
Contributor

No description provided.

adrienlacombe and others added 5 commits May 25, 2026 18:10
* 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>
@vercel

vercel Bot commented Jun 12, 2026

Copy link
Copy Markdown

@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.
@Th0rgal Th0rgal merged commit 95ae0be into Th0rgal:master Jun 12, 2026
9 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants