# Admin som arbeidsflate — ikke et separat system

## Prinsipp

Admin er en arbeidsflate med admin-paneler. Samme SvelteKit,
samme canvas, samme BlockShell. Forskjellen er hvilke noder
og traits du har tilgang til.

Admin-UI er **ikke** et parallelt univers. Det er det samme
grensesnittet med utvidede rettigheter og dedikerte verktøy.

## Domene

```
adm.synops.no → admin-arbeidsflaten
ws.synops.no  → bruker-arbeidsflaten
```

Begge peker til samme SvelteKit-instans. Forskjell:
- `adm.synops.no` → default arbeidsflate med admin-traits
- Krever admin-rolle (owner/admin i Authentik-gruppen)
- Caddy: reverse proxy til SvelteKit, som ws.synops.no

### Caddy-konfig

```caddyfile
adm.synops.no {
    import favicon
    import security-headers
    handle_path /api/* {
        reverse_proxy 127.0.0.1:3100
    }
    handle {
        reverse_proxy 127.0.0.1:3200
    }
}
```

### SvelteKit

Hooks sjekker hostname:
- `adm.synops.no` → krev admin-rolle, redirect til admin-arbeidsflate
- Alternativt: admin-arbeidsflate er bare en samling med admin-traits,
  og `adm.synops.no/` redirecter dit

## Admin-arbeidsflate

En samlings-node med admin-traits, eid av systemet:

```
node_kind: 'collection'
title: 'Administrasjon'
metadata: {
  traits: {
    node_explorer: {},
    task_board: {},
    job_queue: {},
    api_keys: {},
    user_admin: {},
    ai_routing: {},
    server_health: {},
    usage_dashboard: {},
    log_viewer: {},
    system_config: {},
  }
}
```

Admin-brukere har `admin`-edge til denne samlingen.
Vanlige brukere har ingen edge — ser den ikke.

## Admin-traits (nye paneler)

### Node Explorer (`node_explorer`)

Utforsk grafen. Nyttig for admin (debug) og avanserte brukere
(kunnskapsgraf).

- Søk noder etter kind, tittel, innhold, metadata
- Vis en node med alle edges (inn og ut)
- Filtrer på node_kind, visibility, created_by
- Klikk edge → naviger til relatert node
- Rediger metadata direkte (kun admin)
- Slett node (med bekreftelse)

Tilgjengelig for:
- Admin: full tilgang (les, skriv, slett)
- Avanserte brukere: lesemodus for egne noder

### Oppgavetavle (`task_board`)

Proposals, oppdrag og tasks i tre kolonner eller faner.

- Tre visninger: Proposals | Oppdrag | Tasks
- Kanban-stil: dra mellom statuser
- Opprett ny proposal/oppdrag/task
- Klikk → detaljer med tilknyttet chat
- "Godkjenn proposal" → opprett oppdrag
- Vis hvem/hva som jobber på en oppgave
- Prioritetsendring via drag eller tall-input

### Jobbkø (`job_queue`)

Maskinrommets bakgrunnsjobber.

- Filtrer på status (pending, running, completed, error)
- Filtrer på job_type, collection
- Vis payload og resultat
- Retry feilede jobber
- Avbryt kjørende jobber
- Stale-deteksjon: vis running >60 min som varsling

### API-nøkler (`api_keys`)

Krypterte API-nøkler for tredjepartstjenester.

- Nøkkelliste med provider, label, status, sist brukt
- Legg til med test-tilkobling
- Deaktiver/slett
- Hint-visning (aldri full nøkkel etter lagring)

Ref: `docs/infra/nøkkelhåndtering.md`

### Brukeradministrasjon (`user_admin`)

- Brukerliste med klasse, forbruk, status
- Endre brukerklasse
- Overstyr budsjett per bruker
- Se forbrukshistorikk per bruker
- Deaktiver/aktiver bruker

Ref: `docs/infra/brukerklasser.md`

### AI-ruting (`ai_routing`)

- Rediger ai_job_routing (jobbtype → modellnivå)
- Fire nivåer: synops/low, medium, high, extreme
- Per-nivå: velg modell + provider
- Fallback-kjeder
- Test-knapp per nivå
- Kostnadsestimat

### Serverhelse (`server_health`)

- Tjenestestatus (PG, Caddy, maskinrommet, Whisper, LiveKit)
- CPU, minne, disk
- Aktive WebSocket-tilkoblinger
- Docker container-status
- synops-agent-instanser

### Forbruksoversikt (`usage_dashboard`)

- Aggregert forbruk per bruker, per modell, per feature
- Trend over tid (dag, uke, måned)
- Kostnadsestimat basert på modellpriser
- Drill-down til enkeltbrukere
- Eksporter til CSV

