Commit graph

41 commits

Author SHA1 Message Date
b082edc2bd AI-admin: full nøkkeladministrasjon fra grensesnittet
- Nøkkelverdier kan lagres i DB (key_value) og brukes direkte i config
- Ny nøkkel-seksjon: legg til, rediger, slett API-nøkler fra UI
- Config-generering bruker DB-verdi hvis satt, ellers env-referanse
- Dynamisk api_key_env-dropdown basert på registrerte nøkler
- Gemini omdøpt til Google, OpenAI lagt til
- Slett-beskyttelse: kan ikke fjerne nøkkel som er i bruk av providers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 06:49:59 +01:00
6c186ce9cc AI-admin: global av/på-styring av API-nøkler fra grensesnittet
- Ny tabell ai_api_keys med is_enabled per nøkkel (GEMINI, OPENROUTER, etc.)
- Nøkkel-pills i toppen er nå klikkbare toggles (grønn=på, grå=av, rød=mangler)
- Config-generering filtrerer ut providers med deaktivert nøkkel
- Provider-rader viser visuelt når nøkkelen er slått av (rød kant + dimmet)
- Gjeldende modell per alias respekterer nøkkel-status

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 06:43:33 +01:00
f98675a72e AI-admin: vis gjeldende modell per alias, migrer alt til OpenRouter
- Viser primærmodell (høyest prioritet, aktiv) under hvert alias-navn
- Migrerer alle gemini/-providers til openrouter/google/-ekvivalenter
- Endrer standard API-nøkkel i ny-provider-skjema til OPENROUTER_API_KEY

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 06:28:01 +01:00
35c76a7038 AI-admin: extra_params per provider (web-plugin, custom params)
- Ny kolonne extra_params JSONB på ai_model_providers (migrasjon 0009)
- Web-søk toggle-pill per provider — ett klikk for å slå på/av
- «...»-knapp åpner JSON-editor for vilkårlige extra_params
- Config-generering fletter extra_params inn i litellm_params
- POST/PATCH provider-endepunkter støtter extra_params

Eksempel: Grok med web-plugin genererer:
  plugins: [{"id":"web"}]
under litellm_params i config.yaml.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 06:11:54 +01:00
ad0d4f1f8a AI-admin: sorter aliaser alfabetisk, tokenforbruk synkende
Bruker $derived for å opprettholde sortering etter rename/oppdatering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 05:51:05 +01:00
21683bd660 AI-admin: alias-rename, dollarkostnad, fikset kolonnebredder
- PATCH /aliases/:id støtter nå rename (alias-felt)
- Alias-raden har «Rediger»-knapp → inline-redigering av navn + beskrivelse
- Tokenforbruk viser model_actual og estimert dollarkostnad per rad
- Dollarkostnad beregnes fra OpenRouter-katalogpriser (krever lastet katalog)
- Tokenforbruk-tabellen bruker auto-kolonnebredde (fikser overflow)
- «Kompl.» i stedet for «Completion» i header

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 05:36:49 +01:00
177e4b6b66 AI-admin: «Generer + restart gateway»-knapp
Utvider generate-config endepunktet med ?restart=true som finner
og restarter ai-gateway docker-containeren etter config-generering.
Ny grønn knapp i UI gjør begge operasjoner i ett klikk.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 05:30:28 +01:00
b1a7e55fff AI-admin: modellkatalog fra OpenRouter med leverandør-akkordion
- Nytt endepunkt /api/admin/ai/models som proxyer OpenRouter med 1t cache
- Nytt endepunkt /api/admin/ai/keys for API-nøkkelstatus
- API-nøkkel-pills (GEMINI/OPENROUTER/ANTHROPIC/XAI) øverst på siden
- Browsbar modellkatalog gruppert per leverandør i trekkspill-format
- Globalt søkefelt, sortert synkende etter pris per leverandør
- "Legg til →" fra katalog velger alias og oppretter provider
- Katalog-picker i eksisterende add-provider-form

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 05:23:47 +01:00
aafb121bf2 Skill server-admin fra workspace-admin
Server-admin (/server-admin): systemvide innstillinger (AI, kanaler) — kun for owners.
Workspace-admin (/admin): workspace-spesifikke innstillinger (sider, entiteter) — for owner/admin i gjeldende workspace.

