2058 Commits
Author SHA1 Message Date
OrcaWinandOrcaWin 09eb18d5c4 test: remove low-value onboarding, editor and plugin cases (#42344)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-14 01:38:27 -08:00
OrcaWinandOrcaWin d1c5b25d11 test: remove low-value permission and editor suites (#42341)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-14 01:18:14 -08:00
OrcaWinandOrcaWin 856c91bba2 test: remove low-value native, extension, and editor suites (#42333)
* test: remove native policy and wrapper test suites

* test: remove low-value extension and editor fixture suites

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-14 01:01:36 -08:00
Neil c6ee2a7ad6 refactor(projects): group project surfaces by feature owner (#42339) 2026-11-14 00:50:10 -08:00
Neil 6dfb813504 refactor(sidebar): group panels and review state by owner (#42332) 2026-11-14 00:32:01 -08:00
OrcaWinandOrcaWin 120e55a818 test: remove low-value removal and lifecycle examples (#42329)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-14 00:18:39 -08:00
Jinjing 924887bd44 Update E2E tests for project menu and startup readiness (#41923)
* test: update e2e project entry and readiness

* ci: keep targeted e2e launches in background
2026-11-13 23:39:26 -08:00
Neil 48e3da9231 refactor: organize editor document and viewer modules (#42310) 2026-11-13 23:36:10 -08:00
OrcaWinandOrcaWin a899d48611 test: remove mock-only suites and brittle harness assertions (#42281)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 20:32:47 -08:00
Neil cee89b8f62 chore(e2e): use compact dot reporter when an AI agent runs Playwright (#42267) 2026-11-13 19:54:09 -08:00
Kelvin Amoaba a406364654 fix(computer): click, set and scroll Windows buttons, text boxes, combo boxes and lists without bringing the window forward (#42237)
* fix(computer): press, set and scroll Windows native controls without activating the window

Measured on Windows CI: UI Automation's Invoke, Toggle, ValuePattern and
ScrollPattern focus a background WinForms control first, which activates its
window. Native controls now go through their own messages instead, each
owner-checked: BM_CLICK for buttons, check boxes and radio buttons, select-all
plus EM_REPLACESEL for set-value on edits, CB_SETCURSEL with CBN_SELCHANGE for
combo boxes (exact-text match, read back after the app's handler runs) and
LB_SETTOPINDEX for list box pages.

* fix(computer): refuse read-only Windows documents before typing keys, document the caret fallback

* fix(computer): keep Windows native routes to measured controls and refuse partial writes

BM_CLICK only for WinForms buttons, multi-column lists stay on ScrollPattern, a
list already at its end reports success, edits refuse text past their limit,
the combo's owner is checked right before the selection, a cleared selection
reads as a mismatch and a disabled control is element_not_enabled.

* fix(computer): hold Windows edit limits without a readback, require a complete combo search

* fix(computer): read a long Windows edit's length from the field for its limit check

* test(computer): share the Windows fixture action helpers
2026-11-14 02:45:10 +00:00
Kelvin Amoaba f49eb51f95 feat(computer): launch-app starts desktop apps without taking the foreground (#42197)
* feat(computer): add launch-app to start apps without taking the foreground

* fix(computer): leave running apps alone and keep the launch env clean

* fix(computer): recheck aliases, keep focused launches visible, refine launch hints

* chore(computer): document the launch result casts

* test(computer): check launch-app reports where the app ended up on Windows CI

* docs(computer): point app_not_found at launch-app

* test(computer): format the merged Windows background e2e

* fix(computer): match launch paths to the running file and word background launch as an attempt
2026-11-14 02:11:33 +00:00
Vitalii KulishandNeil 762f7bf6a7 fix(source-control): open another workspace from the branch picker like the sidebar (#41930)
Open workspace in the branch picker, Git Graph's open-workspace action and
the folder workspace Source Control header called the raw setActiveWorktree.
A workspace whose tabs were closed on purpose then had no surface and the
window stayed blank. Use activateAndRevealWorktree with the user-open intent,
the same activation the sidebar uses, while keeping the sidebar filters.

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-11-13 17:54:25 -08:00
Kelvin Amoaba e2fb873c0a fix(computer): type into Windows text boxes without bringing the window forward (#42165)
* fix(computer): type into Windows text fields without raising the window

Adds type-text --element-index on Windows through EM_REPLACESEL for user32,
RichEdit and WinForms edits (owner-checked, read back with WM_GETTEXT), or a
ValuePattern write merged with the TextPattern selection. Keyboard verbs on a
background window now refuse with background_unavailable before sending
anything and point at type-text --element-index. Foreground typing uses one
SendInput KEYEVENTF_UNICODE batch instead of WM_CHAR posted to the top-level
window, and get-app-state shows multiline edit text again.

* fix(computer): refuse typing into Windows list items, keep the caret on a confirmed prefix
2026-11-14 01:28:30 +00:00
Kelvin Amoaba 80a514cfb6 fix(browser): stop agent CLI clicks over --environment from moving the desktop (#42205) 2026-11-14 00:51:47 +00:00
Brennan BensonandJinjing a36620afd0 perf(github): share automatic PR reads and reuse the host budget (#42033)
* 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>
2026-11-13 16:33:07 -08:00
Kelvin Amoaba 5a14019c15 test(browser): check on Windows that agent browser input leaves the user's app in front (#42194)
* 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
2026-11-14 00:00:31 +00:00
Brennan Benson 03c828eece Run setup scripts for project group folder workspaces (#41744)
* 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
2026-11-13 15:37:54 -08:00
Neil 54590ba35e refactor: organize terminal store modules by lifecycle owner (#42124)
* refactor: organize terminal store modules by lifecycle owner

* fix: align retirement validation with moved owners
2026-11-13 13:19:21 -08:00
Neil 587562e862 refactor: organize shared sidebar list modules by domain (#42107) 2026-11-13 12:12:51 -08:00
OrcaWinandOrcaWin 65055509d6 test: remove low-value mobile suites and redundant native input coverage (#42098)
* test: remove low-value mobile and native input cases

* test: prune redundant mobile suites and verify native receiver contents

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 10:48:53 -08:00
OrcaWinandOrcaWin 8e604e2f57 test: trim duplicate mobile and internal fixture assertions (#42094)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 10:27:01 -08:00
Neil 2db7499ae2 refactor: group runtime-environment IPC by ownership (#42081) 2026-11-13 09:35:54 -08:00
Neil 075d6b3b50 refactor(rpc): group request contracts by feature owner (#42063) 2026-11-13 08:21:31 -08:00
Kelvin Amoaba a1001409ff feat(browser): a server agent's new tab opens on the paired desktop (#41989)
When a desktop is paired, a tab the server's own agent opens (orca tab create
with no placement) goes on that desktop as a This-device page; otherwise it
stays in the server's own browser. orcad engine tabs reach no client, so on
Linux servers agent tabs were invisible even with a desktop paired.

With a browser of its own to fall back on, the server asks a desktop each time:
a desktop on "Server (streamed)" declines and the tab streams, and a desktop
that does not answer (asleep or gone) leaves it on the server after the
request times out.
2026-11-13 15:49:53 +00:00
Neil 6775615ce4 refactor(preload): organize API modules by feature owner (#42051) 2026-11-13 07:37:49 -08:00
Neil 8dd3b71090 refactor: organize mobile files and host-screen domain owners (#42019) 2026-11-13 05:10:41 -08:00
Neil e81a89c5ff refactor: group Jira and Linear task-page modules by domain (#42009)
* refactor: group Jira and Linear task-page modules by domain

* refactor: remove orphaned Linear refresh test entry
2026-11-13 04:31:03 -08:00
OrcaWinandOrcaWin 2f9b122201 test: remove native smoke and duplicate input checks (#42007)
* test: remove repeated focused Linux text insertion

* test: remove repeated foreground TextEdit replacement

* test: remove Notepad smoke and duplicate paste coverage

* test: drop repeated numeric row and scroll-work counters

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 04:23:13 -08:00
OrcaWinandOrcaWin a3be49edd4 test: remove Calculator smoke and redundant coverage (#42000)
* test: remove weak native smoke and repeated writer coverage

* test: focus packaged PTY coverage on output and exit delivery

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 04:04:33 -08:00
Kelvin AmoabaandWooseong Kim eb1486c3ee fix(browser): open popups and new-tab links from This-device pages (#41973)
Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-11-13 10:49:45 +00:00
Kelvin Amoaba 51d0c97e39 fix(browser): publish title, loading and history state for server-run browser tabs (#41952)
Streamed (offscreen) pages only republished their session-tab row on commit,
in-page navigation, first favicon and load failure. A title parsed after
commit, a live document.title change and the end of a load never reached the
desktop tab strip or the phone, and the row hardcoded loading and back/forward
as false. Publish title and load-state changes through a per-page coalescer
and read real loading and history state into the row.
2026-11-13 10:23:30 +00:00
Brennan Benson 560643500c Show remote files created while a restarted host's watcher starts (#41874)
* fix(explorer): resync a recovered remote watch only after the host watcher is installed

The contact-regained resync fired when the files.watch subscription was accepted, before the
restarted host reported its watcher ready, so a file created in that gap was neither in the
re-read listing nor reported by the watcher. The managed-orcad explorer recovery spec now waits
for that resync before writing its probe file.

* fix(explorer): re-read a recovered remote explorer once when its host watcher fails to install

* test(explorer): the recovered watch resyncs after its ready signal

* fix(explorer): re-read a remote watch on acceptance and again once its host watcher is installed

A recovered watch re-reads when the restarted host accepts it, so outage changes
still appear if the watcher install stays pending, and again on ready so writes
made before the install appear. A first subscription also re-reads on ready,
which replaces the trimmed-watch first-ready catch-up for remote targets.

* test(explorer): the recovered explorer shows a file written while the host watcher installs

Counting resyncs is not an install barrier: two recovery attempts can both
re-read on acceptance before any watcher exists, and a ready that lands before
acceptance re-reads once. Assert the user-visible result instead, which holds
for any order of acceptance, install and the write.
2026-11-13 01:41:32 -08:00
Neil e7288d7ea5 refactor: group new-workspace modules by domain (#41905) 2026-11-13 00:46:08 -08:00
OrcaWinandOrcaWin fd8c3da20a Simplify delete dialogs and make button states visible (#41870)
* fix: simplify delete dialogs and clarify control interaction states

* fix: preserve bulk delete context and update dialog e2e flows

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 00:12:38 -08:00
Neil d2e2c788a5 refactor: organize WSL guest modules by concrete ownership (#41852)
* refactor: organize WSL guest modules by concrete ownership

* chore: link historical relay evidence to the moved command

* chore: prune retired guest test timing debt
2026-11-12 22:49:12 -08:00
OrcaWinandOrcaWin aa736b6650 test: remove narrow mobile and settings navigation samples (#41818)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 20:49:14 -08:00
Neil 2050d9fbc6 refactor: group source-control modules by operation ownership (#41812) 2026-11-12 20:41:35 -08:00
Neil cc29ae4820 refactor: organize provider modules by defining owner (#41772)
* refactor: organize provider modules by defining owner

* refactor: bind cleanup runner to provider owners
2026-11-12 20:04:13 -08:00
Brennan Benson a37ff2fa62 Show matching settings as a results list in Settings search (#40852)
* Show matching settings as a results list in the Settings sidebar

Typing in the Settings search now replaces the nav with a ranked list of
individual settings (pane title on the second line, matched text marked).
The first result is selected and previewed: its pane opens unfiltered,
scrolled to the setting with the target highlight. Arrow keys move and
preview, Enter or a click picks and keeps the query, Esc or the clear
button returns to the nav while leaving the shown pane open.

The sidebar query no longer filters page content. The Back to app row is
now 48px so its border lines up with the Settings header.

* Highlight settings search targets with a full-bleed bar and find unanchored rows

Matches in the results list are marked with semibold text (the jump palette's
HighlightedText) instead of a grey box. The landed-on row gets a tint from card
edge to card edge with a left bar that fades after ~3s, replacing the inset
grey block that sat off-center in the card padding. Integration provider rows
get anchors, and rows not wrapped in SearchableSetting are found by their
visible label.

* Fit the search highlight to each row's enclosing card

Settings cards pad differently (groups, plain sections, shadcn cards, the
Appearance accordion), so the highlight now measures the gap from the row to
its nearest card's inner edges instead of assuming one gutter. A group title
match highlights that group's card rather than the heading text.

* Give the settings target highlight a single owner

Components applied the highlight through SettingsTargetHighlightContext while the
page effect applied it to whatever element the jump scrolled to; when those
differed (Jira's provider row vs. its card shell) two highlights showed. The
effect now owns it alone, and the context, its provider and the macOS
Permissions prop are removed. Jira and Linear reuse their existing anchor ids.

* Use a plain fading tint for the settings target highlight

Drops the left bar; the tint still spans the enclosing card and fades after ~3s.

* Mark settings result titles with the ranking fold

The title highlight lowercased by hand and skipped titles whose length changed,
so İstanbul matching "stan" (or a query of İ) ranked but was never marked. Fold
per code point with the ranking's own fold and map offsets back to the title.

* Make settings search list-only until a pick and reveal collapsed targets

Typing now only changes the result rows: nothing is selected and the page does
not move until Enter or a click (arrows move the selection only). This removes
previews that discarded the Open in draft, re-ran repo hook checks, mounted a
pane per keystroke and drifted after deep links.

- Rank once on a deferred query, cap the list at 50 with a 'keep typing' hint,
  and skip rendering the normal nav while searching.
- A settings jump dispatches a reveal event from its target; Appearance sections,
  Advanced disclosures and the network/mobile collapsibles (now kept mounted)
  open themselves instead of reading the search query.
- Nested scrollers (Shortcuts) scroll the target into view; General sub-page
  results open their page; mirror recovery deep-links to the mirror field; a
  target that never mounts drops its pending jump; group-title matches use
  data-settings-group.

* Fix follow-ups from the settings search repair review

- Two more e2e specs pick a result with ArrowDown + Enter instead of relying on
  typing to navigate.
- After a jump reveals a growing section, re-scroll once if the row is still cut off.
- Hide 'No settings match' while the deferred ranking catches up.
- The reveal hook is a ref callback so disclosures that mount later still open.
- The Advanced disclosure fixture shows the real forced-open case (unsaved edits).

* Give every settings search result a reachable row

* Type the General sub-page anchors as a list instead of casting map entries

* Keep the reveal callback ref out of render

* Match the e2e shortcut labels to main's sentence-case names

* Highlight the result's card, not its section title or a bare label
2026-11-12 19:39:39 -08:00
Neil 69dc20ed33 refactor(automations): group run lifecycle modules by ownership (#41737) 2026-11-12 17:44:20 -08:00
Kelvin Amoaba c5657bd5a7 feat(computer): type into a named text field without focusing it on Linux and macOS (#41421)
* feat(computer): type into a named text field without focusing it on Linux and macOS

* fix(computer): report unconfirmed Linux text readback and cover element typing

* test(computer): send an element with benchmark text only for targeted typing

* test(computer): pick gedit's editor, not its hidden overview map, in Linux e2e

* docs(computer): confirm focus before the unindexed type-text fallback

* fix(computer): report unreadable element text readback as readback_unsupported
2026-11-13 00:28:06 +00:00
Neil f9c7d17f9d refactor: organize sidebar inputs by concrete owners (#41698) 2026-11-12 16:24:24 -08:00
Jinjingandalpenshtokk 7fa2c6e075 fix(tab-group): keep split dividers draggable beside a browser group (#41335)
* fix(tab-group): track divider drags by pointer and keep guests click-through

When a divider drag's first move lands on a browser page, the guest's
process takes that event and every later one, so pointer capture never
activates and the divider stays stuck in is-dragging. Hold webview drag
passthrough for the whole gesture, as the pane-divider, tab and DevTools
dock drags already do.

Linux Chromium can report hasPointerCapture() false while moves still
arrive (#34287), so own the gesture by pointerId with window-level
listeners, and end it on a buttonless move when the release was missed.

Drawn from #35919 by alpenshtokk.

Co-authored-by: alpenshtokk <wawesandways@gmail.com>

* fix(tab-group): keep split dividers grabbable beside a narrow browser group

A squeezed browser toolbar overflowed its overlay slot and sat on top of the
divider to its right, so presses in the toolbar row never reached the handle.
Clip the overlay slot to its group like other retained pane hosts.

Adds a real-mouse e2e for a narrow terminal | browser | terminal row: the
divider must be uncovered along its whole height, follow a drag whose first
move lands on the page, and accept the next drag afterwards.

* fix(tab-group): end a lost divider drag on blur, hide or re-press

A release outside the window could be missed with no buttonless move to end
the gesture, leaving guest passthrough held and letting a later pressed move
resume the old drag. End the gesture when the window blurs or is hidden, and
let a new press of the same pointer replace a gesture whose release was missed.

Covers release outside the window, Linux false capture, multiple guest
surfaces and unmount mid-drag.

Co-authored-by: alpenshtokk <wawesandways@gmail.com>

* fix(tab-group): end a lost divider drag on the next press anywhere

Divider moves are tracked on window, but the same-pointer recovery only ran
when the next press landed on the stale handle itself. A press on another
divider or on pane content let later pressed moves resume the old drag, and
with two dividers both followed the new gesture. Listen for the active
pointer's next pointerdown on window in the capture phase and end the stale
gesture before anything handles the press.

* fix(browser): clip the narrow browser toolbar without making it scrollable

overflow-hidden still made the browser overlay slot a scroll container, so
tabbing to a toolbar control clipped in a narrow group scrolled the toolbar
and page sideways with no way back. overflow-clip clips the same way without
a scroll position.

---------

Co-authored-by: alpenshtokk <wawesandways@gmail.com>
2026-11-12 16:17:56 -08:00
Kelvin Amoaba c794f75e4e fix(computer-use): use UI Automation for Windows scroll, expand and slider actions (#41429)
* fix(computer-use): scroll, expand and set sliders on Windows without raising the window

* fix(computer-use): wait for Windows scroll and slider writes to settle before verifying

* fix(computer-use): reject NaN for Windows slider set-value

* test(computer-use): wait on the Windows fixture state with vi.waitFor and a schema

* test(computer-use): check activation per action against a holder window in the Windows fixture

* test(computer-use): log fixture window events for activation failures

* fix(computer-use): report foreground when a Windows app raises itself for a UI Automation action

WPF activates its own window for Scroll, ExpandCollapse, RangeValue and SelectionItem calls from any UIA client, so the runtime now compares the foreground window before and after a pattern action instead of assuming background. The Windows e2e checks delivery against the fixture's own activation count, with a holder window in another process.

* test(computer-use): skip an unstarted holder when closing the Windows fixture

* fix(computer-use): bound Windows pattern scroll paging and tighten slider read-back

* fix(computer-use): cap Windows slider read-back tolerance and run the UIA e2e only on CI
2026-11-12 23:17:10 +00:00
Jinjing 51fffa8753 fix(browser): bind guest text input to its webContents (#40931)
* fix(browser): keep guest input bound to its webContents

* test(browser): reject unresolved guest input routes

* test(browser): keep text on the guest when the root frame probe fails

* fix(browser): insert guest text only into a confirmed focused frame

Electron's webContents.insertText crashes the guest renderer and never
settles when no local frame holds focus (a fresh tab, or focus in a
cross-site frame after a root probe timeout). Use it only when the focus
probe confirms a focused element or same-site frame, refuse otherwise,
and reject promptly if the renderer dies or stops answering.

* test(browser): explain the busy-page e2e timeout

* fix(browser): expire guest text edits at the renderer mutation boundary

* fix(browser): preserve focused local frame contexts for text edits
2026-11-12 14:48:53 -08:00
Neil d634063ef2 refactor: organize mobile cloud relay by lifecycle owner (#41681) 2026-11-12 14:36:07 -08:00
Neil cab3a67382 refactor(orcad): organize runtime, launch, and host lifecycle owners (#41659) 2026-11-12 13:54:51 -08:00
Jinjing 2434a63be9 fix(tab-group): keep a grabbable tab in narrow tab-group strips (#41249)
* fix(tab-group): keep a grabbable tab in narrow tab-group strips

Tabs were the only shrinkable item in a pane's strip, and the only drag
source, so a narrow pane clipped them to 0px while +, quick commands, the
pane-actions menu and the reserved window-chrome spacers kept their width.
Give the tab area a 40px floor and let the action chrome clip before it.

* test(tab-group): open the right sidebar so the narrow-strip e2e is platform-neutral

* test(tab-group): assert the dragged tab moves between strips in the DOM

* fix(tab-group): hide strip actions whole instead of clipping their focus targets

Narrow strips clipped the new-tab, quick-command and pane-actions buttons
behind the 40px tab floor, so Tab could focus a control that was mostly or
entirely out of view. Measure the room left after the reserved spacers and
drop each control whole, and so out of Tab order, below the width where it
fits: quick commands first, then pane actions, then new tab (groups with a
tab only). Close split pane stays in every tab's context menu.

The e2e now measures only pixels that start a tab drag (not the close
button), drags from that run, and walks the strip with Tab at normal and
narrow widths, asserting every focused control is fully visible.

* fix(tab-group): offer quick commands from pane actions when the strip hides them

When a narrow strip folds the quick-command button away, the pane actions
menu now carries the same Quick Commands submenu the terminal and chat
menus use, so running or adding a command still works from the strip.

The narrow-strip e2e no longer sleeps or casts: it retries the first Tab
until focus lands in the strip, and a new test checks the menu offers quick
commands only when the button is hidden.

* fix(tab-group): drop the window-drag gap before strip controls clip

With the right sidebar closed, the 40px window-drag gap only shrank after
the tab bar hit its floor, so "+" and the actions clipped behind it while
the width rules said they fit. Hide the gap below the width where it and
every control fit, so the existing thresholds hold.

Adds an e2e that sweeps the top-right strip with the right sidebar closed
and asserts no focused strip control is clipped.
2026-11-12 13:41:50 -08:00
Neil c3f8f4100c refactor(native-chat): organize launch, transcript, and conversation owners (#41643) 2026-11-12 12:45:03 -08:00