Implementerer tre nye skrivestier i maskinrommet med tilgangskontroll: - POST /intentions/create_edge — opprett retningsbestemt edge mellom to noder. Validerer at begge noder eksisterer og edge_type er satt. - POST /intentions/update_node — partial update av eksisterende node. Kun oppgitte felter endres, resten beholdes fra PG. - POST /intentions/delete_node — slett node med cascade av edges. Tilgangskontroll for update/delete: brukeren må enten være created_by på noden, eller ha en owner/admin-edge til den. Sjekkes mot PG som autoritativ kilde. Alle endepunkter følger samme mønster som create_node: STDB-skriving (instant) → async PG-persistering → umiddelbar respons. Verifisert på server med 10 testcaser: 1. /me med gyldig token → 200 2. create_node → 200 med node_id 3. create_edge (gyldig) → 200 med edge_id 4. create_edge (ugyldig source) → 400 5. create_edge (tom edge_type) → 400 6. update_node (partial, eier) → 200 7. update_node (ingen tilgang) → 403 8. delete_node (eier) → 200 9. delete_node (ingen tilgang) → 403 10. update via owner-edge (Sidelinja) → 200 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
95 lines
4.9 KiB
Markdown
95 lines
4.9 KiB
Markdown
# Infrastruktur: API-grensesnitt og Tjenesteansvar
|
|
|
|
## 1. Konsept
|
|
|
|
Frontend sender **intensjoner** til maskinrommet (Rust/axum HTTP API).
|
|
Maskinrommet eier alle skrivinger: det validerer, skriver til SpacetimeDB
|
|
(instant), persisterer til PG (asynk), og orkestrerer konsekvenser.
|
|
|
|
Lesestien for sanntid går direkte fra SpacetimeDB til frontend via WebSocket.
|
|
Tunge spørringer (søk, statistikk, graftraversering) går via maskinrommet → PG.
|
|
|
|
## 2. Kommunikasjonskart
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Brukerens nettleser (SvelteKit klient) │
|
|
└──────────┬──────────────────────┬───────────────────────────┘
|
|
│ │
|
|
│ HTTP (intensjoner) │ WebSocket (sanntid)
|
|
▼ ▼
|
|
┌──────────────────────┐ ┌──────────────────┐
|
|
│ Maskinrommet (Rust) │ │ SpacetimeDB │
|
|
│ axum HTTP API │ │ │
|
|
│ │ │ - Hele grafen │
|
|
│ Ansvar: │ │ - Push til │
|
|
│ - Validere │ │ klienter │
|
|
│ - Skrive STDB+PG │ │ │
|
|
│ - Orkestrere │ └──────────────────┘
|
|
│ - Tunge spørringer │
|
|
│ - Bakgrunnsjobber │
|
|
└──┬─────┬─────┬───────┘
|
|
│ │ │
|
|
▼ ▼ ▼
|
|
┌─────┐┌─────┐┌─────────────┐
|
|
│ PG ││STDB ││ Whisper, │
|
|
│ ││ ││ LiteLLM, │
|
|
│ ││ ││ LiveKit ... │
|
|
└─────┘└─────┘└─────────────┘
|
|
```
|
|
|
|
## 3. Ansvarsfordeling
|
|
|
|
| Komponent | Rolle | Snakker med |
|
|
|---|---|---|
|
|
| **SvelteKit (klient)** | UI, brukerinteraksjon | Maskinrommet (HTTP), SpacetimeDB (WS) |
|
|
| **Maskinrommet (Rust)** | Intensjons-API, orkestrering, tunge spørringer | PG, SpacetimeDB, CAS, Whisper, LiteLLM |
|
|
| **SpacetimeDB** | Sanntids state, push til klienter | Klienter (WS), maskinrommet (skriver) |
|
|
| **PostgreSQL** | Persistent arkiv, søk, statistikk | Maskinrommet (SQL) |
|
|
|
|
## 4. Viktige avklaringer
|
|
|
|
- **Maskinrommet er en HTTP API-server** (axum). Frontend sender intensjoner hit.
|
|
- **Maskinrommet eier alle skrivinger.** Frontend skriver aldri direkte til PG eller STDB.
|
|
- **SpacetimeDB nås direkte** fra klienten via WebSocket for lesing (sanntid).
|
|
- **SvelteKit er et rent frontend-prosjekt.** Ingen server-side PG-tilgang.
|
|
- **Bakgrunnsjobber** (Whisper, LLM, TTS) orkestreres av maskinrommet, aldri direkte fra frontend.
|
|
|
|
## 5. Implementerte endepunkter
|
|
|
|
### Offentlige
|
|
- `GET /health` — Helsesjekk. Verifiserer PG- og STDB-tilkobling.
|
|
|
|
### Autentiserte (krever `Authorization: Bearer <JWT>`)
|
|
- `GET /me` — Returnerer autentisert brukers `node_id` og `authentik_sub`.
|
|
- `POST /intentions/create_node` — Opprett node. Skriv til STDB (instant),
|
|
spawn async PG-skriving, returner `node_id` umiddelbart.
|
|
- Body (JSON): `{ node_kind?, title?, content?, visibility?, metadata? }`
|
|
- Defaults: `node_kind="content"`, `visibility="hidden"`, andre felter tomme
|
|
- Respons: `{ node_id: "<uuid>" }`
|
|
- `POST /intentions/create_edge` — Opprett edge mellom to noder.
|
|
Validerer at begge nodene eksisterer og at edge_type ikke er tom.
|
|
- Body (JSON): `{ source_id, target_id, edge_type, metadata?, system? }`
|
|
- Defaults: `metadata={}`, `system=false`
|
|
- Respons: `{ edge_id: "<uuid>" }`
|
|
- `POST /intentions/update_node` — Oppdater eksisterende node (partial update).
|
|
Krever tilgang: created_by eller owner/admin-edge.
|
|
- Body (JSON): `{ node_id, node_kind?, title?, content?, visibility?, metadata? }`
|
|
- Kun oppgitte felter endres, resten beholdes
|
|
- Respons: `{ node_id: "<uuid>" }`
|
|
- `POST /intentions/delete_node` — Slett node og tilhørende edges.
|
|
Krever tilgang: created_by eller owner/admin-edge.
|
|
- Body (JSON): `{ node_id }`
|
|
- Respons: `{ deleted: true }`
|
|
|
|
## 6. Instruks for Claude Code
|
|
|
|
- Maskinrommet (`maskinrommet/`) er Rust-prosjektet med axum, tokio, sqlx.
|
|
- Intensjoner fra frontend → `POST /intentions/*` endepunkter i maskinrommet.
|
|
- Tunge spørringer fra frontend → `GET /query/*` endepunkter i maskinrommet.
|
|
- Frontend (SvelteKit) har ingen direkte databasetilgang.
|
|
- Bakgrunnsjobber trigges av maskinrommet, ikke via en separat jobbkø-tabell.
|
|
|
|
> **Historisk merknad:** Tidligere beskrev dette dokumentet en arkitektur
|
|
> der SvelteKit var web-API og Rust kun var workers. Denne ble erstattet
|
|
> av maskinrommet-arkitekturen (se `docs/retninger/maskinrommet.md`).
|