synops/docs/features/universell_input.md
vegard a7e2bd6b60 Legg til fase 29: universell input — alle modaliteter blir noder
12 oppgaver: skjermklipp, RSS/feed-abonnement, webhook (universell
ekstern input med templates), video-opptak, geolokasjon, håndskrift/
tegning, kalender-import (ICS + CalDAV).

Feature-spec: docs/features/universell_input.md
Prinsipp: modaliteten er transport, noden er det som lever videre.
Alt fra screenshot til GitHub-webhook ender som noder i grafen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 17:48:40 +00:00

165 lines
5.2 KiB
Markdown

# Feature: Universell input — alle modaliteter blir noder
## Prinsipp
Alt som kommer inn i Synops ender som en node. Modaliteten er
transport — tekst, tale, bilde, URL, epost, webhook, RSS, video,
lokasjon, tegning, kalender. Noden er det som lever videre.
## Modaliteter
### Allerede implementert
| Modalitet | Input | Node-type | Prosessering |
|-----------|-------|-----------|-------------|
| Tekst | Tastatur → editor/chat | content | — |
| Tale | Mikrofon → Whisper | content + media | STT → tekst i content |
| Bilde | Kamera/fil → CAS | media | Valgfri AI-beskrivelse |
| Fil | Drag-and-drop/upload | media | MIME-deteksjon |
| URL | Lim inn → synops-clip | content | Readability-parsing |
| Epost | synops-mail | content | Avsender-verifisering |
| Drag-and-drop | Interaksjonsmodell | edge / ny node | Kontekstavhengig |
### Nye modaliteter
#### Skjermklipp
Paste screenshot fra clipboard. Lavterskel visuell input.
```
Ctrl+V (bilde i clipboard)
→ Frontend detekterer ClipboardEvent med image
→ Upload til CAS → media-node
→ Valgfri: synops-ai "beskriv dette bildet" → description i metadata
→ Inline i chat/editor som bilde med bildetekst
```
Bruk: bug-rapportering, visuell referanse, hurtig deling.
#### RSS/Feed-abonnement
Automatisk innhenting fra eksterne kilder.
```
synops-feed --url https://nrk.no/nyheter/rss --collection-id <uuid>
→ Poller hvert 30. minutt
→ Nye entries → content-noder med source_url
→ AI-oppsummering valgfritt
→ Paywall-deteksjon gjenbrukt fra synops-clip
```
Perfekt som orkestrering: "Overvåk denne kilden og varsle
redaksjonen om relevante saker."
#### Webhook (universell ekstern input)
Alt som ikke er menneske kan prate med Synops.
```
POST /api/webhook/<token>
Content-Type: application/json
{ "title": "Build passed", "status": "success", ... }
→ Vaktmesteren validerer token
→ Oppretter content-node med payload i metadata
→ belongs_to-edge til målsamling
```
Webhook-templates for kjente tjenester:
- **GitHub:** commits, issues, PR-er → noder med riktig tittel/innhold
- **Slack:** meldinger → innholdsnoder (bridge)
- **CI/CD:** build-status → noder med status-edge
Hvert webhook har et unikt token, en mål-samling, og en
valgfri template for JSON→node-mapping.
#### Video
Opptak direkte i nettleseren.
```
[● Opptak] → MediaRecorder API → webcam eller skjerm
→ Upload til CAS → media-node
→ Valgfri: synops-video for transcode + thumbnail
```
Bruk: korte videomeldinger, skjermopptak for feedback,
møte-opptak uten LiveKit.
#### Geolokasjon
"Jeg er her" som input.
```
[📍 Del posisjon] → Geolocation API
→ Node med metadata.location: { lat, lon }
→ Kart-visning i node-detaljer (OpenStreetMap)
→ Valgfri: reverse geocoding for adresse
```
Bruk: feltarbeid, lokasjonstagging av innhold,
"dette skjedde her".
#### Håndskrift/tegning
Rask skisse som input — ikke whiteboard, men post-it.
```
[✏️ Tegn] → Enkel canvas-flate
→ Eksporter som PNG → CAS → media-node
→ Inline i chat/editor
```
Bruk: hurtig-skisse, diagram på mobil, visuell idé.
#### Kalender-import
Synkroniser med eksisterende kalendere.
```
synops-calendar --file møter.ics --collection-id <uuid>
→ Parser ICS → noder med scheduled-edges
→ Duplikatdeteksjon via UID
→ Oppdatering ved re-import
```
CalDAV-abonnement for kontinuerlig synk med Google/Outlook.
## Universell input-komponent
Alle modaliteter er tilgjengelige fra samme input-komponent:
```
┌──────────────────────────────────────────┐
│ Skriv noe... [↑] │
│ │
│ 🎤 📷 📎 🔗 📍 ✏️ 📹 │
│ tale bilde fil url pos tegn video │
└──────────────────────────────────────────┘
```
Ikonrad under input-feltet. Klikk → aktiver modalitet.
Resultat havner alltid som node — inline i chat, eller
som frittstående i samlingen.
## Alt er noder
Uansett modalitet:
```
Tekst → content-node (content-felt)
Tale → media-node + content-node (etter STT)
Bilde → media-node (metadata: cas_hash, mime)
Skjermklipp → media-node (metadata: source=screenshot)
Video → media-node (metadata: cas_hash, duration)
URL → content-node (metadata: source_url)
RSS-entry → content-node (metadata: source_url, feed_url)
Webhook → content-node (metadata: webhook_id, payload)
Lokasjon → content-node (metadata: location)
Tegning → media-node (metadata: source=drawing)
Kalender → content-node + scheduled-edge
Epost → content-node (metadata: from, subject)
```
Edges kobler dem til kontekst (samling, samtale, person).
Visninger (kanban, kalender, graf) viser dem riktig basert
på edges og metadata — ikke basert på modalitet.
## Bygger på
- `docs/retninger/universell_input.md` — tre primitiver
- `docs/concepts/orkestrering.md` — RSS/webhook som triggere
- `docs/features/nodereferanser.md` — n:-lenking av alle noder
- `docs/retninger/interaksjonsmodell.md` — drag-and-drop