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>
This commit is contained in:
parent
45916a6f1d
commit
a7e2bd6b60
3 changed files with 167 additions and 0 deletions
165
docs/features/universell_input.md
Normal file
165
docs/features/universell_input.md
Normal file
|
|
@ -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 <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
|
||||||
|
|
@ -46,6 +46,7 @@ declare -A PHASE_DEPS=(
|
||||||
[26]="25"
|
[26]="25"
|
||||||
[27]="26"
|
[27]="26"
|
||||||
[28]="27"
|
[28]="27"
|
||||||
|
[29]="28"
|
||||||
)
|
)
|
||||||
|
|
||||||
# --- Finn blokkerte faser ---
|
# --- Finn blokkerte faser ---
|
||||||
|
|
|
||||||
1
tasks.md
1
tasks.md
|
|
@ -49,6 +49,7 @@ Fase 24 → Fase 25 (web clipper)
|
||||||
Fase 25 → Fase 26 (epost)
|
Fase 25 → Fase 26 (epost)
|
||||||
Fase 26 → Fase 27 (tankekart)
|
Fase 26 → Fase 27 (tankekart)
|
||||||
Fase 27 → Fase 28 (manglende CLI + AI-ruting)
|
Fase 27 → Fase 28 (manglende CLI + AI-ruting)
|
||||||
|
Fase 28 → Fase 29 (universell input)
|
||||||
```
|
```
|
||||||
|
|
||||||
Hvis en oppgave er `[?]` eller `[!]`, hoppes den over — og alle
|
Hvis en oppgave er `[?]` eller `[!]`, hoppes den over — og alle
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue