From 19d7fb39808cc8f9805f97e118b589ffa0d18ce7 Mon Sep 17 00:00:00 2001 From: vegard Date: Fri, 20 Mar 2026 01:55:19 +0000 Subject: [PATCH] Spec: admin som arbeidsflate med traits, adm.synops.no MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- docs/infra/admin_arbeidsflate.md | 240 +++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 docs/infra/admin_arbeidsflate.md diff --git a/docs/infra/admin_arbeidsflate.md b/docs/infra/admin_arbeidsflate.md new file mode 100644 index 0000000..26f6bfa --- /dev/null +++ b/docs/infra/admin_arbeidsflate.md @@ -0,0 +1,240 @@ +# 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