Oppdater api_grensesnitt.md til maskinrommet-arkitekturen

Det gamle dokumentet beskrev en v1-arkitektur der SvelteKit var web-API
og Rust kun var workers. Med maskinrommet-retningen (besluttet) er Rust
en axum HTTP API-server som mottar intensjoner fra frontend og eier
alle skrivinger. Dokumentet er omskrevet til å reflektere dette.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-17 12:23:10 +01:00
parent b35eb100fa
commit 0d0fd03415

View file

@ -1,8 +1,13 @@
# Infrastruktur: API-grensesnitt og Tjenesteansvar # Infrastruktur: API-grensesnitt og Tjenesteansvar
**Filsti:** `docs/infra/api_grensesnitt.md`
## 1. Konsept ## 1. Konsept
Definerer hvordan SvelteKit-frontenden kommuniserer med backend-tjenestene. Prinsippet er: **SvelteKit er web-serveren, Rust er workeren.** Ingen separat Rust HTTP API.
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 ## 2. Kommunikasjonskart
@ -11,63 +16,53 @@ Definerer hvordan SvelteKit-frontenden kommuniserer med backend-tjenestene. Prin
│ Brukerens nettleser (SvelteKit klient) │ │ Brukerens nettleser (SvelteKit klient) │
└──────────┬──────────────────────┬───────────────────────────┘ └──────────┬──────────────────────┬───────────────────────────┘
│ │ │ │
WebSocket │ HTTP (forms, fetch) HTTP (intensjoner) │ WebSocket (sanntid)
▼ ▼ ▼ ▼
┌──────────────────┐ ┌─────────────────────────────────────┐ ┌──────────────────────┐ ┌──────────────────┐
│ SpacetimeDB │ │ SvelteKit Server │ │ Maskinrommet (Rust) │ │ SpacetimeDB │
│ │ │ (load functions, form actions, │ │ axum HTTP API │ │ │
│ - Chat │ │ API routes) │ │ │ │ - Hele grafen │
│ - Kanban │ │ │ │ Ansvar: │ │ - Push til │
│ - Live events │ │ Ansvar: │ │ - Validere │ │ klienter │
│ - Autocomplete │ │ - Les/skriv PostgreSQL direkte │ │ - Skrive STDB+PG │ │ │
│ - Studio- │ │ - Opprett jobber i job_queue │ │ - Orkestrere │ └──────────────────┘
│ markører │ │ - Filopplasting (streaming) │ │ - Tunge spørringer │
│ │ │ - RSS-generering │ │ - Bakgrunnsjobber │
│ │ │ - Kunnskapsgraf-spørringer │ └──┬─────┬─────┬───────┘
└──────────────────┘ └──────────────┬───────────────────────┘ │ │ │
▼ ▼ ▼
│ SQL ┌─────┐┌─────┐┌─────────────┐
│ PG ││STDB ││ Whisper, │
┌──────────────────────────┐ │ ││ ││ LiteLLM, │
│ PostgreSQL │ │ ││ ││ LiveKit ... │
│ │ └─────┘└─────┘└─────────────┘
│ - Kunnskapsgraf │
│ - Episodemetadata │
│ - Statistikk │
│ - Jobbkø (job_queue) │
│ - Brukerdata │
└──────────────┬────────────┘
│ Poll (SELECT FOR UPDATE)
┌──────────────────────────┐
│ Rust Workers │
│ │
│ - whisper_transcribe │
│ - openrouter_analyze │
│ - research_clip │
│ - stats_parse │
│ - sync_to_pg (SpaceDB→PG)│
└──────────────────────────┘
``` ```
## 3. Ansvarsfordeling ## 3. Ansvarsfordeling
| Komponent | Rolle | Snakker med | | Komponent | Rolle | Snakker med |
|---|---|---| |---|---|---|
| **SvelteKit (klient)** | UI, brukerinteraksjon | SpacetimeDB (WS), SvelteKit server (HTTP) | | **SvelteKit (klient)** | UI, brukerinteraksjon | Maskinrommet (HTTP), SpacetimeDB (WS) |
| **SvelteKit (server)** | Web-API, PG-tilgang, jobb-trigger | PostgreSQL (SQL) | | **Maskinrommet (Rust)** | Intensjons-API, orkestrering, tunge spørringer | PG, SpacetimeDB, CAS, Whisper, LiteLLM |
| **SpacetimeDB** | Sanntids state, push til klienter | Klienter (WS), sync-worker (intern) | | **SpacetimeDB** | Sanntids state, push til klienter | Klienter (WS), maskinrommet (skriver) |
| **Rust Workers** | Tunge bakgrunnsjobber, synk | PostgreSQL (SQL), SpacetimeDB, OpenRouter, faster-whisper | | **PostgreSQL** | Persistent arkiv, søk, statistikk | Maskinrommet (SQL) |
## 4. Viktige avklaringer ## 4. Viktige avklaringer
- **Rust er ikke en API-server.** Rust kjører kun som workers/prosessorer som poller jobbkøen
- **SvelteKit server-side er trygt.** Load functions og form actions kjører på serveren og kan snakke direkte med PG uten sikkerhetsproblemer - **Maskinrommet er en HTTP API-server** (axum). Frontend sender intensjoner hit.
- **Filopplasting** håndteres av SvelteKit (streaming for store filer), som lagrer filen på disk og oppretter en jobb i køen - **Maskinrommet eier alle skrivinger.** Frontend skriver aldri direkte til PG eller STDB.
- **SpacetimeDB nås aldri via SvelteKit server** — kun direkte fra klienten via WebSocket - **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. Instruks for Claude Code ## 5. Instruks for Claude Code
- Ikke opprett et separat Rust HTTP API/webserver-prosjekt
- Bruk SvelteKit `+server.ts` (API routes) eller `+page.server.ts` (form actions/load) for all HTTP-kommunikasjon - Maskinrommet (`maskinrommet/`) er Rust-prosjektet med axum, tokio, sqlx.
- Rust-kode skal struktureres som worker-binærer som konsumerer fra `job_queue` - Intensjoner fra frontend → `POST /intentions/*` endepunkter i maskinrommet.
- For PG-tilgang i SvelteKit, bruk et bibliotek som `postgres.js` eller `drizzle-orm` - 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`).