Watch
0
0
Fork
You've already forked hyperhive
0
Commit graph hyperhive/docs/swarm/ui.md
Author SHA1 Message Date
atlas
e46ad07226 add a per-agent egress log mode 2026-10-30 08:52:22 +01:00
iris
b74011bb54 the builds list keeps the swarm's deploy builds too
build_meta, the build of each agent from internal/meta before a deploy, now
writes its result into the same list as the config PR builds: the agent, the
internal/meta commit, how it ended and what nix printed. The builds card titles
them by agent and shows them with the PR builds.
2026-10-30 02:06:07 +01:00
atlas
7e2f4ce7c8 always include a hive's own allowedDomains in the rendered swarm-wide list 2026-10-29 08:25:22 +01:00
atlas
c5a876b845 derive an agent's backend hosts into the egress allow list at the controller 2026-10-29 08:25:22 +01:00
atlas
c9abc2a42b make squid's allowed domains editable at runtime in the swarm ui 2026-10-28 23:01:43 +01:00
iris
1ee481c0b1 swarm-ui: the setup assistant shows when ruth is declared destroyed 2026-10-28 22:14:52 +01:00
iris
da5fcbfd9b subagents publish their model and effort as headers on every row, and the swarm shows them
The subagent daemon stamps Swarm-Model and Swarm-Effort on each row it
publishes. The list endpoint reads them off the newest row it already fetches,
so a long-running subagent keeps them past the stream's 24 hour window, and the
terminal page's menu and the agent panel's list show them beside the name.
2026-10-28 21:55:02 +01:00
iris
2f2b4aa9e2 swarm-ui: cancel turn is a badge over the terminal, not a button by send 2026-10-28 20:12:11 +01:00
iris
214d7000d3 swarm-ui: the agent terminal page gets cancel turn, effort, state age and the expand-output setting
The per-agent page had these and the swarm terminal did not; they need no new
backend. A cancel turn button beside send, shown while the agent is in a turn,
posts to the controller's existing cancel route and says whether a turn was
stopped. The terminal's badges add the effort and how long the agent has been in
its turn state. The expand tool output setting moves to the shared package so
both pages render the one component, and the swarm menu gets it. Docs follow.
2026-10-28 20:12:11 +01:00
iris
24f6690fe5 swarm-ui vhost: cache by name, 404 a missing file, carry a content security policy
After a deploy a browser could keep the old entry document, which named a
bundle that no longer exists, and the missing script was answered with the
entry document, so the page was blank with only a MIME-type error to say why.

