# 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;
"
```
