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
88 lines
4.1 KiB
Markdown
88 lines
4.1 KiB
Markdown
# agent-helm v2 — plan
|
|
|
|
## Mål
|
|
|
|
Fjärrstyra CLI-agenter (agy i första hand) som "claude-desktop-appen
|
|
fast för Googles agent": se sessionen, skicka prompts, svara på
|
|
frågor/godkännanden, byta läge, ändra inställningar och ta emot delade
|
|
filer — från webb och Android, utan att exponera något publikt.
|
|
|
|
## Varför v2
|
|
|
|
v1 (Node: daemon→server-på-Pi5→web, Gemini-hooks) dog med Gemini
|
|
CLI:s OAuth-nedläggning, och hook-integrationen visade sig skör per
|
|
agent. v2 vänder på det: **tmux är sanningskällan**. Servern läser
|
|
skärmen och skickar tangenter — då spelar det ingen roll vilken agent
|
|
som kör eller hur dess hooks ser ut.
|
|
|
|
## Arkitektur
|
|
|
|
```
|
|
Android (egen SSH-tunnel) ─┐
|
|
webb-PWA (LAN/tunnel) ─────┼──► helmd :8788 (Go, REST+SSE, token) ──tmux──► agy
|
|
│ │
|
|
└────────┴──► ntfy.brasse-pc.eu (topics: agent-helm, claude)
|
|
```
|
|
|
|
- **Ingen publik exponering**: bind 127.0.0.1 eller LAN; utifrån via
|
|
SSH-tunnel (mobilklienten sätter upp sin egen mot Pi5 → vidare till
|
|
värddatorn, alt. helmd på Pi5 direkt).
|
|
- v1-koden (packages/) ligger kvar tills webbklienten är portad.
|
|
|
|
## Steg
|
|
|
|
1. ✅ **helmd** (`helmd/`): Go-server, enskild statisk binär.
|
|
- tmux-hantering: skapa/adoptera/döda sessioner (`helm-*`),
|
|
paste+Enter för prompts, tangenter, skärmdump med/utan ANSI.
|
|
- Frågedetektor (`question.go`): agy-godkännanden, trust-prompts,
|
|
numrerade/onumrerade listor; stabil hash per fråga; testad mot
|
|
riktiga agy-dumpar + mock.
|
|
- REST+SSE-API, bearer-token, fildelning (`helmd share`), ntfy
|
|
(event-pushar + `POST /api/notify`, topics `agent-helm`/`claude`).
|
|
- Isolerat integrationstest i Docker (26 tester), CI-release
|
|
`helmd-latest` (x64 + arm64).
|
|
2. ✅ **Webbklient v2** (`helmd/web/`): **ramverksfri** ES-modul-SPA,
|
|
inbäddad i binären med `go:embed` — hela v2 är fortfarande EN fil,
|
|
ingen Node-toolchain i CI. (Beslut: vanilla i stället för Vue-port —
|
|
UI-ytan är liten, eslint/byggkedjan försvinner, agenter underhåller
|
|
koden lättare.)
|
|
- Token-login (localStorage), sessionslista med status/❓-badge,
|
|
ANSI-färgad skärmvy (SSE + poll-fallback), promptfält,
|
|
**frågekort med knappar**, tangent-verktygsrad (Esc/pilar/Enter/
|
|
^C/Läge), delningsflik (bilder, sandboxad HTML-iframe, egen
|
|
md-renderare), inställningsvy mot `PUT /api/config`.
|
|
- Browser-verifierad mot riktig agy: prompt → godkännandefråga →
|
|
svar via kort → kommandot kört; delningar renderade.
|
|
- Deploy på Pi5: docker-stack `helmd` (arm64-image via
|
|
`.gitea/workflows/helmd-image.yaml` → `localhost:5000/helmd`),
|
|
**LAN-only — ingen NPM-vhost**; sessioner kör bash/agenter i
|
|
containern.
|
|
3. ⬜ **Android-klient**: nytt projekt eller Capacitor-port av PWA:n.
|
|
- Egen SSH-tunnel (t.ex. sshj/JSch) → Pi5 → helmd; token +
|
|
värdprofil i appen; push via ntfy-appen eller UnifiedPush.
|
|
4. 🔨 **Hub på Pi5** (påbörjad 2026-08-06): central server som alla
|
|
agenter ansluter utåt till (delad agent-nyckel, inga konton) och
|
|
där web-/CLI-klienter loggar in (lokalt admin-konto →
|
|
`Authenticator`-interface för LDAP senare) och styr alla agenters
|
|
sessioner. Full design: **[hub-plan.md](hub-plan.md)**.
|
|
|
|
## Beslut
|
|
|
|
- **REST + SSE, inte GraphQL/WS** i v1 — enklast att testa med curl,
|
|
räcker för kort-UI. WS-terminal kan läggas till senare.
|
|
- **Go, statisk binär** — samma modell som agent-tools; trivial
|
|
cross-compile till Pi (arm64).
|
|
- **tmux-scraping i stället för hooks** — agentoberoende, överlever
|
|
omstarter (adoption), fallback är alltid rå tangentkanal.
|
|
- ntfy-topics: `agent-helm` (serverhändelser), `claude` (Claudes
|
|
direktnotiser). Allowlist i config.
|
|
|
|
## Öppna frågor
|
|
|
|
- Verifiera agy:s lägesbytes-tangent (Shift+Tab antas).
|
|
- Webbklient: behålla Vue 3 eller byta till ren Vite+TS utan ramverk?
|
|
- Android: Capacitor-wrap av PWA:n (snabbast) vs native Kotlin
|
|
(bäst tunnel-kontroll). Lutar åt Capacitor + termux-liknande
|
|
tunnel-lib.
|
|
- helmd på Pi5 i container med tmux? (Kör agenter direkt på Pi:n.)
|