The hashed bundle is immutable and a missing file is a 404; the entry document,
the worker, the manifest, the icons and the theme's colors.css are revalidated.
The pages carry a content security policy. The service worker fetches its shell
past the HTTP cache, logs a failed install, refreshes the cached entry document
on each navigation and holds cache writes open with waitUntil. The proxy test
pins the cache rules, the 404s and the policy; docs/swarm/ui.md says what the
browser keeps.
2026-10-28 19:56:55 +01:00
iris
4d5a65a185 swarm-ui: a request that finds the login ended reloads the page to the login
The gateway answered every non-page request without a session with a login
redirect, which fetch and EventSource cannot follow across origins, so polls,
forms and streams failed with errors that said nothing about the session. It
now answers anything that does not ask for text/html with a 401 and a
WWW-Authenticate header, and the swarm UI reloads on that 401, from a wrapped
fetch (one place for every call) and from a probe after a stream dies. A second
reload within ten seconds is skipped so a page that keeps answering 401 cannot
loop. The proxy test and the docs follow.
2026-10-28 19:19:26 +01:00
atlas
b551eb02ff send agent traffic through squid once its hive announces it 2026-10-28 17:24:34 +01:00
atlas
501445ebc3 apply each agent's internet flag to its squid credential 2026-10-28 17:23:33 +01:00
atlas
57b04d6c49 let the operator set, replace and remove an agent's backend env from the swarm ui 2026-10-28 08:49:32 +01:00
atlas
10508895c4 swarm-ui: show and toggle an agent's unrestricted internet flag, add it to the create dialog 2026-10-27 14:45:04 +01:00
iris
599747bacb swarm-ui: alerts and the issue report are folded cards on a reports tab
The alerts and issues tabs are one reports tab in the nav. Each page, unchanged
inside, is a card that starts shut and reads nothing until opened; the alerts
header's link, button and refresh picker move into the card's body. /alerts and
/issues redirect to /reports. Docs follow.
2026-10-26 23:04:32 +01:00
iris
9ffd537aa2 swarm-ui: the review classifier is a folded card on the jobs tab
The review tab is gone from the nav. Its page, unchanged inside, is a card on
/jobs that starts shut and reads nothing until opened; /review redirects to
/jobs. Docs follow.
2026-10-26 20:35:06 +01:00
iris
bdef828df3 swarm-ui: the schedules are a folded card on the messages tab
The schedules tab is gone from the nav. Its page, unchanged inside, is a card
on /messages under the broadcast card that starts shut and reads nothing until
opened; its add button and refresh picker move into the card's body.
/schedules redirects to /messages. Docs follow.
2026-10-26 20:28:58 +01:00
iris
d269c06d58 docs: say the jobs and builds cards start shut, in the active voice 2026-10-26 20:09:29 +01:00
iris
8f5b3a2fa8 swarm-ui: the jobs and builds cards are folded by default
Both cards on the jobs tab start shut and read nothing until opened; a link
with ?run= opens the builds card. The fold-and-build-on-first-open part of the
hives card is now one LazyDisclosure, which the hives card uses too. Docs
follow.
2026-10-26 20:09:17 +01:00
iris
a2f000bab4 swarm-ui: builds are a card under the job graph on the jobs tab
The builds tab is gone from the nav; its card sits below the jobs card on
/jobs. The swarm-builder commit status now links to /jobs?run=<id>, and the old
/builds address redirects there with its query so links already on PRs still
open the build. Docs and the link test follow.
2026-10-26 20:02:57 +01:00
iris
5db38a596e docs: rephrase the vale warnings that have a better wording
Words the alex and Microsoft styles flag where a plainer one reads as well:
disabled/special/invalid as a state, primitive, trap, hang, several, click,
first-person FAQ questions, hyphenated adverb pairs. Left as they are: Let's
Encrypt, quoted UI labels and phrases, the generated forge CLI reference, and
the middle-click gesture.
2026-10-26 18:45:04 +01:00
iris
b53365e371 docs: put the credentials prose on the overview and the tables on the reference
The folded-in secrets.md text sat after the reference's table, so the
reference was half prose. The overview now holds all the prose (where a
secret lives, topologies, the swarm- and hive-level notes, how a reader
reaches the store, the browser UI, adding a secret) and the reference holds
only the tables, each pointing at the section that explains it. No text
dropped; links that asked for the explanation now go to the overview, and
the ones that asked for a list or a row go to the reference.
2026-10-26 18:10:01 +01:00
iris
d273fa8028 docs: fold swarm/secrets.md into the credentials reference
secrets.md and credentials-reference.md answered the same question from two
pages. secrets.md's text now follows the reference's table and operating
notes as a 'Where each secret lives' section, unchanged apart from where it
sits. Every link and doc path that named secrets.md (docs, nix comments,
crate READMEs) points at credentials-reference.md; anchors are unchanged.
2026-10-26 18:10:01 +01:00
iris
2d29711df9 docs: split credentials.md into an overview and a per-secret reference
The overview keeps the store invariant, the mTLS exception and the
minter/reader/renewal contract. The table of every credential and the
operating notes (forge token checks, re-creating agents, revoking a queue
credential, store login retries) move unchanged to credentials-reference.md,
and the links that asked where a credential lives point there.
2026-10-26 18:10:01 +01:00
iris
70917b7dd0 swarm-ui: hives are a folded card on the agents page, and hide developer details also hides the components tab
The hives nav tab and route go, with no redirect; the roster is a card above
the agents panel that starts folded and is read on the first open. The
settings toggle is renamed from hide debug output to hide developer details,
as it now also drops the components tab (the page still answers at
/components); the stored preference keeps its key.
2026-10-26 17:56:10 +01:00
iris
a2e8a2bda0 swarm-ui: dropdowns open a themed list of their own instead of the browser's
SelectField and the refresh-interval picker are built on a new Listbox, a
select-only combobox: a button that keeps focus and a listbox in the top
layer, so it works the same in every current browser, is not clipped by a
scrolling ancestor and shows above a modal dialog. Keys, type-ahead and
placement are pure functions with tests. required becomes aria-required, as a
button has no native form validation.
2026-10-25 17:15:04 +01:00
iris
31f8a521e0 swarm-ui: the broadcast composer is its own folded card above the messages card
Replaces the broadcast button in the messages card's header: a Disclosure
titled broadcast, folded by default, over the messages card. The composer is
built on the first open and kept, so it polls the agent list only once used.
The broadcast page wording in broadcast-types.ts and its test now says
composer.
2026-10-25 16:28:26 +01:00
iris
6cf89755e2 swarm-ui: broadcast is a composer on the messages page, not a tab of its own
The messages page gets a broadcast button that opens the agent picker and
message box above the stream, so a sent message shows up in the list below
it. The broadcast route and nav tab go, with no redirect: the page is now the
composer, BroadcastComposer, in the messages page.
2026-10-25 16:28:26 +01:00
atlas
711e413901 swarm-ui: tooltip on the inert wanted badge says to create the agent at swarm level; docs note destroy needs it too 2026-10-25 16:09:14 +01:00
atlas
d8c2fb91b2 docs: contraction in the swarm ui wanted-badge paragraph 2026-10-25 16:02:34 +01:00
atlas
716290e4d2 swarm-controller: state route refuses an agent the swarm has not declared on that hive
A placing state is accepted only for an agent declared or queued on the hive; anything else gets 404 telling the caller to create it at swarm level. swarm-ui's wanted badge no longer offers a first declaration for an undeclared row.
2026-10-25 15:58:25 +01:00
iris
cd41e1d510 swarm-ui, hive dashboard, agent page: one profile menu with the signed-in user, avatar and authelia links
The swarm UI's user menu moves to @hive/shared and takes the whoami URL and
authelia's URL as props; the swarm UI keeps a thin wrapper, and the hive
dashboard and the per-agent page mount the same component. The dashboard's
nginx vhost proxies /api/whoami to authelia (the agent page is served from
the same vhost), and hive-c0re's state carries authelia_public_url, set from
services.hyperhive.swarm.authelia.url. The agent page shows the menu only
behind the gateway.
2026-10-25 15:25:20 +01:00
iris
10b8422d93 swarm-ui: the state row offers reconnect when its stream closes, and says no report yet 2026-10-25 15:07:39 +01:00
iris
705160c0fd swarm-ui: move the terminal preview's state badges into a state row of the agent details table
The small preview in the detail panel keeps only the connection badge and
expand, and no longer follows the agent's state stream; the full terminal
tab keeps all its badges. The table gets a state row with the turn state, a
paused badge, and the context and billed tokens (not the model, which the
inference row shows). The preview's top padding drops to one badge row, and
the showHeaderBadges prop goes since the full-tab mount is now the only one
with badges.
2026-10-25 14:52:57 +01:00
atlas
acfdcd725f reword stale hive-domain discovery claims 2026-10-25 12:15:22 +01:00
iris
c9649b258f swarm-wire: say the repos list holds only repositories with an open issue 2026-10-25 12:14:46 +01:00
iris
b6da2bc9d0 swarm-wire, swarm-ui: the flow schema lists the values a field takes, and the editor picks them instead of asking for typed names
The schema's event fields gain values, a values_from marker (agents, repos)
and a closed flag; a node field gains the marker and the flag. kind is now
listed as issue and PR, what the router sends. The flow editor shows a
dropdown where the list is complete, suggestions where it is only examples,
and a plain box where there is none.
2026-10-25 12:14:46 +01:00
iris
404d8334aa swarm-ui: preview a draft flow's hit counts in the editor with the dry-run route
The editor's preview button posts the draft to POST /api/notify/dry-run and
puts each box's hit count on the canvas; any edit hides the numbers. Boxes of
kind request_reviewer label themselves "reviewer", so the long kind name no
longer runs into the hit count shown beside it.
2026-10-25 11:00:38 +01:00
iris
6e7b5f84e9 swarm-ui: give the new-flow draft a route no flow id can take, and drop the dead hit-count rule
/notifications/new could be a saved flow's own page, so the draft now opens at
/notifications/draft/new, which has a segment more than any flow's route. The
placeholder id no longer needs reserving. The .notify-node-hits rule styled the
removed tree rows; nothing renders it.
2026-10-25 02:05:54 +02:00
iris
d0a55502a8 swarm-ui: draw notification flows as graphs in the list and make a new or copied flow a draft until saved
The flows list draws each flow as the editor's graph, read-only and with the
dry run's hit counts in the boxes, in place of the indented tree. A box's line
of text is cut by the browser at the box's edge, so it no longer runs out of it.

