Watch
0
0
Fork
You've already forked hyperhive
0
Commit graph

5,824 commits

Author SHA1 Message Date
iris
fa131b46a6 dashboard: remove the flow page and the endpoints only it used
The flow page showed the raw broker message stream and had a compose box.
This removes the page and its bundle, its link in the pages menu, and the
styles only it used.

The history endpoint that backfilled it and the operator-send endpoint
behind the compose box had no other caller, so they go too, along with
the broker query behind the history endpoint. The stream endpoint stays:
the dashboard tabs still subscribe to it.

The docs lose the FL0W section and the references to the two endpoints.
2026-10-21 23:57:37 +02:00
iris
acf82beba3 swarm-ui: add CheckboxField and use it for the issue report toggle and the account delete option 2026-10-21 23:56:30 +02:00
damocles
a1a70e257c agent prompt: point the forge condition at HIVE_FORGE_TOKEN_FILE instead of a state-dir file 2026-10-21 23:55:44 +02:00
damocles
9d1a8c0d9a screen relay: close the websocket when the vnc side hangs up and stop the surviving task 2026-10-21 23:55:24 +02:00
iris
515d974f11 docs: separate the load-failure reason from the field text in the create-agent dialog 2026-10-21 23:33:54 +02:00
iris
803ba01372 docs: describe the create-agent dialog's hive and permission load failures 2026-10-21 23:33:54 +02:00
iris
46a6fc36d8 swarm-ui: say when the hive or permission list failed to load, and name the permissions group 2026-10-21 23:33:54 +02:00
iris
8c67ac01fe swarm-ui: show, sort and filter the hive domain by one value, say when the roster is empty, keep the schedule agent picker current
The domain column showed a dash unless a hive had a dashboard but sorted
and filtered on the domain alone, so rows looked mis-sorted. It now shows
the domain as text when there is no dashboard to link. An empty hive
roster says so. The schedule form's agent names reload with the schedules
and the form says when that load failed.
2026-10-21 23:22:22 +02:00
iris
885c051b33 swarm-ui: ignore a saved table filter whose column is gone 2026-10-21 23:15:44 +02:00
damocles
71e303ed62 db migrate: retry the legacy reminders copy while the legacy file is still there 2026-10-21 23:07:23 +02:00
iris
7ba418b0c5 docs: use active voice in the polling rule sentence 2026-10-21 23:05:35 +02:00
iris
8917ba27b6 swarm-ui: one polled-resource hook for the refreshing pages
Each polling page repeated its own fetch-and-set code on a fixed timer,
so a slow answer could be overtaken by the next tick, an older response
could overwrite a newer one, and nothing aborted a request when the page
went away.

usePolled skips a tick while a request is in flight, aborts on unmount
or refresh, ignores answers from dropped requests, and keeps the last
good data under an error. The alerts, hives, agents, schedules, builds,
review runs and broadcast pages and the subagent list use it.
2026-10-21 23:05:35 +02:00
iris
9338496e24 swarm-ui: unit test the popover focus helpers
The helpers take the active element and body as arguments, so the cases
(focus into the box, keep a control that took focus, restore only when
focus was lost, find the trigger) run under node's test runner.
2026-10-21 23:01:56 +02:00
iris
d4f58b3667 swarm-ui: make popovers and table filters usable from the keyboard
Opening a popover or a table filter now moves focus into it, closing one
that left focus on nothing puts it back on the trigger, and the triggers
carry aria-haspopup and aria-controls. The shared Popover covers every
caller; the table filter popover, which has its own portal, does the
same.
2026-10-21 23:01:56 +02:00
iris
bf9d07aedc docs: describe the issue report page and how it handles failures 2026-10-21 22:58:51 +02:00
iris
f6acc1e976 swarm-ui: keep the issue report's table, errors and repo filter consistent
A failed report dropped its error under the previous repo's rows, the
repo list and the report shared one error slot, a remembered repo that
the list lacked left the select on all repos, and the report URL did not
encode the repo path. Each request now has its own error, a failed report
clears the rows, the remembered repo keeps an option, and the path parts
are encoded.
2026-10-21 22:58:51 +02:00
iris
e727774dc8 swarm-ui: show agent panel read failures as text and keep loaded data
Inference, resource caps and linked accounts showed a failed read as a
badge with the reason in a hover title, which keyboard and touch users
cannot read. They now use ApiErrorPanel, and a list that already loaded
stays on screen under a failed refetch.
2026-10-21 22:57:51 +02:00
damocles
ac0bed47e9 hive-agent: correct doc comments that describe sentinel files, session flags and outcomes the code no longer has 2026-10-21 22:56:31 +02:00
damocles
70d1b542e3 agent mcp: bound the in-agent socket round trip so a stalled harness cannot hang a turn 2026-10-21 22:44:17 +02:00
atlas
220b51d0a3 swarm-authelia: run in its own network namespace
Refs #4815
2026-10-21 22:10:23 +02:00
iris
ef156d9d23 swarm-ui link-account forms: keep the sent name, drop secrets, one word for forge
The success line of both link forms read the live text field, so editing
the name after a link changed the sentence. The result now carries the
name that was sent.

