From b3a55af6609f5800bf5dfc26e02605efbde3d5f6 Mon Sep 17 00:00:00 2001 From: vegard Date: Thu, 19 Mar 2026 16:39:49 +0000 Subject: [PATCH] Tre nye proposals: rollebasert arv, Mine ting, chat-merging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rollebasert arv: edge-roller styrer trait-synlighet per bruker (deltaker ser mikser, lytter ser bare chat) - Mine ting: oversiktspanel i Hjem, dra node inn i verktøy for å koble dem (erstatter mottak som panel) - Chat-merging: dra chat oppå chat → live flettet visning eller snapshot med AI-beriking og brukerprompt Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/proposals/chat_merging.md | 164 ++++++++++++++++++++++++++++++ docs/proposals/mine_ting.md | 113 ++++++++++++++++++++ docs/proposals/rollebasert_arv.md | 86 ++++++++++++++++ 3 files changed, 363 insertions(+) create mode 100644 docs/proposals/chat_merging.md create mode 100644 docs/proposals/mine_ting.md create mode 100644 docs/proposals/rollebasert_arv.md diff --git a/docs/proposals/chat_merging.md b/docs/proposals/chat_merging.md new file mode 100644 index 0000000..f4670e5 --- /dev/null +++ b/docs/proposals/chat_merging.md @@ -0,0 +1,164 @@ +# Proposal: Chat-merging og adapter-visninger + +## Konsept + +Dra én chat oppå en annen for å lage en flettet visning. +Originalkildene lever videre uendret. To moduser: live +abonnement eller snapshot. AI-beriking som naturlig forlengelse. + +## Motivasjon + +Informasjon er spredt over flere samtaler. En redaksjon har +en planleggingschat, en research-chat og en teknisk chat. +Når du trenger en helhetlig oversikt over hva som er besluttet +må du lese alle tre. Chat-merging gir deg det i én visning. + +## Interaksjon + +**Dra chat oppå chat (drag-and-drop):** + +``` +1. Bruker drar "Planlegging"-noden fra Mine ting +2. Slipper den på "Research"-chatten (åpent panel) +3. Dialog: "Flett samtaler?" + → [Abonner (live)] [Snapshot] [Avbryt] +4a. Abonner: flettet visning oppdateres i sanntid +4b. Snapshot: ny node med fryst, flettet innhold +``` + +**Med brukerprompt (AI-beriking):** + +``` +3. Dialog: "Flett samtaler?" + [Brukerprompt: "Oppsummer hva vi har besluttet om episodetemaet"] + → [Kjør] [Avbryt] +4. AI leser begge chatter, genererer oppsummering +5. Ny innholds-node med source_material-edges til begge chatter +``` + +## Moduser + +### Live abonnement (adapter) + +En visning som abonnerer på to eller flere kommunikasjonsnoder. +Meldinger flettes kronologisk med kanalmarkør. + +``` +┌─ Flettet: Planlegging + Research ──┐ +│ │ +│ [Planlegging] Vegard 10:03 │ +│ Vi bør ta klimatilpasning │ +│ │ +│ [Research] Trond 10:15 │ +│ Fant en god kilde om flom i Oslo │ +│ │ +│ [Planlegging] Arne 10:22 │ +│ Enig, passer med forrige episode │ +│ │ +│ [Research] Vegard 10:30 │ +│ Denne rapporten er gull: ... │ +└─────────────────────────────────────┘ +``` + +Teknisk: +- Ikke en ny node-type — det er en *visning* (query) +- Chat-panelet mottar en liste av node_ids i stedet for én +- WebSocket abonnerer på alle kilde-chattene +- Meldinger sorteres kronologisk fra alle kilder +- Kanalmarkør viser opprinnelse + +Kan lagres som bruker-preferanse (hvilke chatter er flettet) +eller som en edge-konfigurasjon. + +### Snapshot + +En fryst kopi av flettede meldinger som ny innholds-node. + +``` +snapshot_node (node_kind: 'content') + ├── source_material-edge → Chat A + ├── source_material-edge → Chat B + └── metadata: { merged_at: "2026-03-19T...", source_count: 2 } +``` + +Innholdet er ren tekst med meldingene, formatert med +avsender/tidspunkt/kanal. Kan redigeres etterpå. + +### AI-beriking + +Utvidelse av snapshot med AI-prosessering: + +``` +1. Hent meldinger fra alle kilde-chatter +2. Send til LLM med brukerens prompt +3. Opprett innholds-node med AI-output +4. source_material-edges tilbake til kildene +5. processed_by-edge til AI-preset som ble brukt +``` + +Prompter kan være: +- "Oppsummer beslutningene" +- "Lag en handlingsplan basert på diskusjonen" +- "Hva er vi uenige om?" +- "Skriv et møtereferat" +- Egendefinert fritekst + +## Ikke-destruktivt + +Originalkildene endres **aldri**. Merging er alltid: +- En visning (live) — ingen ny data +- En ny node (snapshot) — med edges tilbake +- Kildene lever videre uavhengig + +## Utvidelser + +**Mer enn to kilder:** Dra flere chatter inn — visningen +fletter alle kronologisk. + +**Filtrering i flettet visning:** Vis kun meldinger fra +én person, eller søk på tvers av alle kildene. + +**Automatisk merging via orkestrering:** "Hver fredag, +flett ukens chatter og lag et sammendrag." + +## Teknisk implementering + +### Live adapter + +Utvid ChatTrait til å akseptere `contextIds: string[]` i +tillegg til `contextId: string`. Når flere IDs er gitt: +- Abonner på alle via WebSocket +- Flett meldinger kronologisk i visningen +- Vis kanalmarkør per melding + +### Snapshot + +Ny intensjon `merge_chats`: +``` +POST /intentions/merge_chats +{ + source_ids: ["chat-a-id", "chat-b-id"], + mode: "snapshot" | "ai", + prompt?: "Oppsummer beslutningene" +} +``` + +Returnerer `{ node_id: "snapshot-id" }`. + +### Drop-target + +ChatTrait sin BlockReceiver utvides til å akseptere +kommunikasjonsnoder. Når en chat droppes på en åpen chat: +- Vis dialog med valg (abonner/snapshot/AI) +- Utfør valgt handling + +## Hva som eksisterer allerede + +- Chat-visning med meldinger fra WebSocket (✓) +- Drag-and-drop mellom paneler (✓) +- BlockReceiver i ChatTrait (✓) +- source_material-edges (✓) +- AI-prosessering via synops-ai (✓) +- Orkestrering (✓) + +Hovedsakelig utvidelse av ChatTrait + ny intensjon i maskinrommet. diff --git a/docs/proposals/mine_ting.md b/docs/proposals/mine_ting.md new file mode 100644 index 0000000..52cf09d --- /dev/null +++ b/docs/proposals/mine_ting.md @@ -0,0 +1,113 @@ +# Proposal: Oversiktspanelet — «Mine ting» + +## Konsept + +Et panel i Hjem-arbeidsflaten som viser alle noder du er +tilknyttet, gruppert etter type. Erstatter mottak-konseptet +som et verktøy i arbeidsflaten — ikke en egen side. + +## Problemstilling + +Når du åpner et chat-panel i arbeidsflaten, hvilken chat? +Paneler instansieres uten kontekst. Det mangler en bro mellom +"mine ting" og "verktøyene jeg bruker dem med". + +## Modell + +«Mine ting» er et panel som spør grafen: "vis meg alt jeg +har edges til, gruppert." + +``` +┌─ Mine ting ────────────────────────┐ +│ │ +│ Samtaler (3) │ +│ 💬 Redaksjonen nylig │ +│ 💬 Vegard & Trond i går │ +│ 💬 Sidelinja tech 3d │ +│ │ +│ Prosjekter (2) │ +│ 📋 Sidelinja │ +│ 📋 Synops utvikling │ +│ │ +│ Møter (1) │ +│ 🎙️ Neste innspilling fre │ +│ │ +│ Dokumenter (4) │ +│ 📝 Episodenotat S02E05 │ +│ 📝 Intervjuspørsmål │ +│ ... │ +└────────────────────────────────────┘ +``` + +## Interaksjon: dra node → verktøy + +Hovedinteraksjonen er drag-and-drop: + +**Dra en samtale inn i et chat-panel:** +Chat-panelet kobles til den samtalen og viser meldingene. + +**Dra et prosjekt inn i et kanban-panel:** +Kanban-panelet kobles til det prosjektet og viser oppgavene. + +**Klikk på en node:** +Åpner det mest naturlige verktøyet for den node-typen: +- Samtale → chat-panel åpnes/kobles +- Prosjekt → navigerer til samlingens arbeidsflate +- Dokument → editor-panel åpnes med dokumentet + +## Gruppering + +Noder grupperes etter `node_kind` og edge-type: + +| Gruppe | Kriterier | +|--------|-----------| +| Samtaler | `node_kind: 'communication'` + din edge | +| Prosjekter | `node_kind: 'collection'` + din edge | +| Møter | Samlinger med `scheduled`-edges i fremtiden | +| Dokumenter | `node_kind: 'content'` + din edge | +| Media | `node_kind: 'media'` + din edge | + +Sortert etter sist interaksjon (recency). + +## Kobling av panel til node + +Når et verktøy-panel kobles til en node trenger panelet en +`contextId` — IDen til noden det opererer på. I dag sendes +`collection={undefined}` for paneler i Hjem. Med Mine ting: + +``` +1. Bruker drar "Redaksjonen" fra Mine ting til chat-panelet +2. Chat-panelet mottar node_id via drop +3. Chat-panelet setter sin kontekst til den samtalen +4. Meldinger lastes og vises +``` + +Samme mekanisme fungerer for alle verktøy: +- Editor + dokument → redigér dokumentet +- Kanban + samling → vis samlingens oppgaver +- Kalender + samling → vis samlingens hendelser + +## Filtrering og søk + +- Søkefelt øverst i panelet +- Filtre: type (samtale, prosjekt, ...), rolle (eier, deltaker, ...) +- Vis/skjul grupper + +## Registrering i workspace + +Ny trait i `TRAIT_PANEL_INFO`: +``` +mine_ting: { title: 'Mine ting', icon: '📂', defaultWidth: 320, defaultHeight: 500 } +``` + +Bør være default-panel i Hjem-arbeidsflaten for nye brukere. + +## Hva som eksisterer allerede + +- Alle noder med edges til bruker (✓) +- Gruppering etter node_kind (✓) +- Drag-and-drop mellom paneler (✓) +- Recency-tracking (✓) +- BlockShell-paneler (✓) + +Primært en ny Svelte-komponent + dra-kobling-mekanisme for paneler. diff --git a/docs/proposals/rollebasert_arv.md b/docs/proposals/rollebasert_arv.md new file mode 100644 index 0000000..d4cd610 --- /dev/null +++ b/docs/proposals/rollebasert_arv.md @@ -0,0 +1,86 @@ +# Proposal: Rollebasert arv i samlinger + +## Konsept + +Når en bruker kobles til en samling (podcast, prosjekt, møterom) +med en rolle-edge, arver de tilgang til ressurser basert på rollen. +Forskjellige roller ser forskjellige traits/paneler. + +## Problemstilling + +I dag gir `member_of`-edge full tilgang til samlingen. En "lytter" +på en podcast ser det samme som en "deltaker" — mikser, opptak, +innstillinger, alt. Det er feil. Roller bør styre hva du ser. + +## Modell + +``` +Edge-typer med rolle-semantikk: + owner → full tilgang, kan endre alt + admin → full tilgang, kan ikke slette samlingen + deltaker → ser og bruker verktøy, kan ikke endre innstillinger + redaksjon → som deltaker + publiseringskontroll + lytter → ser chat og publisert innhold, ikke verktøy + gjest → midlertidig, begrenset tidstilgang +``` + +## Trait-synlighet per rolle + +Samlingens metadata utvides med en matrise: + +```json +{ + "traits": { + "chat": { "roles": ["owner", "admin", "deltaker", "redaksjon", "lytter"] }, + "mixer": { "roles": ["owner", "admin", "deltaker"] }, + "recording": { "roles": ["owner", "admin", "deltaker"] }, + "publishing": { "roles": ["owner", "admin", "redaksjon"] }, + "podcast": { "roles": ["owner", "admin", "deltaker", "redaksjon"] }, + "kanban": { "roles": ["owner", "admin", "deltaker", "redaksjon"] } + } +} +``` + +Hvis `roles` ikke er satt, defaulter til alle roller (bakoverkompatibelt). + +## Automatisk arv ved tilkobling + +Når en bruker kobles til en samling: + +1. `member_of`-edge opprettes med `metadata.role` +2. `recompute_access` oppdaterer `node_access`-matrisen +3. Frontend filtrerer synlige traits basert på rollen +4. Chat og andre kommunikasjonsnoder med `belongs_to`-edge til + samlingen arves automatisk (bruker ser dem i "Mine ting") + +## Eksempel: Podcast + +``` +Vegard --[owner]--> Sidelinja + → ser alt: mixer, opptak, publisering, chat, kanban, innstillinger + +Trond --[deltaker]--> Sidelinja + → ser: mixer, opptak, chat, kanban + → ser ikke: publisering, innstillinger + +Lise --[lytter]--> Sidelinja + → ser: chat, publiserte episoder + → ser ikke: mixer, opptak, kanban, publisering +``` + +## Implementering + +1. Legg til `metadata.role` i `member_of`-edges +2. Utvid trait-konfig med `roles`-array per trait +3. Frontend filtrerer verktøymeny og paneler basert på rolle +4. ContextHeader viser kun relevante traits +5. API-endepunkter validerer rolle ved sensitive operasjoner + +## Hva som eksisterer allerede + +- Edge-typer med metadata (✓) +- node_access-matrise (✓) +- Trait-system med konfig (✓) +- recompute_access (✓) + +Hovedsakelig frontend-filtrering + metadata-utvidelse. Liten backend-endring.