Commit graph

101 commits

Author SHA1 Message Date
4001c05648 Fiks: bruk SDK sin toISOString()/toDate() for timestamps i stedet for microsSinceEpoch
microsSinceEpoch var feil propertynavn — SDK bruker __timestamp_micros_since_unix_epoch__.
Bruker nå SDK-metodene direkte som er framtidssikre.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 18:21:53 +01:00
69b1cb4221 Fiks: parse PG-timestamps korrekt (normalisér +00 → +00:00 for chrono)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 18:19:26 +01:00
b6fd6b5ef0 Fiks: bevar originale timestamps ved warmup i stedet for ctx.timestamp
load_messages satte alle meldinger til nåtidspunkt. Parser nå PG-timestamp
til SpacetimeDB Timestamp slik at created_at bevares korrekt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 18:17:27 +01:00
718f202014 dev.sh: strip \r fra .env.local-verdier (Windows line endings)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 18:11:14 +01:00
7babafc65f Storyboard-spec, canvas-primitiv og universell overføring
Tre nye/omskrevne dokumenter som definerer fritt-canvas arkitekturen:
- Canvas-primitiv: felles underlag for whiteboard og storyboard (pan, zoom, drag, viewport culling)
- Universell overføring: message_placements-tabell og blokk-til-blokk drag-and-drop
- Storyboard: full spec med episode-sekvens, LiveKit-kobling, inter-board overføring

Inkluderer også storyboard-relaterte mini-proposals (ghost cards, pinboard mode,
flow meter, emotion tags, card chaining, collaborative cursors, card heat map).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 18:10:31 +01:00
65b395082e dev.sh: inkluder --ai-gateway-url og --ai-gateway-key ved worker-start
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 18:02:32 +01:00
fa74e255c9 Fiks: SpacetimeDB reducers brukte _workspace_id som ga feil parameternavn i JSON
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 18:00:31 +01:00
02add1377e Fiks: warmup brukte feil kolonnenavn (created_at → edited_at) for revisjoner
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:50:41 +01:00
af74749bed SpacetimeDB som eneste datakilde: fjern alle PG-kall fra frontend-adapter
Utvider SpacetimeDB-modulen med metadata, edited_at og MessageRevision-tabell.
Worker skriver via reducers (set_ai_processing, ai_update_message) i stedet for
direkte PG-skriving. Frontend-adapteren leser alt fra SpacetimeDB — null fetch()-kall.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:38:44 +01:00
1e065b827d Dokumenter SpacetimeDB-loven: aldri PG-lekkasje i frontend/workers
CLAUDE.md: Ny seksjon med fire eksplisitte regler for data som frontend viser.
synkronisering.md: §9 Workers som endrer synlig data — riktig vs feil flyt.
adapter_moenster.md: §5 Anti-pattern enrichFromPg — gjentatt 3+ ganger.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:19:57 +01:00
c5bd0c0130 Fiks revisjonshistorikk: invalider cache etter AI-vask, hent alltid ferske revisjoner
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 17:08:46 +01:00
9277fc6012 Dockerfile: støtt VITE_SPACETIMEDB_URL som build-arg
Bakes inn i frontend ved build-time slik at chat bruker
SpacetimeDB-adapter i stedet for PG-polling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:13:00 +01:00
d4d43dfcd2 Fiks: AI-worker oppdaterer PG body direkte, SpacetimeDB er best-effort
Frontend bruker PG-polling i prod (VITE_SPACETIMEDB_URL ikke satt).
Meldinger finnes bare i PG, ikke i SpacetimeDB — worker feilet ved
STDB-oppdatering og fullførte aldri jobben.

Nå: STDB-oppdatering er best-effort (warn ved feil), PG body
oppdateres alltid direkte som fallback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:03:04 +01:00
2ffcf96be4 Fiks: bevar metadata ved rebuildMessages, sett edited_at ved AI-behandling
- rebuildMessages bevarer nå PG-felter (metadata, edited_at, reply_count)
  fra eksisterende meldinger i stedet for å overskrive med undefined
