Commit Graph
8330 Commits
Author SHA1 Message Date
Brennan Benson ade4e9d3e0 fix(project-groups): preserve repo owner routing 2026-08-10 21:32:04 -07:00
Brennan Benson aa5a1ceed3 fix(sidebar): close legacy folder owner gaps 2026-08-10 21:17:56 -07:00
Brennan Benson 2fcc829f25 test(sidebar): keep owner regression within gate 2026-08-10 20:49:26 -07:00
Brennan Benson 1cf1ea2dac fix(sidebar): retain legacy SSH folder rows 2026-08-10 20:44:32 -07:00
Brennan Benson 70132eca4c fix(sidebar): scope folder activity to owner 2026-08-10 20:37:34 -07:00
Brennan Benson 8468f940c2 fix(sidebar): reveal duplicate owner folder groups 2026-08-10 20:17:43 -07:00
Brennan Benson d87fc15f05 fix(sidebar): preserve filtered folder workspace rows 2026-08-10 19:59:53 -07:00
Brennan Benson 3663228541 fix(sidebar): scope folder-backed geometry by owner 2026-08-10 19:53:00 -07:00
Brennan Benson 2237947314 fix(sidebar): keep host-filtered project groups visible 2026-08-10 19:40:48 -07:00
Brennan Benson 8c066084aa fix(sidebar): preserve project group owner context 2026-08-10 19:17:17 -07:00
Brennan Benson 366b9ad692 fix(sidebar): guard duplicate-id context batches 2026-08-10 18:39:52 -07:00
Brennan Benson 564447c1e0 fix project group owner identity gaps 2026-08-10 18:14:11 -07:00
Brennan Benson bac084fcba fix sidebar project group owner identity 2026-08-10 17:26:25 -07:00
Brennan Benson 135c4611fe fix: close project group owner identity gaps 2026-08-10 16:54:16 -07:00
Brennan Benson de06dbb4f2 fix(sidebar): preserve folder workspace owner identity 2026-08-10 16:22:43 -07:00
Brennan Benson 0c9cbcb678 fix(sidebar): close remaining project group owner gaps 2026-08-10 15:45:54 -07:00
Brennan Benson dfdc6d1c63 fix(sidebar): preserve project group owner interactions 2026-08-10 14:51:25 -07:00
Brennan Benson bc1714b6f0 fix(sidebar): reconcile folder updates by owner 2026-08-10 14:00:28 -07:00
Brennan Benson ec33eef639 fix(sidebar): restore immutable host geometry 2026-08-10 13:43:46 -07:00
Brennan Benson d9d80e705f fix(sidebar): preserve folder owner row identity 2026-08-10 13:36:40 -07:00
Brennan Benson 2e0c0c0332 fix(sidebar): reject stale folder owners 2026-08-10 13:13:38 -07:00
Brennan Benson cd7cf2fd17 fix(sidebar): fail closed on ambiguous folder owners 2026-08-10 13:00:54 -07:00
Brennan Benson d83f9aae93 docs(issue-12532): reduced candidate report with gate counts 2026-08-10 12:30:36 -07:00
Brennan Benson 253f8c3f9e fix(sidebar): narrow owner-qualify same-id group identity
Disambiguate multi-host project groups and folder workspaces only at
catalog normalize, store CRUD, sidebar row keys, activation dual-read,
IPC, persistence, and filesystem-auth. Keep bare IDs when unambiguous
(including folder:folder-workspace-1); fail closed on collision. Leave
#13611 sticky geometry untouched and drop broad WorktreeCard/dashboard
session-routing propagation from the prior 66-file tip.
2026-08-10 12:30:33 -07:00
Brennan Benson d0271cb46f test(sidebar): lock host sticky geometry 2026-08-10 08:45:11 -07:00
Brennan Benson b5988ad1b4 fix(sidebar): stop multi-host header style collision on host collapse
Stamp hostId onto unscoped headers cloned into host sections so virtualizer
keys stay unique, and size host rows with HostSectionHeader's inner pt-1 so
sticky tier geometry matches paint when collapsing/expanding hosts.

Closes #12300
2026-08-10 08:29:02 -07:00
Neil 56b6d845e0 perf(relay): skip serialization without recipients (#13595) 2026-08-10 05:56:39 -07:00
Neil 158b575680 perf(orchestration): coalesce drift probes per dispatch tick (#13592)
* perf(orchestration): coalesce drift probes per dispatch tick

* fix(orchestration): preserve capacity after drift refusal
2026-08-10 05:56:01 -07:00
Neil 6206945c07 fix(native-chat): harden paginated history metadata (#13573) 2026-08-10 05:55:29 -07:00
Neil a63df91790 perf(renderer): gate remote session mirror scans (#13544) 2026-08-10 02:36:19 -07:00
Neil d15a554f62 perf(renderer): gate unread badge scans (#13554) 2026-08-10 02:34:54 -07:00
Neil 6cdd019367 docs(mobile): keep Android links on published release (#13565) 2026-08-10 02:22:35 -07:00
OrcaWinandOrcaWin fb3a3c5643 perf(native-chat): probe WSL transcript paths asynchronously (#13265)
* perf(native-chat): probe WSL transcript paths asynchronously

The WSL transcript resolvers probed `\wsl.localhost` UNC candidates with
existsSync. Those paths are served over 9P, so a stopped or unreachable distro
blocked the Electron main thread instead of falling through to the next
candidate.

- host-readable-transcript-path: the `pathExists` dep is now async, defaulting
  to fs/promises.access. The per-distro loop stays sequential — the ranked order
  exists so the owning distro wins, and probing every distro at once would fan
  9P calls out to ones the user deliberately left stopped.
- session-file-resolver: dropped the existsSync guard outright rather than
  converting it. walkSessionFiles already yields [] for a missing or unreadable
  root, so the guard was redundant as well as blocking.

* perf(native-chat): stop the resolve poll mkdir-ing the Codex runtime home

codexSessionsDirs() only needs the managed home's path to scan it, but called
getOrcaManagedCodexHomePath(), which mkdirSyncs. That put a synchronous fs call
back on the 500ms-5s resolve poll the surrounding async probe work just cleared,
and materialized the runtime home as a side effect of a read-only lookup.

Use the resolve-only variant the module already exposes for this case. A missing
root walks to no matches, so behavior is unchanged.

* perf(native-chat): gate WSL transcript fs access behind a shared queue

Serializes and dedupes WSL 9P filesystem probes (access/readdir) so a
stopped or slow distro can't exhaust the shared libuv threadpool or
block unrelated local filesystem work. Routes Codex session-tree scans
and path-existence checks through the new wsl-transcript-fs-gate,
while sharing in-flight scans across concurrent callers.

* perf(native-chat): prioritize exact WSL transcript probes over scans

- Add cancellation (AbortSignal) throughout session resolution and
  directory walking so an unsubscribed transcript watch stops
  in-flight WSL filesystem work instead of leaking it.
- Split the WSL fs task gate into exact vs scan priority lanes with
  per-route concurrency, so a live transcript access probe is never
  queued behind a directory scan on another distro/provider.
- Extract Codex WSL session path scanning into its own module that
  shares one root snapshot across concurrent session-id lookups and
  refreshes on a shared miss to see post-start file creation.
- Skip the async WSL probe entirely for local paths via existsSync.

* fix(native-chat): harden WSL transcript cancellation

* fix(native-chat): finish transcript cancellation

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-08-10 02:19:16 -07:00
Neil bbcf89e221 chore(mobile): prepare 0.0.43 releases (#13549) 2026-08-10 01:49:33 -07:00
Jinjing 418fbb3192 fix(mobile-ios): gate release on TestFlight distribution (#13419) 2026-08-10 01:47:36 -07:00
Neil eacb9a9fa4 perf(automations): keep output snapshot appends linear (#13469) 2026-08-10 01:36:08 -07:00
Brennan Benson 9060a88dde fix: contain unbroken dialog failure output (#13531) 2026-08-10 01:24:54 -07:00
Neil 131010277c [Perf-LH] Serialize relay JSON payloads once per publication (#13516)
* perf(relay): reuse serialized JSON payloads

* Defer bulk relay payload preparation until admission
2026-08-10 01:17:14 -07:00
d305e48547 fix(gitlab): guard against non-array API responses in MR/issue listing (#12911)
* fix(gitlab): guard against non-array API responses in MR/issue listing

fetchIssuesAsWorkItems and listMergeRequests parsed glab's JSON output
and called .map straight on it. When the GitLab API returns a JSON
object instead of an array (error body, unexpected shape) on a
successful exit, this crashed with a bare TypeError that got
misclassified as "Failed to load issues: JSON.parse(...).map is not
a function" instead of a useful message.

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

* fix(gitlab): cover listIssues and keep payloads out of error classification

The guard missed listIssues in issues.ts — the RPC-backed issue list that
produces the reported "Failed to load issues: JSON.parse(...).map is not a
function". Hoist the guard into glab-api-response.ts so both files share it.

The thrown message is fed to classifyGlabError, which substring-matches it.
A response payload is content, not a diagnostic: an MR titled "fix network
timeout" classified as network_error and the canned copy replaced the payload
the user needed. Report a GitLab error envelope by its own message, and mark
an opaque body so classification is skipped.

* test(gitlab): make the list-guard tests fail on the regressions they name

Two assertions were vacuous under mutation. The envelope test used a "403
Forbidden" message whose keyword matches earlier in the classifier chain than
its sibling payload, so leaking the payload into classification still passed;
it now uses a 404 envelope beside a "403 forbidden" sibling. No call-site test
carried a classifier keyword, so deleting the marker-error branch entirely
failed only one unit test; the MR API path now uses a keyword-bearing body.

Also give the non-list branch the same "Failed to load issues" prefix as every
other list error, cover the `{ error }` envelope field, and pin the thrown type.

* test(gitlab): pin the reported-payload bound

Removing the 300-char slice survived the whole suite, and the banner's
break-words now depends on it. Name the limit and assert both branches
truncate, plus the envelope falling through a blank message to `error`.

* test(gitlab): pin message-over-error envelope precedence

Swapping the lookup order passed the whole suite. Anchor the bound regex too
so it cannot match an incidental ": " near the end of a message.

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 01:10:12 -07:00
hwantageandBrennan Benson 14dc499aa5 fix(ai-vault): preserve agent metadata header on session row expansion (#10920)
* fix(ai-vault): preserve agent metadata header on session row expansion

* chore(tests): remove redundant comment in AiVaultSessionRow test

* test(ai-vault): add happy-dom environment and window.api shim to AiVaultSessionRow tests

* test(ai-vault): assert the expanded session row via the rendered row

Replaces the parallel static-markup harness and second fixture with the
file's existing Testing Library row render, so both suites share one
session fixture and one prop list. Raw HTML substring matches are gone:
the identity assertions now run inside the metadata grid, because the
details-toggle button's aria-label repeats the agent name and made the
old check pass with the fix reverted.

Tags the grid with a data-testid like the row's other query anchors
rather than walking up from a text node, adds cleanup() — the suite has
no globals: true, so rows leaked across tests — and guards that the
worktree badge renders once when expanded. SessionWorktreeLine loses an
export the row no longer imports.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 01:07:17 -07:00
ce3ec4d5ce fix(repo-icon): keep a renamed fork's own owner avatar (#12271)
* fix(repo-icon): keep a renamed fork's own owner avatar

Fork repos always took the upstream owner's avatar, so a renamed fork
showed its parent project's logo. Same-name forks (personal copies)
still prefer the upstream owner; renamed forks now keep their origin
owner across auto-detect, the startup backfill, and the settings
avatar refresh.

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

* fix(repo-icon): re-read repo state before backfill avatar write

The startup backfill computed icon updates from a pre-loop snapshot, so
an icon chosen in settings while the upstream/origin probes were pending
could be clobbered. Re-read the repo after the probes and only migrate
an icon that is still the auto-detected GitHub avatar.

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

* refactor(repo-icon): own the fork avatar rule in one shared selector

The renamed-fork rule was written out twice — once in the main-process
auto-detect and once in the renderer refresh — so the two copies could
drift. Move it next to `githubAvatarIcon` as `githubAvatarSlug`, which
collapses the renderer resolver to a single unbranched path.

Also stop swallowing a rejected origin probe: it cannot tell a renamed
fork from a same-name one, so degrading to the upstream owner would flip
a renamed fork's stored avatar back to the parent's. Letting it propagate
keeps the stored icon, matching how the non-fork path already behaved.

Adds coverage for the startup backfill, the third decision point the fix
claims, which had none.

* test(repo-icon): cover pending backfill icon change

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 01:06:32 -07:00
Brennan Benson 4e536a5232 Improve Agent Map hover and presence motion (#13407)
* feat(agent-map): improve hover and presence motion

* fix(agent-map): derive exiting popover state

* fix(agent-map): bound exit motion lifecycle

* perf(agent-map): avoid duplicate motion commits
2026-08-10 01:03:09 -07:00
Neil 75f5e2d964 perf(renderer): reuse prepared native chat messages (#13519) 2026-08-10 01:00:20 -07:00
Neil e78bf2b6ea [Perf-SS] Keep relay writer drains linear under deep backlogs (#13449)
* perf(relay): keep writer queue drains linear

* test(relay): cover replacement after consumed cursor
2026-08-10 00:59:51 -07:00
Brennan Benson 66aed16974 refactor(ui): consolidate toggle switches (#13432)
* refactor(ui): consolidate toggle switches

* fix(ui): label consolidated switches
2026-08-10 00:54:30 -07:00
Mark XianandBrennan Benson 80f23e31cb fix(file-explorer): open symlink files when stat fails (#11670)
* fix(file-explorer): open symlink files when stat fails

* fix(file-explorer): grant symlink targets path access on activation

Following a symlink out of the workspace was denied by the main-process
path allow-list, so both the stat and the file read failed. Activating the
row is explicit intent, so authorize the target the way terminal links and
Quick Open already do.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 00:53:54 -07:00
Neil c5023fa0ab perf(main): skip impossible advertised URL scans (#13514) 2026-08-10 00:29:26 -07:00
Doyoon LeeandBrennan Benson 33dad13e64 fix: wrap unbroken auto-rename failure output (#12317)
* fix: wrap unbroken auto-rename failure output

* test(sidebar): cover unbroken auto-rename failure containment

happy-dom does no intrinsic sizing, so assert the two declarations that
keep an unbroken token from widening DialogContent's grid column. The
test fails when either min-w-0 or overflow-wrap:anywhere is reverted.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 00:24:00 -07:00
Neil c498d763cd perf(renderer): unmount closed jump palette content (#13525) 2026-08-10 00:18:54 -07:00
Brennan Benson 8a3f704bd1 fix(agent-dashboard): highlight agents awaiting input (#13523)
* fix(agent-dashboard): highlight agents awaiting input

* test(agent-dashboard): cover status halo boundaries
2026-08-10 00:16:54 -07:00