The matrix form held the typed token and password after a failed submit,
and kept them across a switch of credential mode. It now drops them when
the request ends and when the mode changes.

The linked-accounts list and the delete dialog said forgejo where the
link menu and forms say forge; they now say forge.
2026-10-21 22:06:49 +02:00
damocles
8f8217100b disk watch: a footprint walk that ran out of budget counts as unknown, not small 2026-10-21 22:05:54 +02:00
atlas
041779d910 tls: a CA root change no longer restarts the store or bounces containers 2026-10-21 22:00:13 +02:00
damocles
25f93d41e1 login session: only the child exiting finishes it, not one output pipe closing 2026-10-21 21:59:04 +02:00
damocles
c3ff0815ff turn: clear the resolved model on a turn that parsed nothing 2026-10-21 21:57:43 +02:00
iris
e03bd4caa4 swarm-ui try-out: stable live region, reasons for disabled buttons
The running line is a live region whose text changed every second, so a
screen reader announced the counter again each time. The sentence is now
stable and the elapsed seconds sit outside it.

The run and open-a-PR buttons point at the hint that says why they are
off, and add-a-classification says why it is off at the cap.
2026-10-21 21:45:05 +02:00
iris
e81aaef7e3 swarm-ui: give a header tab's close button an accessible name 2026-10-21 21:31:11 +02:00
iris
16c9e0ae3b swarm-ui: keep the table filter popover inside the window 2026-10-21 21:31:00 +02:00
iris
c2f17799fc swarm-ui: only the newest start's late stop ends a claude login 2026-10-21 21:14:53 +02:00
iris
41cc2f5e8e swarm-ui: stop a claude login whose dialog closed while it was starting 2026-10-21 21:14:53 +02:00
iris
20e2f53592 docs: a subagent that leaves the list closes its terminal 2026-10-21 21:12:00 +02:00
iris
393213054d swarm-ui: close a subagent terminal when its subagent leaves the list 2026-10-21 21:12:00 +02:00
iris
3fe53fe323 swarm-ui: try-out copy says the run appears under recent runs 2026-10-21 21:01:43 +02:00
iris
dad495cdfa hive-c0re: fix stale banner and gauge-name wording after review
The nix-store gauge comment claimed a semconv name it deliberately does
not use; it now says why the name is hyperhive-scoped. Two doc pages
still described the removed banner for the limits-read and
knowledge-pull failures. The warning alert's comment now says
pending_logins pages on purpose.
2026-10-21 17:58:09 +02:00
iris
4dbcf6fa80 hive-c0re: hive warnings reach the operator as metrics and alerts, not a banner
The dashboard's top-of-page warning banner is gone. The warning registry
stays, because /health/ready, the swarm status view and the OTEL gauges
read it. What it feeds is now alerted on in Grafana:

- hyperhive.hive.warning{kind,level}: one series per raised warning, so an
  alert names the cause. Raising a warning also logs one `hive warning
  raised` line with the message.
- hyperhive.hive.nix_store.utilization: the used fraction of the nix
  store's filesystem, probed in the gauge callback.
- Alerts: hh-hive-degraded on the existing degraded gauge, hh-hive-warning
  per kind (disk excluded), hh-host-disk-high at 85% and
  hh-host-disk-critical at 95%.
- pending_logins is now a registry warning, refreshed from the container
  rescan, so it reaches the per-kind gauge.

Frontend: server_warnings leaves the state snapshot, and the dashboard,
flow and stats pages keep only the sticky chrome wrapper. The shared
hive-warn and WarnBanner components stay, since other views use them.

A module-eval case checks each alert's metric name against the exporter's
source, so a rename on either side fails the build.
2026-10-21 17:52:53 +02:00
atlas
013bbe5adc hive-c0re: its otel exporter goes to the bridge, not the swarm upstream 2026-10-21 12:50:06 +02:00
atlas
41a7974b9e swarm-otel: the upstream export is a swarm-otel deploy option
The external export is a setting of the swarm collector, so it moves to
services.hyperhive.deploy.swarm-otel.upstream. Renamed:
- otel.endpoint -> upstream.endpoint
- otel.protocol -> upstream.protocol
- otel.headersCredential -> upstream.headersCredential
- otel.collector.upstreamHeaderName -> upstream.headerName
The unreleased otel.upstreamSignals is declared as upstream.signals.

