Commit graph

681 commits

Author SHA1 Message Date
d597b45cb6 Caddy: tillat iframe-embedding mellom *.synops.no for alle tjenester
Fjern X-Frame-Options fra Forgejo og Authentik, erstatt med
Content-Security-Policy: frame-ancestors 'self' *.synops.no.
Web Viewer kan nå vise Git og Auth inne i arbeidsflaten.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 04:22:38 +00:00
d8472b0e0b Web Viewer: fjern sandbox, rydd bokmerker
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 04:20:03 +00:00
599afafc21 Web Viewer: admin-bokmerker kun på adm.synops.no
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 04:14:42 +00:00
f37cc5bb27 Web Viewer: nettleser-panel i arbeidsflaten
Vis en URL i en iframe inne i en BlockShell. URL-bar med
navigasjon (tilbake/frem/oppdater), bokmerker for vanlige
sider (admin, auth, git, synops.no). Sandbox for sikkerhet.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 04:08:40 +00:00
2d44a8d1af Fix: lukk i fullskjerm flytter DOM-element tilbake fra body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:54:29 +00:00
2fbb658c61 Fix: lukk i fullskjerm resetter isFullscreen først
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:51:43 +00:00
3203074116 Toolbar: konsistent formspråk − + × ○ #
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:49:05 +00:00
56c8cff12b Ramme-knapper: − (minimer), + (maksimer), × (lukk)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:47:05 +00:00
bea4a4b072 Fjern visuelle resize-indikatorer — cursor er nok
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:43:31 +00:00
681a614888 Node Explorer: flytt clear-knapp unna comboboks-pilen
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:37:20 +00:00
e96368cb7c Fix: Space/piltaster i inputs, reaktiv node-visning, edit-tilgang
Canvas: keyboard-events ignoreres når bruker skriver i input/textarea.
Space fungerer nå i søkefelt og tekstredigering.

Node Explorer: selectedNode er nå reaktiv mot nodeStore — endringer
reflekteres umiddelbart etter lagring uten å velge noden på nytt.
✏️-knapp vises bare for noder brukeren eier.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:33:57 +00:00
7974c9d53a Node Explorer: clear-knapper, inline redigering av noder
✕ på søk/filter for rask reset. ✏️ for inline redigering av
tittel, innhold og metadata (JSON). Lagre via updateNode API.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:22:05 +00:00
3cc17c5784 Fix: Canvas stjeler ikke klikk fra panel-innhold lenger
Canvas handlePointerDown ignorerer klikk inne i .blockshell-content.
Inputs, knapper, selects og lister i paneler fungerer normalt.
Bare headeren starter Canvas-drag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:14:56 +00:00
8675ba0b5d Zoom-reset ankret til viewport-sentrum
Reset til 100% justerer kameraposisjon slik at det du ser i
midten forblir i midten. Gjelder dobbeltklikk og toolbar-knapp.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:08:51 +00:00
c1a69feede Fix: Ctrl+scroll i panel resizer rammen, ikke bare innholdet
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:02:07 +00:00
e94c22fcb8 Navigasjon: scroll=pan, Ctrl+scroll=zoom, piltaster, viewport-plassering
Canvas: scroll=pan, Ctrl+scroll=zoom, piltaster, dblclick=100%.
BlockShell: Ctrl+scroll zoomer panel-innhold.
Nye paneler plasseres i viewport-sentrum, ikke utenfor bildet.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:58:25 +00:00
0d9837a917 Klikk på zoom-prosent tilbakestiller til 100%
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:46:46 +00:00
bbbaa1e4ca Utviklingsfilosofi i CLAUDE.md — leses av alle sesjoner
Seks prinsipper inline i CLAUDE.md: forstå hvorfor, ikke hardkod
det dynamiske, én fiks ikke workarounds, preferer fjerning,
én mekanisme per problem, gjør det riktig én gang.
Utdypning i docs/retninger/kvalitetsprinsipper.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:38:36 +00:00
8681c55bc8 Kvalitetsprinsipper: gjør det riktig, én gang
Retningslinje for kode og konfigurasjon. Ti prinsipper:
ikke hardkod det dynamiske, forstå hvorfor noe fungerer,
én mekanisme per problem, konfigurer på lavest nivå,
wildcard over spesifikk, sjekkliste for nye domener,
test med andre øyne, dokumenter beslutninger, preferer
fjerning over tillegg, én fiks ikke to workarounds.

