bus, webui, cli: the Console shows the reply to a web send (#1575)

Row 81. The broker gains a `replies` read verb for human and reader
sessions: `{id}`, a message UUID, returns that business's messages whose
in_reply_to is the id, oldest first, at most 50, and writes no
deliveries row, so the reply still reaches the next `mosaic talk`. An
unknown id refuses message-not-found. The Console serves it through
BUS_VERBS with an id check, and the Sent receipt shows the replies to a
web send. The cli's talk timeout message and README now say the reply
may still come and the next `mosaic talk` prints it.

Dewey's round 2, candidate manifest 3ce7527f, base 1e5f5958, a rebase
after row 61. Approved by Darkwing (27783 round 1, 27821 round 2).
Sage's gate green 19:25:18Z to 19:30:39Z. Live at the next bus restart
(the broker verb) and Console restart (the view), bus first.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-12 14:33:11 -05:00
co-authored by Claude Opus 5.5
parent 9438880e67
commit c9a5650ed0
13 changed files with 455 additions and 30 deletions
+23 -9
View File
@@ -180,8 +180,9 @@ On the page:
memory like a Reply draft. Reloading the page loses it. Send is disabled
while a send is pending.
- Sent shows the message id and links its trail, `#/trail/message/<id>`:
the message and its deliveries. A reply is not in it. The text is cleared
unless it was edited during the send.
the message and its deliveries. A reply is not in the trail; it shows
under the receipt (below). The text is cleared unless it was edited
during the send.
- Not sent shows the broker's code and keeps the draft. A redirect counts
as not sent: the Console never redirects this route, so only the sign-in
proxy does, when its session has expired. The page asks for a reload to
@@ -192,9 +193,19 @@ On the page:
unknown, here and on the board's Reply, since a proxy can answer it
after forwarding the request (Envoy's `stream_idle_timeout`).
The role's reply comes back as a message to the human. The Console doesn't
show it yet; that view is row 81 (#1575). Jason's next `mosaic talk` in a
terminal prints it, within talk's limits:
The role's reply comes back as a message to the human with `in_reply_to`
set to the sent message's id. Since row 81 (#1575) the Sent receipt lists
those replies, oldest first, each with its role, time, class, body and a
trail link. It reads them with the bus `replies` read on every render, so a
reply shows on the next ten-second refresh or Read again. "No reply yet"
means the read returned none; "could not be read" means it failed, and the
next refresh tries again. The bus returns at most 50; at 50 the receipt says
only the first 50 show. The list belongs to the last Sent receipt: a new
send starts its own, and reloading the page drops it.
The Console only shows replies. It never receives a message or marks one
delivered or read: `replies` writes no `deliveries` row. So Jason's next
`mosaic talk` in a terminal still prints each reply, within talk's limits:
- talk receives only after it sends its own message;
- `--wait 0` returns straight after the send and receives nothing;
@@ -394,10 +405,13 @@ session reader or transport is implemented here. The session reader is
`packages/conversation`, served by the board.
GET `/api/bus/inbox`, `/api/bus/tasks`, `/api/bus/agents`,
`/api/bus/trail?subject=<id>`, `/api/bus/decisions?list=roles|recent` and
`/api/bus/credentials` are the bus reads (`src/bus.mjs`). Any other method is 405. The subject must match
the broker's identifier rule, and the list must be `roles` or `recent`, else
400. `decisions` (row 57, #1546) is for the Inbox tabs "Routed to roles" and
`/api/bus/trail?subject=<id>`, `/api/bus/decisions?list=roles|recent`,
`/api/bus/credentials` and `/api/bus/replies?id=<message id>` are the bus
reads (`src/bus.mjs`). Any other method is 405. The subject and the id must
match the broker's identifier rule, and the list must be `roles` or
`recent`, else 400. `replies` (row 81, #1575) is the messages whose
`in_reply_to` is that id, for the Sent receipt; the bus refuses an id that
names no message (`message-not-found`, 400). `decisions` (row 57, #1546) is for the Inbox tabs "Routed to roles" and
"Recent"; "Human and reader paths" in `packages/bus/README.md` has what each
list holds. `credentials` (row 60, #1549) is the bus host's credential
status: service, account, role, date and state for each credential it