Commit graph

16 commits

Author SHA1 Message Date
f32aa63bc3 Worker Dockerfile: bruk rust:1-bookworm for nyeste stable
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:49:40 +01:00
a6bc256ef1 Worker: Dockerfile for produksjon (multi-stage Rust build)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:47:44 +01:00
a1e6fa1c6b AI-admin: multi-provider katalog, prompt label/icon, usage action-kolonne
- Modellkatalog henter fra xAI, Gemini, OpenAI og OpenRouter (ikke bare OR)
- Hver katalogmodell bærer litellm_prefix og api_key_env — forenkler add-flow
- Prompts har nå label, icon og sort_order — vises i chat og admin
- ai_usage_log får action-kolonne for å spore hvilken prompt som ble brukt
- Worker skriver PG-metadata FØR SpacetimeDB slik at frontend finner fersk data
- getUserWorkspaces returnerer rolle

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:18:24 +01:00
7899b2f224 AI-admin: vis faktisk modellnavn i tokenforbruk + fiks kolonnelayout
- Worker slår opp faktisk modellnavn (f.eks. google/gemini-2.5-flash-lite)
  fra providers-tabellen og lagrer det i model_actual
- Stripper openrouter/gemini-prefiks for lesbarhet
- Tokenforbruk-tabellen bruker faste kolonnebredder for korrekt justering

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:48:26 +01:00
1f25c50d50 Worker: slå opp modellalias fra ai_job_routing i stedet for hardkodet default
Fjerner hardkodet «sidelinja/rutine» — henter alias dynamisk fra
ai_job_routing-tabellen slik at endringer i admin-grensesnittet
(alias-rename, ny ruting) fungerer uten å endre worker-kode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:16:18 +01:00
3ac9691830 Refaktor: riktig dataflyt — SpacetimeDB er master for body-endring
Før: worker skrev body til både PG og SpacetimeDB (dobbelt-skriving),
og sync.rs skrev den samme endringen tilbake fra SpacetimeDB til PG.

Nå: worker skriver body-endring KUN til SpacetimeDB, sync.rs synker
til PG som vanlig. Worker skriver kun PG-only data direkte (metadata,
revisjoner, tokenforbruk).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:54:23 +01:00
80b7103cba Fix: SpacetimeDB HTTP API bruker snake_case, ikke camelCase
edit_message reducer forventer workspace_id og new_body,
ikke workspaceId og newBody. TypeScript SDK bruker camelCase,
men HTTP API-et bruker snake_case.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:51:13 +01:00
ea3b3d5a38 Fix: worker oppdaterer SpacetimeDB etter AI-behandling
Frontend leser fra SpacetimeDB, men workeren skrev kun til PG.
Nå kalles edit_message-reduceren i SpacetimeDB etter vellykket
AI-behandling, slik at resultatet vises umiddelbart i chatten.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:22:18 +01:00
4b8da64fc5 Fix: worker sender Authorization-header til AI Gateway
Uten nøkkelen returnerte LiteLLM 401, og AI-jobber feilet etter 3 forsøk.
Ny CLI-param --ai-gateway-key (env: AI_GATEWAY_KEY). dev.sh leser
LITELLM_MASTER_KEY fra .env.local og eksporterer som AI_GATEWAY_KEY.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:17:21 +01:00
832ea7117a AI-administrasjon: modellstyring, tokenregnskap, admin-panel
- Migrasjon 0007: ai_model_aliases, ai_model_providers, ai_job_routing, ai_usage_log
- Worker: token-logging fra AI Gateway-respons til ai_usage_log
- Config-generering: POST /api/admin/ai/generate-config bygger config.yaml fra PG
- Admin-panel /admin/ai: aliaser, leverandører, jobbruting, tokenforbruk
- CRUD API for aliaser, providers og routing
- Workspace-forbruk API: GET /api/ai/usage?days=30

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:03:12 +01:00
38f26ef1d9 Fix: warmup brukte feil kolonnenavn (u.name → u.display_name, message_type::text cast)
Også fikset Windows line endings i dev.sh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 02:56:59 +01:00
2ed50d51a9 Warmup: trådbasert henting — hele tråder lastes komplett
messages-modus: hent de N nyeste trådene (sortert etter siste
aktivitet), inkludert alle svar. Ingen orphan-replies.

days-modus: finn alle tråder med minst én melding innenfor
tidsvinduet, last hele tråden (også eldre trådstartere).

all-modus: uendret, henter alt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 02:33:55 +01:00
0d8521855f Admin: per-kanal warmup-konfigurasjon
- channels.config får warmup_mode (all/messages/days/none) og warmup_value
- Migrasjon setter default til "all" for eksisterende kanaler
- Admin-side /admin/channels med oversikt og inline-redigering
- API PATCH /api/channels/:id/config for å oppdatere konfig
- Worker respekterer per-kanal konfig ved warmup
- Sidebar-lenke til kanaler-admin

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 02:26:02 +01:00
8b58d434e9 SpacetimeDB som cache foran PG: arkitekturendring
PG er autoritativ, SpacetimeDB er varm cache. Frontend snakker
kun med SpacetimeDB, worker håndterer toveissynk.

Fase 1 — SpacetimeDB-modul:
- delete_message med SyncOutbox-event
- edit_message reducer
- MessageReaction tabell + add/remove_reaction reducers
- load_messages med JSON-parsing (erstatter pipe-format)
- clear_channel reducer for duplikat-fri warmup
- load_reactions reducer

Fase 2 — Worker:
- warmup.rs: PG→ST oppvarming ved oppstart (100 msg/kanal)
- sync.rs: håndter delete/update/reaction actions
- Sync-intervall redusert til 1s

Fase 3 — Frontend:
- spacetime.svelte.ts: ren SpacetimeDB-adapter, ingen PG-hybrid
- ChatConnection interface med edit/delete/react metoder
- ChatBlock bruker chat.edit/delete/react direkte
- PG-adapter som readonly fallback

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 02:09:33 +01:00
50e26e3c48 Entiteter: merge-verktøy, detaljside og AI-worker
Admin-side for merge av duplikate entiteter med edge-migrering.
Entitetsside med inline redigering, slett, relasjoner og mentions.
AI text process worker-handler (fix_text, extract_facts, rewrite,
translate) med API-endepunkt som oppretter jobbkø-oppgaver.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:45:45 +01:00
3f8ef65c5f Jobbkø-worker: Rust-binær med polling, concurrency og retry
sidelinja-worker — tokio-basert orkestrator som poller job_queue:
- SELECT FOR UPDATE SKIP LOCKED for trygg concurrent polling
- Semaphore-styrt concurrency (--max-concurrent)
- Eksponentiell backoff: 30s × 2^(attempts-1)
- Handler-registry (HashMap<String, Box<dyn JobHandler>>)
- Strukturert JSON-logging via tracing
- Echo-handler for end-to-end testing
- CLI: --database-url, --ai-gateway-url, --max-concurrent, --poll-interval

Testet mot dev-database: echo-jobb fullført, ukjent type → retry → error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:40:32 +01:00