Commit Graph
36 Commits
Author SHA1 Message Date
Neil 176943e8fe refactor(mobile-tasks): group modules by concrete feature owners (#41410)
* refactor(mobile-tasks): group modules by concrete feature owners

* refactor(mobile-tasks): consolidate concrete owner imports

* refactor(mobile-tasks): point recording loaders at concrete owners
2026-11-11 22:40:18 -08:00
Neil d1466f6017 refactor: finish terminal runtime and typography owner imports (#40761)
* refactor: finish terminal and Mobile defining-owner imports

* fix: retain completion coordinator type binding

* refactor: consolidate direct terminal tree imports

* refactor(renderer): import typography from defining owners
2026-11-10 04:51:57 -08:00
Neil d78a9b1e9a refactor(mobile): organize native chat by feature ownership (#40619)
* refactor(mobile): group native chat modules by feature owner

* refactor(mobile): consolidate concrete owner imports

* test(mobile): preserve pinned release source addresses

* refactor(mobile): import the recorded launch function type directly
2026-11-09 20:18:03 -08:00
Kelvin Amoaba cff1b3188e perf(mobile): show accounts from the last snapshot (#40425)
* perf(mobile): show accounts from the last snapshot

* fix(mobile): never count a stored accounts snapshot as live

* test(mobile): pin when accounts usage counts as live

* fix(mobile): date accounts reads by when they were sent and block switches until live

* fix(mobile): show accounts usage only from this screen's own read, drop replies from before a reconnect
2026-11-09 17:37:56 +00:00
Kelvin Amoaba 7fffb5c794 fix(mobile): stop Review's branch compare re-reading back to back during git bursts (#40278)
* fix(mobile): stop Review's branch compare re-reading back to back during git bursts

fetchHostQuery re-read a compare as soon as it landed marked by a git event, so a burst of gitStatusChanged events with reads slower than the event spacing kept the desktop running compares back to back, and kept going after Review closed. A re-read now goes at once only after a quiet spell (a write's own event), otherwise floorMs after the last read landed, and stops once Review's build is no longer current. A superseded build no longer evicts the entry a newer build is reading.

* fix(mobile): show each compare that lands during a git burst while Review reads it again

* fix(mobile): keep note edits when a later compare lands on a shown Review build
2026-11-09 15:52:13 +00:00
Kelvin Amoaba 8b1c394a41 perf(mobile): open Home with last-known workspaces and counts (#40129)
* perf(mobile): open Home with last-known workspaces and counts

* fix(mobile): keep disconnected desktops on Home and judge agents by the client's connect time

* fix(mobile): store the seeded Home counts before removing the old snapshot

* fix(mobile): floor router reads after failures, catch up reads that span a stream reopen, seed the wide host list from Home

* fix(mobile): keep the old Home snapshot until the store can take it, and never re-date stored totals

* perf(mobile): key Home's counts in the host list module so the page boot never loads Home's code

* test(mobile): type the Home catalog adapter's modules with type imports

* perf(mobile): read Home's stored rows in one batch beside the host list, and keep mark-read a delta read

* perf(mobile): paint Home's desktop rows without waiting for the stored counts

* perf(mobile): restore Home's stored rows after the desktop list paints, from its host ids

* perf(mobile): read Home's counts on the connected edge itself, not a render later
2026-11-09 14:06:15 +00:00
Kelvin Amoaba a68d614010 feat(mobile): open chats on their last messages after a relaunch (#40166)
* feat(mobile): open chats on their last messages after a relaunch

The phone's store keeps each chat's newest rows (up to 512 KiB, 500 rows)
and its resume point, written when a turn settles, on hidden and when the
chat closes. A relaunched session opens on its stored chat tab, paints the
saved rows, and resumes from the stored cursor; the live read restates what
the agent is doing. Offline, the composer line says when the copy is from.

* test(mobile): keep the relaunch test typechecking

* i18n(mobile): translate the offline as-of line

* perf(mobile): encode chat copies in slices off the settle frame
2026-11-09 13:58:05 +00:00
Kelvin Amoaba 6f83fb3c46 fix(mobile): floor event-driven reads after failures and catch up reads that span a stream reopen (#40142)
* fix(mobile): floor event-driven reads after failures and catch up reads that span a stream reopen

* test(mobile): pin the event router's read floor after a refused read in a recording
2026-11-09 13:51:51 +00:00
Brennan Benson 4fc4d792be Show folder workspace Source Control on the phone (#39999)
* feat(mobile): show folder workspace Source Control on the phone

A folder workspace now has Source Control on the phone: one row per attached
worktree (repo, name, branch, ahead/behind, change count), read from the host
list's own lineage projection and each worktree's git.status. Tapping a row
opens that worktree's existing Source Control in place; Back returns to the list.

* fix(mobile): folder Source Control routing, back, hidden reads and failure states

- A desktop worktree under a server's folder is listed and opens with desktop routing and gates.
- A child opened in the dock gets Back to the folder list beside Close.
- Rows and the catalog stop reading while the screen is covered, as the single-worktree screen does.
- Offline, failed and missing-folder states; rows whose status can't be read say Unavailable.
- Server rows poll like the host list; branch shown without refs/heads/.
- Perf contract: git.status reads per signal at N and 10N rows.

* perf(mobile): folder Source Control reads summaries and rebuilds only on lineage changes

- Rows read a status summary without per-file line stats; relayed servers' rows open no desktop event stream.
- Membership resolves over a projection of lineage and label fields, so agent and terminal churn rebuilds nothing.
- A row whose re-read failed or whose host reported readError shows Unavailable.
- A connection still coming up shows loading, not offline.
- Perf contracts at N/10N rows and H/10H catalog rows.

* perf(mobile): folder membership keys on lineage only; child status reads update the folder list

Membership resolves again only when a row's lineage fields change, keying
only rows the catalog replaced; labels come from the current rows. A child
Source Control's newer status read is handed to the folder list's summary,
so Back shows what an action did without another read.

* fix(mobile): folder summary takes child reads as they land and ignores server health

Membership depends only on each relayed server's installation, so health
and relay flips no longer resolve the folder again. A child Source
Control hands each status read to the folder summary as it is accepted,
so a summary read answering just after can't hide it, and an older read
never replaces a newer summary failure.

* fix(mobile): folder summary skips restored and cached reads that could undo newer ones

Persisted status is marked restored before anyone hears of it, so a
child screen never hands an earlier launch's status to the folder list.
A cached read caught up on opening writes only an idle summary and never
cancels one in flight. Perf contracts count real lineage serializations,
committed row renders and summary publications.

* fix(mobile): clear the restored mark on any answer but the restore's own

A live answer timed before the stored record, as after a clock
correction, is still this launch's, so its reads and the folder summary
treat it as confirmed.

* fix(mobile): the restore's own write skips clearing its mark only once

A listener replacing restored data as it hears of it writes this
launch's answer, so the mark clears for it too.

* test(mobile): type folder Source Control test fixtures without assertions

* test(mobile): name mocked modules with type-only namespace imports

* feat(mobile): show folder worktrees as cards on the sheet surface

Each attached worktree is its own grouped card on the grey sheet
surface, the look the phone's option sheets use, so rows read apart
from the page.

* fix(mobile): keep folder Source Control's states on the card surface

Loading, empty, error and the list now share the sheet surface, so the
screen no longer changes background between states.
2026-11-08 20:01:22 -08:00
Kelvin Amoaba 3ee351872c perf(mobile): read new-workspace host labels through the stored host-list query (#40096) 2026-11-09 03:35:45 +00:00
Kelvin Amoaba 353f4c5e28 fix(mobile): refresh Review's branch compare when the desktop reports a git change (#40088)
Review rebuilt only when a git.status read changed, so a base move that left this worktree's status as it was kept the old compare (also cached 30 s). The compare entries now take git.status's gitStatusChanged signal. A status read that lands after the signal marked the shown compare rebuilds Review without re-keying worktree diffs, and a compare read that lands marked is read again.
2026-11-09 03:04:19 +00:00
Kelvin Amoaba 57d45efe00 fix(mobile): paint host labels and relay server rows from the phone's store on relaunch (#40086)
* fix(mobile): paint host labels and relay server rows from the phone's store on relaunch

* refactor(mobile): reuse the SSH target summary schema for stored host labels
2026-11-09 03:02:45 +00:00
Kelvin Amoaba 9bfa701b9c perf(mobile): keep task lists on the phone between launches (#39948)
* perf(mobile): keep task lists on the phone between launches

* test(mobile): type the stored task list setItems mock
2026-11-08 20:45:13 +00:00
OrcaWinandOrcaWin 49d74f57b1 test: remove 6 low-value query and cache tests (#39953)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 12:06:50 -08:00
Kelvin Amoaba b032aa5615 feat(runtime): tell phones which settings changed (#39718)
* feat(runtime): tell phones which settings changed

* test(mobile): re-record Source Control goldens for the settings stream
2026-11-08 19:12:26 +00:00
Kelvin Amoaba f74bb65fa1 feat(runtime): tell phones when git status changes (#39672)
* feat(runtime): tell phones when git status changes

* fix(runtime): tell phones about HEAD and packed-refs moves too

* fix(runtime): don't let a phone's status re-read join a read begun before the change

* perf(runtime): limit status-read invalidation to the checkouts an outside change touched

* fix(runtime): match a checkout's status keys under any execution host

* fix(runtime): invalidate globally while a primary checkout is unread

* test(mobile): re-record the Changes and settings goldens on the rebased main

* fix(runtime): invalidate globally while a listed checkout has no cached path

* test: follow the moved paired-client harness

* refactor(mobile): let the host list's catalog read hold the event router
2026-11-08 18:36:13 +00:00
Neil 19043a3d76 refactor(mobile): organize pairing, session, RPC and host owners (#39846)
* refactor(mobile): give relay and encryption concrete owners

* refactor(mobile): organize session and review feature owners

* refactor(mobile): organize RPC and host ownership

* test(mobile): point render fixtures at concrete owners

* refactor(mobile): use explicit type-only owner imports
2026-11-08 07:19:05 -08:00
OrcaWinandOrcaWin 88aa9fa82a test: remove 154 low-value tests and redundant relay checkpoints (#39814)
* test: remove 155 low-value tests and two relay checkpoints

* test: retain schema drift protection and remove dead imports

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 03:06:41 -08:00
Kelvin Amoaba 81c97bb124 perf(runtime): push worktree row changes; host list poll becomes a 10 s backstop (#39688)
* perf(runtime): push worktree row changes; host list poll becomes a 10 s backstop

* fix(runtime): announce title-only agent status changes and gate the rows capability with the switch

* fix(mobile): keep event reads a floor apart while a read is out; announce a retired title clear

* test(runtime): assert the rows notice without counting events
2026-11-08 06:42:18 +00:00
Kelvin Amoaba 3b6d5d4c15 feat(mobile): keep screen data on the phone between launches (#39719)
* feat(mobile): keep screen data on the phone between launches

* feat(mobile): keep the repo list snapshot id across launches

* fix(mobile): don't read a key again that the boot read just found empty

* fix(mobile): late-restored strips, revocation fence and reads never built on stored data

* test(mobile): give the session startup recording the late strip watch

* fix(mobile): remember Workspace options, keep the revocation fence until reauth, store no terminal output

* test(mobile): give the view settings recording its remember hook

* docs(mobile): say what a restored key means to a fetch

* style(mobile): format host-query after rebase onto Q11
2026-11-08 06:26:49 +00:00
Kelvin Amoaba 3e9ca6e85a perf(mobile): open the PR tab with its last state and refresh only what a write changed (#39709)
* perf(mobile): open the PR tab with its last state and refresh only what a write changed

* fix(mobile): allow the phone's comment re-read and settle review findings

* fix(mobile): keep PR reads current across path switches and overlapping writes

* refactor(mobile): share PR query keys and simplify PR write rollbacks

* chore(mobile): list every PR action and comment write kind explicitly

* fix(mobile): read the push-time PR reread through an effect event

* fix(mobile): report a comment write interrupted by a path switch as unconfirmed

* fix(mobile): settle a comment write whose reply was lost from the re-read comments

* style(mobile): format host-query after rebase onto Q12
2026-11-08 06:12:07 +00:00
Kelvin Amoaba b4eda05c81 perf(mobile): show the last task list per filter while it refreshes (#39668)
* perf(mobile): show the last task list per filter while it refreshes

* perf(mobile): read Tasks repos six at a time

* fix(mobile): hold Tasks paging while kept rows re-read

* test(mobile): pin Tasks paging held during a query switch

* perf(mobile): read Tasks repos four at a time, the desktop's gh limit

* test(mobile): give the Linear connect recording the revalidating input

* perf(mobile): open Tasks on its kept hydration and lists through host query families

* fix(mobile): keep the desktop's newer Tasks state and only cancel screen-read queries

* fix(mobile): type the Jira refresh harness and Tasks list read for CI
2026-11-08 05:53:45 +00:00
Kelvin Amoaba 1ef68f5062 perf(mobile): stop polling automations when the desktop reports changes (#39664)
* perf(mobile): stop polling automations when the desktop reports changes

* perf(mobile): ship the host event router in the query hooks' chunk
2026-11-08 05:52:59 +00:00
Kelvin Amoaba db7ff5c8ff fix(mobile): re-subscribe Home and the follow-up preference after the client event stream ends (#39655)
* fix(mobile): re-subscribe Home and the follow-up preference after the client event stream ends

* fix(mobile): try a refused client event wire once per connected edge

* refactor(mobile): mark replayed client event readies in the shared stream

* test(e2e): give the phone feed socket client a state listener
2026-11-08 05:52:38 +00:00
OrcaWinandOrcaWin e833bb703c test: remove 140 low-value tests (#39644)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 17:40:01 -08:00
OrcaWinandOrcaWin e4a479ceec test: remove 282 low-value tests (#39632)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 16:51:15 -08:00
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 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 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
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
OrcaWinandOrcaWin f5f45784e2 test: remove 212 low-value mobile shell and routing tests (#39334)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-06 23:07:50 -08:00
Kelvin Amoaba 1763014bea perf(mobile): reopen Files folders from memory (#39175)
* perf(mobile): reopen Files folders from memory

* test(mobile): re-record Files explorer goldens for query reads

* fix(mobile): paint cached Files rows before the host client attaches

* refactor(mobile): share query observer options and Files' empty-state rules

* test(mobile): type the Files explorer test host
2026-11-07 04:41:21 +00:00
Kelvin Amoaba 93187e7d66 feat(mobile): show a thin refresh line under the header while cached data refreshes (#39170)
* feat(mobile): show a thin refresh line under the header while cached data refreshes

* fix(mobile): start the refresh line still under unknown motion and key it by execution host

* fix(mobile): draw the refresh line only once the motion preference is known

* fix(mobile): start the refresh sweep at the left edge on each reveal

* refactor(mobile): drive the refresh line from the screen's own refetch and keep its timers in the header

* test(mobile): give the Changes content fixture the new refreshing field
2026-11-07 04:05:35 +00:00
Kelvin Amoaba 22f09f4257 refactor(mobile): read host capabilities from one status read per connection (#39157) 2026-11-07 04:04:19 +00:00
Kelvin Amoaba 489a6a66a4 perf(mobile): reopen Source Control's Changes list from memory instead of rescanning (#38988)
* perf(mobile): reopen Source Control's Changes list from memory instead of rescanning

* fix(mobile): keep action errors through background status reads

* fix(mobile): let only explicit status reads clear Source Control's action error

* refactor(mobile): simplify the query layer and the Changes compare trigger

* fix(mobile): follow language switches in Changes' empty states
2026-11-06 16:46:31 +00:00