Commit Graph
10162 Commits
Author SHA1 Message Date
gatsby74andJinjing 98d850aeba fix(settings): keep full installed font list (#7581)
* fix(settings): keep full installed font list

* fix(settings): bound font picker rendering

* Fix redundant font queries and handle partial state in worktree purge

- Latch the loaded state even when the returned font list is empty, preventing font-less systems from reissuing font listing calls on every picker interaction.
- Add null-tolerance for `ptyIdsByTabId` when building worktree purge state to support callers that pass partial AppState.

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-06 20:21:58 -07:00
Jinwoo HongandOrca a6cbd3102a fix(terminal): repaint revealed panes stuck behind xterm's paused-render gate (#7614)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 20:17:35 -07:00
Neil 86f404ef53 perf(native-chat): byte-cap the transcript read-cache to bound RSS (GB-scale leak) (#7625) 2026-07-06 19:08:42 -07:00
Jinjing 4cbf699360 fix: quote queued OMP resumes for Windows shells (#7628) 2026-07-06 18:41:32 -07:00
PP 0b4196fc17 fix(ssh): stop deleted ~/.ssh/config hosts from reappearing on sync (#7302)
Deleting a config-sourced SSH target had no lasting effect: the Manage-SSH pane
re-imports ~/.ssh/config on open, and the import was a pure upsert with no record
of deletions, so the just-deleted host was re-inserted verbatim from the config
that still exists on disk.

Persist a `deletedSshConfigAliases` tombstone set:

- Deleting a config-managed target (source 'ssh-config', or an adopted legacy
  import) records its alias; manual targets are never tombstoned.
- The passive on-open sync skips tombstoned aliases, so a deleted host stays
  deleted.
- Re-adding or editing a target reclaims its alias, and the explicit Import
  action (`reAdopt`) clears all tombstones to deliberately re-adopt config.

This also fixes the edit-then-reappear case: editing a config host to `manual`
already reserved its current alias, and reclaim covers alias changes.
2026-07-06 18:35:42 -07:00
51c3849a00 fix(github): route PR merges through repo owner (#7590)
* fix(github): route PR merges through repo owner

- Use repo-owner runtime settings before source-context overrides in PR actions
- Keep headless/runtime repos on runtime RPC instead of local gh:mergePR
- Add source-boundary coverage for merge routing and Windows-safe newline matching

* fix(github): preserve repo-owner merge routing

- Apply task-source runtime overrides only when they resolve to a runtime host
- Keep runtime-owned repos from being downgraded to local gh:mergePR
- Guard the routing contract with source-boundary coverage
- Important because non-runtime source contexts could recreate the issue #6957 access-denied path

* test(github): add behavioral regression test for repo-owner merge routing

Mirrors PRActionsPanel's merge-routing decision through the real
repo-runtime-owner/task-source helpers so a revert to source-only
routing (issue #6957) fails here. Covers the runtime-owned repo with a
local GitHub source view and the local-repo-while-runtime-focused case.

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-06 18:34:02 -07:00
Jinwoo-HandOrca d84041c52a test: lock composer agent-detection host precedence for runtime repos (#7082)
Regression guard for the runtime-agent-list fix: asserts the composer's
detectedAgentList selector and detection effect resolve SSH -> runtime ->
local in that order, so a runtime-owned repo shows the paired runtime's
agents instead of the local machine's.

Co-authored-by: Orca <help@stably.ai>
2026-07-06 18:13:55 -07:00
Eren Çakar 1886ea27f7 fix: use runtime agent IDs in workspace composer (#7082) 2026-07-06 18:13:55 -07:00
f61500280b feat(ai-vault): add OMP sessions to the AI Vault session browser (#7618)
* feat(ai-vault): add OMP sessions to the AI Vault session browser

Adds OMP ("Oh My Pi") to the AI Vault/Agents catalog so historical
.omp/agent/sessions/**/*.jsonl transcripts are discovered, parsed, and
resumable from the right-sidebar session browser — locally and over SSH.

- Discovery mirrors Pi (OMP_CODING_AGENT_DIR env, WSL home roots, per-agent
  limit) in both the local scanner and the remote/SSH scanner.
- Parses OMP's message-graph JSONL via the shared graph parser (new
  MessageGraphAgent type), capturing the model from model_change.model (OMP's
  key, not Pi's modelId) or the assistant message, and tokens from usage.
- Routes OMP through the incremental parse cache so ~5s rescans resume from
  the last byte instead of re-reading whole transcripts.
- Resumes by absolute transcript path (`omp --resume <path>`) so it resolves
  regardless of which session-dir root (custom OMP_CODING_AGENT_DIR / WSL
  store) the file was discovered under; threaded through both the scanner and
  the renderer's local resume/copy rebuild.
- Renderer reuses the existing OmpIcon/catalog/grouping; adds overflow-x-hidden
  so long worktree chips never widen the sidebar.

Generalizes normalizePiSessionsDir -> normalizeAgentSessionsDir. Verified
end-to-end against 10 real ~/.omp transcripts and rendered in the app.

Co-authored-by: gatsby74 <166927047+gatsby74@users.noreply.github.com>

* fix: make AI Vault parse-cache agent switch explicit

---------

Co-authored-by: gatsby74 <166927047+gatsby74@users.noreply.github.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-06 18:03:36 -07:00
Neil e30f9d36f2 perf(renderer): purge seven per-tab/per-pty terminal maps on bulk worktree removal (#7613) 2026-07-06 17:57:31 -07:00
Brennan BensonandOrca 9a3bf1293c Mobile file tree follow-ups: reconnect no-blank + old-desktop files.list fallback (#7599)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 17:13:21 -07:00
NeilandOrca f311307560 Add max-lines ratchet CI gate to block new line-limit bypasses (#7608)
oxlint already fails any file over max-lines that is not suppressed, so the
only way to grow past the budget is to add an eslint/oxlint-disable max-lines
comment or a per-file max-lines bump in mobile/.oxlintrc.json. This adds a CI
gate that freezes the current set of suppressions (config/max-lines-baseline.txt,
355 grandfathered entries) and fails the build when a NEW one appears — with a
loud, actionable message pointing at 'split the file'. Existing oversized files
are untouched; the baseline may only shrink (pnpm check:max-lines-ratchet --prune).

Wired into the root lint script and as a dedicated pr.yml step. Unit-tested
(15 cases) and verified against all three failure paths + clean-tree pass.

Co-authored-by: Orca <help@stably.ai>
2026-07-06 17:12:27 -07:00
Jinwoo HongandOrca 9bed9bbd34 perf(ssh): bound relay bulk-stream backlog so PTY echo is not head-of-line blocked (#7601)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 17:10:04 -07:00
Jinjing 7c7ffd64ad docs: update Android APK release link (#7609) 2026-07-06 17:06:17 -07:00
NeilandOrca 6ebe352f36 perf(renderer): project TabBar's agent-status subscription to stable agent types (#7559)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 17:03:44 -07:00
Brennan BensonandNeil f5d1a9d549 fix(agent-status): cap retainedAgentsByPaneKey to stop renderer heap OOM (#7528)
retainedAgentsByPaneKey snapshots a completed agent (a full AgentStatusEntry
— up to ~24KB of prompt/message text — plus a TerminalTab) per ephemeral
paneKey. paneKeys never recur, and the map is pruned only on worktree removal
or manual dismissal, so a long-lived worktree in a busy multi-agent /
orchestration session grows it without bound. This is the dominant
large-payload driver of the renderer JS-heap OOM seen in the Windows crash
bundles (heap climbing to the 3586 MB V8 old-space limit under continuous
multi-agent work).

Cap the map with insertion-order (== retention-order) FIFO eviction, mirroring
capRecordByInsertionOrder in github.ts: the newest completions survive; the
oldest simply stop showing in the recently-completed overlay. retainAgents is
the only path that grows the map, so capping there fully bounds it.

Adds a leak regression test that drives the production retainAgents path with
distinct ephemeral paneKeys and asserts the map stays bounded — fails before
this change (grows to N), passes after (capped at MAX_RETAINED_AGENTS).

Co-authored-by: Neil <neil@stably.ai>
2026-07-06 16:57:54 -07:00
NeilandOrca 459b8ecbee perf(renderer): gate CodexRestartChip's store subscriptions on restart-notice existence (#7560)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:48:45 -07:00
NeilandOrca d39812f98d perf(renderer): LRU-bound the native-chat composer scope caches (#7566)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:46:04 -07:00
NeilandOrca e82eb82716 perf(renderer): purge sparse-preset maps when a repo is removed (#7564)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:45:29 -07:00
NeilandOrca 39dbab41d8 perf(renderer): purge three orphaned tab/worktree module maps on removal (#7562)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:44:58 -07:00
NeilandOrca aa3936c1e0 perf(main): bound agent-hook closed-tab suppression set (#7561)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:44:18 -07:00
NeilandOrca c4c934cf7c perf(main): bound authorized-external-path set with LRU eviction (#7556)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:43:43 -07:00
NeilandOrca ec52db6d20 perf(main): drop localhost label routes when a worktree is removed (#7557)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:43:05 -07:00
Brennan BensonandOrca 7237c8e592 Route title-status consumers through one pane-agent-evidence seam (title evidence plan, PR 2) (#7600)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 16:39:20 -07:00
github-actions[bot] ee2e3a30a5 release: v1.4.126 v1.4.126 2026-07-06 22:59:57 +00:00
Brennan BensonandOrca 99ae2dc90f Show full workspace file tree on mobile (#7289)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 15:41:51 -07:00
Brennan Benson a393facef8 Keep the Peek References scrollbar visible (#7584) 2026-07-06 15:28:09 -07:00
Jinwoo HongandOrca bc84f4b04b Speed up startup with deferred remote catalogs (#7087)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 15:15:15 -07:00
github-actions[bot] 014fd3cf26 release: v1.4.126-rc.0 v1.4.126-rc.0 2026-07-06 22:14:09 +00:00
Brennan BensonandOrca 16439fd499 perf(ai-vault): extend incremental transcript parsing to all append-only JSONL agents (STA-1417) (#7593)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 15:13:00 -07:00
Jinwoo HongandOrca 417723411e perf(source-control): stop gh rate-limit storms and idle git-status spawn churn (#7595)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 15:12:56 -07:00
Jinwoo Hong 377bde351c Bridge WSL Codex sessions into runtime home (#7477) 2026-07-06 15:11:48 -07:00
Brennan BensonandOrca 6aed5c1122 Gate the Gemini GPU fallback on pane-owner evidence instead of raw title text (title evidence plan, PR 1) (#7458)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 15:01:06 -07:00
Dzmitry Bachko 47feae3fb3 fix(settings): portal the IDE Font dropdown outside the settings section
Fixes #7585
2026-07-06 13:46:50 -07:00
NeilandOrca 63384d0497 perf(renderer): gate the jump palette's status-map subscriptions while closed (#7558)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 13:31:08 -07:00
github-actions[bot] 28495f6036 release: v1.4.125 v1.4.125 2026-07-06 20:25:41 +00:00
github-actions[bot] d8ed41f74c release: v1.4.125-rc.2 v1.4.125-rc.2 2026-07-06 18:27:45 +00:00
Brennan BensonandOrca 34a254956e perf(ai-vault): reuse and incrementally parse session transcripts across scans (STA-1278) (#7525)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 11:09:44 -07:00
github-actions[bot] 883b56be6e release: v1.4.125-rc.1 v1.4.125-rc.1 2026-07-06 17:50:35 +00:00
github-actions[bot] 057db5b287 release: v1.4.125-rc.0 v1.4.125-rc.0 2026-07-06 17:14:30 +00:00
Brennan BensonandOrca fbaf3f7d81 Stop terminal flicker during active Claude Code sessions (#7540)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 10:11:27 -07:00
Rod Boev 4f284652c8 fix(orchestration): stop coordinator message auto-submit (#7391) 2026-07-06 10:05:03 -07:00
Trevin ChowandJinjing cd3d0e99db fix: add view file action to file context menu
* fix: add view file context menu action

* Address PR review feedback (#4620)

- Localize the View File context menu label

- Update file explorer virtual row test fixture

* test: cover view file context menu visibility

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-06 10:03:43 -07:00
github-actions[bot] 9d9ebe69af Update README downloads badge 2026-07-06 13:32:45 +00:00
NeilandOrca b41cab1a9e fix(renderer): raise renderer V8 heap toward the 4GB pointer-compression cage (#7531)
* fix(renderer): raise renderer V8 heap toward the 4GB pointer-compression cage

Renderer OOM ('renderer crashed'/'oom', exit 5 / 0xE0000008 / SIGTRAP) is the
dominant crash in the crash channel: the renderer JS heap reaches Chromium's
default V8 old-space ceiling (~RAM/4) and V8 aborts. Two adversarial leak hunts
(13 agents across every renderer subsystem) found no unbounded GB-scale leak, so
this is a capacity ceiling, not a leak.

Chromium sizes the renderer heap at ~RAM/4, leaving 8-15GB machines well under
V8's ~4GB pointer-compression cage (an 8GB machine caps near 2.2GB). Reclaim that
unused headroom via --max-old-space-size in a focused startup module, gated on
physical RAM (>=8GB, ~40% of RAM, floor 3072MB, capped at the real 4096MB cage).
16GB+ machines are already at the cage so this is a no-op for them; low-RAM
machines keep the default to avoid trading a clean OOM for OS memory-pressure
kills.

Overridable with ORCA_RENDERER_HEAP_MB (number to force, default/off/0 to opt
out). Verified on Electron 42.3.3: the main-process js-flags switch propagates to
the renderer V8 and is honored up to the 4096MB cage (5000/12288 -> 4096).

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

* fix(renderer): address CodeRabbit — floor-to-0 override + Linux 8GB gate

- parseRendererHeapOverrideMb: a fractional override in (0,1) floored to 0 and
  emitted an invalid --max-old-space-size=0; treat floored-to-0 as an opt-out.
- Lower the RAM gate from 8 to 7.5 GiB: os.totalmem() on Linux reports MemTotal
  (excludes kernel/firmware-reserved RAM), so a real 8 GB box reports ~7.7 GiB
  and was wrongly excluded from the headroom — the exact crashing population.
  7.5 still cleanly excludes 6 GB machines (report ~5.7 GiB).

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-06 02:13:10 -07:00
NeilandOrca e33b2006f4 Remove stale max-lines lint disables from files under the limit (#7548)
110 files carried an eslint/oxlint-disable max-lines directive but are
already under the default max-lines budget (300 .ts / 400 .tsx / 600 .mjs
/ 800 test), so the suppression is dead. Removing it restores real
max-lines coverage on these files with zero behavior change.

Each removed directive had max-lines as its only rule; verified via a
full oxlint run (0 max-lines violations, 0 new errors). Diff is pure
deletions (200 lines, 0 additions) — no code touched.

Co-authored-by: Orca <help@stably.ai>
2026-07-06 02:12:32 -07:00
NeilandOrca dfc839fcb5 perf(renderer): gate WorktreeCardAgentsBody's send-target subscriptions (#7545)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 02:01:14 -07:00
NeilandOrca 2e44f72755 perf(main): stop allocating a debug snapshot on every PTY delivery event (#7541)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 02:00:29 -07:00
NeilandOrca b38f5babb4 perf(renderer): pause the shared useNow clock while the window is hidden (#7537)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 01:59:41 -07:00
NeilandOrca 82a59f8822 perf(renderer): purge pane-expand maps on worktree removal (#7534)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 01:58:32 -07:00