Commit Graph
123 Commits
Author SHA1 Message Date
f534cd5bc3 fix(mobile): downscale oversized clipboard images so paste no longer fails (#5601)
* fix(mobile): downscale oversized clipboard images so paste no longer fails

Pasting a large clipboard image (high-res screenshot or photo) failed with
'Image too large to paste' because the re-encoded PNG exceeded the 24 MiB
base64 upload cap, with nothing shrinking it first.

Now an oversized image is downscaled to fit the budget before upload:
- computeMobileClipboardImageDownscale() picks target dimensions by area
  (~sqrt(budget/actual)), with a bounded retry loop since PNG size is nonlinear.
- prepareMobileClipboardImageBase64() drives the loop with an injected resizer,
  so the byte/dimension logic is unit-tested without native modules.
- The resizer stages the image to a temp file and hands ImageManipulator a
  file:// URI; the iOS native loader (Data(contentsOf:)) cannot decode large
  base64 data URIs, so a data URI made renderAsync throw.

Adds expo-image-manipulator and expo-file-system.

* fix(mobile): fail fast when resized clipboard image has no base64

Empty base64 from saveAsync would pass the downstream base64 check and
upload a corrupt image; throw instead so the paste surfaces an error.

Addresses CodeRabbit review on #5601.

* Fix mobile clipboard image resize cleanup

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-18 18:25:06 -07:00
Carlos Baraza d46349ce82 fix: improve mobile link modifier handling (#5597) 2026-06-18 16:48:43 -07:00
688137c916 fix: improve mobile terminal glyph rendering (#5602)
* fix: improve mobile terminal glyph rendering

Align the mobile companion WebView terminal with the desktop xterm setup so Claude output renders correctly on iOS.

- Upgrade the embedded xterm CDN stack to the desktop beta line
- Load Unicode 11 before replaying terminal bytes
- Enable WebGL rendering with context-loss fallback
- Preserve Claude status dots as text presentation
- Add regression coverage for the mobile terminal setup

* Fix mobile status dot normalization edge cases

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-18 16:30:53 -07:00
Jinwoo HongandOrca 06d674b35d Fix mobile folder workspace visibility (#5679)
Co-authored-by: Orca <help@stably.ai>
2026-06-17 23:18:34 -07:00
c9bd61376f feat(mobile): combine PR sidebar and checks parity (#5641)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
2026-06-17 22:52:12 -07:00
gsxdsm c2acb3c11b fix(mobile): open the file tab when a terminal file path is tapped 2026-06-17 18:15:53 -07:00
99b5de6e3d Add Ante as a supported CLI agent (#5193)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-17 11:12:45 -07:00
67a95c7400 fix: pr-bug-scan validated finding from #5304 (#5342)
* fix: address pr-bug-scan validated finding from #5304

Added stream.sent=false reset in handleAuthRejection retry branch so e2ee_authenticated replay re-sends active terminal.subscribe after auth-retry reconnect.

* test: verify terminal resume after auth retry reconnect

* Fix remote runtime client timeout refresh on mobile

Avoid using Node-specific Timeout.refresh directly on platforms like
mobile where setTimeout returns a standard number/timer ID. Instead,
fallback to clearTimeout and setTimeout if .refresh is unavailable. Also
add missing path mappings to the mobile tsconfig.

---------

Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-06-16 17:21:13 -07:00
Jinwoo Hong 83bee02b47 fix(mobile): add terminal link routing setting
## Summary

- add mobile Settings → Browser → Open terminal links
- route terminal HTTP(S)/OSC 8 link taps to either the streamed Orca browser or the phone browser
- keep existing file-path tap behavior intact

## Verification

- pnpm --dir mobile test
- pnpm --dir mobile lint
- pnpm --dir mobile exec tsc --noEmit
- git diff --check
2026-06-16 17:05:12 -07:00
21a01c7d6b Mobile: worktree-list sidebar for tablet/foldable layouts (#5505)
* Add worktree-list sidebar for mobile tablet/foldable layouts

On wide canvases (tablet/foldable, >=700pt) the per-host worktree list now
renders as a persistent left sidebar with the routed screens (terminal,
source control, review, accounts, tasks) shown in a detail pane to its
right — mirroring the desktop's sidebar + center layout. Phones keep the
existing single-pane stack navigation unchanged.

- Reuse the existing worktree-list screen as the sidebar via an `embedded`
  mode (props for hostId/action, mount-driven fetch since a sidebar is never
  the focused route, hide-sidebar control in place of the back button, and
  open-into-detail-pane navigation that replaces rather than stacks).
- The default host route renders an empty WorkspaceDetailPlaceholder on wide
  layouts (the list lives in the sidebar) and the full screen on phones, so
  exactly one instance mounts either way.
- Hide button collapses the sidebar to give the detail pane full width; an
  elevated reveal tab brings it back.
- Detail-pane screen transitions use `animation: 'none'` while the split is
  active so workspaces swap instantly instead of sliding and flashing the
  screen beneath.
- Drag the sidebar's right edge to resize (clamped 280-560pt, detail pane
  kept >=320pt, tap-transparent so list rows still work); width persists via
  AsyncStorage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Address PR review feedback (#5505)

- Clamp the restored/persisted sidebar width against the current window and
  re-clamp when the window shrinks, so a width saved on a larger device can't
  starve the detail pane below MIN_DETAIL_WIDTH. Extract a shared
  clampSidebarToWindow helper reused by load, window-resize, and drag.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Polish mobile tablet sidebar

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-16 16:50:38 -07:00
gsxdsm 50b324a8c8 Fix file loading on web and mobile remote clients 2026-06-16 14:39:25 -07:00
gsxdsm f47832cce0 fix(mobile): show usage bars for system-default login (#5499)
Show mobile account usage for Claude/Codex system-default logins when rate-limit data exists without Orca-managed accounts.\n\nReview fixes:\n- match inactive account usage to the runtime rateLimits payload shape\n- share usage-bar state so stale window data remains visible during transient fetch errors\n- add regression coverage for both cases
2026-06-16 13:29:45 -07:00
Jinwoo HongandOrca adf5ccbc92 feat(mobile): view image files from the Files tree (#5472)
Co-authored-by: Orca <help@stably.ai>
2026-06-15 22:30:05 -07:00
Jinwoo HongandOrca e3bf7d8614 feat(mobile): pickers, workspace parity, active-workspace focus, tap-to-open, source-control parity, artifact viewing (#5330)
Co-authored-by: Orca <help@stably.ai>
2026-06-15 22:02:51 -07:00
cd31cd702d feat(mobile): add terminal text size (zoom) setting (#5388)
* release: v1.4.48-rc.0 [rc-slot:2026-06-05-15]

* release: v0.0.1-rc.0 [rc-slot:2026-06-06-03]

* feat(mobile): add terminal text size (zoom) setting

The mobile terminal fits the desktop's full column count to the phone
width with a CSS scale, which cancels out xterm's raw fontSize — so there
was no way to make text bigger or smaller. Add a persisted baseline zoom
multiplier the WebView applies on top of the fit.

- Settings → Terminal → "Text size": 50%–200% presets.
- Pinch-to-zoom in the terminal snaps to the same presets and persists.
- Per-device display preference; does not change the desktop terminal.
- Extracts the xterm WebView HTML into terminal-webview-html.ts to keep
  TerminalWebView.tsx within its max-lines budget.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* refactor(mobile): make terminal text size reflow columns instead of CSS scaling

Text size now drives the real xterm fontSize rather than a CSS transform
baseline. A larger cell means fewer columns fit the phone width, so the
existing measure -> terminal.updateViewport pipeline resizes the PTY and the
shell rewraps to the new width (and smaller sizes show more columns). Pinch
still snaps to a preset, but now changes the font size and reflows instead of
scaling pixels; the refit hook re-fits the PTY whenever the scale changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(mobile): restore terminal touch scrollback (undefined contentWiderThanViewport)

The single-finger touchmove handler gated horizontal panning on
contentWiderThanViewport(), which is never defined — so every one-finger
touchmove threw a ReferenceError before reaching the vertical-scroll code
below it, killing all touch scrolling including scrollback.

Replace the call with the inline overflow check clampPan() already uses
(scrollWidth * getTotalScale() > innerWidth). Vertical scroll now always runs;
two-finger pinch-to-zoom is unaffected. Merged two adjacent var decls to keep
the file under its max-lines cap without a disable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test(mobile): guard terminal text scale viewport refit

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-15 13:14:58 -07:00
d17c22c826 feat(mobile): add terminal keyboard autocomplete toggle (#5348)
* release: v1.4.48-rc.0 [rc-slot:2026-06-05-15]

* release: v0.0.1-rc.0 [rc-slot:2026-06-06-03]

* feat(mobile): add terminal keyboard autocomplete toggle

Terminal command inputs disable autocorrect/suggestions and use a
password-class keyboard so the OS never rewrites commands, flags, or
paths. Some users want phone-style typing in the command bar.

Add a Settings → Terminal "Autocomplete & autocorrect" toggle
(persisted locally, default off). When on, the command bar enables
autoCorrect/spellCheck and uses the default keyboard so Android shows
its suggestion strip; iOS drops the ascii-capable restriction. The
direct keyboard-capture input is unchanged — it streams raw keystrokes
where suggestions cannot apply.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(mobile): remount command input when autocomplete toggles

Android caches the IME inputType at mount, so flipping the toggle did
not switch suggestions on until the field remounted.

* fix(mobile): guard autocomplete pref loads against unmount and fast toggle

Address review feedback: the settings toggle's initial load could clobber
a fast user toggle, and the session focus-effect could setState after the
screen unfocused. Both now use a guard flag.

* test mobile terminal autocomplete preference

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-15 13:07:07 -07:00
Jinwoo Hong 618b5d3177 fix(mobile): retry handshake before latching auth-failed (#5200) (#5304) 2026-06-13 14:25:43 -07:00
c4fade90e7 Add mobile Review Changes workflow (#5313)
* Add mobile diff review

* Wrap mobile review notes prompt

* Fix mobile review unreviewed navigation

* Clear review completion when a refreshed diff invalidates a reviewed file

mergeMobileDiffReviewState invalidates a file's reviewed flag when its
diff identity changes, but left completedAt set — inconsistent with
markUnreviewed. Drop completedAt on invalidation and add a regression
test.

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-13 14:24:26 -07:00
Jinwoo HongandOrca 71bfbbf840 Fix rich markdown image paste bloat (#5290)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 16:48:09 -07:00
Yang,Zhou 74e2c952f1 feat: add Devin CLI as supported TUI agent (#5282)
* feat: add Devin CLI as supported TUI agent

Register Devin across shared agent config, telemetry, desktop/mobile
catalogs, localization, and README. Uses stdin-after-start prompt
delivery with --permission-mode bypass default args.

* test: assert Devin default --permission-mode bypass in startup plans
2026-06-12 16:10:09 -07:00
Jinwoo HongandOrca 6837cca9f3 Fix Tasks PR detail drawer and GitHub attachment videos (#5288)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 16:02:09 -07:00
Carlos Baraza 1205457d53 feat(mobile): paste clipboard images into terminals (#5264) 2026-06-12 14:37:43 -07:00
Jinjing dccea75b0e Fix active tab scrolling and editor keyboard layout on mobile (#5271)
* Improve mobile session tab scrolling and editor keyboard layout

- Auto-scroll the active session tab into view within the horizontal
  tab strip, using a new layout-aware utility with minimal scrolling.
- Use visual viewport measurements in the editor WebView to accurately
  report keyboard insets and lift floating controls above the keyboard,
  as native events can under-report covered areas.

* Fix active tab scrolling and normalize editor keyboard inset

- Ensure the active session tab is scrolled into view immediately when
  its layout finishes to prevent it from remaining hidden off-screen.
- Round, clamp, and validate WebView visualViewport bottom measurements
  to avoid rendering inconsistencies from fractional or invalid insets.
- Trigger an immediate keyboard inset report on script initialization.

* Update tabStripOffsetRef when scrolling mobile tab strip

Ensure the cached offset is updated to match the next scroll position. Without this update, subsequent scroll calculations would use stale offset values.
2026-06-12 11:09:08 -07:00
Jinwoo HongandOrca 58ce969fcb fix(mobile): preserve repeated iOS terminal hyphens (#5222)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 15:53:56 -07:00
Jinwoo Hong 7e73cd4719 fix(mobile): use Claude icon for Agent Teams
Use the Claude logo for the Claude Agent Teams option on mobile.
2026-06-11 14:38:36 -07:00
Jinwoo HongandOrca 469cbe387d feat(mobile): drag-to-reorder terminal shortcut keys in settings (#5076)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 14:05:07 -07:00
Jinwoo HongandOrca c9ab6018da Fix duplicate mobile notifications (#5206)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:15:06 -07:00
Jinwoo HongandOrca 93e59ab086 fix(mobile): recover Android remote sessions without an app restart (#5061)
Co-authored-by: Orca <help@stably.ai>
2026-06-09 17:55:20 -07:00
Jinwoo HongandOrca 28fe76f696 Fix desktop terminal restore after mobile fit (#5039)
Co-authored-by: Orca <help@stably.ai>
2026-06-09 12:11:48 -07:00
Jinwoo HongandOrca b42b286879 Fix mobile markdown actions above keyboard (#4945)
Co-authored-by: Orca <help@stably.ai>
2026-06-08 21:27:33 -07:00
Jinwoo HongandOrca 66035716f0 Fix mobile diff syntax highlighting (#4922)
Co-authored-by: Orca <help@stably.ai>
2026-06-08 17:41:27 -07:00
Jinwoo HongandOrca f5efdd5945 Fix remote runtime terminal sharing with mobile (#4901)
Co-authored-by: Orca <help@stably.ai>
2026-06-08 14:26:07 -07:00
Jinwoo HongandOrca 880fd964ac Fix issue workspace names with apostrophes (#4848)
Co-authored-by: Orca <help@stably.ai>
2026-06-07 19:57:52 -07:00
Jinwoo HongandOrca c23ab4323c Prepare mobile 0.0.12 (#4627)
Co-authored-by: Orca <help@stably.ai>
2026-06-04 01:06:45 -07:00
gsxdsm a19e16f718 fix: Android terminal text overflow and stale viewport after unfold
Fix Android terminal text overflow and stale foldable viewport handling.

- Pin terminal WebView textZoom so Android system font scale cannot inflate xterm glyphs past measured cells.
- Refit mobile terminal viewport on window dimension changes for fold/unfold, rotation, and split-screen.
- Harden viewport refit fallback handling for stale async runs and updateViewport responses.

Fixes #4579
2026-06-04 02:38:57 -04:00
Neil 6dc779c4f4 Address react doctor warnings 2026-06-03 12:48:00 -07:00
Jinwoo HongandOrca aa8451b3e9 Fix mobile Linear issue list parsing (#4576)
Co-authored-by: Orca <help@stably.ai>
2026-06-03 11:06:43 -07:00
Jinwoo HongandOrca 8959535f1b Auto-dismiss agent notifications on acknowledgement (#4518)
Co-authored-by: Orca <help@stably.ai>
2026-06-02 18:01:23 -07:00
Jinwoo HongandOrca 5ab1fe09b9 Fix mobile Tailnet pairing (#4415)
Co-authored-by: Orca <help@stably.ai>
2026-06-01 17:30:10 -07:00
Neil 41bf76aef2 chore: gate high-signal react doctor rules
Adds a focused React Doctor oxlint gate for high-signal state/effect rules, disables the noisy js-combine-iterations React Doctor rule, and refactors the mobile new-worktree modal away from prop-change state reset effects.
2026-05-31 22:35:15 -07:00
Neil 0bb62b9d29 Add braces to mobile control flow (#4351) 2026-05-31 21:32:37 -07:00
Jinwoo HongandOrca b555e66598 Keep migrated mobile shortcut order canonical (#4349)
Co-authored-by: Orca <help@stably.ai>
2026-05-31 20:48:34 -07:00
Jinwoo HongandOrca a34a6bec7e Add mobile terminal Space shortcut (#4335)
Co-authored-by: Orca <help@stably.ai>
2026-05-31 20:35:31 -07:00
Neil 12d75587a5 fix: ignore stale mobile socket events 2026-05-31 09:43:36 -07:00
Neil 8db35593b5 fix: handle malformed mobile diagnostic endpoints 2026-05-31 09:24:07 -07:00
Neil 853fa454ef fix: honor mobile rpc timeout while reconnecting 2026-05-31 09:15:46 -07:00
Neil 81f4559049 perf: bound mobile terminal WebView queues
Bounds the mobile terminal WebView pre-ready write backlog, avoids Array.shift() in the embedded xterm write drain, disposes old xterm observers, and clears successful fallback timers.
2026-05-31 04:23:39 -07:00
Neil 49153d933f perf: cap mobile dictation audio backlog (#4078) 2026-05-31 03:33:00 -07:00
Neil 7fa23737ad perf: stream mobile PR diff previews (#4071)
Stream capped mobile PR file diff previews while preserving exact total row counts.
2026-05-31 03:21:57 -07:00
Neil 255bb24c37 perf: cap mobile diff preview rows (#4067) 2026-05-31 03:14:29 -07:00