BeforeTool-hook + kort-vy (strukturerade godkännanden) + release på master-push
All checks were successful
build-and-push / build (push) Successful in 22s
release-client / build-release (push) Successful in 48s

Feature: strukturerade verktygsgodkännanden
- shared: protokoll för approval (daemon:approval, server:approval[-resolved],
  web:approval-decision, server:approval-decision)
- daemon: hook-läge ('agent-helm hook' — samma binär), lokal 127.0.0.1-endpoint
  som hooken POST:ar till, long-poll tills beslut; graceful default (allow) när
  ingen UI; timeout-fallback; skickar AGENT_HELM_HOOK_PORT till agentens env
- server: routar daemon:approval -> prenumeranter, beslut -> daemon + döljer kort
- web: reaktiv approvals-lista + kort-overlay (Tillåt/Neka), mobilanpassad

CI:
- release.yaml triggar nu även på master-push -> rullande 'latest'-release
  (versionerade releaser kvar på v*-taggar); install.sh hämtar 'latest'

Docs: hook-konfig (gemini settings.json) + hook-env i .env.example + DEPLOY.md.
Säkerhet: hook-endpoint binder endast 127.0.0.1; inga hemligheter i repot.

Verifierat lokalt: hook->daemon->server->kort->beslut->hook ger {"decision":"allow"};
alla paket typecheckar; web bygger.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 18:03:12 +02:00
parent a06a02927c
commit 98c4d13360
9 changed files with 460 additions and 97 deletions

View File

@@ -94,8 +94,10 @@ curl -s http://localhost:5000/v2/agent-helm-server/tags/list
containern kör som uid 1000 = `brasse` så filerna blir korrekt ägda.
2. Ny stack i Dockge, namn `agent-helm`.
3. Klistra in `deploy/agent-helm.compose.yaml`.
4. I stackens **env**: `AGENT_HELM_TOKEN=<lång-slumpad-hemlighet>`
(generera t.ex. `openssl rand -hex 32`).
4. I stackens **env**: `AGENT_HELM_TOKEN=<lång slumpad hemlighet>`
— en stark slumpad sträng (≥ 32 byte). Förvaras **bara** i stackens `.env`
på Pi5, aldrig i git. Det är denna token som skyddar åtkomsten till dina
sessioner, så håll den hemlig.
5. Deploy. Kolla i Dockge att containern `agent-helm` är *running*.
---
@@ -164,6 +166,34 @@ systemctl --user daemon-reload && systemctl --user enable --now agent-helm
```
Klienten ansluter till `wss://rcai.brasse-pc.eu` och dyker upp som en session i UI:t.
## Strukturerade godkännanden (BeforeTool-hook + kort-vy)
Utöver fallback-tangentbordet kan agentens verktygsanrop visas som **godkännande-kort**
i UI:t (Tillåt/Neka). Det sker via en `BeforeTool`-hook i Gemini som anropar
`agent-helm hook` — samma binär, så inget extra beroende.
**Aktivera** genom att lägga till hooken i `~/.gemini/settings.json` på maskinen där
klienten kör (justera vid behov efter din Gemini-versions hook-schema):
```json
{
"hooks": {
"BeforeTool": [
{ "hooks": [{ "type": "command", "command": "agent-helm hook" }] }
]
}
}
```
Daemonen skickar automatiskt `AGENT_HELM_HOOK_PORT` till agentens miljö, så
`agent-helm hook` hittar den lokala endpointen själv.
**Beteende:**
- UI anslutet → verktygsanropet visas som kort, agenten väntar på ditt beslut.
- Ingen UI / servern onåbar → `AGENT_HELM_HOOK_DEFAULT` (default `allow` — agenten
fungerar som utan hook). Sätt `AGENT_HELM_HOOK_DEFAULT=deny` för strikt läge.
- Inget svar inom `AGENT_HELM_HOOK_TIMEOUT` (ms) → default-beslutet används.
Den lokala hook-endpointen binder **endast** `127.0.0.1` och är aldrig nåbar utifrån.
## Uppdatera till senaste
1. `git push master` → runnern bygger + pushar `:latest`.