- Ny rute /server-admin med egen layout-gate (owner-rolle)
- Flytt AI og kanaler fra /admin til /server-admin
- Workspace-admin gate sjekker nå rolle i gjeldende workspace
- Sidebar: workspace-admin-lenker under separator, server-admin-nav i server-admin-modus
- WorkspaceSwitcher: "Admin (server)" kun for owners
- Kanaler: trekkspill gruppert etter workspace
- Config-API: owners kan endre kanaler på tvers av workspaces
- Migrasjon: ai_prompts-tabell

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 05:19:23 +01:00
b4e01feada Fix: hent metadata fra PG ved meldingsoppdatering i sanntid
Etter onUpdate fra SpacetimeDB hentes edited_at og metadata
(ai_processed, ai_action) fra PG, slik at revisjonshistorikk
og AI-badge vises korrekt også for sanntidsoppdateringer.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:52:28 +01:00
52b71e6440 UI: bruk play-symboler (◀ ▶) for revisjonspiler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:46:10 +01:00
bc0da66d2a Fix: revisions-API brukte created_at men kolonnen heter edited_at
Ga 500 Internal Error når frontend forsøkte å laste revisjoner.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:40:44 +01:00
0b52266e70 Fix: hent edited_at og metadata fra PG etter SpacetimeDB-load
SpacetimeDB har ikke edited_at eller metadata-felter, så «redigert»-
indikatoren dukket aldri opp. Etter initial subscription-load gjør
frontend nå et kall til /api/channels/:id/messages/metadata for å
hente redigeringsstatus og AI-metadata fra PG.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:35:50 +01:00
aeda5e7527 Generell revisjonshistorikk + markdown-rendering i meldinger
- Markdown rendres automatisk for all ikke-HTML body (detekterer <p>, <div> osv.)
- «redigert»-indikator med bla-navigasjon (← →) for alle redigerte meldinger
- Henter revisjoner fra PG via /api/messages/:id/revisions ved behov
- SpacetimeDB onUpdate setter edited_at slik at frontend vet meldingen er redigert
- AI-badge ( action) vises fortsatt for AI-behandlede meldinger

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:33:04 +01:00
d5882c8c45 Markdown-rendering og revisjons-toggle for AI-behandlede meldinger
- AI-resultat (markdown) rendres med marked-biblioteket
- «Vis original» / «Vis AI-resultat» toggle under AI-behandlede meldinger
- Nytt API: GET /api/messages/:id/revisions for å hente originaltekst
- Markdown-stiler: overskrifter, lister, blockquotes, kodeblokker

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:28:13 +01:00
0a560bdf2d Fix: bruk sql.json() for JSONB payload i job_queue
JSON.stringify + ::jsonb via postgres-biblioteket lagret payload som
dobbelt-escaped string i stedet for JSONB-objekt. Workeren fant ikke
message_id i den resulterende strengen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 03:10:08 +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
a6ca0f602d Fix: forenkle channels-query, fjern ugyldig factoids.title referanse
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 02:29:13 +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
63f928bbe6 Chat: svar-tråder, kanban-konvertering og kalender-konvertering
Legger til tre nye funksjoner fra chatmeldinger:
- Svar på meldinger med reply-kontekst (↩ forfatter: tekst)
- Konverter melding til kanban-kort via dialog
- Konverter melding til kalenderhendelse via dialog

Utvider messages API med reply_count, parent-info og
LEFT JOIN til kanban/kalender view-tabeller for badges.
Nye list-endepunkter for /api/kanban og /api/calendar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 01:43:24 +01:00
d5a4de55de Fix: fjern sort i SpacetimeDB-merge, behold PG-rekkefølge
PG-meldinger kommer sortert fra queryen. SpacetimeDB-meldinger
har upålitelige timestamps (fallback til now()), så sortering
blandet rekkefølgen. Legger nå SpacetimeDB-only meldinger etter
PG-meldinger uten re-sortering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 23:12:15 +01:00
b24f323083 Fix: bevar SpacetimeDB-meldinger ved refresh, stille feil ved 404
- loadFromPg() merger nå PG-data med eksisterende SpacetimeDB-meldinger
  i stedet for å overskrive (hindrer at chatten tømmes)
