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>
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
- Caddy + SvelteKit — adm.synops.no domene, admin-rolle-sjekk
- Admin-samling — systemnode med admin-traits, seed i PG
- Node explorer — mest gjenbrukbar, nyttig for debug
- Oppgavetavle — bygger på task-noder vi nettopp implementerte
- Jobbkø — migrér eksisterende /admin/jobs
- Brukeradmin + klasser — bygger på brukerklasse-spec
- API-nøkler — migrér eksisterende /admin/keys
- AI-ruting — migrér eksisterende /admin/ai
- Serverhelse — migrér eksisterende /admin/health
- Forbruk — migrér eksisterende /admin/usage
- Logger, systemkonfig, webhooks, podcast — resten