Commit Graph
3524 Commits
Author SHA1 Message Date
Jinwoo-HandOrca eb456a94e6 Two-tier sticky headers: pinned host card above pinned group header
When scrolling inside a host section, the host card now stays pinned at
the top (z-30) while project/status group headers hand off beneath it
(z-20, offset by the pinned card height). The host is the outer
hierarchy level, so it is the most persistent context — previously the
first repo header replaced it, losing 'which machine am I on' exactly
when it mattered. The pinned card keeps its collapse/menu/warning
affordances. Handoff rules: the next host card pushes the previous one
out at the viewport top; a group pins only once it reaches the slot
beneath the host card, and a previous host's group can never pin under
the next host. Without host sections the logic degrades to the original
single-tier behavior.

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:32:56 -07:00
Jinwoo-HandOrca e70820a055 Anchor host badge to its label, indent rows under host cards
Sidebar polish from review:
- The count badge sat in dead space between the label and the
  hover-only chevron/menu; it now hugs the label like repo headers
- Rows under a host card get a left inset so projects and workspaces
  visibly belong to the machine above them
- A host whose only visible row is a collapsed repo group counted 0
  while the group badge said 9; host counts now fall back to header
  counts for groups contributing no visible items

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:32:56 -07:00
Jinwoo-HandOrca 481b44ec64 Restore the outlined server card for host headers
Feedback: the bordered card with the server glyph made it clearer that
a host section is a separate machine, not just another group. Bring
that back while keeping the recent quieting: no status dot when
healthy (marks only for connecting/blocked/error/disconnected), no
'This computer' detail on the local host, and collapse/menu/count
behavior unchanged.

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:32:56 -07:00
Jinwoo-HandOrca 0ebfaf05a7 Quiet multi-host sidebar: no persistent strip, label-style host headers
Design feedback: the All-hosts view stacked redundant chrome (server
icon three times, status dots everywhere, a strip repeating what the
headers below said).

- The scope strip no longer renders in All-hosts view — host section
  headers tell the story, and scope switching lives in the workspace
  options menu. When scoped to one host it becomes a slim
  '<host> only · ✕ All hosts' return banner
- Host headers are now quiet uppercase muted labels (no server icon),
  with a transport suffix only for remote hosts and a status mark only
  when a host needs attention (connecting/blocked/error/disconnected);
  healthy hosts show nothing
- Collapse, hover chevron, count badge, and the host menu are unchanged

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:32:56 -07:00
Jinwoo-HandOrca 38b908ade3 Remove redundant 'Focus this host' from the host header menu
The host scope strip is the single scoping control (the design doc
explicitly forbids a separate focused-host toggle), and decluttering is
now served by collapsing host sections. A second entry point with a
different verb invented a third concept where two suffice: the strip is
where work goes, the header is a group you can fold.

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:32:56 -07:00
Jinwoo-HandOrca 4ce1b2d201 Make host sections collapsible and suppress them for single-host lists
Sidebar usability fixes for the multi-host grouping, from review feedback:
- A lone host section is noise: host headers now render only when at
  least two hosts have visible workspaces, so a 6-host registry with
  only local work shows today's plain sidebar
