Split session screen's clearTerminalCache cleanup into a mount-only effect; included client identity in home-screen wireUp dep key via a WeakMap-derived clientKey so forceReconnect re-attaches subs.
Findings addressed:
- mobile/app/h/[hostId]/session/[worktreeId].tsx:436 — clearTerminalCache fires on every client identity change
- mobile/app/index.tsx — useEffect deps array uses inline expression — runs every render
Rebased onto current main.
Co-authored-by: orca-bot <bot@stably.ai>
host-store: write AsyncStorage metadata before SecureStore token to avoid orphaned keychain tokens on crash. mobile IPC: coalesce repeated getPairingQR calls onto a single pending device token via new DeviceRegistry.getOrCreatePendingDevice.
Findings addressed:
- [high] mobile/src/transport/host-store.ts — saveHost orders Keychain write before AsyncStorage — orphaned tokens on crash
- [low] src/main/ipc/mobile.ts:84-95 — getPairingQR creates a device token on every call, leaking pre-paired entries
Rebased onto current main to resolve conflicts; preserved tokenCache.set added on main.
Co-authored-by: orca-bot <bot@stably.ai>
Reordered pi prefill extension to check event.reason before consuming env var; appended shell unset/clear for ORCA_PI_PREFILL after pi exits to avoid stale prefill on rerun.
Findings addressed:
- src/main/pi/titlebar-extension-service.ts:36-46 — Prefill env var consumed before reason check — may silently drop prefill
- src/main/pi/titlebar-extension-service.ts:30-46 — ORCA_PI_PREFILL still set in shell env after pi exits
Rebased onto current main.
Co-authored-by: orca-bot <bot@stably.ai>
Addresses two SIGKILL/wake-routing bugs:
- setWorkspaceSession now merges prior tab.ptyId / ptyIdsByLeafId
when the incoming snapshot's binding is empty, closing the second
half of the SIGKILL race that could clobber persistPtyBinding.
- DaemonPtyRouter.shutdown skips sessionAdapters.delete when
keepHistory=true so legacy-adapter sessions wake on the right
adapter on resume.
Co-authored-by: orca-bot <bot@stably.ai>
Re-added the `item.type !== 'pr'` guard around the relocated 'Start workspace from issue' button in GHEditSection so PRs no longer show it.
### Findings addressed
- ✅ **[medium]** `src/renderer/src/components/GitHubItemDialog.tsx` — 'Start workspace from issue' now renders on PRs
Rebased onto current main; removed the now-redundant early `return null` for PRs at the top of GHEditSection so the per-button guard is reachable and labels/assignees popovers remain available on PRs.
Co-authored-by: orca-bot <bot@stably.ai>
Fix race between in-flight remote watcher install and unwatch/shutdown by tracking cancel tokens; emit overflow fs:changed when the 60s retry timeout gives up so renderer falls back to manual refresh.
### Findings addressed
- [medium] src/main/ipc/filesystem-watcher.ts:445-480 — Race between in-flight installRemoteWatcher and unwatch/shutdown leaks watcher
- [low] src/main/ipc/filesystem-watcher.ts:497-505 — Silent timeout: 60s give-up never notifies renderer
Rebased onto current main.
Co-authored-by: orca-bot <bot@stably.ai>
Added seq + ref guards after awaits in post-scrollback re-subscribe path; awaitReady's prior in-flight promise now resolves before re-arming so old waiters don't pin 3s timers.
Findings addressed:
- mobile/app/h/[hostId]/session/[worktreeId].tsx:280 — Post-scrollback re-subscribe path lacks a seq guard after awaits
- mobile/src/terminal/TerminalWebView.tsx:770 — awaitReady promise replaced without resolving the prior one
Rebased onto current main; conflict in worktreeId.tsx resolved by preserving main's existing 'why: scrollback null viewport' comment alongside the new seq-recheck comment.
Co-authored-by: orca-bot <bot@stably.ai>
Don't seed empty-success worktree roots in worktrees:list[All] catch (prevents auth-cache poisoning); restored focus-gated fetchWorktrees polling for the active repo so non-active worktrees pick up terminal-driven branch switches; encode detached HEAD as undefined instead of '' so renderer's nullish-coalescing preserves prior branch.
Rebased onto current main to apply only the intended diff.
Co-authored-by: orca-bot <bot@stably.ai>
Updated reconnect-backoff comments in rpc-client.ts and connection-health.ts to reflect the actual ~6m total (not ~2m). Made valueFromMs() snap non-preset ms to the closest finite preset so the picker's selected radio agrees with the row sublabel.
Rebased onto current main to resolve conflicts; only the 3 Fixer-summary files.
Co-authored-by: buf0-bot <buf0-bot@users.noreply.github.com>
The regex /\x1b\[20[01]~/g intentionally matches control characters —
that's the entire point of the sanitizer (stripping embedded \x1b[200~ /
\x1b[201~ markers from clipboard text). Suppress the lint warning with
the same convention used elsewhere in mobile/ (see scripts/repro-worktree-startup-stream.ts).
Comment-only change, zero runtime impact. Follows up #1576.
Co-authored-by: hermes <hermes@stably.ai>
Strip embedded \x1b[200~/\x1b[201~ sequences from clipboard text before bracketed-paste wrap; route accessory-key repeat through a ref so held-key repeats use the current handleAccessoryKey.
Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
Fixed bundle-sheet keyed-canvas discard, narrowed magenta key threshold to avoid keying purples/pinks, hardened bundle copyFile against TOCTOU via O_NOFOLLOW, and skipped frame detection when the manifest already provides a valid sprite layout.
Rebased onto current main to resolve conflicts; reviewed and merged round-1 reviewer feedback (no committed node_modules).
Co-authored-by: orca-bot <bot@stably.ai>
Selecting a PR/issue/Linear row replaces the focused input with a source
pill, which causes Chromium to retarget the next keydown to document.body.
Allow body/documentElement as submit targets so the modal shortcut keeps
working post-selection. Also tighten the modifier check to be platform-
exclusive (Cmd-only on Mac, Ctrl-only elsewhere).
Co-authored-by: Orca <help@stably.ai>
The orca.yaml trust dialog now adapts copy and layout based on whether
this is a first-time approval or a re-prompt after the script changed.
Re-prompts lead with '<repo>'s setup script changed — run the new
version?' so users understand why they're being asked again.
Restyles the 'always trust' checkbox as a card and threads a
previouslyApproved flag from ensureHooksConfirmed into the dialog.
Co-authored-by: Orca <help@stably.ai>
Per-scope persisted column widths via fr-weight redistribution between
adjacent column pairs, so the table fits its container without growing.
Also relocates "Start workspace from issue" button into GHEditSection and
expands comment composer with a labeled send button.
Co-authored-by: Orca <help@stably.ai>
Run pnpm update in root + mobile to pull patched versions of vite, hono,
@hono/node-server, dompurify, uuid, picomatch, lodash, brace-expansion,
path-to-regexp, postcss, @xmldom/xmldom, and other transitive packages
flagged by Dependabot.
Co-authored-by: Orca <help@stably.ai>