* fix(terminal): never type a colour reply into the shell after the program that asked has exited
The PTY owner holds a colour-query reply made inside a shell command for up
to 20 ms and drops it if the command's OSC 133;D arrives, or (POSIX) another
process group takes the terminal; otherwise it answers. Command markers ride
the colour scan every emission already pays, so the hot path does no new
work until a query is pending. No daemon protocol change.
Closes#16633Closes#14631
* fix(terminal): track command markers in the existing colour scan, drop the live-group shortcut, and hold through claimed echoes
* fix(terminal): one verdict for every query held behind the first, contiguous ranges through a held echo, drop held replies at the final snapshot
* refactor(terminal): move the torn query/echo holds out of the ingress
* fix(terminal): a query completed after a verdict is judged afresh; the final snapshot judges held askers instead of dropping them
* perf(renderer): add unfocused slowdown to shared visibility poll primitives
installWindowVisibilityInterval gains slowWhileUnfocused (focus read at tick
time, overdue catch-up on window focus) and the git status refresh scheduler
gains cadenceScale + retime(). Opt-in; focused cadence is unchanged.
* refactor(source-control): extract git status scheduler window-presence hook
* perf(ssh): slow remote port, git status and compare polls while unfocused
Visible-but-unfocused windows poll workspace/host ports, branch compare,
stale conflict probes and active git status 4x slower, so agent edits no
longer drive remote git status every 3s behind another app. Hidden windows
still pause; window focus runs overdue work immediately.
* perf(source-control): keep activity debounce when refocus re-times git status
* test: drop cadence-count tests for unfocused poll slowdown
Applies pnpm i18n:reactive-translate --helpers. Output is unchanged: t delegates
to translate() and helpers default the threaded parameter.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Live reasoning and reduced-motion replies passed streaming but never growing,
so each update re-parsed the whole message (~260ms avg per update on a 20KB
reply in happy-dom, vs ~3ms block by block).
Applies pnpm i18n:reactive-translate --helpers. Output is unchanged: t delegates
to translate() and helpers default the threaded parameter.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
The accepted option support and the selection controller's terminal revision were read from mutable owners during render. Pass the reader snapshot and the selection revision each hook already subscribes to as recomputeOn inputs, so a compiled memo recomputes exactly when those values can change. Without the compiler the reads are unchanged.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Applies pnpm i18n:reactive-translate --helpers. Output is unchanged: t delegates
to translate() and helpers default the threaded parameter.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* wip
* Open HTML previews in the editor's tab group
Keep previews in the invoking group for local and remote files, and
avoid changing the selection if the user navigates away while opening.
* test: cover HTML preview from editor
* fix perf issue
* Prevent HTML previews from opening on the wrong host
* Guard HTML previews against workspace ownership changes
Applies pnpm i18n:reactive-translate --helpers. Output is unchanged: t delegates
to translate() and helpers default the threaded parameter.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Applies pnpm i18n:reactive-translate --helpers. Output is unchanged: t delegates
to translate() and helpers default the threaded parameter.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Host chat-agent readers called useHostStructuredAgentsVersion, CrewRowTime
called useNow, and both discarded the value before reading module state or wall
time. The titlebar portal target was a bare document lookup. React Compiler
would cache all three on unrelated inputs. The reads now go through recomputeOn
with the returned version, and the titlebar lookup moves into a tiny hook whose
result the compiler never caches. With the compiler off the code runs the same.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* fix(renderer): key external-store reads on the subscription version they already take
Browser driver, remote viewer, client-hosted row and automation visibility hooks
subscribed with useSyncExternalStore, discarded the version, then read module
state. useHighlightedSyntax did the same with a reducer tick. React Compiler
memoizes those reads on their arguments only, so they would stop updating.
Each read now goes through recomputeOn with the version it already has; with
the compiler off the same code runs on the same renders.
* fix(renderer): read the client-hosted row selection through its subscription version
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Shows CI result lines in the chat that opened or pushed to a pull request. They're hidden in the terminal overlay and on the phone until the phone app gets the setting.
The browser page mount admission hook now returns its useSyncExternalStore
snapshot instead of recomputing it after a discarded subscription, and the
sleeping sweep keys its wall-clock read on the grace tick with recomputeOn.
Both run the same code with the compiler off; the hazard baseline is now empty.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* fix(agent-picker): search fallback models and show cached models while the list refreshes
The new-tab agent picker's search skipped any agent whose model catalog was
unknown, while that agent's model submenu still listed the built-in models,
so typing "gpt" found nothing even though Codex showed GPT models. Search now
covers the same models the submenu offers.
The picker also waited for a fresh model probe on every read, and Claude and
Codex catalogs go stale after two minutes, so most opens showed the built-in
list for 0.5-1.5s. Like the chat composer, it now reads the saved listing
first and shows it at once, then follows with the waiting read, which joins
the same host refresh (no extra probe). An unknown catalog still takes the
waiting read, as before.
* Fix model catalog refresh when reopening the agent picker
* fix(agent-picker): wait only for active catalog refreshes
* fix(runtime): keep a terminal's last output on exit and stop charging dropped screencast frames
* fix(browser): clear an oversize frame held for credit instead of retrying it
* fix(mobile): keep held model lists through late preloads and running chats
* fix(mobile): let progress answers fill empty lists and decide recording per read
* fix(mobile): record a pre-send listing on rejoin and leave unheld retirements alone
* test(desktop): use a valid listed catalog in the preload race test
* test(mobile): type the catalog cache test's renderer
* fix(tasks): confirm a lost Tasks comment by author on GitLab and GitHub REST reads
Only GitHub GraphQL's viewerDidAuthor marked the viewer's comments, so on GitLab,
the GitHub REST fallbacks (including issues with more than 100 comments) and the
gh view fallbacks the phone kept an unconfirmed draft even after the comment
posted. Those reads now match the login of the account that made them, and an
explicit PR refresh reads comments uncached.
* fix(mobile): settle an unconfirmed comment only on one posted after the send
A refresh of an issue with more than 100 comments reads comments the first
load never showed, so an older identical comment by the same account looked
new and could clear the draft.
* refactor(gitlab): share the glab viewer read and skip it on Checks polling
* test(mobile): pin the clock in the unconfirmed comment test
* fix(mobile): chat page follow-ups
- clear the touch state when the chat hides, so a held reply lands on return
- keep the chat pinch scale per chat
- record waiting display-math openers in the math plugin instead of a line regex
- share the details markup test and the orphan row id predicate
* fix(mobile): record math openers whose scan reaches the end, skip no-op pinch commits
* fix(mobile): fall back to a whole parse only for details section tags
* refactor(mobile): drop a repeated comment
* perf(mobile): open Jump back in and notifications inside the host document
* fix(mobile): gate open targets on page 3, keep notification suppression, fold double taps
* fix(mobile): report the shown session from host documents and only open this host's sessions
* test(mobile): ignore the page's location report in the agent-history notify check
* fix(mobile): let a Back before the paint gate settle the host stack
* refactor(mobile): build the route-param clear frame beside its name
* perf(mobile): let the model pill take picks before the chat attaches
* fix(mobile): lock the picker while a held pick is sent and keep the mode toggle for attach
* fix(mobile): report a held pick's refusal only for its own chat
* perf(mobile): route the last status.get callers through the shared status read
* refactor(mobile): drop the unused one-shot Codex reset capability read
* fix(mobile): open the chat transcript when the text-append check fails, and key connections on one epoch
Applies pnpm i18n:reactive-translate --helpers. Output is unchanged: t delegates
to translate() and helpers default the threaded parameter.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Add useTranslate()/useIntlLocale() backed by a TranslationScopeProvider whose key
changes only with the active language or its own resources, an AST codemod that
rewrites render-path translate()/getIntlLocale() calls and threads the hook values
into render-called helpers, a helper analysis report, and a ratchet that keeps
render-path module translate() calls from growing. Apply the codemod to
components/native-chat.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
The Resource Manager samples every 2 s while visible. execFile runs ps
directly instead of through /bin/sh -c, one fewer process per tick, with
the same arguments and output.
The collector test mocked child_process.exec; it now mocks execFile.
Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Neil <neil@stably.ai>
The explorer subscribed to the whole gitStatusByWorktree and expandedDirs
maps, so a status or expansion write in any other worktree re-rendered it.
It only reads the active worktree's entry, so select that entry instead.
Co-authored-by: m4air <m4air@Mac.localdomain>
* feat(settings): group settings into titled cards so section boundaries are clear
Each settings group now shows its title above its own card, with hairlines
between rows, replacing one shared card where group headers looked like rows.
Adds SettingsGroup; SettingsSection drops its outer card when a pane is built
from groups, and SettingsRow/SearchableSetting mark rows for the dividers.
* fix(settings): use status-warning tokens for the task sources banner
* fix(settings): avoid subtree-restyling :has() spacing and keep orchestration search copy
* fix(settings): keep agent catalog rows mounted when an agent moves from available to installed
* fix(settings): hide groups that search empties and divide rows inside multi-row wrappers
* fix(settings): drop pane-wide :has scans, keep group headers when search empties a card
Ruling D2/E2/S3 on #39253 review: outermost rows own dividers, only an empty
card hides (direct-child selector) so header actions like Remove Project stay,
and panes declare grouped statically. Also restores the whole-header Alt-click
for the release channel, gives App Icon and the Windows admin row stable cards,
and removes wrapper divs that kept emptied cards visible.
* test(settings): Option-clicking the Updates version line reveals the release channel switcher
* test(settings): stub the updater API without a type assertion
* feat(native-chat): add /fork to fork a chat from its latest response
Typing /fork in a native chat now runs the same fork as "Fork from this
response", through the newest response still in context, instead of
passing the text to the agent. It is offered only where the host and
agent can fork, and answers with a composer notice while a response is
still running, before any response exists, while a fork is opening, or
when text follows the command.
* fix(native-chat): keep /fork off the transcript rows' fork surface
* fix(native-chat): read /fork's response from the hook's latest input
* Prepare queue rows to preserve accepted delivery intent
* Keep waiting native chat input in one ordered queue
* Keep a typed view of admitted queue records
* Keep the removed queue caption in the runtime catalog
* Remove the unused queue barrier caption
* Keep queue writes local and preserve accepted send provenance
* Read the sender from the queued admission request
* Keep continuation fixture clock within its operation window
* Remove deleted queue-barrier test from ratchet baseline
* Keep ratchet baseline change scoped to the deleted test
* Filter historical acceptance reads before loading payloads
* Instrument cached acceptance cursor once per fixture
* Restore original personal provenance after legacy card cleanup
* Complete legacy sender fixture metadata
* Narrow admitted history record types
* Reconstruct accepted personal proof after restoring original admissions
* Use the fixed clock for historical queue fixtures
* Consolidate queue source and type imports
* Preserve admission refusals and failed startup ownership
* Keep manual queue holds independent of later turn endings
* Remove obsolete mobile queue barrier expectations
* Keep journal format initialization independent of its decoder
* Assert returned-row recovery for released send clients
* Preserve Stop assertion across handoff-only publication
* Redesign Antigravity chat sign-in settings
Settings rows for method, project and location; one full-size Sign in
button named for the method; a status badge; the chat runtime install
row inside the card; and no save error while Enterprise fields are
still empty.
* Use primitive variants for Antigravity sign-in styling
* Drop Antigravity sign-in strings translated on main after removal
* Announce settled sign-in, keep Change account after a cancelled switch, reset paste form per flow