- Worker setter edited_at = now() ved AI-behandling slik at
  revisjonshistorikk og AI-badge vises umiddelbart

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:55:04 +01:00
c32b772293 Fiks: prompt-redigering toggle, AI-pulsering ved feil, error-status
- Rediger-knappen i prompt-seksjonen fungerer som Avbryt når editoren er åpen
- Fjernet separat Avbryt-knapp fra prompt-editor footer
- pollJob sjekker nå også 'error'-status (ikke bare completed/failed)
- Worker rydder ai_processing-flagget fra metadata ved feil

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:47:57 +01:00
f7308d21e8 AI-admin: bruk Docker Engine API via socket for gateway-restart
docker CLI finnes ikke i web-containeren. Bruker http.request mot
/var/run/docker.sock i stedet for execSync('docker restart ...').

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:33:36 +01:00
c3d81b97fe AI-admin: tving refresh ved katalog-lasting for å unngå stale cache
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 10:18:12 +01:00
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
42cf812c64 API: jobbstatus-endpoint for polling av AI-behandling
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:18:53 +01:00
89a8f99766 Docs: oppdater CLAUDE.md arbeidsflyt, ai_gateway og chat-docs
- CLAUDE.md: lagt til standard arbeidsmodus, testmiljø og browser-testing
- ai_gateway.md: PG-eier-config arkitektur, datamodell, config-generering, admin-panel
- chat.md: trådvisning, meldingskollaps, AI-behandling, konvertering

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:18:50 +01:00
88a22e131b SpacetimeDB: subscription-erfaringer, refresh med enrichFromPg, whitespace-fiks
- Dokumentert at subscriptions ikke støtter JOINs (feiler stille)
- refresh() kaller enrichFromPg() for å hente fersk metadata fra PG
- Whitespace-normalisering i autogenererte module_bindings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:18:45 +01:00
531defe986 Editor/UI: expanded bottom bar, kanban rich editor, ConvertDialog ordlyd
- Editor compact mode: send/minimer-knapper flyttes til bunnrad når utvidet
- KanbanBlock: bruker Editor-komponent for beskrivelse i stedet for textarea
- ConvertDialog: «Opprett» i stedet for «Konverter» (meldingen beholdes)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:18:37 +01:00
58646b1543 Chat: metadata i meldingsqueries, AI-badge med modellnavn, reaksjons-upsert
- Messages API returnerer metadata-felt (ai_action, ai_label, ai_model)
- AI-badge i MessageBox viser label og faktisk modellnavn
- Reaksjoner: slett eksisterende før insert (én reaksjon per bruker per melding)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:18:32 +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
85f0cd9d30 AI-promptvelger i chat: velg mellom forhåndsdefinerte AI-handlinger
- -knappen åpner nå en meny med tilgjengelige prompts (vask, sammendrag, skriv om, oversett)
- Prompts er workspace-konfigurerte via ny tabell workspace_ai_prompts
- Nytt API GET /api/ai/prompts returnerer tilgjengelige prompts for workspace
- AI-badge viser prompt-label og ikon i stedet for rå action-navn
- ai_prompts utvidet med label, icon og sort_order kolonner

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:42:30 +01:00
ba9218e594 AI-admin: legg til allowed_fails i router_settings for bedre fallback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:23:22 +01:00
c67beb6086 Fiks config-generering: skriv til prosjektrot, ikke web/
process.cwd() i SvelteKit er web/, men config.yaml skal ligge i
prosjektrotens config/litellm/. Endret til relativ sti opp én mappe.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:19:39 +01:00
a28c61605c Gitignore config/litellm/config.yaml — kan inneholde API-nøkler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:18:46 +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
b0d0202eb8 AI-admin: fiks provider-swap ved å droppe UNIQUE-constraint på prioritet
- Fjernet UNIQUE(alias_id, priority) — prioritet er kun for sortering
- Forenklet swap-endpoint til to rene UPDATE-statements
- Renummerert kjapp-providers til sekvensielle prioriteter

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:08:17 +01:00
7c81e80742 AI-admin: katalog add-form på egen rad slik at den ikke klippes
- «Legg til»-formen vises nå som egen rad under modellen med grønn kant
- Alias + nøkkel-dropdowns og bekreft-knapp har god plass
- Erstatter den sammenpressede inline-formen som ble klippet i smal kolonne

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:05:54 +01:00
2d17a632cd AI-admin: katalog lar deg velge nøkkel — direkte API eller OpenRouter
- Ny mapping fra OpenRouter-provider til LiteLLM direkte-prefiks
  (google→gemini/, anthropic→anthropic/, openai→openai/, x-ai→xai/)
- «Legg til»-knappen i katalogen viser nå to dropdowns: alias + nøkkel
- Velger du Google-nøkkel → gemini/modellnavn, OpenRouter → openrouter/google/modellnavn
- Inline picker respekterer også valgt nøkkel i provider-skjemaet

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:00:19 +01:00
8652f0969f AI-admin: opp/ned-knapper for å endre provider-prioritet per alias
- Nytt swap-endpoint (POST /api/admin/ai/providers/swap) for atomisk bytte
- Pil opp/ned ved hver provider-rad for å endre fallback-rekkefølge
- Prioritet avgjør hvilken modell LiteLLM prøver først per alias

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 06:55:55 +01:00
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
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
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
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
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