synops/docs/infra/claude_code_polling.md
vegard 7d0ccdfa06 Docs: Claude Code polling — komplett oppsett og feilsøking
Handler-moduser (internal/external/paused), chat-ID, scripts,
start/stopp-prosedyrer, feilsøking. Alt en ny sesjon trenger
for å starte polling uten forkunnskaper.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 05:59:10 +00:00

120 lines
3.5 KiB
Markdown

# 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 = '<modus>' 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 <chat-id> "<svar>"`
> Marker ferdig: `/home/vegard/synops/scripts/vaktmester-complete.sh <job-id>`
> 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 <chat-id> "<melding>"` | Skriv melding som Claude Code med access-propagering |
| `scripts/vaktmester-complete.sh <job-id>` | 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;
"
```