helmd hub: central server på Pi5 + agent-uplink + helmd ctl + web-login
All checks were successful
helmd-image / build (push) Successful in 3m22s
helmd-release / build-release (push) Successful in 4m28s

Hub-läge i samma binär (doc/hub-plan.md): agenter ansluter utåt med
delad agent-nyckel (hub-sektion i config.json), web-/CLI-klienter
loggar in (lokala konton, pbkdf2; Authenticator-interface för LDAP
senare) och styr alla agenters sessioner via proxy + merged SSE.
Webbklienten autodetekterar hub/local via /api/mode. Nya kommandon:
helmd hub [setpass|users|agentkey], helmd ctl (login/agents/sessions/
prompt/screen/answer/events …). Enhetstester + scripts/run-hub-smoke.sh
(15-stegs e2e: hub + agent + ctl).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011KikHkfCiC3yELbsMN8fT9
This commit is contained in:
2026-08-06 23:19:18 +02:00
parent d0b57e8224
commit 77682e91b5
17 changed files with 2411 additions and 37 deletions

View File

@@ -34,12 +34,67 @@ skickar tangenter. Fungerar därför med vilken TUI-agent som helst, och
## Kommandon
```
helmd serve [--listen host:port] [--config fil] starta servern
helmd serve [--listen host:port] [--config fil] starta agent-servern
helmd share [--note text] [--session namn] <fil> dela en fil till klienterna
helmd token skriv ut API-token
helmd hub [--listen host:port] [--config fil] starta hubben (Pi5)
helmd hub setpass <användare> [--password PW] sätt/skapa hub-konto
helmd hub users lista hub-konton
helmd hub agentkey skriv ut agent-nyckeln
helmd ctl <kommando> CLI-styrklient mot hubben
helmd version
```
## Hubben (`helmd hub`)
Central server (Pi5) som **agenter ansluter utåt till** och där web-
och CLI-klienter **loggar in** och styr alla agenters sessioner. Full
design och beslut: [../doc/hub-plan.md](../doc/hub-plan.md).
- **Agent-anslutning:** ingen inloggning/konto — agenten skickar den
**delade agent-nyckeln** (`agent_key` i hubbens config) vid
registrering. Hämta den med `helmd hub agentkey` på hubben, eller
efter inloggning med `helmd ctl agentkey` / Inställningar-fliken i
webben. Transporten är long-poll över HTTP (`/hub/register`,
`/hub/work`, `/hub/result`, `/hub/events`) — agenten kör jobben mot
sin egen lokala mux, så hela API-tabellen ovan funkar oförändrad
genom hubben. Agenter ser aldrig något om varandra.
- **Klient-login:** `POST /api/login` med användarnamn + lösenord →
Bearer-token. Konton ligger lokalt i hub-konfigen (pbkdf2-sha256);
`Authenticator`-interfacet i `hubauth.go` är utbytespunkten för
LDAP/SSO längre fram. Första starten seedas `admin` (lösenord från
`HELMD_HUB_ADMIN_PASSWORD` eller slumpat — skrivs ut i loggen).
- **Klient-API:** `GET /api/agents` (lista + online-status),
`ANY /api/agents/{namn}/…` (proxas till agentens `/api/…`),
`GET /api/events` (merged SSE, fältet `agent` på varje event),
`GET /api/agentkey`, `GET/POST /api/login|logout|me`.
`GET /api/mode` (oautentiserad) svarar `hub`/`local` så att den
inbäddade webbklienten kan välja login-form — i hub-läge får den
användarnamn/lösenord och en agentväljare.
- **Agentens config** (`config.json`) pekar ut hubben:
```json
"hub": {
"url": "http://192.168.0.19:8790",
"name": "brasse-linux01",
"key": "<agent_key>",
"enabled": true
}
```
Det lokala API:t på `:8788` fortsätter fungera parallellt — hubben
nere betyder bara att uplinken backar och försöker igen.
- **Hubbens config** (`~/.config/helmd/hub.json`, `HELMD_HUB_CONFIG`
överstyr): `listen` (default `127.0.0.1:8790`), `auth` (`local`),
`users`, `agent_key`, `session_ttl_hours` (default 168).
- **CLI-klienten:** `helmd ctl login --server http://192.168.0.19:8790`
→ `ctl agents`, `ctl sessions <agent>`, `ctl new <agent> <namn>`,
`ctl screen|prompt|question|answer|keys|kill <agent> <session>`,
`ctl shares <agent>`, `ctl events`. Sparar server + token i
`~/.config/helmd/ctl.json`.
- **Smoke-test av hela flödet:** `bash scripts/run-hub-smoke.sh`
(hub + agent + ctl lokalt, 15 kontroller).
`helmd share` är **agentens verktyg för att dela filer** (html, md,
png, jpg, …) till klienterna: agenten kör kommandot i sin shell, filen
laddas upp till servern och dyker upp i klientens delningsflik.