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.
* fix(mac): give Orca's main executable its own Mach-O UUID
macOS Local Network privacy identifies an app by its main executable's
UUID. The packaged executable is stock Electron's, so it shares that UUID
with every other app on the same Electron version and macOS can apply
another app's Local Network decision to Orca. Rewrite LC_UUID in every
slice to a value derived from the app id, executable name and CPU type,
before signing.
* fix(mac): re-sign rewritten executables ad hoc, cover the terminal host, assert UUIDs at release
Rewriting LC_UUID breaks Electron's linker ad hoc signature, and arm64
kills unsigned code, so identity-less local builds (where app signing is
skipped) produced an Orca.app that died at launch. Re-sign the rewritten
executable ad hoc, outside the bundle so codesign does not treat it as
the bundle; real signing replaces it later.
The terminal host's executable is a stock Node binary whose UUID is
shared by every copy of that Node release, so give it its own stable
UUID the same way. Packaging and release verification now fail when a
shipped executable does not carry its expected UUID.
* fix(mac): scope the executable UUID rewrite to the main app
The terminal host gets a separate design; leave it unchanged here.
* 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.
* fix(speech): spell near misses of dictionary terms the term's way
* fix(speech): ship the common-word list as a 2% Bloom filter to fit the phone page budget
A run without --page fell back to the chat's latest agent page whenever it
had no remembered page, which is every older run after a restart or once 500
runs push it out. The chat's browser activity now belongs only to its newest
browser run, which remembers that page for when a newer run takes over. An
older run that this renderer never saw as the newest shows no button.
Add an on-by-default Claude usage polling switch with live-terminal-only behavior when disabled, cancellation and account attribution safeguards, and translations for all supported locales.
Fixes#27151.
Fixes#39502.
Fixes#37037.
Co-authored-by: Sibyl <scauyb@qq.com>
* fix(opencode): attach @-mentioned files to OpenCode chat prompts
OpenCode's ACP agent reads a file only from a resource_link block and
ignores @path text, so mentioned files never reached the model. Keep
the text as typed and link each mentioned file inside the session
folder.
* fix(opencode): reuse the chat mention scanner and compare paths byte-exactly
* fix(opencode): leave mentioned files over 20 MiB as text
* fix(ime): keep plain-committed Hangul so macOS 2-Set can rebuild it in place
Right after an input-source switch, macOS 2-Set can commit a lone jamo as
plain text and then rebuild it (ㅇ + ㅏ → 아) by replacing that committed
range. The native text forwarder emptied the field after every commit, so
the replacement had nothing to land on and the vowel was dropped (#9738).
Keep Hangul commits in the field (Latin commits still clear for #11504),
and erase replaced text from the PTY before the replacement is sent.
* fix(ime): only erase retained Hangul when the replacement is forwarded and still at the PTY cursor
Drop retention on blur, on any composition start, and on chord/named keydowns
the pane handles before the forwarder (macOS Ctrl+C, non-Latin control chords).
Erase only for insertText/composition replacements that end at the field tail.
* ci(e2e): route terminal IME changes to IME specs again after the input/ owner move
#39113 moved IME and keyboard policy files under terminal-pane/input/, but the
native IBus and synthetic IME routes still matched the old paths, so IME changes
selected neither lane.
* fix(dictation): give each cleanup its own cancel lane (STA-15095)
* test(dictation): one explicit case per overlapping-cleanup behavior
* test(dictation): follow main's text-generation/execution moves (STA-15095)
Main (#41838) moved the lanes, agent-launch, agent-environment and test
harness modules under text-generation/execution/ and renamed the
commit-message settings export to resolveCommitMessageSettings. Point the
new dictation cleanup test's imports and mocks at the moved modules.
The tab bar built every tab's sheet row, including the agent preview over
each terminal's last message, on every tab snapshot and 60 s tick, and the
always-mounted closed sheet ran its own clock and row elements. The bar now
builds only the title/dot/group summary it draws; the sheet's clock, frozen
groups and detail rows live in content mounted only while the drawer is
shown.
Without WSL installed, Windows' wsl.exe stub opens the installer and a UAC prompt.
The WSL host distro list read the registry and ran wsl.exe --list --running in
parallel, so opening Add WSL host (and every window refocus while it was open)
spawned wsl.exe even with nothing to annotate. Read the registry first and only
probe running state when a user distro is registered.
Refs #40771
Co-authored-by: Claude <noreply@anthropic.com>
wsl.exe --exec refuses an empty argument with Wsl/Service/E_INVALIDARG. When a
managed WSL Claude account exists but the distro is on System default, the
pointer content is the empty string, so every Claude launch in that distro
failed before its terminal spawned. This hits both Windows-driven WSL panes
and WSL hosts, whose account env is prepared by the desktop.
Fixes#41160
peerMailRelayWants ran every pull-loop iteration and rebuilt the global set of
servers (SELECT DISTINCT over every remote_run_links row, closed history
included, plus home conversations) to answer one boolean for one server.
It now asks about that server only, each an index seek on existing indexes.
* feat(macos): redesign Full Disk Access toast with prompt count illustration
* fix(macos): stack FDA toast actions on narrow cards so the button never overflows
* perf(native-chat): draw only the visible rows of an opened tool run
An opened tool run rendered every call it held, so a long autonomous stretch
kept thousands of rows, their DOM and their per-row state alive while only a
dozen were visible in the run's capped box.
The run now owns a keyed window over its rows (the shared TanStack
virtualizer plus the existing row+offset scroll anchor):
- rows keep today's keys and order; small runs and Find-with-a-query draw
every row through the same keyed tree, so nothing remounts at the switch
- the reader is remembered as a row and offset (pixel top while unmeasured),
following the end only for new work, and forgetting on close as before
- the box's cap keeps the measured height of opened details, including ones
scrolled out of view; the full task list now remembers its open state
- the first/last rows, a diff reveal target, recently interacted rows, the
focused row's Tab neighbours and a text selection's span stay drawn
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): finish tool-run follow, keep reveals, bound per-move work
Review repairs for the windowed tool run:
- a follow started by new work always gets its completion frame, so a
result that adds no row cannot leave it armed to chase later detail growth
- the row anchor restores only when rows arrive or the pane shows again,
so a diff reveal or the reader's own scrolling is not pulled back
- opened-detail room is kept incrementally and travels with the run's
remembered position across outer windowing
- focus neighbours, item keys and window rows no longer cost work per move
proportional to the run's length; selection is tracked only while visible
- thoughts with no words are not keyboard stops; the restored row stays
drawn until the reader moves
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): finish hidden follows, let reveals win, keep draw-all scrolling free
Second review repair for the windowed tool run:
- a follow is certified only by a real, visible tail measurement, and that
measurement wakes it even when no size changed; a hidden pane resumes it
- a diff reveal cancels any pending restore and follow on every request
- a hidden pane returns to its row (not its reset pixel offset) on show
- draw-every-row mode (Find, short runs) rebuilds nothing as the reader
scrolls; selection spans re-derive after the pane was hidden
- remembered detail heights are copied only when one changes
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): certify a tool-run follow only by a laid-out tail
A follow's landing is confirmed only when the last row that draws something
has a real, non-zero size; a measurement callback carrying a cached or zero
size no longer ends it early, and a run whose rows draw nothing has no
landing to wait for.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): keep draw-all tool runs cheap per scroll and prove follow wake paths
Draw-all (Find) no longer records the scroll anchor or rebuilds the selection span
on every scroll, and its trailing spacer skips the end scan. Tests now cover a task
list crossing the window threshold and Find, and pin both follow-completion paths.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): skip anchor scans under a wide selection and recover the reader's row after
A selection wider than a window keeps its rows drawn, so recording the anchor on
each scroll would scan them all; recording now waits, as it does under Find. The
reader's row is then taken from the virtualizer's offsets when recording resumes
or the pane hides, so showing it again does not return to an older row.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): type the tool-run selection-span gate and settle the anchor on hide
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): merge duplicate tool-run window import
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* chore(native-chat): prune the structured session's compiler bailout after the main sync
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): keep the tool-run measurement callback current without a render-time ref write
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): keep a reader who jumps past an open run's drawn rows where they jumped
The window redraws inside the scroll that moves it, and a restore still pending
from earlier work could run first and send the reader back to the row they left.
The reader's own scroll now points the anchor at their row from the window's
offsets before that redraw.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): re-point the anchor on reader scrolls only while the run is windowed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): keep a hidden tool run's saved row from its box's reset offset
A hidden box resets its offset and may report that as a scroll or as the offset
at unmount. Scroll recording (the run's and the anchor hook's) and the hook's
unmount record now wait while the pane is hidden, so the row kept at hide time is
the one a returning reader lands on.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): give an opened tool run sole ownership of its reader's place
The run and the shared scroll-anchor hook each decided when a saved row still owned
the box, and each local exclusion left another path for a stale restore or capture.
The run now keeps one row-and-offset place from the window's full measurement model,
admits a landing only on mount or show, lets every reader scroll retire pending
work first, records nothing while hidden, and takes a reveal before any landing.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): confirm every tool-run landing correction and model the browser's scroll report in tests
A real change (size, row list, the held row's measurement) now grants a landing a
fresh, bounded confirmation budget, so a correction made after an earlier budget ran
out is still confirmed. A pending landing's own writes no longer re-arm following.
The reader harness delivers the scroll event a browser sends after an offset change.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* test(native-chat): keep the reveal-return case on one memory record and before the reveal's scroll report
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* test(native-chat): return the reader harness's scroll writes to their earlier behaviour (rig-stop ruling)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): keep a revealed file's own row as the tool run's saved place
A reveal now records the card's row and offset from the page as the card aligns,
rather than reading the window's size model, which may still hold that row's
collapsed height. Remount tests report the landing's own scroll the way a browser
would; the pinned reveal case needs no report.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(native-chat): read an opened tool run's reader place from the rows actually drawn
The window's size model can hold a row's old height for a frame after it grows, so a
scroll report read through it could record a later row than the reader sees. Capture
now takes the row at the box top from the drawn rows' own geometry, found by a binary
search over the run's in-flow children, and uses the model only where the top lies in
an undrawn gap; a box with no geometry keeps the last place.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* test(native-chat): type the reader-position owner test's rows without assertions
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: organize WSL guest modules by concrete ownership
* chore: link historical relay evidence to the moved command
* chore: prune retired guest test timing debt
The retention sweep trusted a closed pane's still-resolvable handle, so a
closed run terminal kept its ids and blocked the automation-run cleanup
reason. runOwnHandle now also requires the PTY's exit verdict, and a slept
pane keeps its keys while the layout still binds the run's PTY.
* fix(notifications): lift toasts and corner cards onto a shared notice surface
* fix(notifications): keep corner-card shadows unclipped and match the StarNag toast
* fix(notifications): keep the stack's scrollbar on screen and its overflow off the status bar
* fix(notifications): collapse stack shadow room while scrolling and paint lower cards above upper shadows
* fix(notifications): pair re-pointed surfaces with popover foregrounds and keep close-hover border
* fix(notifications): keep notice text readable on plugin themes and catch card growth in a capped stack
* fix(notifications): track stack cards from mutation records and tidy test types
* fix(notifications): check painted notice colors and outline unfilled secondary buttons
* fix(notifications): paint app-theme notice colors as the exact hex measured, with a one-step margin
* fix(notifications): keep muted panels on the notice surface's polarity for app themes
* fix(notifications): keep toast descriptions and outline buttons readable on notice surfaces
The surface lift now also keeps the 80% toast description blend readable, so
mid-gray dark popovers no longer drop descriptions under 4.5:1. The notice scope
remaps --background with --foreground, so outline buttons keep a dark surface
under light popover text in light-base themes with dark popovers.