create flow (a primary button beside the refresh interval) and duplicate open
the editor on an unsaved draft at /notifications/new, with ?from= naming the
flow to copy; the flow is made by save, under an id taken from its name. Edit
and duplicate are buttons in the flow's header row. The editor's head and
inspector are laid out as sections.
2026-10-25 02:05:54 +02:00
iris
b93eaaff51 swarm-ui: fix the stale refusal comment, guard the create dialog's submit, say what create another keeps
The refusal comment still described collapsed sections the dialog no longer
has. The form's submit now returns while a create is in flight. The docs say
create another keeps only the hive.
2026-10-25 01:44:24 +02:00
iris
339da0aebe swarm-ui: make agent creation a five-step dialog with a fixed header and footer
The create dialog was one tall form that scrolled as a whole, so its header
and button moved out of view. It is now steps you go through in order:
identity, instructions (AGENTS.md in a box of its own), permissions,
resources and inference, then a summary of what will be sent and what the
agent creation queues, where create is. The header, step tabs and footer stay
put and only the step's own fields scroll. A refused AGENTS.md text sends the
dialog back to its step. The request is unchanged.
2026-10-25 01:40:20 +02:00
iris
78c48272ee swarm-ui: edit an agent's permissions on its detail panel
The detail panel had editors for inference, instructions, resource caps and
accounts, but nothing for the permissions the swarm grants, which could only
be set at create time or with swarmctl. A permissions row shows the grant
(the default set, none, or the list) and an edit dialog ticks the catalogue
from GET /api/permissions and saves with PUT /api/agents/{agent}/permissions.
Ticking exactly the default set sends the DELETE, as the create form sends no
list for it.
2026-10-25 01:18:26 +02:00
atlas
ed1fd053e7 notify router: deliveries log, dry-run hit counts, api and page 2026-10-24 22:13:07 +02:00
atlas
0b1669a364 request the review classifier's review when a PR's head moves
The router gets a request_reviewer node and a pull_request_sync source;
the built-in head-classifier flow asks swarm-controller, over
$SWARM.router.sink.request-reviewer, to request review-classifier on
every push, unless its review of the head already stands. The controller
subscribes to pull_request_sync on its pull-request hook and answers
the router; nats-auth grants the router the publish and the controller
the subscribe.
2026-10-24 17:23:36 +02:00
iris
68e289fff5 swarm-ui: rewire a notification flow by drag or keyboard
The flow editor can now change a flow's shape on the canvas, not only
through the inspector's fields:

