docs: add operator inbox + flow agent filter + flow collapse + home page docs (follow-up to #1469 #1472 #1473 #1464)
This commit is contained in:
parent
8ddab401f9
commit
a5268560e1
1 changed files with 57 additions and 14 deletions
|
|
@ -100,6 +100,17 @@ operator, with amber pulsing border. Anatomy of each card:
|
||||||
- **◆ answ3red (N)** — collapsible `<details>` below the pending
|
- **◆ answ3red (N)** — collapsible `<details>` below the pending
|
||||||
list; shows the last 20 resolved questions with their answers.
|
list; shows the last 20 resolved questions with their answers.
|
||||||
|
|
||||||
|
**0PER4T0R 1NB0X** — messages agents have sent to `to="operator"` but
|
||||||
|
the operator hasn't read yet. Cold-loaded from `/api/operator-inbox` on
|
||||||
|
tab activation + page load; appended live from the broker `sent` stream
|
||||||
|
(deduped on row id). Each row shows sender · timestamp · body (with
|
||||||
|
file-path linkification). A `✓ mark all read` button on the right acks
|
||||||
|
all rows via `POST /api/agent/operator/mark-all-read` (reuses the existing
|
||||||
|
mark-read endpoint). Unread count folds into the Y3R C4LL tab pill so
|
||||||
|
messages are visible from any tab even while inactive. Backed by
|
||||||
|
`GET /api/operator-inbox` → `{ messages: [...] }` (id, from, body, at,
|
||||||
|
in_reply_to, file_refs).
|
||||||
|
|
||||||
## SYST3M tab
|
## SYST3M tab
|
||||||
|
|
||||||
Passive / rare-interaction state.
|
Passive / rare-interaction state.
|
||||||
|
|
@ -422,20 +433,45 @@ mark-all read). FL0W stays the pure event firehose.
|
||||||
**MESS4GE FL0W** — live broker tail wrapped in a `.terminal-wrap`.
|
**MESS4GE FL0W** — live broker tail wrapped in a `.terminal-wrap`.
|
||||||
Cold load backfills the last ~200 messages from `/dashboard/history`;
|
Cold load backfills the last ~200 messages from `/dashboard/history`;
|
||||||
live frames arrive on `/dashboard/stream`. Each row is one broker
|
live frames arrive on `/dashboard/stream`. Each row is one broker
|
||||||
event — `sent` or `delivered` — with `from → to: body`. The row is
|
event — `sent` or `delivered` — with `from → to: body`. When a `sent`
|
||||||
a `flex-wrap: wrap` container holding ts / arrow / from / sep / to
|
and `delivered` event for the same message arrive within 3 seconds
|
||||||
chips inline; the **body wraps to its own full-width line below**
|
(immediate delivery to a live recipient), the row is upgraded in place
|
||||||
the chips (`flex: 1 1 100%`) so the body always gets the full row
|
(arrow becomes green ✓, title reads "sent + delivered") instead of
|
||||||
width down to the content edge — long timestamps + agent names
|
rendering two near-identical lines — genuine delivery latency (recipient
|
||||||
used to push the body ~30ch in and force awkward narrow-column
|
was busy) still appears as a second row. Each row carries `data-from` /
|
||||||
wraps. `min-width: 0` keeps `word-break: break-word` effective so
|
`data-to` attributes; an **agent filter select in the FL0W header** narrows
|
||||||
the body doesn't force the row wider than its container. Sticky-
|
the timeline to messages involving the chosen agent (matched on `from` OR
|
||||||
bottom auto-scroll + "↓ N new" pill. Below the stream sits a
|
`to`), with non-matching rows hidden (`.flow-hidden` class). The selection
|
||||||
terminal-style compose box: `@name` picks the recipient (sticky via
|
persists in localStorage across reloads; new rows pick up the active filter
|
||||||
localStorage; auto-complete from the live container list, Tab/Enter
|
at render time. The dropdown populates from the live container list and
|
||||||
to confirm; `@*` broadcasts). `POST /op-send` drops
|
stays current on add/remove; a saved selection survives even if that agent
|
||||||
`{from:"operator", to, body}` into the broker; the resulting SSE
|
isn't currently listed.
|
||||||
frame re-renders the terminal row. Manager is addressed as `@root`.
|
|
||||||
|
The row is a `flex-wrap: wrap` container holding ts / arrow / from / sep
|
||||||
|
/ to chips inline; the **body wraps to its own full-width line below** the
|
||||||
|
chips (`flex: 1 1 100%`) so the body always gets the full row width down to
|
||||||
|
the content edge — long timestamps + agent names used to push the body ~30ch
|
||||||
|
in and force awkward narrow-column wraps. `min-width: 0` keeps
|
||||||
|
`word-break: break-word` effective so the body doesn't force the row wider
|
||||||
|
than its container. Sticky-bottom auto-scroll + "↓ N new" pill. Below the
|
||||||
|
stream sits a terminal-style compose box: `@name` picks the recipient
|
||||||
|
(sticky via localStorage; auto-complete from the live container list,
|
||||||
|
Tab/Enter to confirm; `@*` broadcasts). `POST /op-send` drops
|
||||||
|
`{from:"operator", to, body}` into the broker; the resulting SSE frame
|
||||||
|
re-renders the terminal row. Manager is addressed as `@root`.
|
||||||
|
|
||||||
|
## Home page (`/`, `/home.html`)
|
||||||
|
|
||||||
|
The H0M3 hub is the primary landing page (served at `/` by default). A
|
||||||
|
responsive grid of link tiles — Dashboard, Flow, Logs, Matrix (when enabled)
|
||||||
|
— each pointing to their respective surfaces. The page is a pure portal with
|
||||||
|
no tab-bar or SSE subscriptions. Typography + colours inherit from the shared
|
||||||
|
theme (Catppuccin Mocha via `common.css` + `theme.css`). The Matrix tile is
|
||||||
|
hidden until `home.js` confirms `matrix_gui_enabled` (same gating as the
|
||||||
|
dashboard's M4TR1X tab); `home.js` also fills the swarm/hive identity line
|
||||||
|
at the top. Dashboard is now served at `/dashboard.html` (route swap completed
|
||||||
|
in #1464 step 2); the home page at `/` replaces the old dashboard root. All
|
||||||
|
dashboard sub-pages include a `← Home` back-link for navigation.
|
||||||
|
|
||||||
## L0GS page (`/logs.html`)
|
## L0GS page (`/logs.html`)
|
||||||
|
|
||||||
|
|
@ -799,6 +835,13 @@ that's a browser-level decision, not ours.
|
||||||
not yet delivered and sets `acked_at = now`. Returns
|
not yet delivered and sets `acked_at = now`. Returns
|
||||||
`{ "marked": N }`. Agent name validated against
|
`{ "marked": N }`. Agent name validated against
|
||||||
`[a-z0-9_-]`, 1-63 chars; 400 on bad input.
|
`[a-z0-9_-]`, 1-63 chars; 400 on bad input.
|
||||||
|
- `GET /api/operator-inbox` — list unread messages addressed to
|
||||||
|
`to="operator"` (broker rows with `acked_at = NULL`). Cold-loaded
|
||||||
|
for the Y3R C4LL tab's ◆ 1NB0X ◆ section on page load + tab activation;
|
||||||
|
live updates fed from the broker `sent` stream. Returns
|
||||||
|
`{ messages: [{ id, from, body, at, in_reply_to, file_refs }, …] }`,
|
||||||
|
newest-first. Reuses `/api/agent/operator/mark-all-read` to ack (filters
|
||||||
|
are identical so every listed row is exactly what mark-read clears).
|
||||||
- `POST /op-send` (`to=<name>`, `body=<text>`) — drop an
|
- `POST /op-send` (`to=<name>`, `body=<text>`) — drop an
|
||||||
operator-authored message into `<name>`'s inbox. `to=*` fans
|
operator-authored message into `<name>`'s inbox. `to=*` fans
|
||||||
out to every registered agent. Returns 200; the broker
|
out to every registered agent. Returns 200; the broker
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue