* 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(mobile): stop false Wi-Fi arrivals and update the relay gate text
* refactor(mobile): read the network fresh for every caller
* perf(mobile): share a network read within one nudge fan-out
* 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): retry a failed Changes compare and drop preserveReadyOnFailure
A compare that failed, or one cleared by a worktree switch, kept its status
read marked as compared, so returning to Changes inside the 3 s fresh window
skipped it. Forget the read when its compare doesn't land and when the route
identity changes. Branch compare already always kept a ready result on
failure, so the loadStatus option and nextBranchCompareState flag were dead.
* fix(mobile): keep a superseded compare from clearing the retry marker
* refactor(mobile): forget a failed compare's read inside the attempt
* fix(mobile): clear the compare marker in an effect, not during render
* perf(files): page large folders on the phone instead of reading them whole
* fix(files): page from hasMore, refresh closed folders, retry a superseded Show more
* fix(files): rerun a refresh that paging displaced, and keep an old host's whole folder from duplicating rows
* test(mobile): re-record the Files matrix goldens for paged reads
* test(files): type the paging fake host's params without widening
* fix(files): filter folder reads that land after the folder closes
* feat(mobile): add host mutations with draft, block and queue modes, starting with rename
* fix(mobile): settle a lost rename through the reconnected client and keep server rows routed
* fix(mobile): offer Retry on the offline banner once the host is unreachable
* fix(mobile): let the offline banner's Retry redial from the page
* fix(mobile): date the offline banner from the drop, not the connect
* fix(mobile): keep the terminal rename sheet's state updates pure
* test(mobile): mount rename and close-action tests inside a query client
* refactor(mobile): share one draft rename sheet between workspace and terminal rename, and retry a confirm after a path switch
* fix(mobile): keep another target's unsaved rename and show the offline reason over an old refusal
* fix(mobile): keep a newer rename draft when an older save lands late
* feat(mobile): queue chat sends while the desktop is offline
* test(mobile): cover the offline chat send queue
* fix(mobile): drop a closed chat tab's queued messages
* fix(mobile): keep offline queue order and hold drains behind terminal prompts
* fix(mobile): drain a structured chat's queue only once its session loads
* test(mobile): stub reanimated in the prompt controller render mocks
* feat(mobile): bring a queued chat message back paused after Orca closes
* fix(mobile): update the queue's send ref after render and type the queued bridge test
* fix(mobile): keep the queued send intent type free of page storage imports
* test(mobile): pass a send's chips through its intent in the kill test
* fix(mobile): hand a queued host command with a lost reply back to its queue
* 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
* feat(mobile): keep chat drafts and unsent text in the device store
* test(mobile): give the send tests a real draft destination
* fix(mobile): confirm reopened sends past the loaded window and save the journal id with the clear
* fix(mobile): let an open chat claim a released send, and warn on a reopened command
* refactor(mobile): share the pausable unconfirmed-send deadline between chat holds
* fix(mobile): hold every lost structured send and replace a re-held deadline; use the shared store value codec
* fix(mobile): save chip-only drafts, save only a send's own chips, and keep hold time across outages
* fix(mobile): hash a draft key the device store would refuse as too long
* fix(mobile): drop a sent message's chips in the write that settles it
* fix(mobile): return a structured host command whose reply was lost to the box
* 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
* perf(mobile): open a session without the startup terminal polls
* test(mobile): re-record session startup goldens
* perf(mobile): cache the session strip from host snapshots and drop phone-closed tabs
* fix(mobile): keep a shown terminal over the offline and loading body states
* test(mobile): re-record the last-strip reopen golden
* refactor(mobile): drop a startup guard that can no longer fire
* fix(mobile): drop a pending-terminal activation reply from an earlier route
* test(mobile): type the pending terminal tab fixture
* test(mobile): import the last-tabs module type without an import() annotation
* perf(mobile): reopen agent history from memory
* fix(mobile): reread history after association changes without restarting reads, and share the connection's status with query reads
* fix(mobile): reread history after an association change only when the query can read, including after a failed scan
* refactor(mobile): name every history screen state
* fix(mobile): keep history's connected-edge watcher by not gating its query on the connection
* perf(mobile): prefetch the next and previous file in Review
* perf(mobile): open Review on the tapped file without reading the first file
* fix(mobile): show failed Review diff reads and re-read refused deleted files
A re-keyed worktree diff that fails now shows its error instead of the
older lines. A deleted-file stand-in from a refused read is re-read on the
next visit and by Retry. Without git status, the branch section no longer
waits on an unused compare.
* fix(mobile): remount silently after background WebView losses
* fix(mobile): hold a reclaimed remount until the app is in front
* fix(mobile): give a reclaimed renderer one free remount per painted document
* fix(mobile): report a dead Android renderer again with its original loss facts
* refactor(mobile): build the page update-failure record in one place
* fix(mobile): declare desktop-bound native verbs in the verb table and let the device store skip the verdict hold
* refactor(mobile): name the update-failure record builder after the effect it returns
* test(mobile): check the device store read before the verdict actually succeeds
* test(mobile): leave the store-verb hold test to its own PR
* fix(mobile): stop a session opened on a pane from faulting the page
* test(mobile): check the opened pane leaves the session URL
* fix(mobile): type the session's own navigation for the pane erase
* feat(mobile): persist TanStack queries through the device store
* fix(mobile): refuse query storage keys the store verb would reject
* fix(mobile): skip re-encoding oversized query records and guard long keys on remove
* fix(mobile): keep the query storage flush chain alive when a write throws
* refactor(mobile): share one store value codec and hash query store keys
* refactor(mobile): check stored query records with a type guard
* fix(mobile): replay a page's streams only after its connection verdict
A reconnect or a cutover after a drop re-sent every stream the page held
before the page's verdict for the new connection, bypassing the bridge's
hold. The client now asks the stream's owner before re-sending; the bridge
holds the re-send until the verdict opens. An unsent stream's cancel no
longer sends an unsubscribe.
* test(mobile): expect the replay hold on a page stream's subscribe options
* refactor(mobile): one subscribe options type and one pass-through rule for the verdict hold
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>
Count a key changed twice in one write once, keep the per-bucket estimate an upper bound, and redo a seed pass that missed files at the next foreground instead of trusting it as exact.
The page store refuses a bad key or an over-cap value before posting anything, keeps its calls in call order and inside the bridge's in-flight cap, and checks deferred slots. The shell reads only the keys that surely fit the reply budget, so no value is decrypted twice.
* perf(mobile): merge small route-shared page chunks into one
* refactor(mobile): share the merged page build with the route closure check
* build(mobile): check in the chunk sweep and drop the unused route closure helper
* refactor(mobile): count page chunks in one place
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>
Set RGB and contrast-adjusted colors through CSS properties instead of serializing and reparsing the complete inline style. Regenerate the pinned xterm runtime patches and lock hash without changing terminal scheduling or recovery.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* 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
* fix(agents): workspaces created on a paired host use the host's launch settings
Creating a workspace with agent picks or a draft could launch the paired host's agent with desktop settings, or lose the picks during recovery. Let capable hosts compose those launches from their own settings and preserve the user's inputs through fallback creation. Older hosts retain their existing requests.
* fix(agents): workspaces created on a paired host use the host's launch settings
When a workspace is created on a paired computer, agent picks and Arguments can be replaced by this computer's defaults or dropped during recovery. Keep explicit choices with the submission and let the paired computer resolve its own launch settings.
Preserve older-host request behavior, disabled-agent draft substitution and prompt submission, and restore the composer if compatibility preparation fails.
* fix(agents): workspaces created on a paired host use the host's launch settings
Keep the submitted choices available when a background launch has no prepared startup carrier. Tighten the regression checks for restored composer names, legacy commands and prompt submission so recovery preserves the user's work.
* fix(agents): workspaces created on a paired host use the host's launch settings
Creating a workspace on a paired machine could ignore its agent settings or lose a draft while the terminal connected. Keep the selected launch inputs and the pending text together through fallback and reconnect, and never replay partially written input. Preserve older hosts' launch commands and ordinary new-tab prompts' editable behavior.
* fix(agents): workspaces created on a paired host use the host's launch settings
Keep a workspace's pending prompt attached to its original terminal while the pane reconnects. Stop automatic delivery before reporting a final failure, retain the recoverable text, and recognize a launch handed off to the paired host even before its tab appears. Avoid delaying creation on a redundant host status request.
* fix(agents): workspaces created on a paired host use the host's launch settings
New workspaces on a paired computer could lose their first prompt when the terminal briefly disconnected. Delayed delivery could also continue after reporting failure, or leave terminal-only agents without an accessible copy of their prompt.
Keep pending prompts through attachment loss, stop content writes when automatic delivery ends, and offer the existing composer to recover unsent text. Preserve launch identity without inventing empty Arguments or treating missing metadata as a replacement.
* fix(agents): workspaces created on a paired host use the host's launch settings
A replacement pane can learn its terminal before the layout catches up after reconnecting. Re-registering the effective launch settings then dropped the original first-prompt identity.
Recover that identity from the existing verified terminal binding so later remounts keep the same pending prompt.
* fix(agents): workspaces created on a paired host use the host's launch settings
A terminal binding can identify the launch before its effective Arguments are known. Keep permission notifications working in that state without assuming a launch-settings recipe exists.
* fix(agents): workspaces created on a paired host use the host's launch settings
Keep an unsent prompt attached to its launch when a paired host briefly disappears, so reconnecting the same terminal can finish delivery. Clear the rest of the exited pane's status as before, and release the binding after delivery or a confirmed end.
Offer Copy prompt when automatic delivery finally fails, so the prompt can be pasted into the terminal that already opened. Keep creation-failure Reopen separate.
* fix(agents): preserve paired prompt recovery across transport updates
Resolve the consumed startup token through the pane's verified binding instead of reading renderer ownership during every remote attach. Keep the transport's host-authoritative exit and reconnect behavior and its fixture guards.
Settle pending prompt delivery when the host reconfirms a closed surface, including after it discards the terminal's exit record. Update the remount fixture for the Windows PTY model binding.
* fix(agents): merge duplicate imports flagged by type-aware lint
* test(agents): fix type assertions in paired launch fixtures
Type the repository rows, mutable agent choice and terminal tab used by
launch regressions. Reuse the session binding across its real installers
and document the partial-fixture adapters required by the runtime APIs.
Keep the RPC, remount and prompt-delivery assertions unchanged.
* fix(agents): route workspace terminals through their owning host
Creating a terminal for an existing workspace could send it to another focused server. Resolve its owning host when no explicit route was supplied, and keep the host-shaped draft regression within the shared startup contract so renderer checks do not pull in main-process code.
* test(agents): align launch fixtures with runtime dependencies
Retain real i18n exports while replacing translation output, hoist the terminal restore toast spy, and supply the explicit host environment used by paired terminal callers. Keep the existing behavior assertions unchanged.
* fix(agents): isolate prompt failure notice dependencies
Load the prompt failure notice only when a settled hosted launch needs it,
so workspace recovery consumers do not initialize toast and localized agent
catalogs just by importing delivery code. Keep prompt retirement and its
recoverable draft synchronous, and preserve the existing Copy prompt action.
Restore the ordinary new-tab failure toast's original invocation and verify
that Fix Checks retains its edited request through the activation handoff.
* test(agents): route legacy wire launches to their fixture host
Pass the paired environment explicitly in legacy terminal-creation fixtures,
matching real launch callers instead of relying on the focused host. Keep
all compatibility and accepted-creation assertions unchanged.
* fix(agents): preserve paired work-item completion without a startup plan
Blank-terminal work-item launches on paired hosts now keep their successful activation result. If the agent command cannot be built, show that error once instead of reporting an activation failure.
* refactor(agents): deliver paired creation prompts once like agent tabs
Drop the retained hosted-prompt lifecycle (pending map, rebind, deadline,
terminal retirement, token recovery). After the host creates the session the
desktop attempts the prompt once; failure shows the prompt-not-sent toast with
Copy prompt.
* fix(agents): silence prompt failures after closing a workspace terminal
Closing a paired workspace terminal before the agent was ready could report a prompt failure after that terminal was gone. Use shared launch completion and existing tab records to keep deliberate closes silent while preserving one Copy prompt notice after an interrupted delivery. Prepared launches now decide client delivery from the host request.
* fix(agents): report every failed paired prompt delivery
A paired host can retract its tab from inventory without the user cancelling the launch. Always report a failed prompt attempt with Copy prompt, using the same single-attempt completion as agent tabs.
* test(agents): name host-session fixture mock types