- drag a box onto another to move it and its branch there; a drop the
  save would refuse shows the target dashed red and gives the reason;
- a palette of node kinds adds a node below the picked box on click, or
  below any box it is dragged onto; it offers what the controller lists;
- arrow keys walk the tree, M picks a box up and Enter drops it under
  the focused one, Alt+Up/Down reorder a node among its siblings, Delete
  removes a branch; focus follows the edit;
- each box with siblings says when it runs, and the inspector can move
  it earlier or later, since the router runs children in edge order;
- request_reviewer is a second leaf kind beside todo, with a reviewer
  field;
- leaving with unsaved edits asks first, also for in-app links and the
  back button (a router hook runs navigation past a page's guard).
2026-10-24 15:08:48 +02:00
iris
fb8aa23e66 swarm-ui: a todo switched from clear to upsert drops its prefix flag 2026-10-24 14:40:39 +02:00
iris
06f3e76329 docs: edit-flow section reads clean under the prose lint 2026-10-24 14:40:39 +02:00
iris
f28e1e9063 swarm-ui: edit a notification flow on a canvas
A custom flow opens at /notifications/<id>: its nodes drawn left to right
(source, then matches, then todos), and a panel to edit the picked node: the
source's events, a match's conditions, a todo's recipients, op, key and text.
Add a match or todo below a node, move a branch under another match, or remove
it; an edit the controller would refuse (a todo with children, a second
parent, a cycle, over the node or depth cap) is turned away with the reason.

Edits stay in a draft until save, which sends the whole document at the
revision read. A stale revision is told apart from a refused document: the
editor offers to reload or to keep the draft on top of the latest. The form
choices come from the controller's schema when it sends one.

The list page gains edit and duplicate on custom flows, duplicate on the
built-ins, and a new-flow box; a new flow's id avoids the built-ins' too.
2026-10-24 14:40:39 +02:00