Tre nye proposals: rollebasert arv, Mine ting, chat-merging
- 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) <noreply@anthropic.com>
This commit is contained in:
parent
58d77756df
commit
b3a55af660
3 changed files with 363 additions and 0 deletions
164
docs/proposals/chat_merging.md
Normal file
164
docs/proposals/chat_merging.md
Normal file
|
|
@ -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.
|
||||||
113
docs/proposals/mine_ting.md
Normal file
113
docs/proposals/mine_ting.md
Normal file
|
|
@ -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.
|
||||||
86
docs/proposals/rollebasert_arv.md
Normal file
86
docs/proposals/rollebasert_arv.md
Normal file
|
|
@ -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.
|
||||||
Loading…
Add table
Reference in a new issue