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

5,780 commits

Author SHA1 Message Date
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
damocles
62ab45297c hive-agent: run the event store in WAL and give turn-stats writes a busy timeout 2026-10-20 12:08:30 +02:00
atlas
161dd8c44b meta lock waiters keep their queue place; deadlines cover pin_agent git and kill the whole process group 2026-10-20 12:01:14 +02:00
atlas
7cde4e7b15 meta nix/git calls under META_LOCK time out instead of wedging every deploy
A hung forge fetch inside `nix flake update hyperhive` (or any other meta
git/nix child) now fails after its deadline with an error naming the command,
the child is killed, and META_LOCK, BuildSlot and MetaWindow are released. The
boot sweep already treats that failure as a warning and fans out the rebuilds.
A wait on META_LOCK past 60s logs a warning naming the waiter and the holder.
2026-10-20 12:01:14 +02:00
atlas
8d70afd93e swarm-otel's own logs go only to the store, so an upstream export failure no longer feeds itself
The logs/self pipeline shipped the collector's own journal to the upstream
exporter too. When the upstream failed, the collector logged the failure,
journald/self read it, and logs/self sent it upstream again: ~8 lines/s.

logs/self now exports only to otlphttp/victorialogs, and a filter processor
drops the collector's failure lines that name that exporter, so the store
exporter cannot rebuild the loop one hop later. Other collector lines,
including upstream failures, still reach the store.

On deploy, swarm-otel's store rows drop from ~8/s of error spam to its real
output.
2026-10-20 12:00:41 +02:00
flake-bot
446eaf9fa2 nix flake update 2026-10-20 10:04:50 +02:00
atlas
2777453c17 hive-core's git ignores the host's credential helpers, so a meta fetch never waits on an interactive one
hive-core's .gitconfig now resets credential.helper (globally and for the
forge URL) before adding hive-forge. git runs every matching helper, system
config first, so a host-level `oauth` helper blocked `nix flake update`'s
git ls-remote of agent-configs forever.

On deploy: the boot sweep's meta_lock completes and rebuilds run.
2026-10-20 00:01:56 +02:00
atlas
cac634cb65 agent claude-code is built without its alsa-lib LD_LIBRARY_PATH wrapper 2026-10-19 21:37:47 +02:00
atlas
8476609f98 swarm-otel ships its own journal, so its logs reach the store
The collector's container ran with --link-journal=host and the host's
journal bound over /var/log/journal, so its own journal was never
written where anything read it. It now keeps its journal in the guest,
reads it with a second journald receiver, and gets the host's journal
at /run/host-journal.

On deploy swarm-otel rows start arriving in the store, stamped
service.name swarm-otel.
2026-10-19 20:25:23 +02:00
atlas
9bbb28731a merge_base_of no longer takes open_pulls's doc comment 2026-10-19 20:19:36 +02:00
atlas
f0d93cd0fe the review classifier takes the merge base from the PR's commits, not the forge's stored merge_base 2026-10-19 20:19:36 +02:00
atlas
0f3da0a496 the CA fetch logs which trust anchor it uses for bao 2026-10-19 20:15:13 +02:00
atlas
d547b521f6 agents fetch the hive CA from bao at boot instead of the meta flake embedding it 2026-10-19 20:15:13 +02:00
atlas
0831b85b73 swarmctl shares the create-agent, inference and permissions shapes with the controller 2026-10-19 18:58:00 +02:00
atlas
249aab6642 module-eval: the always-on hive collector put a scrape target and an identity demand on hives that assumed none 2026-10-19 18:35:17 +02:00
atlas
13daf4c7dc every hive runs its otel collector, and agents export to it by default 2026-10-19 18:35:17 +02:00
atlas
839efd1642 agent_permissions, agent_term and subagent_term take their wire contracts from swarm-wire 2026-10-19 18:30:44 +02:00
flake-bot
c06b1325e7 nix flake update 2026-10-19 17:41:08 +02:00
atlas
09cabf8398 the rendered meta flake pins each agent config by forge URL at its forge main 2026-10-18 22:57:29 +02:00
atlas
fc72bea151 swarm-wire: take notices's wire types, fmt the moved imports 2026-10-18 22:50:02 +02:00
atlas
e111807f59 swarm-wire: take agent_schedules's wire types 2026-10-18 22:50:02 +02:00
atlas
9cce9c470f swarm-wire: take agent_limits's wire types 2026-10-18 22:50:02 +02:00
atlas
266be0a5db swarm-wire: take wanted's wire types 2026-10-18 22:50:02 +02:00
atlas
c6b1364684 swarm-wire: take agent_icon's wire types 2026-10-18 22:50:02 +02:00
atlas
9222a051f5 swarm-wire: take agent_status's wire types 2026-10-18 22:50:02 +02:00
atlas
6084fb6329 move the send and turn row markers into hive-types 2026-10-18 22:13:37 +02:00
atlas
e4a9005468 move Permission into hive-types, drop swarm-controller's hive-sh4re dep 2026-10-18 21:40:01 +02:00
atlas
04786da58f the system prompt tells agents to attach, inline or send files instead of handing out state-dir or /shared paths 2026-10-18 21:07:47 +02:00
atlas
c6d26a0904 the port-bind test no longer loses its released port to other sockets 2026-10-18 21:06:34 +02:00
atlas
daf38e4c55 the meta flake takes docs from the pinned hyperhive input 2026-10-18 20:09:14 +02:00
atlas
bb13909d8e the rendered meta flake pins hyperhive by forge URL and follows its nixpkgs 2026-10-18 20:06:09 +02:00
atlas
6ea13c02e3 move the review classifier, agent login and inference types into swarm-wire 2026-10-18 19:27:30 +02:00
iris
bdeec3f744 swarm-ui: key message rows on an arrival id and follow the tail on it
At the 2000-message cap the count stops changing, so the page stopped
following the newest message, and every row's index key shifted on each
arrival, remounting all of them. Each message now gets an id when it
arrives; the rows key on it and the scroll follows the newest id. Rows
are memoised on the message, and the events of one frame join the list
in a single update.
2026-10-18 18:39:11 +02:00
iris
447498fef7 swarm-ui: add a messages page for the swarm-wide message feed
/messages reads GET /api/messages/stream. A history select picks the window
(live only up to 24 hours) and a filter keeps the messages whose sender or
recipient contains the text. Each message is a row of the terminal list an
agent's terminal uses: one summary line with the time, the two parties and
the start of the body, and the whole body under it. The list follows the
newest message and holds the last 2000.

