diff --git a/docs/infra/claude_code_polling.md b/docs/infra/claude_code_polling.md new file mode 100644 index 0000000..737137f --- /dev/null +++ b/docs/infra/claude_code_polling.md @@ -0,0 +1,120 @@ +# Claude Code polling — chat-integrasjon + +## Oversikt + +Claude Code (denne terminalen) kan svare på meldinger i +Synops-chatten ved å polle for deferred jobber. Maskinrommet +ruter meldinger basert på `handler_mode` i `agent_identities`. + +## Forutsetninger + +- Claude Code kjører i tmux-sesjon på serveren +- Maskinrommet kjører (`systemctl status maskinrommet`) +- PostgreSQL kjører (Docker) + +## Handler-moduser + +Sett med: +```sql +UPDATE agent_identities SET handler_mode = '' WHERE agent_key = 'claude-main'; +``` + +| Modus | Oppførsel | +|-------|-----------| +| `internal` | Maskinrommet kjører synops-respond (eksternt API). Standard. | +| `external` | Jobb deferred → Claude Code poller og svarer. | +| `paused` | Maskinrommet svarer "AI utilgjengelig". Ingen AI-kall. | + +## Claude Code chat + +- **Chat-ID:** `abe2edfd-986b-45ba-8c2e-4461a8a7e480` +- **Tittel:** "Claude Code" +- **Deltakere:** Vegard + Claude Code agent +- **URL:** `https://ws.synops.no/chat/abe2edfd-986b-45ba-8c2e-4461a8a7e480` + +## Starte polling + +### 1. Sett handler_mode til external + +```bash +docker exec sidelinja-postgres-1 psql -U sidelinja -d synops -c " +UPDATE agent_identities SET handler_mode = 'external', is_active = true +WHERE agent_key = 'claude-main'; +" +``` + +### 2. Start polling i Claude Code + +Si til Claude Code: + +> Start vaktmester-polling. Sjekk for deferred jobber hvert minutt. +> Poll med: `/home/vegard/synops/scripts/vaktmester-poll.sh` +> Svar med: `/home/vegard/synops/scripts/chat-reply.sh ""` +> Marker ferdig: `/home/vegard/synops/scripts/vaktmester-complete.sh ` +> Chat-ID: abe2edfd-986b-45ba-8c2e-4461a8a7e480 + +Eller bruk `/loop 1m vaktmester-poll` for automatisk polling. + +### 3. Flyten + +``` +Bruker skriver i chat + → Maskinrommet: create_node + agent_respond jobb + → Handler: handler_mode=external → status='deferred' + → Claude Code poller: finner deferred jobb + → Leser melding fra payload + → Behandler (svarer, utfører kommandoer, etc.) + → Skriver svar: scripts/chat-reply.sh + → Markerer done: scripts/vaktmester-complete.sh +``` + +## Stoppe polling + +### Tilbake til eksternt API +```bash +docker exec sidelinja-postgres-1 psql -U sidelinja -d synops -c " +UPDATE agent_identities SET handler_mode = 'internal' +WHERE agent_key = 'claude-main'; +" +``` + +### Pause (ingen AI) +```bash +docker exec sidelinja-postgres-1 psql -U sidelinja -d synops -c " +UPDATE agent_identities SET handler_mode = 'paused' +WHERE agent_key = 'claude-main'; +" +``` + +## Scripts + +| Script | Funksjon | +|--------|----------| +| `scripts/vaktmester-poll.sh` | Returner JSON med eldste deferred jobb, eller "none" | +| `scripts/chat-reply.sh ""` | Skriv melding som Claude Code med access-propagering | +| `scripts/vaktmester-complete.sh ` | Marker jobb som completed | + +## Feilsøking + +**Jobber forblir deferred for lenge:** +```bash +# Sjekk deferred jobber +docker exec sidelinja-postgres-1 psql -U sidelinja -d synops -c " +SELECT id, created_at FROM job_queue WHERE status = 'deferred' ORDER BY created_at; +" +``` + +**Bytt tilbake til internal hvis Claude Code er nede:** +```bash +docker exec sidelinja-postgres-1 psql -U sidelinja -d synops -c " +UPDATE agent_identities SET handler_mode = 'internal' WHERE agent_key = 'claude-main'; +UPDATE job_queue SET status = 'pending' WHERE status = 'deferred' AND job_type = 'agent_respond'; +" +``` + +**Sjekk handler_mode:** +```bash +docker exec sidelinja-postgres-1 psql -U sidelinja -d synops -c " +SELECT agent_key, handler_mode, is_active FROM agent_identities; +" +```