# 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