submitting R3QU3ST SP4WN immediately queues an approval that lands in the very next list. the form belonged with that list, not at the top of containers — the agent doesn't exist yet at form time anyway. docs: claude.md grows operator_questions.rs / events.rs sqlite / broker vacuum to the file map; web-ui shape lists the actual current endpoint set (per-agent cancel/compact/history, dashboard tombstone purge/answer/spawn); live-view section now describes the state badge, sticky-bottom scroll, history backfill, and the terminal- embedded prompt with its slash commands; dashboard-action-surface rewritten around the new six-section page (containers / kept-state / questions / inbox / approvals / message-flow) and the two-line container row. new 'persistence + retention' section documenting both sqlite databases and their vacuum cadences. readme picks up the new mgr mcp surface (start/restart/ask_operator) + operator-side features list + ask_operator answer flow. todo trimmed of shipped items (bigger terminal / sticky scroll / cancel button / /compact trigger / /cancel command). new entry for the two-step spawn-with-preconfig flow.
112 lines
4.5 KiB
Markdown
112 lines
4.5 KiB
Markdown
# hyperhive
|
|
|
|
Multi-Claude-Code-agent orchestration on **nixos-containers**.
|
|
|
|
A host-side Rust daemon (`hive-c0re`) spawns nspawn-isolated agent
|
|
containers and brokers messages between them. A manager agent (`hm1nd`)
|
|
coordinates the swarm and gates lifecycle changes on user approval via git
|
|
commits, surfaced through a vibec0re-styled HTTP dashboard.
|
|
|
|
```
|
|
host (NixOS, runs hive-c0re.service)
|
|
│
|
|
├── operator
|
|
│ ├── browser → :7000 hive-c0re dashboard (containers, approvals)
|
|
│ ├── browser → :8000 / :8100-8999 per-agent web UIs (live SSE, send, login)
|
|
│ └── CLI → /run/hyperhive/host.sock JSON-line admin protocol
|
|
│
|
|
├── hive-c0re (Rust daemon)
|
|
│ ├── lifecycle nixos-container CRUD + per-agent flake generation
|
|
│ ├── broker sqlite messages + tokio broadcast (powers SSE + wake-ups)
|
|
│ ├── approvals sqlite queue, two kinds: ApplyCommit (config) + Spawn
|
|
│ ├── auto_update rebuilds any container whose recorded flake rev is stale
|
|
│ ├── dashboard axum HTTP + async-form actions + SSE message flow
|
|
│ └── sockets /run/hyperhive/{host,manager,agents/<n>}/mcp.sock
|
|
│
|
|
└── nixos-containers (each bind-mounts its socket dir → /run/hive,
|
|
│ credentials dir → /root/.claude,
|
|
│ durable notes dir → /state;
|
|
│ manager additionally gets /agents RW)
|
|
│
|
|
├── hm1nd hive-m1nd serve : claude turn loop +
|
|
│ MCP (send / recv / request_spawn / kill / start /
|
|
│ restart / request_apply_commit / ask_operator)
|
|
│ + web UI on :8000
|
|
│
|
|
└── h-<name> hive-ag3nt serve : claude turn loop +
|
|
MCP (send / recv) + web UI on a hashed :8100-8999
|
|
```
|
|
|
|
Each turn: harness pops one inbox message (Recv long-polls server-side and
|
|
wakes on a broker Sent event) → builds a wake prompt → spawns
|
|
`claude --print --continue --output-format stream-json --mcp-config …` →
|
|
streams JSON events into the per-agent SSE bus + a sqlite history db →
|
|
claude drives any further `recv`/`send` itself via the embedded MCP server.
|
|
|
|
Operator surface per agent: terminal-themed live tail with a textarea
|
|
prompt; slash commands `/help` `/clear` `/cancel` `/compact`; granular
|
|
state badge (idle / thinking / offline) with age timer; cancel-turn
|
|
button while thinking; sticky-bottom auto-scroll with "↓ N new" pill;
|
|
event history backfilled on page load.
|
|
|
|
Config changes flow the other way: manager edits `/agents/<name>/config/agent.nix`
|
|
(bind-mounted from the host's proposed repo) → commits → submits the sha as
|
|
an approval → operator clicks ◆ APPR0VE on the dashboard → hive-c0re copies
|
|
the file into the applied repo and `nixos-container update`s the agent.
|
|
For decisions the manager needs human signal on, `ask_operator(question,
|
|
options?, multi?)` queues a free-text/checkbox/radio form on the
|
|
dashboard; the answer arrives later as a `HelperEvent::OperatorAnswered`
|
|
in the manager's inbox.
|
|
|
|
## Host config
|
|
|
|
Minimal `flake.nix` for a host that runs hive-c0re:
|
|
|
|
```nix
|
|
{
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
|
hyperhive.url = "git+https://git.berlin.ccc.de/vinzenz/hyperhive";
|
|
};
|
|
|
|
outputs = { nixpkgs, hyperhive, ... }: {
|
|
nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
|
|
system = "x86_64-linux";
|
|
modules = [
|
|
hyperhive.nixosModules.hive-c0re
|
|
({ ... }: {
|
|
services.hive-c0re.enable = true;
|
|
# ... rest of your host config (hardware, networking, users, …)
|
|
system.stateVersion = "25.11";
|
|
})
|
|
];
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
hive-c0re will then:
|
|
- open its admin socket at `/run/hyperhive/host.sock` + dashboard on
|
|
`:7000`,
|
|
- auto-create the manager container (`hm1nd`) if missing,
|
|
- auto-rebuild any managed container whose hyperhive rev is stale.
|
|
|
|
## Build / deploy
|
|
|
|
```sh
|
|
# inside the repo (devshell first; no global cargo)
|
|
nix develop -c cargo check
|
|
nix develop -c cargo clippy --workspace --all-targets -- -D warnings
|
|
|
|
# evaluate everything (rust+nix+toml fmt + clippy)
|
|
nix flake check
|
|
|
|
# deploy to a host that imports `hyperhive.nixosModules.hive-c0re`
|
|
cd ~/Repos/<nixos-config-repo>
|
|
nix flake update --update-input hyperhive
|
|
sudo nixos-rebuild switch --flake .#<host>
|
|
```
|
|
|
|
No overlays on the host's `pkgs` — the module pulls hive-c0re's package
|
|
straight from `hyperhive.packages.<system>.default`. Just import the
|
|
module and the service is wired up.
|