synops/docs/infra/admin_arbeidsflate.md
vegard 19d7fb3980 Spec: admin som arbeidsflate med traits, adm.synops.no
Admin er ikke et separat system — det er en arbeidsflate med
admin-traits. Samme canvas, samme BlockShell, samme SvelteKit.
adm.synops.no som eget domene med admin-rolle-krav.

13 admin-traits: node explorer, oppgavetavle, jobbkø, API-nøkler,
brukeradmin, AI-ruting, serverhelse, forbruk, logger, systemkonfig,
webhooks, podcast-import, podcaststatistikk.

Noen traits delt mellom admin og brukere med ulik tilgang.
Eksisterende /admin/*-sider migreres til traits.

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

7.5 KiB

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

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

// 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