helmd v2: Go-server som styr agent i tmux — REST+SSE, frågedetektor, fildelning, ntfy, CI-release
- tmux som sanningskälla (agentoberoende, överlever omstart via adoption) - API: sessions, prompt, question/answer, keys, mode, config, shares, notify, events - frågedetektor testad mot riktiga agy 1.1.9-dumpar + mock - integrationstest: 26 tester i isolerad debian-container (scripts/run-integration.sh) - e2e-verifierad mot riktig agy (trust-fråga -> svar -> prompt) - .gitea/workflows/helmd-release.yaml -> rullande helmd-latest (x64+arm64) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
71
doc/plan.md
Normal file
71
doc/plan.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# 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** (`packages/web`): porta till helmd-API:t.
|
||||
- Sessionslista, skärmvy (poll + SSE), promptfält, frågekort med
|
||||
knappar, läges-/inställningsvy.
|
||||
- Delningsflik: html/md renderas, png/jpg visas, md till html.
|
||||
- Uppdaterad look. Serveras statiskt av helmd (embed) eller nginx.
|
||||
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.
|
||||
|
||||
## 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.)
|
||||
Reference in New Issue
Block a user