### Logg-visning (`log_viewer`)

- Vis loggfiler: maskinrommet, Caddy, jobbkø
- Tail-modus (sanntid)
- Søk og filtrer
- Som et "terminal"-panel

### Systemkonfigurasjon (`system_config`)

- Systembudsjett for AI (tokens/dag for system-jobber)
- Default brukerklasse for nye brukere
- Orkestrerings-oversikt (aktive, deaktiverte)
- Vedlikeholdsmodus (graceful shutdown)

## Eksisterende admin-sider → traits

De eksisterende `/admin/*`-sidene migreres til traits:

| Eksisterende side | Ny trait |
|-------------------|----------|
| `/admin` | Fjernes (admin-arbeidsflate erstatter) |
| `/admin/ai` | `ai_routing` |
| `/admin/health` | `server_health` |
| `/admin/jobs` | `job_queue` |
| `/admin/usage` | `usage_dashboard` |
| `/admin/webhooks` | `webhook_admin` (ny trait) |
| `/admin/podcast-import` | `podcast_import` (ny trait) |
| `/admin/podcast-stats` | `podcast_stats` (ny trait) |
| `/admin/keys` | `api_keys` |
| `/admin/agents` | Integrert i `task_board` + `server_health` |
| `/admin/users` | `user_admin` |

Gamle `/admin/*`-ruter kan redirect til `adm.synops.no` i
en overgangsperiode.

## Traits delt mellom admin og brukere

Noen admin-traits har verdi for vanlige brukere i begrenset modus:

| Trait | Admin | Bruker |
|-------|-------|--------|
| `node_explorer` | Full (les/skriv/slett alle) | Lesemodus (egne noder) |
| `task_board` | Alle proposals/oppdrag/tasks | Egne oppgaver |
| `usage_dashboard` | Alle brukere | Eget forbruk |
| `job_queue` | Alle jobber | Egne jobber |

Tilgangsstyring via rollebasert arv (samme mekanisme som
for andre samlinger). Admin-samlingen har traits med
`roles: ["admin"]`, noen med `roles: ["admin", "user"]`.

## Registrering i TRAIT_PANEL_INFO

```typescript
// Admin-traits
node_explorer:    { title: 'Nodeutforsker',    icon: '🔍', defaultWidth: 550, defaultHeight: 500 },
task_board:       { title: 'Oppgaver',          icon: '📋', defaultWidth: 600, defaultHeight: 500 },
job_queue:        { title: 'Jobbkø',            icon: '⚙️', defaultWidth: 500, defaultHeight: 400 },
api_keys:         { title: 'API-nøkler',        icon: '🔑', defaultWidth: 450, defaultHeight: 400 },
user_admin:       { title: 'Brukere',           icon: '👥', defaultWidth: 500, defaultHeight: 450 },
ai_routing:       { title: 'AI-ruting',         icon: '🧠', defaultWidth: 500, defaultHeight: 400 },
server_health:    { title: 'Serverhelse',       icon: '💚', defaultWidth: 450, defaultHeight: 400 },
usage_dashboard:  { title: 'Forbruk',           icon: '📊', defaultWidth: 550, defaultHeight: 450 },
log_viewer:       { title: 'Logger',            icon: '📜', defaultWidth: 600, defaultHeight: 400 },
system_config:    { title: 'Systeminnstillinger', icon: '🔧', defaultWidth: 450, defaultHeight: 400 },
webhook_admin:    { title: 'Webhooks',          icon: '🔗', defaultWidth: 450, defaultHeight: 400 },
podcast_import:   { title: 'Podcast-import',    icon: '📥', defaultWidth: 500, defaultHeight: 450 },
podcast_stats:    { title: 'Podcaststatistikk', icon: '📈', defaultWidth: 500, defaultHeight: 400 },
```

## Implementeringsrekkefølge

1. **Caddy + SvelteKit** — adm.synops.no domene, admin-rolle-sjekk
2. **Admin-samling** — systemnode med admin-traits, seed i PG
3. **Node explorer** — mest gjenbrukbar, nyttig for debug
4. **Oppgavetavle** — bygger på task-noder vi nettopp implementerte
5. **Jobbkø** — migrér eksisterende /admin/jobs
6. **Brukeradmin + klasser** — bygger på brukerklasse-spec
7. **API-nøkler** — migrér eksisterende /admin/keys
8. **AI-ruting** — migrér eksisterende /admin/ai
9. **Serverhelse** — migrér eksisterende /admin/health
10. **Forbruk** — migrér eksisterende /admin/usage
11. **Logger, systemkonfig, webhooks, podcast** — resten