- onReaction/onTogglePin kaller bare refresh() ved OK-respons
- Fjernet debug-logging

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 23:08:21 +01:00
e4b0eb77ea Fix: erstatt LATERAL join med separat reaksjons-query
LATERAL subquery med parameteriserte verdier fungerte ikke med
postgres-biblioteket. Bruker nå en enklere to-stegs tilnærming:
hent meldinger først, deretter reaksjoner i én batch-query.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:50:15 +01:00
5bc992272d MessageBox: API-utvidelser, reaksjoner og pin-toggle
- GET messages returnerer alle felter + aggregerte reaksjoner via LATERAL join
- Nytt PATCH/DELETE endepunkt for enkeltmeldinger (/api/messages/[id])
- Nye reaksjons-endepunkter (POST/DELETE /api/messages/[id]/reactions)
- refresh() eksponert på ChatConnection (PG + SpacetimeDB)
- MessageBox UI: reaksjonspills med toggle + hurtig-emojis ved hover
- Pin-toggle i header med hover-synlighet
- ChatBlock wirer onReaction og onTogglePin callbacks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:42:41 +01:00
568c385cd0 Notes: typealignering til MessageData
NoteConnection eksponerer nå `message: MessageData | null` i tillegg til
`note: Note | null`, slik at notater deltar i den felles datamodellen.
Hjelpefunksjoner noteToMessage/messageToNote for konvertering.
NotesBlock uendret — bruker Editor direkte.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:24:35 +01:00
e3e3bbc24f MessageBox: universell meldingsboks-komponent for chat, kanban og kalender
Felles MessageData-type (matcher messages-tabellen) med 3 renderingsmodi:
- expanded (chat): forfatter, tid, HTML-body, mention-klikk, badges
- compact (kanban): tittel, trunkert preview, fargestripe
- calendar (pill): tidspunkt, tittel, bakgrunnsfarge

Alle blokker (ChatBlock, KanbanBlock, CalendarBlock) migrert til MessageBox.
PG-adaptere mapper API-respons til MessageData med view-spesifikke felter.
SpacetimeDB-adapter oppdatert for kompatibilitet.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:15:36 +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
592ebdf1d6 Tiptap-editor og mentions→graf-edges
Ny Editor-komponent med Tiptap (bold, italic, code, mentions).
Chat og notater oppretter nå MENTIONS-edges i kunnskapsgrafen
automatisk ved lagring. SpacetimeDB-adapter skriver alltid via
PG API først for edge-atomisitet. RLS SET LOCAL fix i db.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:45:34 +01:00
6edd1fa091 Frontend: entiteter, graf-visualisering og #-autocomplete
- EntitiesBlock: liste med søk/filter, opprett, rediger, slett,
  relasjonsvisning med navigering mellom entiteter
- GraphBlock: SVG force-directed layout via traverse API,
  pan/zoom, drag noder, dobbeltklikk for å utforske
- EntityAutocomplete: #-mention med debounced søk, tastaturnavigering,
  dropdown med typefarger og aliaser
- Registrert entities block-type + kunnskapsgraf-side i seed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:46:34 +01:00
1d47119b1e Kunnskapsgraf CRUD API: entities, edges, søk og traversering
Syv nye API-endepunkter for kunnskapsgrafen:

Entities:
- GET/POST /api/entities — list, søk (name+aliases), filtrer på type
- GET/PATCH/DELETE /api/entities/:id — hent (m/edge_count), oppdater, slett
- GET /api/entities/:id/edges — relasjoner med retningsfilter

Graf:
- POST /api/graph/edges — opprett relasjon (upsert)
- DELETE /api/graph/edges/:id — slett relasjon
- GET /api/graph/search — fulltekstsøk (entiteter + transkripsjoner FTS)
- GET /api/graph/traverse/:nodeId — recursive CTE, D3.js/Vis.js-format

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:37:00 +01:00
1faef972dd Meldingsboks-migrasjon: universell diskusjonsprimitiv + entities
Migrering 0005 samler kanban-kort, kalenderhendelser, faktoider og
notater til én felles messages-tabell med view-config-tabeller.
Actors og topics erstattes av unified entities-tabell.

