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>
5.2 KiB
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 primitiverdocs/concepts/orkestrering.md— RSS/webhook som triggeredocs/features/nodereferanser.md— n:-lenking av alle noderdocs/retninger/interaksjonsmodell.md— drag-and-drop