* feat(native-chat): open each subagent in its own view inside the chat pane
Clicking a roster entry, an agent in the agents strip or a subagent row in
the sidebar now opens that subagent's own rows in the chat pane, with a bar
to switch between agents and a status bar with its state, Stop and the way
back in place of the composer. Subagent rows are no longer inlined in the
main transcript, which stays mounted underneath so going back keeps the
reader's place. The inline-section machinery is removed.
* fix(native-chat): close a subagent's hover preview when its view opens, and name the strip's open action
An open preview stayed over the subagent's view after its roster row was
hidden, and took the view's first Esc. The agents strip's label now says
it opens the agent rather than showing it in the conversation.
* feat(native-chat): show what the main agent asked a subagent and its reply in the subagent's view
A subagent's view now opens with the prompt the main agent gave it, folded
past a few lines, and ends with its final reply once it settles. Claude's
prompt and reply come from the Agent call its run names; Codex's prompt
comes from the spawn call naming the child, and its reply is already its
last own message.
* chore: drop the deleted delegation file from the node tsconfig and record the removed compiler bailout
* fix(native-chat): subagent view UX round: focus, endings, nested path, status glyphs
Going back hands focus to the entry or strip row that opened the view, else
the composer. Only a completed subagent ends with a reply; a failed one shows
its error and a stopped one says it stopped. Nested subagents get their spawn
path as a breadcrumb, and Back and Esc go to the parent. Every surface uses
the agents strip's status glyph, states lead capitalised and tokens carry
their unit, entries show that they open, the switcher marks the current
agent and numbers unnamed ones, and the status bar fits narrow panes.
* fix(native-chat): switch subagents from the switcher by pointer, and open no preview on handed-back focus
The switcher's modal-less menu closed on pointerdown before the item could
take the click; it is modal now. Focus handed back to a roster entry after a
pointer Back no longer pops its hover preview; keyboard focus and hover still do.
* fix(native-chat): fit the subagent view to main's tool-run provider, install slot and exhaustive state switch
* fix(native-chat): keep a subagent's full reply when its last message is only the start of it
* fix(native-chat): translate the subagent back label with useTranslate so it follows the language
* fix(shortcuts): forward Plugins shortcut from browser pages
* fix(shortcuts): preserve text-producing guest chords
* fix(shortcuts): preserve AltGr input in browser guests
* fix(browser): return keyboard to the page after Settings closes
Closing Settings remounts the active browser page. Its activation focus
retry waits a frame for the retained guest to reattach, and a StrictMode
effect re-run cancelled that wait while the activation latch stayed set,
so the page never got focus back (host activeElement stayed BODY). A
re-run that cancels the retry before any focus attempt now clears the
latch so the next run retries.
Also make the Plugins shortcut copy match browser-page behavior and add
guest-dispatch coverage for Linux Ctrl+Alt, macOS Option symbol vs dead
keys, and a German Y/Z layout.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(browser): keep the user's focus when a drag restarts page activation
The Settings-close fix re-arms a page activation whose focus retry was
cancelled before it acted. A drag starting or ending also re-runs that
effect, and the re-armed retry took the current focus as its starting
point. A user who picked the address bar while the guest was still
attaching therefore had it treated as the page's starting focus, and the
guest took the keyboard once it attached. The activation now keeps the
focus it began from across restarts until the page deactivates, so a
user focus change made before or during the drag still wins.
Move the focus-address-bar chord listener into its own hook, matching the
history shortcut, to keep the focus hook within the file-size limit.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(browser): take the activation's focus snapshot before the drag guard
A page that activated while a drag was already active skipped the focus
snapshot and took it when the drag ended. If the user picked the address bar
during the drag, that pick became the starting point and the guest took the
keyboard once it attached. Take the snapshot when the page activates, before
deferring for the drag.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(plugins): let the Plugins shortcut hint wrap in narrow windows
In a window about 700px wide the "Open with ..." hint stayed on one line and
cut off the key combo. The label now wraps like the rest of the description,
and only the key combo stays on one line, moving to the next line whole
when it does not fit.
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat(native-chat): show each subagent's model, current tool and result in the roster
Subagent roster rows now carry the child's role, model, reasoning effort,
the tool it is running and the last thing it said, so a row says what the
subagent is doing and, once done, what it found. Codex children take model
and effort from the spawn call; Claude children take the model from their
own messages. A hover card shows the longer text.
* feat(native-chat): name subagent models and roles the way people say them
Show Opus 5.5 · High instead of claude-opus-5-5 · high, reusing the
model-id label and effort picker copy, and General purpose instead of
general-purpose.
* fix(native-chat): read Codex subagent model and effort from its started activity
Current Codex announces a spawn only through subAgentActivity, which carries
the model and reasoning effort the child resolved to.
* fix(native-chat): use the hover card's own spacing variant for the subagent preview
* fix(native-chat): show a subagent's reply as plain text in its roster row and preview
Its last message is markdown; the row now drops backticks, emphasis, list
and heading marks and joins lines into one readable line.
* feat(worktrees): archive and restore a workspace's checkout (backend, off)
* fix(worktrees): keep archived rows through startup GC and Windows path checks
* fix(worktrees): serialize archive and restore, finish interrupted restores
* fix(worktrees): restore prior archive flag, drop leftover marks, keep archived rows out of offline listings
* test(worktrees): fixed timestamp in archived GC test; drop path cast
* feat(workspace-cleanup): archive inactive workspaces from the runner once archive is on
* fix(worktrees): queue bare-id restores and forget the archive mark when deleting an archived workspace
* fix(worktrees): import archive params from their new contract folder
A paired desktop that sleeps with its socket open let every agent tab create
wait out the full 15 s host-request timeout until the server's heartbeat
dropped the socket. The request registry now remembers a desktop that let an
ask time out and fails the next ask for it at once, until the desktop answers
anything or subscribes again. A new subscription also gets any ask that is
still pending.
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.
* test: remove low-value push and relay coverage
* test: delete orphaned fixture and closure support
* test: trim runner and mobile recording matrices
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* test: remove low-value automation and shared suites
* test: retire stale gate references and stabilize retained fixture date
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Pageless agent commands prefer the workspace's active client page, and creating
an offscreen or renderer tab never cleared it, so the next command after
`orca tab create` acted on the user's page. Yield client selection wherever a
create moves the bridge's active tab, as orcad already does.
The idle sweep stopped any still-starting agent whose chat had been quiet past the idle window on
the wall clock, which counts sleep. A message sent just before the Mac slept was rejected on wake
as "Claude couldn't start". A start's own deadline already runs on awake time, so the sweep now
leaves a start alone while that deadline still times it.
The streamed pane's context menu opened the page or link URL as-is in
the desktop's default browser, so a server's localhost page opened this
machine's localhost. Use resolveRemoteFailureExternalUrl, as the
streamed error page already does, and leave the items out when it
refuses.
The desktop's screencast subscription dropped the stream's dialog and
dialogClosed events, so an alert, confirm or prompt on a Server
(streamed) page froze it with nothing to answer. Ask with the local
browser's dialog, answer through browser.dialogAccept/dialogDismiss,
and close it when the host closes the dialog or the stream stops.
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.
The button threw away activateBrowserPagePaletteResult's failure, so a
missing page, tab or workspace made it do nothing. It now shows the open-tab
switcher's messages, shared through one helper. A blocked activation stays
quiet like every other caller: the activation reports it.