- 0005_meldingsboks.sql: messages utvides med title/pinned/visibility,
  kanban_card_view + calendar_event_view + message_reactions opprettes,
  entities erstatter actors+topics, gamle tabeller droppes
- seed_dev.sql: oppdatert til meldingsboks-modell + 5 test-entiteter
  med graf-relasjoner
- API-ruter: kanban/kalender/notater bruker messages + view-config
- Dokumentasjon: meldingsboks feature-spec, oppdatert arkitektur,
  kunnskapsgraf, jobbkø, konseptdokumenter og proposals

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:32:15 +01:00
7e83292abe Notater: auto-save scratchpad med debounce
- Migrering 0004: notes-tabell (nodes i kunnskapsgrafen)
- REST API: GET/PATCH notat
- PG-adapter med 500ms debounce og 10s polling
- NotesBlock: tittel + fritekst med auto-lagring og status
- Seed: notater for begge workspaces, kalenderside med 2-1 layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 03:03:41 +01:00
d924645dd3 Kalender: PG-adapter, API-ruter, månedsvisning med fargekoder
- Migrering 0003: calendars + calendar_events (nodes i kunnskapsgrafen)
- REST API: GET kalender med tidsvindu, POST/PATCH/DELETE hendelser
- PG polling-adapter med adapter-factory
- CalendarBlock: månedsrutenett, heldags vs. tidshendelser, fargevelger
- Seed: kalender for begge workspaces, kalenderside i sidekonfig

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 02:56:16 +01:00
7c5b809802 Redirect / til første workspace-side automatisk
Både workspace-switch og direkte navigering til rot-URL
lander nå på første konfigurerte side i stedet for tom oversikt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 02:36:32 +01:00
a93ffc6de5 Kanban-brett: PG-adapter, API-ruter, drag & drop UI + multi-workspace seed
- Migrering 0002: kanban_boards, kanban_columns, kanban_cards (REAL-posisjon)
- REST API: CRUD for kolonner, kort, flytt-kort
- PG polling-adapter med optimistisk UI-oppdatering
- KanbanBlock: drag & drop, redigeringsmodal, enkelt kort-input
- WorkspaceSwitcher: data-sveltekit-reload for korrekt workspace-bytte
- Seed: Foreningen Liberalistene som andre test-workspace

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 02:29:46 +01:00
9867bda949 Fiks Authentik OIDC: bruk sub-claim som bruker-ID, fjern debug-logging
Authentik sin OIDC sub-claim er en SHA256-hash, ikke PostgreSQL UUID.
@auth/sveltekit sin interne user.id er en annen UUID som ikke matcher.
Løsning: lagre profile.sub som authentik_sub i JWT-tokenet og bruk
den som session.user.id.

Ny erfaringsfil: docs/erfaringer/authentik_oidc.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 02:00:11 +01:00
3d3c99cb0d Debug: log JWT token IDs og bruk authentik_sub som user.id 2026-03-15 01:58:13 +01:00
7eb7c2f1db Midlertidig debug-logging for Authentik user ID 2026-03-15 01:56:43 +01:00
3af31f03a4 Dockerfile for SvelteKit produksjons-build
Multi-stage Node 20 Alpine build med adapter-node output.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 01:49:59 +01:00
ca27a8077b SvelteKit-app, SpacetimeDB-modul og chat med sanntid
SvelteKit (web/):
- Komplett app-skjelett med Authentik SSO (dev-bypass lokalt)
- Workspace-modell med cookie-basert switching og RLS-kontekst
- Komponerbare sider (PageGrid + BlockShell + block registry)
- Chat med adapter-mønster: PG-polling og SpacetimeDB hybrid-adapter
- Brukeridentitet fra Authentik/dev-login flyter til chat-meldinger
- API-ruter for channels, messages og health

SpacetimeDB (spacetimedb/):
- Rust WASM-modul med ChatMessage og SyncOutbox-tabeller
- send_message reducer med sync outbox for fremtidig PG-persistering
- Genererte TypeScript-bindings for klient-integrasjon

Infra:
- SpacetimeDB lagt til i docker-compose.dev.yml

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