The feed has no event id, so a reconnect sends the history again. The page
empties its list each time the connection opens and fills it from the
replay, where the terminal stream hook, which keeps its rows across a
reconnect, would list every message twice.

The stream URL, filter, cap and row logic is in its own module with tests,
and docs/swarm/ui.md describes the page.
2026-10-18 18:19:30 +02:00
atlas
c32906b893 the swarm controller streams every inter-agent message from the agents' terminal rows 2026-10-18 17:27:53 +02:00
atlas
87b1f94ac6 move agent_token from swarm-queue-client to swarm-agent-verify
per #5471, verifiers stop depending on the queue client. the module is
store-free and needs only thiserror, so swarm-agent-verify gains one
dependency and loses its swarm-queue-client edge. consumers import it
from swarm_agent_verify; swarm-logs and swarm-metrics, whose only use of
swarm-queue-client was this module, drop that dependency, as does
swarm-logs-auth.
2026-10-18 16:58:39 +02:00
atlas
741fe388f9 move startup_read from swarm-queue-client to swarm-secret-client
read_with_startup_retry retries the first read of a client secret through a store that is restarting. Nothing in swarm-queue-client calls it; its only callers are the four binaries that read the secret (swarm-builder, swarm-claude-login, swarm-controller, swarm-review-classifier), and they already depend on swarm-secret-client. It sits beside stored_secret, which moved there in #5538. swarm-queue-client drops its backon dependency and the tokio test-util dev-dependency that only these tests used.
2026-10-18 16:11:55 +02:00
iris
dd7fc1c9af swarm-ui: show the AGENTS.md size refusal when the instructions section is collapsed
The refusal sat inside the collapsed section, and the general error panel
hides while a refusal is set, so a refused submit with the section closed
showed nothing. The refusal now renders under the section, outside the
details element.
2026-10-18 16:02:10 +02:00
iris
f068d0b2fc docs: say the swarm refuses an oversized initial AGENTS.md in the active voice 2026-10-18 16:00:50 +02:00
iris
30ba34f411 swarm-ui: let the create-agent form set the new agent's initial AGENTS.md
The form gets a collapsed "instructions" section with a plain text box. Its
text goes in the optional agents_md field of the create request, and is left
out while the box is empty or only whitespace. The controller's size refusal
shows under the box instead of in the form's general error panel. The text
box empties after a successful create.

The send and refusal logic sits in its own module with tests, and
docs/swarm/ui.md describes the field.
2026-10-18 15:59:19 +02:00
atlas
456cf9a7cb set an agent's initial agents.md at create 2026-10-18 15:54:14 +02:00
müde
a6147dc875 swarm-controller: chgrp the runtime dir in ExecStartPost, ExecStart's setup undid the ExecStartPre one 2026-10-18 15:32:35 +02:00
atlas
738dd1c95b swarm-controller: split main.rs into jobq, routes and startup modules
no behaviour change: a pure move of items and tests into new modules, plus
visibility edits (pub(crate)) and path updates in sibling modules that named
crate-root items. same routes, same OpenAPI, 561 tests before and after.

why: #5470, new features stop landing in one 6.4k-line file by default.

files outside swarm-controller/src: docs/agent-lifecycle/agent-roster.md,
swarm-ui JobsPage.tsx and AgentsPage.tsx, nix/host-modules/swarm-controller.nix
and swarm-grafana.nix hold comments that named main.rs for items that moved.
2026-10-18 13:44:43 +02:00
iris
f0a6d6c042 swarm-ui: add a button to the alerts page that shows the pending, no-data and error instances
The page opens on the firing ones. The button lists every instance again,
with the state filter and the tones back, so the table's filtering is
visible. The saved-filters key goes back to its original name, since the
state column is a filter again.
2026-10-18 13:29:52 +02:00
iris
b39e095aa8 swarm-ui: test which alert instances the alerts page lists
The firing-only filter and the helpers beside it move out of the page
component into a plain module, with tests for the state match, the
never-active time and the row key.
2026-10-18 13:29:52 +02:00