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>
This commit is contained in:
parent
494a6b5f18
commit
19d7fb3980
1 changed files with 240 additions and 0 deletions
240
docs/infra/admin_arbeidsflate.md
Normal file
240
docs/infra/admin_arbeidsflate.md
Normal file
|
|
@ -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
|
||||
Loading…
Add table
Reference in a new issue