synops/docs/infra/claude_agent.md
vegard 1dd48317af Oppdater docs og config for native maskinrommet + Claude-agent
- CLAUDE.md: ny driftsmodell-seksjon, maskinrommet native, Claude-agent
- docs/infra/claude_agent.md: arkitektur, sikkerhet, drift, oppsett
- config/caddy/Caddyfile: synk fra server (host.docker.internal)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 19:24:23 +00:00

104 lines
3.5 KiB
Markdown

# Infrastruktur: Claude som chat-deltaker
## Oversikt
Claude deltar i samtaler som en agent-node i grafen. Når en bruker sender
en melding i en kommunikasjonsnode der Claude er deltaker, trigger maskinrommet
en `agent_respond`-jobb som kaller `claude -p` CLI og skriver svaret tilbake.
## Arkitektur
```
Bruker sender melding (via frontend)
→ create_node() i maskinrommet
→ sjekker: har kommunikasjonsnoden en agent-deltaker?
→ ja: enqueue agent_respond-jobb (prioritet 8)
→ jobbkø-worker plukker opp (poll hvert 2s)
→ kaller: claude -p "<prompt>" --output-format json --dangerously-skip-permissions
→ parser JSON-respons, henter result-feltet
→ skriver svar som content-node (STDB instant + PG async)
→ frontend viser melding i sanntid via STDB WebSocket
```
Latens: ~3-5 sekunder fra melding til svar.
## Noder og tabeller
### Claude-noden
- **UUID:** `d3eebc99-9c0b-4ef8-bb6d-6bb9bd380a44`
- **node_kind:** `agent`
- **visibility:** `discoverable`
### agent_identities
Kobler agent-noder til konfigurasjon og nøkkel.
| Felt | Verdi |
|------|-------|
| agent_key | `claude-main` |
| agent_type | `claude` |
| config | max_context_messages, rate_limit_per_hour, etc. |
### agent_permissions
Autorisasjonsnivåer per bruker/agent-par.
| Nivå | Betydning |
|------|-----------|
| `direct` | Kan bestille endringer som implementeres direkte |
| `propose` | Kan foreslå endringer som krever godkjenning |
### ai_usage_log
Logger hvert agent-svar med timestamps, job_id, og kommunikasjons-ID.
## Sikkerhet
| Mekanisme | Beskrivelse |
|-----------|-------------|
| **Kill switch** | `agent_identities.is_active = false` stopper all aktivitet |
| **Rate limiting** | Maks 60 responser per time (konfigurerbart) |
| **Loop-prevensjon** | Stopper hvis siste 3 meldinger er fra agenten |
| **Egne meldinger** | Svarer aldri på egne meldinger (sjekk i trigger) |
## Oppsett av ny chat med Claude
```sql
-- 1. Opprett kommunikasjonsnode
INSERT INTO nodes (id, node_kind, title, visibility, metadata, created_by)
VALUES ('<uuid>', 'communication', 'Min chat med Claude', 'hidden', '{}', '<bruker-uuid>');
-- 2. Legg til bruker som owner
INSERT INTO edges (id, source_id, target_id, edge_type, metadata, system, created_by)
VALUES ('<uuid>', '<bruker-uuid>', '<comm-uuid>', 'owner', '{}', false, '<bruker-uuid>');
-- 3. Legg til Claude som member_of
INSERT INTO edges (id, source_id, target_id, edge_type, metadata, system, created_by)
VALUES ('<uuid>', 'd3eebc99-9c0b-4ef8-bb6d-6bb9bd380a44', '<comm-uuid>', 'member_of', '{}', false, '<bruker-uuid>');
-- 4. Recompute access
SELECT recompute_access('<bruker-uuid>', '<comm-uuid>', 'owner', '<owner-edge-uuid>');
SELECT recompute_access('d3eebc99-9c0b-4ef8-bb6d-6bb9bd380a44', '<comm-uuid>', 'member', '<member-edge-uuid>');
```
Etter dette vil alle meldinger i chatten automatisk trigge Claude-svar.
## Drift
Maskinrommet kjører som systemd-tjeneste direkte på hosten:
```bash
sudo systemctl status maskinrommet # status
sudo systemctl restart maskinrommet # restart etter ny build
sudo journalctl -u maskinrommet -f # live-logger
```
Bygg og deploy:
```bash
cd ~/synops/maskinrommet && cargo build --release
sudo systemctl restart maskinrommet
```
## Faser
- **Fase A (MVP):** Chat-agent — implementert og verifisert
- **Fase B:** Autorisasjon og oppgaver (direct vs propose flyt)
- **Fase C:** Autonom implementering (claude Code som subprocess for kode-endringer)
- **Fase D:** @mentions, typing-indikator, admin-panel