# 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.