diff --git a/docs/features/universell_input.md b/docs/features/universell_input.md new file mode 100644 index 0000000..1316c21 --- /dev/null +++ b/docs/features/universell_input.md @@ -0,0 +1,165 @@ +# 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 + → 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/ + 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 + → 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 diff --git a/scripts/run-next-task.sh b/scripts/run-next-task.sh index 9696ae0..1310808 100755 --- a/scripts/run-next-task.sh +++ b/scripts/run-next-task.sh @@ -46,6 +46,7 @@ declare -A PHASE_DEPS=( [26]="25" [27]="26" [28]="27" + [29]="28" ) # --- Finn blokkerte faser --- diff --git a/tasks.md b/tasks.md index 34158df..b5e3cce 100644 --- a/tasks.md +++ b/tasks.md @@ -49,6 +49,7 @@ Fase 24 → Fase 25 (web clipper) Fase 25 → Fase 26 (epost) Fase 26 → Fase 27 (tankekart) Fase 27 → Fase 28 (manglende CLI + AI-ruting) +Fase 28 → Fase 29 (universell input) ``` Hvis en oppgave er `[?]` eller `[!]`, hoppes den over — og alle