Motivert av ORIGIN-fellen ved multi-subdomain.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:34:50 +00:00
dfcec6b3b0 Kontekst-velger: Hjem og Administrasjon som separate lenker
Dropdown viser begge arbeidsflater med absolutte URLer
(ws.synops.no og adm.synops.no). Navigasjon mellom subdomener
fungerer uten å miste sesjon.

Erfaringsnotat: multi-subdomain med SvelteKit — ORIGIN-fellen,
cookie-domene, CSRF, OIDC redirect URIs, sjekkliste for nye
subdomener.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:30:41 +00:00
f239ada4f6 Fix: fjern ORIGIN for multi-subdomain host-deteksjon
ORIGIN=https://ws.synops.no tvang SvelteKit til å sette url.hostname
til ws.synops.no for ALLE requests. Fjernet ORIGIN — AUTH_TRUST_HOST=true
lar SvelteKit lese hostname fra Host-headeren, som gir korrekt
adm.synops.no-deteksjon.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:24:52 +00:00
8981fc3ea5 Fix: sjekk hostname direkte i layout.server.ts for isAdminHost
event.locals.isAdminHost fra hooks ble ikke pålitelig overført.
Sjekker event.url.hostname direkte i stedet.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:20:48 +00:00
8885a13d9b adm.synops.no viser admin-arbeidsflate
- Header viser "Administrasjon" i stedet for "Hjem" på adm.synops.no
- Tom-tilstand foreslår admin-verktøy (Nodeutforsker, Forbruk, AI)
- homeLabel prop i ContextHeader for konfigurerbar tittel
- isAdminHost fra layout server → +page.svelte

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:18:19 +00:00
b8c38a901e Cookie-domene .synops.no for delt sesjon mellom ws og adm
Session-cookie settes på .synops.no slik at login på ws.synops.no
også gjelder for adm.synops.no. Berettiget nå med to subdomener
som trenger samme sesjon. CSRF-token forblir host-bound (__Host-).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:07:33 +00:00
da04d42df2 Deaktiver SvelteKit CSRF origin-sjekk for multi-subdomain
ORIGIN er hardkodet til ws.synops.no, men adm.synops.no trenger
også POST (auth callback). CSRF ivaretatt av OIDC PKCE+state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:05:35 +00:00
c2ddd5a933 Node Explorer trait + adm.synops.no viser arbeidsflaten
Ny trait: NodeExplorerTrait — søk og utforsk noder med edges.
Split-visning: nodeliste til venstre, detaljer til høyre.
Filtrer på node_kind, søk i tittel/innhold/ID.
Klikk edges for å navigere i grafen.

adm.synops.no setter isAdminHost flag via hooks/layout.
Registrert i TRAIT_PANEL_INFO som 'node_explorer'.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:03:42 +00:00
be7f7ed9ec adm.synops.no: Caddy + hooks + Authentik redirect URI
Nytt subdomain for admin. Caddy ruter til SvelteKit.
Hooks redirecter adm.synops.no/ til /admin.
Authentik OIDC redirect URI lagt til.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 01:59:10 +00:00
19d7fb3980 Spec: admin som arbeidsflate med traits, adm.synops.no
Admin er ikke et separat system — det er en arbeidsflate med
admin-traits. Samme canvas, samme BlockShell, samme SvelteKit.
adm.synops.no som eget domene med admin-rolle-krav.

13 admin-traits: node explorer, oppgavetavle, jobbkø, API-nøkler,
brukeradmin, AI-ruting, serverhelse, forbruk, logger, systemkonfig,
webhooks, podcast-import, podcaststatistikk.