- Host sections collapse/expand like other sidebar groups (persisted
  via the existing collapsed-group keys; chevron on hover; menu clicks
  don't toggle)
- Host headers restyled from bordered cards to the group-label idiom so
  the scope strip (a filter) and host headers (group labels) read as
  different tiers
- Scope strip shows '{n} connected' instead of the raw saved-host count

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:31:30 -07:00
Jinwoo Hong 17188f503a fix(i18n): stop visible placeholders in Create PR and related UI (#5063) 2026-06-11 12:31:30 -07:00
Brennan Benson a9e81c3fa5 Show full details for child worktree cards (#5056) 2026-06-11 12:30:28 -07:00
NeilandOrca b3c942457a Replace pasted work-item URLs with title-derived workspace names (#5059)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:28:53 -07:00
Brennan Benson 6cb1d5bb53 Fix worktree card border-radius for multi-selected state (#5058) 2026-06-11 12:28:53 -07:00
NeilandOrca d7f431d9cf Re-enable WebGL for remote-runtime terminals (#5048)
PR #4946 forced terminalGpuAcceleration to 'off' whenever a remote
runtime environment is active, as a conservative workaround alongside
the real fixes (CSS anchor-name encoding and rebuilding the WebGL
renderer after replay bytes parse). That left every remote-runtime
terminal on the slower DOM renderer even though the post-replay
rebuildPaneWebgl already covers the snapshot-after-attach race.

Remove the forced-off resolver so remote-runtime panes honor the user
GPU setting again. The snapshot path (onSnapshot -> processData with
replayingBufferedData -> onReplayData -> rebuildPaneWebgl after parse)
keeps the glyph atlas in sync, and attachWebgl re-checks all guards
(gpuRenderingEnabled, deferred attachment, context loss) on rebuild.

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:28:53 -07:00
Brennan BensonandOrca f71df6a434 Fix shortcut chip floating right in Cmd-J palette tip on Windows/Linux (#4921)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:28:53 -07:00
Jinjing 3569c6fe22 fix: address review findings (#5055) 2026-06-11 12:28:53 -07:00
Jinjing 9e81af8ae3 Preserve floating workspace state after restart (#5047)
* Preserve floating workspace state during restart purge

* rm doc
2026-06-11 12:27:57 -07:00
Brennan BensonandOrca 6255c5dabd Add Project modal: roving keyboard selection (#5052)
* Make Add Project highlight a roving keyboard selection

The Add Project modal previously rendered Browse folder as a permanently
filled "primary" card with a static ⏎ chip. Turn that white fill + ⏎ chip
into a roving selection indicator driven by keyboard focus: Browse starts
selected (it is autofocused on open), and Tab or ↑/↓ move the highlight —
and the ⏎ chip — to whichever action is focused, so Enter's target is always
the highlighted row.

Also flatten the unselected Browse card's surface to bg-background so it
matches the secondary rows instead of showing the outline variant's lighter
tinted/shadowed surface.

ShortcutKeyCombo gains an optional keyCapClassName so the ⏎ chip can tint
itself for the filled surface.

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

* Drop focus ring on selected Browse card so it stays borderless

The primary Browse card uses the Button component, whose base styles always
draw a focus-visible border + ring. Because Browse is autofocused-and-selected
on open, that ring rendered as a border on only the top card, unlike the
filled secondary rows. Suppress the ring on the selected state (the fill + ⏎
chip already indicate focus, since focus drives selection) and add a
transparent border to hold the box size steady across the outline↔default swap.

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

* Fix add project action selection accessibility

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

* Refine add project action outlines

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:26:34 -07:00
Jinwoo HongandOrca 2080298ee3 Allow Claude account changes with live sessions (#5054)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:26:34 -07:00
NeilandOrca 8cfa15b9ef Restore slim terminal scrollbar (xterm width: 7) (#5051)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:26:34 -07:00
Jinwoo Hong b5d9f3da8b Add Simplified Chinese, Korean, and Japanese UI localization (#5046) 2026-06-11 12:26:34 -07:00
Jinwoo HongandOrca df0bafaf53 Fix terminal read for blank TUI tails (#5050)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:25:50 -07:00
Jinwoo HongandOrca deb10db787 Fix status bar usage separator entity (#5053)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:25:50 -07:00
Jinwoo HongandOrca 05c7030867 Resume agents after PTY cold restore (#5045)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 12:25:50 -07:00
Jinwoo-HandOrca 6b437f9820 Per-host setting overrides, host rename/remove, regression fixes
- hostSettingOverrides on GlobalSettings with effective = host override
  ?? client default (src/shared/host-setting-overrides.ts, tested);
  Apply-to scope selector on Workspace Directory with override
  indicator and reset
- Host display-label overrides flow through the registry so Rename in
  the host header menu updates every sidebar surface; Remove confirms
  then reuses the existing ssh-target cleanup (runtime hosts deep-link
  to the servers pane)
- Fix branch test regressions vs main: lineage fixture gains the
  workspaceHostScope field, dropdown mock gains DropdownMenuLabel, CLI
  terminal-create assertion reflects owner-scoped environmentId, repo
  fixtures expect intentional executionHostId stamping
- Split launch-work-item-direct types and WorktreeMetaDialog issue-link
  hook + save-payload builder into focused modules (max-lines)

Co-authored-by: Orca <help@stably.ai>
2026-06-09 20:03:50 -07:00
Jinwoo-HandOrca 1384d9f6bf Live runtime status in sidebar; focused-host creation default; SSH auth-needed label
- New runtime-status slice holds per-environment status (boot hydration,
  settings-pane probes, host-header checks all write through it); stale
  environments dropped on list reload
- buildSidebarHostOptions forwards live status to the host registry at
  all call sites, so compat verdicts and blocked health render in the
  scope strip, options menu, host headers, and browser pane
- New-workspace composer defaults to a repo on the focused host scope
  (explicit draft/initial/active choices still win)
- SSH hosts with expired auth say "Authentication needed" in the host
  header instead of icon-only

Co-authored-by: Orca <help@stably.ai>
2026-06-09 19:39:07 -07:00
Jinwoo-HandOrca 3412919373 Route mutations by owner host; host header actions; per-host session persistence
- Fix ~30 owner-routing bugs found by call-site audit: SourceControl git
  ops, agent launch/notes, work-item preflight, repo icon, TabBar shell
  capabilities, GitHub project row edits, repo.update preference write
- Per-host splits for repo reorder and worktree sort-order persistence
- Host section headers gain a connection menu (focus, manage, ssh
  reconnect/disconnect, runtime check) and blocked-host update guidance
- Cmd+J palette shows owning-host badges when multiple hosts exist
- Partition persisted workspace session by execution host: host-keyed
  get/set/patch + IPC + preload, runtime-owned entries split to their
  partitions on write and merged on boot; legacy blob stays the local
  partition (zero-copy, idempotent migration)
- Keepalive regression tests pin no-teardown on runtime switch and
  boot-gated worktree purge; host scope documented as filter-only
- Fix host grouping for explicitly runtime-owned repos in All hosts view

Co-authored-by: Orca <help@stably.ai>
2026-06-09 19:25:51 -07:00
Jinwoo-HandOrca ea42a5c18d Multi-host groundwork: execution host identity, owner routing, host-scoped sidebar and ports
Inherited verified slice toward #4697 (multi-host Orca):
- ExecutionHostId/-Scope types, parse/build helpers, host registry
- Repos stamped with executionHostId; owner-host routing for github,
  hosted review, browser, diff comments, hooks, checks, terminals,
  file watching, activation
- Sidebar host scope strip + menu, host section rows, visibility filter
- Host-partitioned port scans with all-hosts aggregate projection

Typecheck, oxlint (touched files), and ownership/port suites green.

Co-authored-by: Orca <help@stably.ai>
2026-06-09 18:07:23 -07:00
Jinwoo HongandOrca 7ed829ee67 Recover corrupted terminal WebGL atlases (#5042)
Co-authored-by: Orca <help@stably.ai>
2026-06-09 13:52:58 -07:00
Brennan BensonandOrca 1e7e494e9a Add "Use Orca's browser" onboarding milestone (#4855)
Co-authored-by: Orca <help@stably.ai>
2026-06-09 13:50:46 -07:00
Jinjing f321ad50fe fix: address review findings (#5044) 2026-06-09 13:44:20 -07:00
Jinwoo HongandOrca a04e85c2d2 fix(browser): hide zoom percent after feedback (#5043)
Co-authored-by: Orca <help@stably.ai>
2026-06-09 13:43:56 -07:00
Jinjing 0ca2cb49ab Use scrollable hover cards for source control variable previews (#5029)
Replace the variable chip Tooltips with HoverCards to allow scrolling
through long prompt previews (such as the base prompt template).

* Pass action-specific base prompt previews (commit, PR, branch name)
  into the text generation dialogs to populate the variable chips.
* Style the hover cards to support vertical scrolling with a sleek
  scrollbar and update theme colors to match design guidelines.
* Add unit tests for the variable chips and dialog form behavior.
2026-06-09 13:38:16 -07:00
Jinwoo Hong c043939bf8 Fix project action menu click handling (#5041) 2026-06-09 12:55:17 -07:00
Brennan BensonandOrca 909128526c Refine stale-local-main toast: de-squish layout and clearer copy (#4930)
Co-authored-by: Orca <help@stably.ai>
2026-06-09 12:50:14 -07:00
Jinjing b7a4ece2a6 fix: address review findings (#5040) 2026-06-09 12:18:18 -07:00
5c31930e0e perf: speed up desktop startup (#4618)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
2026-06-09 12:15:04 -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
Jinjing ffe96c8f06 fix: remove amp archive flag (#5036) 2026-06-09 11:55:09 -07:00
Jinwoo HongandOrca 9369708f6b Add English localization infrastructure (#4995)
Co-authored-by: Orca <help@stably.ai>
2026-06-09 10:43:04 -07:00
Jinjing 39a7e057f0 Fix titlebar gap when sidebar is open but no worktree is active (#5030)
When on full-page views (like Tasks or Landing) with an open sidebar
but no active worktree, mirror the split-column titlebar layout.
This positions the left titlebar controls directly above the sidebar,
avoiding a layout gap and ensuring consistent visual alignment.
2026-06-09 10:06:52 -07:00
4d6c291eff fix(windows): stop main-thread PowerShell ACL storm on env-store reads (#5011)
* fix(windows): stop main-thread PowerShell storm on env-store reads

Two changes fix the v1.4.52+ Windows performance regression (#4901 regression
against #4840) where 49 powershell.exe processes were spawned in 27 seconds
during load, saturating the Electron main thread and causing black terminals
and runtimeEnvironments:call timeouts.

Root cause: `readEnvironmentStore` calls `hardenExistingSecureFile` on every
read. The env-store parent directory's mtime churns constantly (every secure
write updates it), so the mtime-keyed idempotency cache never matched →
`bestEffortRestrictWindowsPath` (powershell, ~1-1.5s synchronous) fired on
every call. After #4901, the remote-runtime tab-sync loop reads the store
~2×/s, turning sporadic mtime misses into a continuous main-thread storm.

Fix 1 – path-cached directory hardening: add `hardenedDirectoryPathsThisProcess
(Set<string>)` that caches directory hardening by PATH for the process lifetime.
A directory's required ACL does not change when its mtime changes; only file
hardening retains the metadata-keyed cache so post-rename inode changes are
detected correctly.

Fix 2 – async ACL application: replace `execFileSync(powershell.exe, ...)` with
`execFile` (fire-and-forget). PowerShell cold-start is ~1-1.5s; the function is
already named `bestEffortRestrictWindowsPath` so async/optimistic caching is
correct. `applySecurePathRestriction` returns `true` optimistically on win32 so
the cache entry is written before the background process completes.

Tests: new regression tests verify the directory is hardened exactly once even
when its mtime changes between calls, that unchanged files are not re-hardened,
and that ACL application goes through async execFile (not execFileSync).

* fix(windows): apply credential-file ACL synchronously on write path

Follow-up rigor on the env-store PowerShell ACL storm fix (#5006). The
read-path storm fix (path-cached async directory hardening + async file
re-harden) is retained, but switching ALL ACL application to async opened a
narrow Windows-only security window: because writeFileSync({mode}) is a no-op
on Windows, writeSecureFile returned with the credential file still carrying
the parent directory's inherited (broader) ACL for the ~1-1.5s PowerShell
cold-start, affecting the e2ee keypair, device registry, and runtime env auth
store.

Fix: apply the credential FILE's ACL synchronously (execFileSync) on the
infrequent write path, before the atomic rename publishes it, and cache the
path as hardened only on confirmed success so a failed apply retries. Keep the
DIRECTORY hardening async + path-cached for the process lifetime (that is what
killed the #4901/#5006 main-thread storm). The read path's existing-file
re-harden stays async + metadata-cached (fires at most once per file, no storm).

Also:
- Document the dir-path cache process-lifetime known limitation (deleted+
  recreated dir not re-hardened until restart).
- Remove the redundant double dir-cache write in writeSecureFile.
- Add docs/windows-secure-file-acl-hardening.md describing the sync-file/
  async-dir model and a manual Windows e2e test plan (the cross-platform
  Playwright harness runs on Linux and cannot reach the PowerShell path).

Tests (src/shared/secure-file.test.ts, 13 passing): credential file hardened
synchronously while dir stays async (no async file-ACL window); failed sync
file-ACL apply is not cached and retries; dir hardened exactly once across many
writes despite mtime churn; no PowerShell spawned on non-win32.

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

* fix: keep POSIX secure directory hardening metadata-aware

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-06-09 01:47:29 -07:00
98d02bca47 fix: support windows ssh hosts (#5004)
* feat: add windows ssh relay base support

* feat: support windows ssh relay runtime services

* fix: default windows ssh pty cwd to user profile

* fix: support windows hosts over system ssh

* fix: preserve degraded windows relay native deps

* fix: gate windows shell args by relay platform

* fix: preserve windows relay fallback pipes

* test: align windows native deps relay fixture

* fix: build valid windows install lock command

* fix: address windows SSH relay review findings

Resolve correctness, efficiency, and reuse issues found reviewing the
Windows SSH native-host support:

- GC liveness on Windows now probes the actual named pipe (via node
  net.connect against markers + deterministic candidates) instead of
  substring-matching Win32_Process command lines, which could remove a
  live relay dir. Reports ALIVE conservatively only when there is no
  liveness signal at all (no markers and no seed pipes).
- Resolve the remote node path once per deploy and thread it through
  install/repair/launch instead of re-resolving 3-7x.
- Replace the 200ms node -e poll loop with a single long-lived remote
  wait process during Windows relay startup.
- Skip the no-op executable command on Windows in uploadRelay.
- Make the Windows fallback pipe name deterministic and recoverable
  (drop the global counter), with an extra reconnect attempt.
- Normalize the prepended node bin dir to backslashes on Windows PATH.
- Batch the system-SSH Windows directory upload into a single streamed
  JSON package instead of one ssh process per file.
- Extract relay endpoint/marker helpers into ssh-relay-endpoints.ts and
  consolidate the PowerShell EncodedCommand encoding into the shared
  powershell-command-encoding module.

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

* Support cancellation and timeouts in Windows port scanning

- Propagate the request AbortSignal and a 5-second timeout to both
  PowerShell and netstat child processes during Windows port scanning.
- Avoid spawning the netstat fallback process if the port scan has
  already been aborted.
- Wrap the .NET OSArchitecture check in a try/catch block during SSH
  Windows platform detection to robustly fall back to environment
  variables if needed.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-06-09 01:17:34 -07:00
Neil 8ec5d599d0 Always open workspace composer before projects (#4991) 2026-06-09 00:27:39 -07:00
Jinjing 3411a75d96 Route GitHub work item queries through active runtime environment (#5000)
- Use the active runtime environment RPC for fetching, paging, and
  counting work items when available, falling back to local IPC.
- Scope in-flight work item request keys to specific environment targets
  to avoid incorrect deduplication during runtime transitions.
- Discard and skip writing work item responses to cache if the active
  runtime environment changed while the request was in flight.
2026-06-09 00:13:41 -07:00
Jinjing 27889edc01 Move worktree PR/MR unlink action behind a dropdown menu (#4998)
Keep the worktree details hover card visible while the review actions
dropdown is open. This change prevents the hover card from unmounting
when interacting with the portaled dropdown items, and adds support
for unlinking GitLab MRs with appropriate terminology.
2026-06-08 23:21:21 -07:00
Jinjing 7d353523d1 Add remote SSH file download (#4957)
* Add remote SSH file download

Implement the remote file download flow described in docs/remote-file-download.md, including main/preload IPC wiring, SSH provider support, file explorer UI actions, and tests.

* Add open action to download toast

* rm design doc
2026-06-08 23:12:01 -07:00
Jinwoo HongandOrca 400f3d7eaa Fix Linear issue reference links in descriptions (#4955)
Co-authored-by: Orca <help@stably.ai>
2026-06-08 21:59:29 -07:00
Neil 351e4508de Clamp right sidebar render width (#4948) 2026-06-08 21:52:56 -07:00
Jinjing bd0533cfe5 Fix active agent detection in split-pane layouts and support early hints (#4949)
* Detect active agents from title/launch hints before hooks report

* Fix active agent detection in split-pane layouts with lone background ti

* Probe runtime for manually started agents during note-send detection

- Query runtime via `terminal.isRunningAgent` to detect active agents
  before titles or status hooks have reported them.
- Extract active-agent-target resolution utilities and state selectors
  to a dedicated `active-agent-note-target.ts` file.
2026-06-08 21:52:19 -07:00
Jinwoo HongandOrca 699bcf6478 Fix remote runtime terminal rendering (#4946)
Co-authored-by: Orca <help@stably.ai>
2026-06-08 21:20:25 -07:00
Neil 85a5dc0a06 Fix create worktree focus ring clipping (#4940) 2026-06-08 20:31:40 -07:00
Jinjing fc850a3f4e Improve language in local-main sync suggestion toast (#4938) 2026-06-08 20:16:04 -07:00