Watch: review fixes for action errors that vanished, feed refreshes dropped or overwritten around a change, a fresh thread screen per route, errors cleared on sign out, notification actions only while paired, cache writes off the main thread and capped at 30 threads, Ask before acting and Load earlier races, two-letter search, C# headings, and strictly encoded query values

This commit is contained in:
gib committed 2026-11-02 15:29:15 -05:00
1 parent 99b300855e
commit 25be69fa30
14 files changed
+591 -94

No files matched your search

+18 -6
View File
@@ -92,7 +92,9 @@ row leaves at once and comes back with the error if its call fails. Settle all,
and the full list, is one `POST /v1/recent/settle` for every completed thread in Recent, including
those past the first 10. Failed threads stay. The completed rows leave at once, and the header says
so when the call fails or some threads did not settle. A finished notification has Settle too,
beside Reply and Open. It settles in the background without opening the app.
beside Reply and Open. It settles in the background without opening the app. A background action
only runs while the watch is paired. After unpairing, or in demo mode, it posts a notification
saying the watch is not paired.
## Snooze
@@ -120,10 +122,17 @@ content, a refresh keeps it on screen, and a failed refresh only adds a small di
The error and Try again replace the placeholder only when there is nothing to show. When a screen
goes away mid-request, the cancelled request shows no error.
On every refresh the app saves the last good feed as JSON in its caches folder, and it saves each
thread's detail when the thread loads. Launch shows the saved feed at once, with a dim "Updating" by the
count until the first refresh answers, and a thread opens on its saved detail while it loads.
Unpairing clears both. Demo mode never touches them.
A feed refresh asked for while another is out, as after Settle, Snooze or Allow, waits for it and
then runs once more. A feed answer to a request sent before a change, or before signing out, is
dropped, so a poll cannot put back a row the change removed. On the thread screen, a failed reply,
answer, Settle or Stop says why above Reply until the next action, and a reply that did not send
shows its text with Send again.
The app saves the last good feed as JSON in its caches folder, and each thread's detail when the
thread loads, off the main thread and only when it changed. It keeps the 30 threads saved most
recently. Launch shows the saved feed at once, with a dim "Updating" by the count until the first
refresh answers, and a thread opens on its saved detail while it loads. Unpairing clears both. Demo
mode never touches them.
## Activity, All threads and history
@@ -137,12 +146,15 @@ The feed's last row opens All threads: hosts from `GET /v1/projects` (offline on
host's projects by title, then the project's threads from
`GET /v1/projects/:hostId/:projectId/threads`, settled ones included. Each thread is one line with
a status dot and its age, and opens the usual thread screen. Each screen loads when it appears.
The search field at the top of All threads needs at least two letters, as the gateway does, and
says so under the field when given one.
A thread screen lists the thread's subagents under its messages, above Reply, each with a status
word. A row opens that subagent's thread. When the thread has messages before the latest 20, Load
earlier at the top fetches the page before them (`GET /v1/threads/:hostId/:threadId/history`), and
the next tap uses the cursor that page returned. The 10 s refresh replaces only the latest window.
Loaded pages stay, and a message shows once by id. Message text renders as markdown: bold, italics,
Loaded pages stay, and from the first tap the window a refresh replaces is kept too. A message shows
once by id, as its newest copy, so one caught mid-stream gets its full text. Message text renders as markdown: bold, italics,
inline code and links inline, headings in bold, list items as bullets, and fenced code in monospace.
Against a gateway older than these fields, the cards show the last message, and Load earlier and