Commit Graph
1236 Commits
Author SHA1 Message Date
Neil 41fb3c7a9c fix(mobile): retire host edit navigation after leaving the route (#31692)
Saving an endpoint after the user leaves can pop a second screen. Retire navigation ownership while allowing the endpoint save and client refresh to finish.
2026-10-21 16:41:13 -07:00
Neil 74d11d93d0 fix(mobile): preserve notification changes across delayed focus reads (#31690)
A focus read started before Enable can finish afterward and switch notifications back off. Fence reads against permission and preference mutations.
2026-10-21 16:41:08 -07:00
Neil 154307498b fix(mobile): isolate file review composers by document (#31698)
A reused file reader carries a note composer into another document, and a late submission closes the new composer. Give document state and callbacks a keyed lifetime.
2026-10-21 16:40:15 -07:00
82512a43a3 fix(pairing): normalize base64 consistently across clients (#31465)
Normalize bounded Base64 input consistently across desktop, browser, and mobile pairing paths while preserving lossless legacy padding and trailing-bit spellings. Retain offer validation and authentication behavior.

Adapted from #12027. Compatibility verified across 378 spellings with no previously accepted inputs lost; full PR workflow and aggregate gate passed for a84dfaee35.

Co-authored-by: Henry Su <henrysu4707@gmail.com>
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-21 16:34:37 -07:00
Jinwoo HongandClaude 98007cb5f5 refactor(sidebar): one shared feed client for the desktop window and the phone (#31524)
* fix(sidebar): land flip-a's switch-on fixes on main, still dark (no flip)

The fixes found while the sidebar ran from main's feed, without turning
that on: ORCA_SIDEBAR_INPUTS_IS_MAIN stays false, and none of flip-a's
stop-gaps come along.

- Main stops counting a closed tab's terminal once it was asked to stop
  and no pane shows it; a failed or refused stop takes the request back,
  and a host out of contact stays unverifiable.
- Main fetches a paired server's rows with the transport's normal bound,
  so a server slower than 5 s still lists.
- A deferred unread raise flips the folder row it was decided for, and a
  read while the owner check is out cancels it.
- Phone: no worktree.ps flash before the feed; a host's last installed
  feed stands in while a fresh read is out; it highlights its own
  last-opened workspace and a fold never scrolls; projects file under
  their project group with the desktop's indent; the collapse spinner
  shows only after 500 ms; "Reopen to update" keeps the rows on screen.
- e2e helpers and journeys for the switch-on suite.

* fix(sidebar): keep an owed relay stop marked, clear a thrown stop, and prune pending unread raises

- A stop-and-wait that throws takes its stop request back, like one that fails.
- A final stop the legacy relay still owes stays marked, since the relay retries it.
- Pending unread raises are tracked only while one waits, so the map no longer grows.
- The paired-server fallback poll test gives its third fetch a reply and asserts live.

* refactor(sidebar): read the sidebar feed through one shared client library on desktop and phone

The window and the phone each had their own feed reader. Both now use one reader under
src/shared/sidebar-feed-client: paging, notices, retries and the snapshot it installs. A
snapshot reuses each unchanged entity's parsed object, so one row's change re-parses one row
instead of its whole domain. Adds the gesture and view-report pieces later cuts wire up.
Lists are unchanged on both sides.

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(sidebar): drop the feed client's unused pieces until their callers land

Co-Authored-By: Claude <noreply@anthropic.com>

* test(sidebar): key the snapshot test's rows by host identity, as main's feed types now do

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-21 19:34:02 -04:00
NeilandChun Chet Ng f6fc6d00f5 fix(mobile): use port 443 for explicit WSS host edits (#31659)
Use port 443 when an explicit WSS host edit omits a port; preserve saved host endpoints, bare-host inheritance and explicit ports.

Adapted from https://github.com/stablyai/orca/pull/31499.

Co-authored-by: Chun Chet Ng <ngchunchet95@gmail.com>
2026-10-21 16:32:07 -07:00
Neil 5f50b95c9c fix: remediate dependency security advisories across workspaces (#31681)
* fix: remediate dependency security advisories across workspaces

* test: verify security patches without ad hoc dependency installs
2026-10-21 16:31:17 -07:00
fcac5cf0f0 refactor(native-chat): one shared parser for the approval envelope (#30848)
The phone and the desktop each parsed the status row's
{ approval: { tool, summary } } envelope with identical validation.
Move that validation and the answer keys into
src/shared/native-chat-approval-envelope.ts; each caller still builds
its own card (phone English labels, desktop translated labels) and
keeps its own precedence and heuristics. No behaviour change.

Co-authored-by: E2E Test <e2e@test.local>
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-21 19:14:28 -04:00
Jinwoo Hong 7df3ff76d5 fix(sidebar): keep each host's activity, PR lane and retention apart for a same-id workspace (dark) (#31517)
* fix(sidebar): land flip-a's switch-on fixes on main, still dark (no flip)

The fixes found while the sidebar ran from main's feed, without turning
that on: ORCA_SIDEBAR_INPUTS_IS_MAIN stays false, and none of flip-a's
stop-gaps come along.

- Main stops counting a closed tab's terminal once it was asked to stop
  and no pane shows it; a failed or refused stop takes the request back,
  and a host out of contact stays unverifiable.
- Main fetches a paired server's rows with the transport's normal bound,
  so a server slower than 5 s still lists.
- A deferred unread raise flips the folder row it was decided for, and a
  read while the owner check is out cancels it.
- Phone: no worktree.ps flash before the feed; a host's last installed
  feed stands in while a fresh read is out; it highlights its own
  last-opened workspace and a fold never scrolls; projects file under
  their project group with the desktop's indent; the collapse spinner
  shows only after 500 ms; "Reopen to update" keeps the rows on screen.
- e2e helpers and journeys for the switch-on suite.

* fix(sidebar): keep an owed relay stop marked, clear a thrown stop, and prune pending unread raises

- A stop-and-wait that throws takes its stop request back, like one that fails.
- A final stop the legacy relay still owes stays marked, since the relay retries it.
- Pending unread raises are tracked only while one waits, so the map no longer grows.
- The paired-server fallback poll test gives its third fetch a reply and asserts live.

* fix(sidebar): key activity, review, retention and repo lookups by host, not bare id

The feed published activity and PR facts by bare workspace id, so a same-id
workspace on two hosts (a paired server and this desktop, or two servers)
shared one host's facts. Activity and review are now keyed by row identity,
retention sweeps per listed row, and the builder resolves each row's repo by
its own host's registration. Bumps the feed semantics version to 3.

Claude-Session: e1fdb3d9-6985-4693-84aa-9a9fad732103

* test(e2e): read a review fact by its row key

Claude-Session: e1fdb3d9-6985-4693-84aa-9a9fad732103

* test(mobile): key fixture rows by row identity

Claude-Session: e1fdb3d9-6985-4693-84aa-9a9fad732103

* fix(sidebar): count and label rows by their own repo registration; keep activity keyed through a failed listing

Host header counts and mixed-host labels read the row's own registration, as
the host filter and row now do, so one render cannot file a row under one host
and count it under another. A failed listing keys activity by the last rows.

Claude-Session: e1fdb3d9-6985-4693-84aa-9a9fad732103

* fix(sidebar): a slower older listing never overwrites a newer one's rows

Claude-Session: e1fdb3d9-6985-4693-84aa-9a9fad732103

* test(sidebar): read the quiet-desktop PR fact by its row key

Claude-Session: e1fdb3d9-6985-4693-84aa-9a9fad732103

* refactor(repos): the renderer re-exports the shared getRepoHostIdentity

Claude-Session: e1fdb3d9-6985-4693-84aa-9a9fad732103
2026-10-21 18:55:25 -04:00
NeilandBrennan Benson 90b86405bc fix(mobile): recover workspace capabilities after transient probe failures (#31480)
Recover workspace capabilities after transient status failures without treating an unknown answer as unsupported. Share probes, invalidate across reconnects, and bound active-sheet retries with backoff and cleanup fencing.

Fixes #16347. Replaces the earlier recovery work in #16850 (already closed).

Credit Brennan Benson (@brennanb2025) for the original report and recovery implementation. Verification includes 105 focused tests, deterministic retry/leak counts, native iOS evidence with disclosed fixture limits, and green CI at a1cf7b54d2.

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-10-21 15:51:58 -07:00
Neil 15b2cd5828 refactor(ipc): group Linear handlers with direct owner imports (#31673)
* refactor(ipc): group Linear handlers with direct owner imports

* chore: keep module organization progress local
2026-10-21 15:41:13 -07:00
Neilandmonsterlag 80b9dca13e fix(mobile): keep terminal wait feedback visible with a draft (#31658)
Keep terminal-wait feedback visible while a draft is present, preserving editing and existing send gating.

Adapted from https://github.com/stablyai/orca/pull/31528.

Co-authored-by: monsterlag <64719697+monsterlag@users.noreply.github.com>
2026-10-21 15:37:59 -07:00
NeilandWooseong Kim 2b716f601d fix(mobile): attach Codex images when agent identity is missing (#31370)
Use the shared desktop image-path formatter for unidentified mobile terminals and identified Codex, preserving owned agent identity, bracketed paste, upload routing and acknowledged-input ordering.

Adapted from community PR #30310 by Wooseong Kim (@innocarpe). Fixes #30298.

Validation includes exact-head CI and aggregate gate, native macOS and Windows consumer checks, actual paired Windows uploads with byte-integrity checks, and combined mobile/desktop tests, types, lint and bundle checks.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 15:31:55 -07:00
NeilandShahar Mor 92ef7be3a6 fix(mobile): retain terminal reading position after resume (#31661)
Preserve terminal reading position on foreground and reconnect by reusing the existing scroll-preservation option. Adapted from community PR #23401 by Shahar Mor (@shaharmor), with native iOS before/after proof and 38 focused regression tests.

Co-authored-by: Shahar Mor <shaharmor1@gmail.com>
2026-10-21 14:35:19 -07:00
NeilandJian Zhou a33d596827 fix(mobile): open Create Workspace after source drawer closes
Wait for the source drawer to finish closing before opening the create surface. Preserve task, project, Linear, and Jira selections through the handoff.

Closes #17558.
Adapted from #13147.

Co-authored-by: Jian Zhou <16776397+ZhouJian26@users.noreply.github.com>
2026-10-21 14:31:01 -07:00
Neilandgrboy6770 4a671db940 fix(native-chat): retire ghost queued continuation bubbles
Retire queued continuation echoes when transcript rows represent the sends. Preserve literal backslashes, occurrence boundaries, and image barriers on mobile and desktop.

Closes #15288.
Adapted from #15283.

Co-authored-by: grboy6770 <2000grboy@gmail.com>
2026-10-21 14:30:53 -07:00
NeilandWooseong Kim 75b14606d8 fix(agents): preserve Cursor identity across imported Claude hooks
Preserve Cursor identity across imported Claude hooks and mobile terminal tabs while retaining current tab status, rename, and scroll behavior.

Closes #30543.
Adapted from #30544.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 14:30:48 -07:00
NeilandWooseong Kim 0b82f88e9f fix(mobile): dispatch leading terminal scroll without a timer (#31472)
Dispatch the leading terminal scroll immediately and coalesce subsequent movement behind the outstanding request. Preserve queue expiry, limits and ordering.

Closes #30299.
Adapted from #30311.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 13:42:30 -07:00
65035bc52c fix(mobile): extend the final terminal row background into its remainder (#31474)
Paint the fractional terminal area from the last visible row background. Preserve terminal theme, scrolling and row-color behavior.

Closes #23507.
Adapted from #23508.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 13:42:25 -07:00
b128cbbd6a fix(chat): route OMP question cards to terminal (#31440)
Route terminal-backed OMP question cards to the owning terminal and refuse automated ask answer/cancel writes. Preserve structured semantic answers and recognize OMP multi-select metadata.

Verified against the real OMP selector source; automatic semantic card answering remains tracked in #26692.

Co-authored-by: jairuspace <jairusbpace@gmail.com>
Co-authored-by: Daniel Lopez <dafeloru@gmail.com>
2026-10-21 13:04:38 -07:00
Jinjing 78bc1e5005 Clarify locked mobile settings and preserve selected option visibility (#31628) 2026-10-21 12:31:45 -07:00
Neilandgsxdsm 47bb876bb1 docs(mobile): clarify buffered terminal autocomplete scope (#31347)
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
2026-10-21 12:24:29 -07:00
Jinjing b3f1607c84 Remove directional tab-close actions and tracking (#31599)
* Remove directional tab-close menu actions

* Remove retired directional-close translations

* Remove retired directional-close PostHog tracking

* Preserve legacy app-open schema compatibility without emitting samples
2026-10-21 12:01:27 -07:00
Kelvin Amoaba 22154de422 feat(mobile): tab strip shows terminal and chat agent state, reveals the next tab, renames on double-tap (#31372) 2026-10-21 18:27:30 +00:00
Kelvin Amoaba cdb032e83f fix(mobile): New Tab drawer reopens with its agents and refreshes them when desktop does (#31367) 2026-10-21 18:26:42 +00:00
Kelvin Amoaba 8f8c0abfc7 fix(mobile): show the saved restore delay in Terminal settings (#31361) 2026-10-21 18:24:12 +00:00
Brennan Benson 3d6a945b54 Mobile chat composer uses desktop's placeholder (#31425)
* Mobile chat composer uses desktop's placeholder

The phone composer said "Message Codex" (or "Message, @files, /commands") while desktop says "Ask anything, @ to mention files, / for commands". Both now read the one string from the shared native-chat copy table, so they can't drift again.

* Ship the shared composer placeholder in the runtime English catalog

* Keep the composer placeholder beside, not inside, the turn-status copy

The turn-status table maps one-to-one onto the status.* catalog keys; the placeholder is composer.placeholder, so it gets its own constant and its own catalog check.

* Read the composer catalog without a type assertion

* Read the composer placeholder from the typed catalog directly
2026-10-21 11:16:35 -07:00
Brennan Benson 8174208436 fix(terminal): every start in a deleted folder opens at the workspace root and says so (#30747)
* fix(terminal): start every terminal in the workspace root when its saved folder is gone, and say so

A terminal whose start folder was deleted opened at the workspace root only
when the window started it; the CLI, phone restore, orchestration and other
host starts failed with the raw "Working directory ... does not exist" error,
because the renderer had to opt in with a cwdFallback flag.

The execution host now makes that decision for every start that may create a
process (anything but a known live pane), with no caller flag. The fallback is
reported only when a process was proven started at the requested folder, so a
reattach or a crash restore in its recovered folder never claims "workspace
root", and only then does the saved start folder heal. A recovered folder that
was itself deleted yields to the request's resolved folder.

The notice reaches each caller through surfaces it already has: the window's
terminal line (now also written when a host-created tab attaches, and on a
restored reattach), the agent.launch warning (also for callers that show the
tab themselves), and a toast when a phone tap restores the tab.

* fix: recover terminal startup folders without healing unreadable paths

* fix: preserve saved start folder when revealing fallback terminals

* Reuse saved-tab lookup in cwd persistence test

* Import mobile tab activation result from its contract

* Check startup fallback response without a test cast

* Update expectation to catch up with accepted saved-folder metadata

* Preserve inconclusive WSL directory evidence when saving startup folders

* fix: project restored terminal ids for handle consumers

* test: return void from launch parity cleanup

* test: retain saved folder in shared spawn expectation
2026-10-21 10:21:36 -07:00
Jinwoo Hong 92bbb380a6 Sidebar: land the switch-on fixes from the flip branch on main, switch still off (#31466)
* fix(sidebar): land flip-a's switch-on fixes on main, still dark (no flip)

The fixes found while the sidebar ran from main's feed, without turning
that on: ORCA_SIDEBAR_INPUTS_IS_MAIN stays false, and none of flip-a's
stop-gaps come along.

- Main stops counting a closed tab's terminal once it was asked to stop
  and no pane shows it; a failed or refused stop takes the request back,
  and a host out of contact stays unverifiable.
- Main fetches a paired server's rows with the transport's normal bound,
  so a server slower than 5 s still lists.
- A deferred unread raise flips the folder row it was decided for, and a
  read while the owner check is out cancels it.
- Phone: no worktree.ps flash before the feed; a host's last installed
  feed stands in while a fresh read is out; it highlights its own
  last-opened workspace and a fold never scrolls; projects file under
  their project group with the desktop's indent; the collapse spinner
  shows only after 500 ms; "Reopen to update" keeps the rows on screen.
- e2e helpers and journeys for the switch-on suite.

* fix(sidebar): keep an owed relay stop marked, clear a thrown stop, and prune pending unread raises

- A stop-and-wait that throws takes its stop request back, like one that fails.
- A final stop the legacy relay still owes stays marked, since the relay retries it.
- Pending unread raises are tracked only while one waits, so the map no longer grows.
- The paired-server fallback poll test gives its third fetch a reply and asserts live.
2026-10-21 12:24:27 -04:00
Neilandfettpl 84af8efee3 fix(mobile): apply desktop WebGL atlas fixes to current engine (#31441)
Fixes #18283

Supersedes community PR #18347. Applies the existing desktop WebGL patch to the pinned mobile engine after independent adversarial and upstream review.

Co-authored-by: fettpl <38704082+fettpl@users.noreply.github.com>
2026-10-21 01:24:31 -07:00
NeilandArthur Chang 0cba9f2e08 fix(mobile): render offline Nerd Font symbols on first terminal display (#31446)
Fixes #17168

Supersedes community PR #17220. Original contributor credit is preserved below.

Co-authored-by: Arthur Chang <arthurc0102@gmail.com>
2026-10-21 01:17:08 -07:00
efcf8f0888 fix(mobile): keep terminal scroll gestures from becoming taps (#31445)
Fixes #25457
Fixes #25458

Supersedes community PR #25432, community PR #25435. Original contributor credit is preserved below.

Co-authored-by: Prateek Rungta <prungta2@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 01:16:49 -07:00
NeilandWooseong Kim 251bbf7bb0 fix(mobile): mount sessions with saved preferences (#31443)
Fixes #30517

Supersedes community PR #30518. Original contributor credit is preserved below.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 01:16:35 -07:00
NeilandiBakuman 11a1cc4d8b fix(mobile): load folder workspace agent presets on the correct host (#31442)
Fixes #16215

Supersedes community PR #16216. Original contributor credit is preserved below.

Co-authored-by: iBakuman <67883044+iBakuman@users.noreply.github.com>
2026-10-21 01:16:19 -07:00
NeilandWooseong Kim 7a2057e65c fix(mobile): retire old touch gestures before snapshot replay (#31437)
Fixes #30300

Supersedes community PR #30312. Original contributor credit is preserved below.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 01:16:03 -07:00
NeilandWooseong Kim 21322a56aa fix(mobile): cancel stale shortcut list drags (#31436)
Fixes #30302

Supersedes community PR #30314. Original contributor credit is preserved below.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 01:15:49 -07:00
NeilandWooseong Kim ea401d7164 fix(mobile): restore dictation after iOS audio interruptions (#31435)
Fixes #27498

Supersedes community PR #30297. Original contributor credit is preserved below.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 01:15:29 -07:00
NeilandWooseong Kim 0dbc6aa3c4 fix(mobile): select Unicode words at rendered cell boundaries (#31434)
Fixes #30301

Supersedes community PR #30325. Original contributor credit is preserved below.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 01:15:12 -07:00
NeilandWooseong Kim 8b9ba72c3b fix(mobile): retire stale terminal stream fits and callbacks (#31432)
Retire old terminal stream callbacks and delayed fits across reconnects, unsubscribe, terminal replacement, and synchronous termination. Preserve fresh output and the latest accepted fit.

Fixes #30505
Adapted from community PR #30506.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 00:31:18 -07:00
NeilandWooseong Kim 46b83a9529 fix(mobile): drag terminal selection with the long-press finger (#31433)
Let the finger that creates a long-press selection extend it through the existing selection-drag dispatcher. Verified with native iPhone touches and focused lifecycle tests.

Fixes #30554
Adapted from community PR #30555.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 00:30:43 -07:00
NeilandShahar Mor 45ee56e1a5 fix(mobile): preserve native iOS dictation placeholders (#31356)
Preserve UIKit recognition placeholders during equal-text Fabric synchronization and reset recognition state when the native input is recycled.

Adapted from community PR #26644 by Shahar Mor. Verified with matched source-built native Debug lifecycle probes for both input classes; physical spoken dictation remains in the final manual batch.

Co-authored-by: Shahar Mor <shaharmor1@gmail.com>
2026-10-20 23:52:49 -07:00
Brennan Benson 6de974ca5b Mobile chat: remove the Tools toggle and its open-everything mode (#31188)
* fix(mobile): remove the chat's Tools toggle and its open-everything mode

* test(mobile): keep the scroll-ownership tests' runs drawn without the Tools default

* test(mobile): the scroll-ownership harness opens settled turns as the old Tools default did
2026-10-20 22:56:11 -07:00
NeilandWooseong Kim 12e0b37293 fix(mobile): keep dictation controls in sync with host settings (#31349)
Honor enabled voice settings across terminal/chat controls and capture. Refresh hold/toggle state on connection, focus and foreground while fencing stale replies.

Adversarial review: 63 existing tests plus six disable/late-finish/unmount/settings ownership probes pass; final required CI and aggregate gate pass. Existing native screenshots and microphone lifecycle exercise are attached to the PR.

Fixes #30307. Fixes #30511.
Adapted from community #30316 and #30513 by @innocarpe.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-20 21:45:10 -07:00
fa35698db5 fix(mobile): keep keyboard accessory row height stable (#31363)
fix(mobile): keep keyboard accessory row height stable
Stretch the dismiss control within the accessory row so showing it no
longer adds height and needlessly reduces the terminal viewport.

Adapted from community PR #23511 by @innocarpe.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 21:32:47 -07:00
NeilandWooseong Kim f19ce3635b fix(mobile): show the bundled whale on DeepSeek Build tabs (#31359)
fix(mobile): reuse DeepSeek whale for Build tabs
Adapted from community PR #30525 with a focused component regression and native current-shell validation.

test(mobile): use checked icon renderer guard


test(mobile): keep icon diagnostic with review evidence
Native before/after captures cover this low-impact asset mapping; retain the local fail/pass diagnostic outside the product diff.

Use checked optional type for mobile icon lookup

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-20 21:32:39 -07:00
Neilandbbingz 3fd90e94e0 fix(mobile): preserve live palettes on identical themes (#31355)
fix(mobile): skip identical terminal theme assignments
Preserve live TUI palette changes and contrast caches on repeated normalized host themes. Keep explicit foreground recovery repaints and published desktop contrast overrides.

Co-authored-by: bbingz <zzb@gxsmjx.com>
2026-10-20 21:32:23 -07:00
NeilandWooseong Kim 3ed0bb4dfc fix(mobile): match home-indicator inset to terminal input panel (#31354)
fix(mobile): paint terminal dock bottom safe area
Adapted from community PR #30318.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-20 21:31:25 -07:00
NeilandWooseong Kim 6537842f0c fix(mobile): blend workspace header into status-bar safe area (#31353)
fix(mobile): match workspace header safe-area surface
Adapted from community PR #30531 with native iOS simulator before/after validation.

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-20 21:31:20 -07:00
Brennan Benson 03f4ce3d6b fix(mobile): show the session title beside the tabs on a landscape phone (#30879)
The served session page (react-native-web) reads flex: 0 as flex-basis 0%,
so the title block collapsed to zero width beside the tab strip. flex: -1
is natural width capped at 160, shrinking only when the row overflows, on
both web and native.
2026-10-20 20:59:19 -07:00
Neil fece03b5ac fix(orcad): voice dictation on headless orca serve hosts (#31217)
* fix(orcad): voice dictation on headless orca serve hosts

Mobile dictation against an orca serve host answered speech_unavailable
since serve moved to orcad: orcad never installed the speech service
factories, and the model manager and download imported Electron.

The model download now takes a host request opener (Chromium net on the
desktop, Node https on orcad, with redirects mapped to the same event),
the STT worker ships in the orcad slot, and orca serve hands orcad the
installed app's on-device recognizer. A host without a recognizer (an
SSH or WSL managed slot) lists only cloud models and sends a phone that
picked an on-device model to the setup sheet. Mobile names the fix when
an older server still has no speech at all.

The parity test now requires both roots to install speech.

Reported-by: delorean2020 (@delorean2020)

* fix(orcad): retry Node download drops, stage the recognizer on Windows, review fixes

- Node https errors (ECONNRESET, ETIMEDOUT, ...) are retryable, so an
  interrupted orcad model download resumes (Codex P2).
- On Windows orca serve hands orcad a per-version copy of the recognizer
  in the profile, so a loaded addon never locks the app's files against
  an update (Opus).
- Drop a recognizer candidate path that could never match; one SAFETY
  helper per test file instead of repeated casts; comments.

* fix(orcad): cloud speech is ready only with a key this host can decrypt; prune superseded recognizer copies

Codex round 2: a desktop-sealed OpenAI key exists on disk but orcad's
secret store cannot open it, so the catalog reported cloud models ready
and dictation failed at the end. orcad's model manager now proves the
key decrypts. The desktop keeps its existence check (no keychain prompt).

* fix(orcad): never prune staged recognizers before the profile lock; copy linked packages as real files

Codex round 3. ref-oss check: versioned copies are cleaned only by the
process that owns them, so the pre-lock prune is dropped rather than
patched.

* fix(orcad): remove a partial recognizer copy when staging fails (Codex round 4)

* fix(speech): never hand out another store's ciphertext as the OpenAI key (Codex round 5)

* refactor(orcad): no recognizer copy on Windows; Windows orcad keeps cloud dictation only

Design check after review round 5: every remaining finding came from the
Windows copy that dodges addon file locks. Dropping it shrinks the
surface to a path lookup; Linux and macOS serve keep on-device models.

* fix(speech): name the fix when an old server refuses a mic tap; always set the recognizer env; retry ENOTFOUND (final Opus review)

* fix(managed-server): probe install completeness relative to the slot dir

CI: shipping stt-worker.js added one more absolute slot path to the
install-complete probe, pushing it further past the exec-size budget.
Testing each artifact relative to the slot (inside a subshell cd) cuts
the probe from ~12.2 KB to ~3.6 KB, so it drops off the over-budget
list instead of raising a ceiling.

* fix(mobile): pin host.platform's read to a platform type, independent of which zod copy resolves

With mobile's own dependencies installed (which CI does for any PR that
touches mobile/), the e2e program resolves two zod copies, and the
salvaged platform arm from src/shared inferred as {}. The schema now
narrows through an explicit platform guard.

* fix(mobile): keep the host.platform read line intact for its RPC mutant; narrow in a second step

Mobile verify: the recorded-RPC mutant anchors on the read line, which
the previous guard rewrote, so the mutant could not apply.

* refactor(cli): app-executable resolution in its own module; drop the platform guard now zod is aligned

launch.ts went one line past max-lines with main; resolveAppRoot,
resolveForegroundOrcaExecutable, getExecutableAppArgs and
stripElectronRunAsNode move to orca-app-executable.ts (re-exported, so
callers are unchanged). With mobile and root on one zod (#31260), the
host.platform schema no longer needs the extra narrowing step.

* refactor(cli): import app-executable helpers from their module; no re-exports from launch.ts
2026-10-20 19:54:55 -07:00