feat(webui): one Agents page for the whole system, Fire pinned to the row's organization (#1873) #1968

Merged
jason.woltje merged 3 commits from sp5-agents into refactor 2026-11-15 09:53:21 +00:00
Owner

One Agents page for the whole system (#1873, lane sp5). Fifth slice of the single-pane direction.

What changes for a person:

  • #/agents lists every organization's agents in one table: name, role, state, what it is working on, with the organization chip and a project chip when there is one.
  • Filters by organization and by state live in the hash query, so a reload keeps them.
  • Fire posts to the row's own organization, never the one opened last, and shows only where that organization's config lets this Console decide. Its label and receipt name the organization.
  • Open goes to #/orgs/<id>/agents?agent=<key>, which lists that agent first and marks it.
  • A stopped organization is named at the top as not read, with the reason.
  • A hired agent shows "Hired" or "Hired from pack X". The org:hire-<uuid> id stays as secondary text.
  • #/orgs/<id>/agents still works: the same table scoped to that organization, above the levels grid.

How: WebUI only (workspace.js, bus.js, display.js, shell.css). Fire uses the existing hire.start route. No new route, no role, contract or schema change.

Tests: new tests/system-agents-browser.test.mjs (10 tests), red first. Lane gate 95 files, 745/0. Lead check at f97e0d3ae: 8 WebUI files one at a time, 89/0.

Reviews (fresh Opus 5.5 delegates): review 1 asked for one change (Open on the scoped page linked to itself), fixed with four P3. The re-check approved with three P3 notes, fixed in f97e0d3ae, which the Lead read instead of a third reviewer.

Not tested: a named Fire's receipt surviving an organization switch while in flight. Read only.

Follow-ups:

  • No agent detail drawer, no stop or message per agent. The per-organization page has none either.
  • A hire shows "Hired", not the template it was hired as. Reading it costs one decision read per hired agent per poll.
  • Long hire ids wrap over several lines at 390.
  • Each poll makes one instances read and one config read per answering organization.
One Agents page for the whole system (#1873, lane sp5). Fifth slice of the single-pane direction. What changes for a person: - `#/agents` lists every organization's agents in one table: name, role, state, what it is working on, with the organization chip and a project chip when there is one. - Filters by organization and by state live in the hash query, so a reload keeps them. - Fire posts to the row's own organization, never the one opened last, and shows only where that organization's config lets this Console decide. Its label and receipt name the organization. - Open goes to `#/orgs/<id>/agents?agent=<key>`, which lists that agent first and marks it. - A stopped organization is named at the top as not read, with the reason. - A hired agent shows "Hired" or "Hired from pack X". The `org:hire-<uuid>` id stays as secondary text. - `#/orgs/<id>/agents` still works: the same table scoped to that organization, above the levels grid. How: WebUI only (`workspace.js`, `bus.js`, `display.js`, `shell.css`). Fire uses the existing hire.start route. No new route, no role, contract or schema change. Tests: new `tests/system-agents-browser.test.mjs` (10 tests), red first. Lane gate 95 files, 745/0. Lead check at f97e0d3ae: 8 WebUI files one at a time, 89/0. Reviews (fresh Opus 5.5 delegates): review 1 asked for one change (Open on the scoped page linked to itself), fixed with four P3. The re-check approved with three P3 notes, fixed in f97e0d3ae, which the Lead read instead of a third reviewer. Not tested: a named Fire's receipt surviving an organization switch while in flight. Read only. Follow-ups: - No agent detail drawer, no stop or message per agent. The per-organization page has none either. - A hire shows "Hired", not the template it was hired as. Reading it costs one decision read per hired agent per poll. - Long hire ids wrap over several lines at 390. - Each poll makes one instances read and one config read per answering organization.
jason.woltje added 3 commits 2026-11-15 09:53:13 +00:00
#/agents lists every organization's agents in one table: name, role, state,
what each works on, organization and project chips. Org and state filters
live in the hash query. A stopped organization is named at the top. A row
opens the agent in its organization; Fire is drawn only where that
organization's own config lets this Console decide, and posts to that
organization's hire route. #/orgs/<id>/agents leads with the same table
scoped to one organization, above the levels grid and held roles. A hired
agent reads as Hired (or Hired from pack X) with its org:hire id as
secondary text. The sidebar and dashboard Agents links open the system page.
- Open on #/agents goes to #/orgs/<id>/agents?agent=<key>; the scoped table puts that agent first,
  marks it (aria-current) and draws no Open or Actions column (review F1, F2).
- Fire's aria-label, confirm group and receipt use the organization's label (F5).
- A Fire sent to a named organization keeps its receipt after the opened organization changes (F7).
- Cancel moves focus back to the row's Fire (F10).
- agentsPage refuses a scope that is not an organization id instead of listing every organization (F11).
jason.woltje merged commit f97e0d3aeb into refactor 2026-11-15 09:53:21 +00:00
Sign in to join this conversation.