lint-staged 16.4.0 walks the whole worktree several times before any
linter runs. On a cold stat cache that made small commits take over a
minute. Extend the existing lint-staged patch:
- getDeletedFiles: replace the serial `ls-files --deleted` with
`diff-files -D` (parallel preload, fsmonitor bypassed) plus
assume-unchanged entries, filtered by the same lstat rule, so the
deleted-file contract is unchanged.
- getUnstagedFiles: `status --untracked-files=no`; the `??` lines were
already discarded.
- config discovery: list tracked config files only. A nested config
must be tracked or staged to apply; untracked configs at the repo
root are still found.
Run lint-staged directly from the hook; husky already puts
node_modules/.bin on PATH, so `pnpm exec` only added startup time.
* perf(github): share and pace timed pull request reads on the host
Reuse exact completed results for automatic refreshes, back off unchanged
settled pull requests, and route server revalidation through the existing
host budget while preserving foreground reads and older clients.
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* fix(github): preserve shared producer settlement and selected demand
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* test(github): cover paired receipt retries and watch fairness
* test(github): explain shared fake-clock fixture
* test(github): typecheck host and renderer integration together
* test(github): name exported fixture mock types
* Revert "test(github): typecheck host and renderer integration together"
This reverts commit 756a38787c.
* test(github): place host and renderer loops in cross-layer suite
* fix(github): preserve refresh policy and shared callers
Use the same validated freshness for cached queue reads and their follow-up. Keep forced mergeability rereads and detach cancelled consumers independently from the shared lookup.
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* fix(github): refresh settled rows when exposed again
Use the same finite foreground age to admit and consume the queued read. A recent exact result can still satisfy it, and settled rows do not acquire a recurring timer.
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* fix(github): accept only current PR read completions
Keep shared publication and retry planning on the accepted actual read. Preserve legacy own replies, terminal loading and ordinary work after a superseded lookup, and honor the accepted error gate before automatic recovery.
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* test(github): follow moved request contracts
* test(github): explain the partial event fixture type assertion
* fix(github): preserve queued deadlines and detachable PR waits
* fix(github): compare refresh wakes on the elapsed clock
* test(github): format queued refresh deadline cases
* fix(github): charge actual producers and fence retry gates
* fix(github): preserve fresh intent and producer error policy
* fix(github): retain owned cold-read retry gates
---------
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
A tab a page opened with no gesture counted as the agent's only within the
agent's 20 s idle window, so a late open (an OAuth tab finishing after the
agent went quiet) switched the user's visible tab. Track, per guest, whether an
agent drove the page since the desktop user last gave it input, carry it into
popups the page opens, and keep such opens in the background.
A popup whose owner tab was gone handed any http(s) open to the system browser,
including agent, phone and scripted ones, which took the foreground. Only the
desktop user's own click opens it there now; the rest are reported blocked.
* feat(computer-use): scroll and select rows in background Linux windows, and aim GTK 4 pointer input
Scroll moves the nearest scroll bar's value by whole viewports, handing
the scroll outward at a view's end, or pages a web document with
Component.ScrollTo, before falling back to the pointer. A click on a
list row with no action selects it through the list's Selection when
the index is proven to name that row. GTK 4 rectangles come from
WINDOW extents plus the X11 client origin, since its SCREEN extents
read [0, 0, w, h].
* fix(computer-use): keep Linux background scroll and select honest under partial and slow results
Wait for ScrollTo to move before planning the next page, report pages
already scrolled instead of falling back, let refused scroll bars fall
through, clear a multi-select list before a plain-click select, accept
only an InvalidArgs refusal as index proof, bound child walks, and
read GTK 4 origins lazily.
* fix(computer-use): scroll the innermost Linux view that overflows, and bound the scroll search
ScrollTo now runs on each ancestor that overflows its own box, innermost
first, so an inner scroller moves before the page; coordinate scrolls
start from the deepest node under the point. Cap the scroll bar search
to small containers, report a document at its end as a no-op, keep
looking past an unusable spanning child, and look up GTK 4 window names
once per operation.
Keep the host cadence and completion owners while carrying the parent scheduling, pending wait and producer error fixes.
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
Keep one qualified foreground return after a delayed automatic read, preserve GitLab background guards, and use the existing fresh fetch path when the panel returns.
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* feat(settings): add per-project workspace cleanup rules to project settings
A project's settings get a Workspace cleanup section: Use global, Off, or
Custom rules seeded from the host's global rules, using the same rule rows
as the Workspace Cleanup page.
* fix(settings): compare a cleanup change against a fresh preview, not the cached one
A cached baseline can predate files that now protect a workspace, which
would hide it from the confirm. The host shares concurrent previews, so a
fresh read stays one evaluation.
* test(browser): measure agent input focus on the Windows desktop
* test(browser): show Orca inactive before the Windows holder takes the foreground
* test(browser): name the foreground window in Windows holder replies
* test(browser): lift the foreground lock before the Windows holder takes the foreground
* test(browser): run the Windows agent focus check from a dispatch-only workflow
* test(browser): skip the Windows focus checks before launch off hosted runners
* test(browser): harden the Windows focus holder and its dispatch workflow
* fix(computer): ask the user before retrying with --restore-window
Error hints, recovery steps, the skill guide and the CLI follow-up command
told agents to retry with --restore-window on their own, which raises the
target app and takes the user's screen. They now say to ask the user first,
stop recommending a restore just to observe, and fix stale per-platform
background claims.
* docs(computer): name the Linux keyboard gate and the Wayland limit
Pages outside an Orca pane (popups, serve pages) got native webContents.focus() on every agent press, which focuses and can raise their window. Emulate page focus instead, and focus natively only inside a window that already has focus.
* Add setup scripts for project group folder workspaces
* Align setup regression fixtures and catalog read validation
* Target the Advanced disclosure in group setup regression
* test: initialize project groups in worktree slice fixture
* Preserve group setup startup input across paired hosts
* Check paired group startup regression in cross-layer project
* Restore group setup settings when saving fails
* Wait for group agents to accept startup input
* Type the group startup readiness fixture foreground state
* Give group startup fixture mocks portable public types
* Reuse worktree startup for group folder setup
* Keep example shell regression while removing obsolete observer tests
* Complete launch runtime fixture PTY options
* Exercise terminal startup failure and worktree draft paste in parity tests
* Preserve repository type defaults for setup commands
* Reuse resolved executable paths for Mac process launches
* Keep synchronous launch wrappers covered by the ratchet
* Explain executable launch type assertions
* Remove resolved Git imports from the direct-launch baseline
* Keep native spawn cancellation on the native lookup path
* fix(mobile-relay): resolve on persistent 4404 and make deferral logs readable
* fix(mobile-relay): bound 4404 director resolves for a desktop that stays offline
Review follow-up:
- Resolve on the 2nd consecutive 4404 of an episode, then the 4th, 8th, 16th,
and never twice within 5 minutes per host. A sleeping laptop with a
foregrounded phone now costs 6 resolves in 30 minutes, not ~1 per 2 dials.
- If the director names the same cell and epoch, keep the normal 4404 wait:
no re-route and no immediate redial.
- The streak ends on any other outcome (including aborts), when the phone has
connected since the last 4404 (a direct-path win), or after a 2-minute gap.
- Clear the gate reprobe due time with its timer so the deferral log never
reports a stale remainingMs.
* fix(mobile-relay): double the gap between 4404 resolves while the desktop stays offline
The 5-minute floor alone set the pace (12 resolves/hour, forever). After each
resolve the minimum gap now doubles, 5 -> 10 -> 20 -> 40 -> 60 min, and
returns to 5 min after a successful relay dial or any connection. A laptop
asleep for two hours with the phone in the foreground costs 5 resolves.
* refactor(mobile-relay): namespace the supervisor's diagnostic log import to stay within max-lines
* fix(computer-use): keep Linux actions in the background unless the user allows a raise
Pointer fallbacks, scroll and drag no longer raise the target window and
warp the pointer without --restore-window; they refuse with
background_unavailable before sending anything. With the flag, the
target point is validated before the raise, a window on another
workspace is refused instead of switching the user's view, and the
pointer is put back afterwards.
Also refuse background clicks that open menus, keyboard-grabbing popups
or dialogs (ported from agent-desktop's foreground classifier), refuse
synthetic input on Wayland where it never lands, press Return through a
GTK entry's activate action, re-check focus and held modifiers while
typing, and report action.delivery from what happened.
* fix(computer-use): check the workspace before every Linux raise and release held buttons
Run the other-workspace check before GrabFocus too, raise before a
user-approved menu or dialog opener, validate a pointer target before
asking for the flag, count newly active app windows as foreground,
release synthetic buttons when input is interrupted, and stop typing
without an exception exit so the user's held keys are left alone.
* fix(computer-use): keep held modifiers from other X screens and settle remapped keys on early stop
* fix(computer-use): refuse a Linux raise when the target's workspace can't be read
* fix(relay): faster stall detection and a 60s retry cap when only the cell failed
Start the existing 3 x 8 s ping probe once a keepalive reply is 10 s overdue,
cutting silent-stall detection without shortening the keepalive interval or
tearing down on a single lost frame.
When the director answered and only the cell connect failed, cap the drain
retry at 60 s instead of 300 s. Director failures keep the full schedule.
* fix(relay): use the 60s cap only for a newly named failing cell
Every drain retry re-asks the director, so capping retries at 60 s for a cell
that keeps failing would raise director load for every host on that cell. The
short cap now applies only when the director names a cell that has not just
failed; the same cell failing again falls back to the full 300 s schedule.
* refactor(relay): keep retry-cap state next to assignment state
* fix(relay): give each failing cell the short retry cap once per episode
A director alternating between failing cells (A, B, A, B) kept the 60 s cap
forever because only the previous cell was compared. Track every cell that
failed since the last success; a repeat of any of them uses the full backoff.