Noen traits delt mellom admin og brukere med ulik tilgang.
Eksisterende /admin/*-sider migreres til traits.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 01:55:19 +00:00
494a6b5f18 Oppgave-noder: proposal/assignment/task node_kind med validering
Tre nye node-typer for oppgavestyring:
- proposal: status (draft/discussed/approved/rejected/parked)
- assignment: status (open/planning/active/paused/done/blocked) + priority
- task: status (open/active/done/failed/skipped) + priority

Validering i create_node og update_node. Ingen ny tabell —
bruker eksisterende nodes-tabell med metadata.
Ref: docs/infra/oppgaver.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 01:37:32 +00:00
68d8fff2dd Spec: brukerklasser og AI-budsjettering
Konfigurerbare brukerklasser (Basis, Proff(ish), Superduper ultra
premium, Admin) med token-budsjett per dag, modellnivå-tilgang og
feature-gates. Budsjettsjekk før hvert LLM-kall. Admin-forbruk
vises med kostnadsestimat. Automatiske triggere teller mot
brukerens budsjett. Klasser og brukere som noder i grafen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 01:21:44 +00:00
9bc8624592 Task fullført: 061-admin-ai-routing.md 2026-03-19 23:24:49 +00:00
b4ede32713 Admin AI-ruting: fire nivåer med test-prompt og kostnadsestimat
- Ny «Nivåer»-fane i /admin/ai med synops/low, medium, high, extreme
- Per-nivå: fallback-kjede, provider-administrasjon, kostnadsestimat
- Test-knapp sender prompt gjennom LiteLLM og viser respons, latens, tokens, kostnad
- Backend: POST /admin/ai/test_prompt + GET /admin/ai/tier_costs
- Migration 033: oppretter de fire synops/* aliasene med providers
2026-03-19 23:24:23 +00:00
6e753a73d4 Task runner: verifiser kodeendring før markering som ferdig
Sjekker at det faktisk ble committet kodeendringer (utenom tasks/)
før oppgaven markeres som fullført. Oppgaver uten kodeendring
flyttes tilbake til køen. Forhindrer falske "Task fullført".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 23:14:38 +00:00
a2510d1b81 Ærlig audit: 37 oppgaver tilbake i kø (ikke faktisk implementert)
Task-runneren markerte oppgaver som ferdige uten å implementere dem.
Claude Code-sesjonene avsluttet uten kode, men scriptet tolket det
som suksess. 18 oppgaver beholdt som ekte fullført (verifisert med
kodeendringer). 37 flyttes tilbake for reell implementering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 23:14:02 +00:00
038e095be1 Task fullført: 600-valgomat-roast.md 2026-03-19 22:45:55 +00:00
0de3245b48 Task fullført: 600-social-posting.md 2026-03-19 22:38:13 +00:00
446d524849 Task fullført: 600-live-audience-qa.md 2026-03-19 22:31:19 +00:00
91bc18e5c5 Task fullført: 600-kildevern-modus.md 2026-03-19 22:25:00 +00:00
544856eebe Task fullført: 600-guest-prep-simulator.md 2026-03-19 22:21:15 +00:00
16755f87d8 Task fullført: 600-ghost-host-tts.md 2026-03-19 22:14:20 +00:00
4304c09597 Task fullført: 600-flow-meter.md 2026-03-19 22:09:32 +00:00
4b8ce53777 Flow Meter: varighetsindikator for storyboard
Ny FlowMeter-komponent som viser episodeprogresjon som en
fargekodet linje (rød→gul→grønn) med pulsering nær mål.
StoryboardTrait viser Flow Meter øverst og kort gruppert
etter status (Klar, Tatt opp, Droppet).

Ref: docs/proposals/flow_meter.md
2026-03-19 22:09:20 +00:00
68a00638f2 Task fullført: 600-emotion-tags.md 2026-03-19 22:05:01 +00:00
813584783c Task fullført: 600-debate-club.md 2026-03-19 22:01:53 +00:00
2a1efadb03 Task fullført: 600-contradiction-detector.md 2026-03-19 21:58:06 +00:00
e9d404ca67 Task fullført: 600-card-heat-map.md 2026-03-19 21:54:08 +00:00
3973f5c4dd Task fullført: 600-card-chaining.md 2026-03-19 21:50:38 +00:00
c247f0bb88 Task fullført: 600-avisvisning.md 2026-03-19 21:47:29 +00:00
b1504dbb23 Task fullført: 600-auto-highlight-reel.md 2026-03-19 21:41:07 +00:00
eb2628c6a1 Auto Highlight Reel: AI-kuratert klipp-pakke fra podcast-transkripsjon
Ny feature: highlight_extract-jobb som analyserer fullstendig
transkripsjon etter innspilling og finner 5-10 klippverdige øyeblikk
(humor, emosjon, sterke meninger, punchlines, narrative høydepunkter).

Komponenter:
- synops-highlight CLI: henter segmenter, kaller AI, oppretter klipp-noder
- maskinrommet/highlight.rs: jobbdispatcher med modellrouting
- Registrert i jobbkø-dispatcher som "highlight_extract"

Hvert klipp blir en content-node med metadata (tidsstempler, score,
foreslått teksting, thumbnail-sitat, hashtags) og derived_from-edge
til episoden. Bruker synops/high-modell via AI Gateway.

Ref: docs/proposals/auto_highlight_reel.md
2026-03-19 21:40:50 +00:00