BeforeTool-hook + kort-vy (strukturerade godkännanden) + release på master-push
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:
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user