Commit Graph
17976 Commits
Author SHA1 Message Date
OrcaWinandOrcaWin 32060decbb fix(editor): open the link that received the modifier-click (#35071)
* fix(editor): open the link that received the modifier-click

* fix(editor): read clicked link href from its mark, not the sanitized DOM

Tiptap blanks rendered hrefs for file:, Windows drive paths and custom schemes; resolve the clicked anchor's document position and read the link mark instead.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:14:35 -07:00
Jinjing 165f63a02d fix(terminal): retain only timings in typing diagnostics (#36088)
* fix(terminal): retain only timings in typing diagnostics

* Remove typed text from latency diagnostics and cover task overlap

* Preserve text metadata in diagnostic lifecycle test
2026-10-29 17:11:47 -07:00
OrcaWinandOrcaWin 12b589474c fix(editor): preserve file: links through rich Markdown copy and paste (#35789)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:07:59 -07:00
Brennan Benson a88581d8d5 perf(claude): look up retained prompts' turns in one journal pass during catch-up (#36127)
Catch-up scanned the whole chat journal once per retained prompt. Index prompt-to-turn matches once per reader, the same way the reader already indexes local prompts, keeping every match as a commit dependency in journal order.

Tracked in STA-12049.
2026-10-29 17:05:06 -07:00
OrcaWinandOrcaWin fdfe1e5a09 fix(editor): resolve TOC headings with folded whitespace, images and doc links (#34972)
* fix(editor): normalize heading whitespace when navigating the TOC

* fix(editor): resolve TOC headings containing images and document links

* fix(editor): read only text and image alt when matching TOC headings

Skip comment nodes in heading text, and trim test cases that overstated NBSP coverage or checked an inert negative path.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:03:23 -07:00
Neil 400266a9ce fix(ui): toasts sit above the notification cards; the Codex ~/.codex notice is a card (#36167)
NotificationCardStack publishes its height so the toaster stacks above it instead of rendering
behind it (z-47 under z-50), and lines up with the cards at 1rem. The one-time Codex shared
settings notice moves from a sticky toast into the card stack.
2026-10-29 16:55:26 -07:00
OrcaWinandOrcaWin 008a1e8480 Release the last closed rich Markdown editor (#35227)
* Release the last closed rich Markdown editor

* test(editor): reduce retention test to one case and note configure() ordering

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:53:44 -07:00
OrcaWinandOrcaWin 1607c647cd fix(editor): preserve selected code when indenting (#34970)
* fix(editor): preserve selected code when indenting

* fix(editor): keep Shift-Tab list outdent for selections starting outside code

Gate code-block outdent on the selection starting in (or being fully covered by)
a code block so list items containing a nested indented code block still outdent.
Remove the dead empty-indent branch, restore the DOM-less test fixture, move the
DOM-dependent undo/caret tests to a scoped happy-dom file, and trim duplicate tests.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:48:49 -07:00
Brennan Benson 14a2c4cefb Run the unit tests that force garbage collection on Node (#36131)
* test: run the AI Vault title-input GC check on Node

The test asserts superseded maps are garbage collected. Under Bun, whose GC
scans the stack conservatively, it can keep one alive, which failed CI on an
unrelated PR. Route it to Node with the other V8 retention checks.

* test: run the other forced-GC checks on Node too

HostRemoveDialog and the happy-dom observer retention check force a
collection like the AI Vault check; under Bun's conservative GC they can
fail or pass falsely.
2026-10-29 16:47:53 -07:00
Brennan Benson ddd4518d7d Stop the saved chat status writer from remembering every closed chat (#36105)
* fix(native-chat): stop the saved-status writer from remembering every closed chat

The writer deduped turn-edge writes with a per-chat memo that was never
cleared, so a long-running app kept one entry for every chat it had ever
shown. Dedupe against the saved record instead, holding only edges whose
write is still in flight; a reopened chat still skips an edge already saved.

* test: cover settled chat status writer retention

* test: simplify saved status retention contracts
2026-10-29 16:47:16 -07:00
Neil f11e71a3ff fix(bash): emit the shell-ready marker when ble.sh owns the prompt (#35784) (#36163)
* fix(bash): emit the shell-ready marker when ble.sh owns the prompt

ble.sh discards Bash's own readline prompt output and draws from its own
PS1 copy, so the daemon wrapper's PS1 ready marker never reached the PTY
and every startup command waited the 15s shell-ready timeout. Print the
marker directly from the prompt hook when BLE_ATTACHED is set.

Fixes #35784

* fix(bash): detect ble.sh 0.3 and ignore inherited ble.sh variables

ble.sh 0.3.x has no BLE_ATTACHED, so key the direct ready marker on
_ble_attached, and require ble.sh's functions in this shell so a stale
exported variable cannot select the cooked-mode path and double-echo
the startup command.

* fix(bash): wait for ble.sh's decoder and drop inherited ble.sh state

Nightly ble.sh renders its first prompt, which runs Orca's prompt hook,
before the key decoder attaches and can still fail back to cooked mode.
Print the direct marker only once _ble_decode_bind_state is set, and
unset inherited ble.sh attach state before profiles so exported
variables or functions cannot select the direct path.

* fix(bash): keep live ble.sh state from a system bashrc

Bash sources /etc/bash.bashrc before --rcfile, so ble.sh may already be
attached; the unconditional unset broke its decoder attach and hid the
ready marker. Drop only exported copies, which ble.sh never creates, and
make the wrapper tests require readiness before the first command.
2026-10-29 16:47:08 -07:00
OrcaWinandOrcaWin 15a02f7103 Bound preview selection deferral during continuous external edits (#35373)
* Bound preview selection deferral during continuous external edits

* test(editor): keep only the continuous-edit deadline regression test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:44:36 -07:00
OrcaWinandOrcaWin 9baf51d2e5 perf(editor): admit large pastes before clipboard parsing (#34839)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:37:53 -07:00
Neil b187d55e15 fix(computer-use): cap every macOS permission helper launch path at one per 5 s (#34390) (#36150)
* fix(computer-use): replace the macOS permission status gate with one 5s launch floor (#34390)

Follows up #36028. The earlier gate grew background/explicit flags, epochs,
backoff and a setup pgrep path that reviewers could not make correct.

- Status: one probe at a time and one 5s launch floor shared by every reader, so
  every path stays at <=12 helper launches/min. Readers inside the floor join the
  running probe or ride one trailing probe that fires only if someone waits.
  Only grants are cached (until the floor expires); denials and errors are never
  served, so a grant shows within one floor locally and on web. No app epochs:
  without a denial cache they bought nothing. Off macOS the gate is skipped.
- Setup: one launch per 5s across every permission, claimed synchronously; a
  request inside the window is queued (latest wins) and reported as
  launchQueued. Kill-and-relaunch stays so a click always re-shows the helper.
  Setup reuses the gate's in-flight/cached/last result instead of probing.
- Reset checks helper availability from the bundle and invalidates after any
  tccutil attempt, including partial failures.
- Remove the background flag from preload/IPC/renderer/web, the app-activity
  binding, and the sidecar permission_denied invalidation.

* fix(computer-use): close the remaining gaps in the permission launch floor (#34390)

- Clear the trailing timer whenever any probe launches and re-check the floor
  when it fires, so a late timer can never launch inside the floor.
- Setup reuses a denial only until the floor expires.
- A reader that joins a probe older than 300ms and gets a denial rides the next
  probe, so a grant shows within about one floor even after a stale web/RPC probe.
- Setup requests are numbered on arrival, including ones that coalesce, so the
  latest request wins (A, B, A launches A); a queued launch already covered by a
  newer launch is dropped. Reset and will-quit cancel any queued launch.
- The settings pane says "Opening…" and the CLI says queued for queued launches.

* fix(computer-use): measure permission launch floors from real spawns and cancel setup on every host (#34390)

- Both 5s floors use performance.now, so a wall-clock step cannot stretch or skip them.
- The status floor counts from the later of claim and the actual `open` spawn, and
  the setup window from after its spawn, so a slow mkdtemp or pkill can't allow a
  13th spawn in a 60s window.
- Setup cancellation registers through AppEnvironment quit handlers (desktop,
  headless Electron serve, orcad) and orcad's shutdown trigger; reset and
  shutdown bump a generation so an Open still waiting on status never launches.
- Reset cancels queued setup before its first await.
- A setup request leaves the coalescing map when it launches, so a later request
  for the same permission queues and wins (latest-wins across microtasks).
- A failed probe clears the remembered denial.

* fix(computer-use): drop setup coalescing and gate setup on a host-wide shutdown flag (#34390)

- Remove the per-permission setupInFlight map. Every Open goes through the 5s
  window and seq-ordered queue; a queued request with the same args that arrived
  before the last spawn was already shown by it, so concurrent same-permission
  Opens still spawn once. This fixes stale entries after reset turning the next
  Open into a no-op or a cancelled one.
- A cancelled Open (reset or shutdown) rejects with an error instead of returning
  launchedHelper: false, which every client rendered as "setup complete".
- Replace the per-host cancel calls with src/main/host-shutdown-state.ts, set
  synchronously by Electron will-quit and orcad's shutdown admission; setup
  checks it before every spawn, including the queued timer.
- Track the status cache's expiry from the probe that produced it, so starting a
  new probe cannot revive an expired grant.
- The queued setup timer re-checks its deadline and re-arms when early, and both
  timers round delays up; a throwing spawn there is logged, not uncaught.

* fix(computer-use): keep setup latest-wins after slow probes and surface cancelled setups (#34390)

- Record the launching request's seq; an older request that resumes or is queued
  after a newer one spawned is dropped, so latest-wins holds when requests
  resume out of order behind a probe.
- orcad sets the host shutdown flag on every cleanup entry, including failed
  startup.
- The web facade only falls back for hosts without computer.permissions; other
  failures, such as a cancelled Open, reject so the pane and onboarding show them.
- The cancellation check runs before an untargeted Open can report everything granted.
- Opens that arrive mid-reset wait for it, so reset's helper cleanup cannot kill
  what they open.
- Queued wording now says a newer request or a reset may replace it.

* fix(computer-use): wait out a reset before an Open reads permission status (#34390)
2026-10-29 16:33:52 -07:00
Neil 3fcac72437 fix(plugins): reload active icon theme when a same-metadata update changes its content (STA-12869) (#36151) 2026-10-29 16:33:06 -07:00
Neil 0426223be5 feat(telemetry): count plugin installs from Orca's public catalogs (#36132)
* feat(telemetry): report plugin installs and removals from Orca's public catalogs

* refactor(plugins): move marketplace install origin out of the installer
2026-10-29 16:32:49 -07:00
Neil d063703de2 fix(wsl): main's background start preps its host env without waking the distro, on both providers (E9) (#36149)
* fix(wsl): main's background start preps its host env without waking the distro (E9)

* fix(wsl): daemon-off background starts prep their env without waking the distro (E9)
2026-10-29 16:29:48 -07:00
Jinwoo Hong 17a681b8f8 Suppress agent CLI updates for unattended automation launches (#36133)
* fix: suppress CLI updates for unattended automation launches

* fix: preserve updater suppression precedence and host launch expectations
2026-10-29 19:29:21 -04:00
Brennan BensonandVyacheslav Scherbinin 00de405c5c fix: group Antigravity models and refresh effort choices (#34518)
* fix(acp): update Antigravity model and effort metadata

* fix: confirm ACP model families and idle option metadata

* Preserve provider-owned model and effort selection

* test: repair model option host and consumer fixtures

* Use the provider child type for optional delivery ownership

* test: match model option fixtures to their protocol contracts

* fix: isolate resting options from adapter type dependencies

* Preserve Antigravity option fixture types

* Match option fixture control response contract

---------

Co-authored-by: Vyacheslav Scherbinin <gentslava@mail.ru>
2026-10-29 16:21:22 -07:00
OrcaWinandOrcaWin 24ebed2366 fix(editor): preserve literal text in citation paste fallback (#34827)
* fix(editor): preserve literal text in citation paste fallback

* test(editor): drop paste-meta implementation assertion from fallback test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:18:03 -07:00
OrcaWinandOrcaWin 17e5d72a35 fix(editor): keep slash and document triggers literal inside code (#34971)
* fix(editor): keep slash and document triggers literal inside code

* fix(editor): import rich extensions in code-trigger tests and fold slash guards

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:17:46 -07:00
OrcaWinandOrcaWin bb2980c290 Preserve modified Enter line breaks in Markdown tables (#35224)
* Preserve modified Enter line breaks in Markdown tables

* fix(editor): limit table hard-break bypass to Tiptap's exact shortcuts

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:17:26 -07:00
OrcaWinandOrcaWin fe4ceec83f fix(editor): synchronize rendered image metadata (#35028)
* fix(editor): synchronize rendered image metadata

* fix(editor): resolve image attribute definitions once and trim metadata test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:16:43 -07:00
OrcaWinandOrcaWin 85522e89b8 test: remove low-value theme and copy suites (#36140)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:13:19 -07:00
Jinwoo Hong e960b3091a fix(editor): keep useRichMarkdownSearch.ts within the 300-line cap (#36147)
#34969 added an import that put the file one line over the lint cap on main. The Find and Replace shortcut branches now share one open-and-stop path.
2026-10-29 19:13:04 -04:00
OrcaWinandOrcaWin a986c8251e perf(editor): discard stale code spans before mapping replacements (#35116)
Find stale lowlight decorations of touched code blocks in the old DecorationSet, remove them, then map only the survivors instead of mapping every span and searching by mapped bounds.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:09:23 -07:00
Brennan Benson 3699db8b64 fix(claude): ignore a launcher's own version when choosing hook events (#36119)
* fix(claude): ignore a launcher's own version when choosing hook events

* Bind Claude capability versions to identified output

* Complete Claude version probe test process results
2026-10-29 16:08:53 -07:00
Kelvin Amoaba a874ff9d76 fix(relay): diagnose desktop clock drift (#36139) 2026-10-29 23:08:23 +00:00
OrcaWinandOrcaWin a0b8181bf3 fix(editor): preserve table widths when inserting beside selected cells (#35162)
* fix(editor): preserve table widths when inserting beside selected cells

* test(editor): fold selected-rectangle width regressions into table actions tests

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:08:08 -07:00
OrcaWinandOrcaWin adb3da0a3b fix(editor): preserve small images beyond the reusable cache target (#34998)
* fix(editor): preserve small images beyond the reusable cache target

* docs(editor): clarify retained image payload accounting

* test(editor): cover integrated tooltip and image contracts

* test(editor): trim pinned image capacity coverage to one regression case

* test(native-chat): keep byte-budget retry fixture within the file length limit

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:07:15 -07:00
OrcaWinandOrcaWin 06c86c4828 fix(editor): cancel superseded review-note position frames (#35261)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:06:54 -07:00
OrcaWinandOrcaWin 84b673b87b perf(editor): collect review note elements once per geometry pass (#34986)
* perf(editor): collect review note elements once per geometry pass

* test(editor): drop selector call-count tests for review note heights

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:06:50 -07:00
OrcaWinandOrcaWin 8344ff268c fix(editor): scope delayed review saves to the current draft owner (#34964)
* fix(editor): scope delayed review saves to the current draft owner

* fix(editor): drop unreachable root/editor-swap checks from review submit guard

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:06:44 -07:00
OrcaWinandOrcaWin 47e23a4646 fix(editor): keep retained review highlight ranges mapped after edits (#34963)
* fix(editor): keep retained review highlight ranges mapped after edits

* test(editor): assert rendered review highlights instead of plugin state

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:06:37 -07:00
Kelvin Amoaba 030c88deec feat(computer): return tree diffs after actions and add get-app-state --query (#36023)
* feat(computer): send tree diffs after actions and add get-app-state --query

Action results now carry only the accessibility-tree lines that changed since
the caller's last view of the same window (~ changed, + added, - removed as
index ranges, or an explicit no-change line), plus the focused element. The
runtime sidecar keeps the last tree per session/worktree and app, so all three
providers get it. The CLI opts in with treeDiff; older runtimes strip the
param and keep returning the full tree, and --full-tree opts out.

The macOS helper now keeps an element's index across snapshots of a window:
AX identity first, then the next unclaimed index with the same signature for
views that rebuild their AX objects, and never reuses a removed index.

get-app-state --query prints matching elements with their ancestors and
--max-elements caps the output, both in the CLI over the rendered tree.

Custom action names with raw newlines no longer split an element over lines.

* fix(computer): preserve parent changes in snapshot diffs

* fix(computer): refuse stale index reuse for lookalike controls

* fix(computer): print full trees in action replies

* fix(computer): keep controls located in snapshot replies
2026-10-29 23:05:41 +00:00
Neil d61f8ba92f refactor(jira): group status metadata owners (#36138) 2026-10-29 16:01:38 -07:00
Kelvin Amoaba 12f9f8175c fix(mobile): hide handles for unavailable terminals (#36135) 2026-10-29 22:59:18 +00:00
OrcaWinandOrcaWin 24e7643517 perf(editor): install one code highlighting plugin per editor (#35112)
* perf(editor): install one code highlighting plugin per editor

* perf(editor): merge tiptap import, explain base plugin lookup, trim tests

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:59:04 -07:00
OrcaWinandOrcaWin 9edd4b01f9 perf(editor): reuse unchanged review block line counts (#34934)
* perf(editor): reuse unchanged review block line counts

* test(editor): drop serializer call-count assertions for review block reuse

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:58:00 -07:00
OrcaWinandOrcaWin 896fc04f38 fix(editor): preserve combining marks in whole-word replacement (#34957)
* fix(editor): preserve combining marks in whole-word replacement

* fix(editor): keep whole-word boundaries after emoji presentation sequences

Resolve a leading combining mark to its base character so VS16 after an
emoji does not count as a word character, treat enclosing marks (keycaps)
as symbols, and drop the redundant hook-level undo/redo test.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:57:03 -07:00
OrcaWinandOrcaWin e7e3e568e7 fix(editor): keep composition-owned Escape inside Find (#34969)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:56:33 -07:00
Kelvin Amoaba 2e5711fcaa fix(mobile): use paired ports in firewall help (#36130)
* fix(mobile): use paired ports in firewall help

* fix(mobile): use a namespace type in diagnostics test
2026-10-29 22:55:38 +00:00
Kelvin Amoaba c97e6f16bc fix(computer): report macOS actions that changed nothing, read back wrong or hung (#36020)
* fix(computer): fail set-value when its read-back shows a different value

A value_mismatch came back as ok with exit 0, so callers that check only
the exit status took an ignored or misplaced write as success. The runtime
now turns it into a verification_failed error at the sidecar boundary,
which covers every provider and every caller of the RPC.

Part of #33511

* fix(computer): pair macOS AX windows with their CGWindowID

AppKit and WebKit windows don't answer AXWindowNumber, so matching a
capture to its accessibility window fell back to frames. Two windows with
the same frame then paired the screenshot of one with the tree and title
of whichever AX listed first, under the first one's id. Read the id with
_AXUIElementGetWindow, as yabai and Hammerspoon do, and keep AXWindowNumber
as the fallback.

Fixes #27252

* fix(computer): fail fast when a macOS app stops answering accessibility

Every request runs behind one helper lock, and a hung app cost a timeout
per AX read, so one get-app-state on it held every agent for up to the 60 s
RPC timeout. Pin the AX messaging timeout at 1.5 s, refuse an app that
doesn't answer a root probe, and stop a tree walk at the first read that
waits out the timeout, each with an action_timeout error.

A press or write that the app received but didn't answer now fails the
same way, saying it may have taken effect. Before, the click fell through
to AXConfirm and then a synthetic click, so a button whose handler blocked
ran twice, and type-text typed the text again as keys.

* fix(computer): report macOS accessibility actions that changed nothing

AXPress and other accessibility actions came back as plain unasserted
success even when the app ignored them, as Chromium does for a role=button
whose handler sits on a child. After such an action the helper now compares
the target's tree, frame and on-screen windows with the snapshot it took
just before. If they still match after re-reading for about a second, the
result says unverified/suspected_noop; if they change late, the result
carries the settled state instead.

The new reason is additive; older CLIs print it like any other reason.

Refs #31758

* fix(computer): propagate late macOS observation failures

* fix(computer): select existing text before replacement

* fix(computer): share native macOS window identity
2026-10-29 22:55:16 +00:00
OrcaWinandOrcaWin a83cb6ee33 Reuse Markdown tokenizer and details start searches across paragraph suffixes (#35374)
* Reuse Markdown tokenizer start searches across paragraph suffixes

* Reuse details start searches across Markdown paragraph suffixes

* test(editor): drop prototype spy-count tokenizer cursor tests

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:50:57 -07:00
OrcaWinandOrcaWin 5535d5e372 test: remove low-value inventories and wording suites (#36129)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:48:15 -07:00
OrcaWinandOrcaWin 95f45db57c fix(editor): honor Plain text code block highlighting (#35111)
* fix(editor): honor Plain text code block highlighting

* fix(editor): trim Plain text highlighting tests and drop redundant guard

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:48:09 -07:00
OrcaWinandOrcaWin 35c779ea36 perf(editor): honor the Find query debounce (#34829)
* perf(editor): honor the Find query debounce

* test(editor): drop redundant Find debounce walk-count test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:47:13 -07:00
OrcaWinandOrcaWin 85ddd7aa30 test(native-chat): drop flaky at-rest admission bounds test (#36134)
The N/10N case asserted exact start/peak/permit counts across concurrent work under fake timers and failed intermittently on CI (expected 3 to be 4). The phone dispatch/retirement and shared-context tests in the same file still cover the user-facing behavior.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:46:48 -07:00
Kelvin Amoaba 7a805621b2 fix(mobile): forward iOS keys and Shift+Enter (#36120)
* fix(mobile): forward iOS keys and Shift+Enter

* fix(mobile): preserve Option text and newline mirrors
2026-10-29 22:46:04 +00:00
Kelvin Amoaba 41cd866fb1 fix(mobile): recover from native screen render errors (#36121)
* fix(mobile): recover from native screen render errors

* fix(mobile): avoid replaying launch links after recovery

* fix(mobile): discard launch intent before recovery Home

* test(mobile): correct recovery fixture types
2026-10-29 22:44:22 +00:00