Commit Graph
19879 Commits
Author SHA1 Message Date
Kelvin Amoaba 34cd1161bb perf(mobile): show the workspace list from memory and refresh it on desktop changes (#39453)
* perf(mobile): show the workspace list from memory and refresh it on desktop changes

* fix(mobile): import the host list queries type without an import() annotation

* fix(mobile): keep host labels on a not-connected read and update the phone feed e2e helper

* fix(mobile): keep the event router listening when its stream ends while opening

* fix(mobile): reuse the shared read-view base and remount for the cache-return recording
2026-11-08 00:23:19 +00:00
Kelvin Amoaba 5a6e0510e1 fix(mobile): save only the listing a pre-turn read waits on, not later reads (#39622) 2026-11-08 00:21:08 +00:00
OrcaWinandOrcaWin 810080fe86 test: remove 468 low-value tests (#39614)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 16:13:17 -08:00
Jinjing ef55da8770 docs: add WeChat community group QR codes (#39411) 2026-11-08 00:10:19 +00:00
Jinjing 51d6192d7a fix(agent-picker): search fallback models and show cached models while the list refreshes (#39444)
* 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
2026-11-07 16:08:26 -08:00
OrcaWinandOrcaWin 8dad16cca2 docs(contributing): shorten the Vitest cache note to one line (#39623)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 16:07:43 -08:00
Kelvin Amoaba 3c1149ea5e fix(runtime): keep a terminal's last output on exit and stop charging dropped screencast frames (#39384)
* 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
2026-11-08 00:03:09 +00:00
Kelvin Amoaba aa30c8140a fix(mobile): keep the saved model list right across late reads and account switches (#39470)
* 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
2026-11-07 23:45:44 +00:00
Kelvin Amoaba 50a4cccbad perf(runtime): cache OMP and Grok model discovery for desktop IPC too (#39402) 2026-11-07 23:44:49 +00:00
Kelvin Amoaba 199d64fb7c fix(mobile): stop false Wi-Fi arrivals and update the relay gate text (#39391)
* 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
2026-11-07 23:44:16 +00:00
Kelvin Amoaba 336fd01968 fix(tasks): confirm a lost Tasks comment by author on GitLab and GitHub REST reads (#39422)
* 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
2026-11-07 23:44:06 +00:00
Kelvin Amoaba 32f1229564 fix(mobile): retry the Changes branch compare after a failure or quick worktree switch (#39350)
* 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
2026-11-07 23:43:54 +00:00
Kelvin Amoaba 11f31112db perf(files): page large folders on the phone with Show 500 more and Search all (#39438)
* 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
2026-11-07 23:43:43 +00:00
Kelvin Amoaba a9f65f71d2 feat(mobile): handle renames and the workspace list while the desktop is offline (#39448)
* 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
2026-11-07 23:43:33 +00:00
Kelvin Amoaba c950d1eebd feat(mobile): queue chat sends while the desktop is offline (#39423)
* 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
2026-11-07 23:40:10 +00:00
Kelvin Amoaba 659f279a0f fix(mobile): chat follow-ups for held replies, per-chat zoom and streamed math (#39403)
* 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
2026-11-07 23:39:23 +00:00
Kelvin Amoaba 4c43219b74 perf(mobile): open Jump back in and notifications inside the host document (#39474)
* 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
2026-11-07 23:39:10 +00:00
Kelvin Amoaba 525e11196e perf(mobile): let the model pill take picks before the chat attaches (#39379)
* 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
2026-11-07 23:34:27 +00:00
Kelvin Amoaba 138c9e3460 feat(mobile): keep chat drafts, attachments and unsent messages across app kills (#39342)
* 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
2026-11-07 23:32:44 +00:00
Kelvin Amoaba ed3a3fd9f6 perf(mobile): reuse the connection's status in the automation editor and chat capability check (#39345)
* 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
2026-11-07 23:27:28 +00:00
OrcaWinandOrcaWin 7b509e477a test: remove 581 low-value tests (#39608)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 15:25:35 -08:00
Kelvin Amoaba 8897f986cf perf(mobile): tell a buried Android page it's hidden (#39409) 2026-11-07 23:20:51 +00:00
Kelvin Amoaba de6c2b6f5c perf(mobile): open a session with one terminal list read and a loading body under the cached tabs (#39412)
* 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
2026-11-07 23:20:40 +00:00
Kelvin Amoaba 481f61152d perf(mobile): reopen agent session history from memory (#39387)
* 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
2026-11-07 23:14:37 +00:00
Kelvin Amoaba 2ec6ea4aad perf(mobile): prefetch the next and previous file in Review (#39355)
* 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.
2026-11-07 23:14:26 +00:00
Kelvin Amoaba 1363f16782 fix(mobile): keep the page after the phone reclaims its WebView in the background (#39415)
* 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
2026-11-07 23:13:47 +00:00
Kelvin Amoaba 850dd642f0 fix(mobile): stop a session opened on a pane from faulting the page (#39357)
* 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
2026-11-07 23:07:13 +00:00
Kelvin Amoaba 3ae6c3a0a7 feat(mobile): persist TanStack queries through the device store (#39313)
* 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
2026-11-07 23:06:57 +00:00
Jinwoo Hong 2e3d58691f fix(automations): retain interrupted verdict after agent quits to shell (#39397) 2026-11-07 18:05:57 -05:00
Kelvin Amoaba bdeb388d75 fix(mobile): replay a page's streams only after its connection verdict (#39419)
* 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
2026-11-07 23:00:18 +00:00
Kelvin Amoaba 1688a16a20 fix(mobile): save to the phone's store while the desktop is offline (#39464) 2026-11-07 23:00:09 +00:00
OrcaWinandOrcaWin 8f368c1df0 refactor(i18n): read render-path translations from useTranslate in settings (repository, browser, terminal, runtime environments, ssh) (#39356)
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>
2026-11-07 14:57:09 -08:00
Kelvin Amoaba a18165e046 fix(mobile): make the device store's size accounting and page writes safe (#39408)
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.
2026-11-07 22:56:59 +00:00
Kelvin Amoaba 679d343741 perf(mobile): merge the page bundle's small shared chunks into one (#39343)
* 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
2026-11-07 22:56:39 +00:00
OrcaWinandOrcaWin 26179069b6 test: remove 763 low-value tests (#39604)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 14:44:04 -08:00
OrcaWinandOrcaWin 8da13a8e6d test: remove 585 low-value tests (#39600)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 14:23:58 -08:00
OrcaWinandOrcaWin ddba7e3dc5 fix(ci): sync render-path translate baseline with settings group cards (#39595)
#39253 merged after #39353's CI ran, adding one translate() call in TerminalPane.tsx and removing one in CliSection.tsx.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 14:02:38 -08:00
OrcaWinandOrcaWin 60003df154 feat(i18n): make render-path translation reactive to the UI language (#39353)
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>
2026-11-07 13:44:33 -08:00
OrcaWinandOrcaWin 0956e333d3 test: remove 313 low-value tests (#39592)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 13:35:39 -08:00
OrcaWinandOrcaWin ed67e11362 test: remove 255 low-value tests (#39587)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 13:16:01 -08:00
5bb273776e perf(memory): run ps without a shell on each Resource Manager poll (#39445)
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>
2026-11-07 12:58:54 -08:00
OrcaWinandm4air 9138c7b699 perf(file-explorer): select the active worktree's git status and expanded dirs (#39442)
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>
2026-11-07 12:53:38 -08:00
NeilandCopilot 0b22e904e3 perf(terminal): avoid reparsing xterm inline color styles (#39482)
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>
2026-11-07 12:53:11 -08:00
OrcaWinandOrcaWin e3385d659b docs(contributing): explain the local Vitest transform cache (#39586)
Repeat `pnpm test` runs reuse transforms; raw `vitest` skips the cache.
Prompted by https://github.com/stablyai/orca/discussions/39390.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 12:51:25 -08:00
Neil 05af4b2a66 chore(native-chat): remove rail wake comments (#39585) 2026-11-07 12:50:24 -08:00
Brennan Benson c3534a9954 feat(settings): show each settings group as a titled card (#39253)
* 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
2026-11-07 12:37:16 -08:00
OrcaWinandOrcaWin a299de5630 test: remove 438 low-value tests (#39580)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 12:36:38 -08:00
Neil b0ac9ae521 refactor: organize native chat composer and conversation owners (#39534) 2026-11-07 12:26:03 -08:00
OrcaWinandOrcaWin 76ffc1f046 test: remove 618 low-value tests (#39576)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 12:06:11 -08:00
Brennan Benson c6e243d640 feat(native-chat): add /fork to fork a chat from its latest response (#39257)
* 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
2026-11-07 11:56:39 -08:00