synops/docs/infra/claude_agent.md
vegard b5aa5bb243 Fjern SpacetimeDB komplett (oppgave 22.4)
SpacetimeDB er nå helt fjernet fra Synops. Sanntid håndteres av
PG LISTEN/NOTIFY + WebSocket i portvokteren (maskinrommet).

Kode fjernet:
- spacetimedb/ Rust-modul og spacetime.json
- maskinrommet/src/stdb.rs (HTTP-klient for STDB-reducers)
- frontend module_bindings/ (23 auto-genererte filer)
- spacetimedb npm-avhengighet fra package.json
- scripts/test-sanntid.sh (testet STDB-flyt)

Infrastruktur:
- Docker-container stoppet og fjernet fra docker-compose.yml
- Caddy: fjernet /spacetime/* reverse proxy
- maskinrommet-env.sh: fjernet STDB_IP og SPACETIMEDB_*-variabler
- .env.example: fjernet SpacetimeDB-seksjoner

Dokumentasjon oppdatert:
- CLAUDE.md: stack, lagmodell, kjerneprinsipper, driftsmodell
- docs/arkitektur.md: skrivestien, lesestien, datalag, teknologivalg
- docs/retninger/datalaget.md: migrasjonshistorikk, status "fjernet"
- 37 andre docs oppdatert (features, concepts, infra, ops, retninger)
- Alle kode-kommentarer med STDB-referanser oppdatert

Verifisert: maskinrommet bygger og starter OK, frontend bygger OK,
helsesjekk returnerer 200. Caddy reloadet.
2026-03-18 13:39:09 +00:00

3.8 KiB

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 delegerer til synops-respond CLI-verktøyet.

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)
  → maskinrommet: kill switch, rate limit, loop-prevensjon
  → spawner: synops-respond --communication-id ... --write
    → henter meldingshistorikk + kontekst fra PG
    → bygger prompt
    → kaller: claude -p "<prompt>" --output-format json
    → oppretter svar-node i PG, logger ai_usage + resource_usage
    → returnerer JSON med reply_node_id + response_text
  → PG NOTIFY propagerer til frontend via WebSocket
  → frontend viser melding i sanntid

Ansvarsdeling (unix-filosofi):

  • Maskinrommet: Auth, kill switch, rate limiting, loop-prevensjon
  • synops-respond: Kontekst-henting, prompt-bygging, claude-kall, PG-skriving

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

-- 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:

sudo systemctl status maskinrommet   # status
sudo systemctl restart maskinrommet  # restart etter ny build
sudo journalctl -u maskinrommet -f   # live-logger

Bygg og deploy:

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