Hosts keep working through the rename warnings. Eval test covers the old
paths reaching the new options. Docs and stale comments point at the
new paths.
2026-10-21 10:25:26 +02:00
atlas
2977dc91d1 swarm-otel: the operator chooses which signals go upstream
Adds services.hyperhive.otel.upstreamSignals, a list of "metrics" and/or
"logs" naming the signals the swarm collector sends to otel.endpoint. The
swarm's own stores always receive everything. The upstream exporter is
only defined when at least one signal uses it, since otelcol refuses an
exporter no pipeline references.

On deploy: nothing changes until the option is set; the default is
[ "metrics" "logs" ], today's behaviour. To stop the 404 flood from an
upstream that has no /v1/logs, set services.hyperhive.otel.upstreamSignals
= [ "metrics" ].
2026-10-21 09:31:39 +02:00
atlas
9a65643769 swarm-bao granter stops retrying a rejected bootstrap token
swarm-bao-granter-role exits 4 when the store is unsealed but refuses the
bootstrap token, and Restart=on-failure retried that every 30s for as long
as the token file existed. RestartPreventExitStatus=4 makes that permanent
failure leave the unit failed once. Exit 1 (store sealed or unreachable)
keeps retrying.

On deploy: the unit goes red once instead of looping every 30s. The stale
token on muede-lpt2 still needs the operator step (remove it or mint a
fresh one); this does not clear it.
2026-10-21 09:22:19 +02:00
atlas
de68f175b5 wanted pull: one deadline bounds both connect waits 2026-10-21 09:22:10 +02:00
atlas
784507f554 hive-c0re re-converges wanted state whenever its watch attaches
pull waits (bounded) for the swarm queue connection instead of failing at boot while the client is still connecting. The watch runs one pull after every attach, including re-attaches, and a failed attach or ended stream is retried with a bounded backoff instead of waiting for the next boot. A first deploy is not queued again while one for the agent is queued or running.

An agent whose first deploy was lost to a c0re restart is now deployed on the next boot, or the next watch re-attach, without anyone re-declaring it.
2026-10-21 09:22:10 +02:00
atlas
d989636d98 swarm roster shows a declared agent's state before it has ever reported
A declared agent that never reported (e.g. its first deploy was lost) had no hive in the roster row, so the wanted merge skipped it and swarm-ui showed 'no declaration' with the state control disabled. GET /api/agents/status now takes such a row's hive from the one hive whose declaration places the agent, so the declared state shows and the control works on deploy.
2026-10-21 09:21:56 +02:00
flake-bot
0e061067dd nix flake update 2026-10-21 05:01:08 +02:00
atlas
62a8a40e90 hive-forge list trusts the forge's own next-page signal for its trailer 2026-10-21 00:50:01 +02:00
atlas
3543942e4c docs: hive-forge list's paging trailer 2026-10-21 00:34:39 +02:00
atlas
6859eb7f37 hive-forge list's paging trailer counts the rows actually shown
The trailer computed shown as page * rows-on-this-page, so a short last
page (page 27 of 1331 rows at 50/page, 31 rows) was counted as 837 of
1331 and printed a hint to fetch page 28. A page whose unclamped row
offset lands exactly on the total is now recognised as the last one, so
the trailer stays silent there. Shown is also clamped to the total.
2026-10-21 00:34:39 +02:00
atlas
096b45867d swarm-nats gateway cert: treefmt 2026-10-21 00:19:19 +02:00
atlas
b4dbd7d1c3 swarm-nats gateway cert reloads nginx without blocking the switch
nixos-rebuild switch no longer hangs when nginx is (re)started in the
same transaction: the cert unit is Before=nginx, so its synchronous
reload and nginx's queued start job waited on each other. The reload is
now queued with --no-block try-reload-or-restart, as the nixpkgs ACME
module does.
2026-10-20 21:20:24 +02:00
atlas
f864ffba1b an interrupted meta sync resumes on the next run instead of leaving flake.lock stale
sync_agents returned early whenever the rendered flake.nix matched disk.
A sync stopped after writing flake.nix but before its commit therefore
never re-locked or committed. The early return now also requires that
flake.nix and flake.lock have nothing uncommitted; otherwise the normal
lock+commit path runs and logs that it is resuming.
2026-10-20 18:58:12 +02:00
damocles
53eed2a757 nix: extraMcpServers http entries can read request headers from one file via headersHelper 2026-10-20 13:03:00 +02:00