Files
MindSift/Doku/modules/workspace.md
T
sandrodach ef8cf8f022
MindSift CI & Docker Release / Build, Test in Container & Push (push) Failing after 29s
feat(workspace): implement Yjs CRDT real-time collaborative editing (resolves FLAW-01)
2026-10-26 15:18:48 +01:00

5.3 KiB

📝 Kernmodul 3: Workspace Outliner-Engine, Wiki-Links & Pure-DB Storage

Der MindSift Workspace (WorkspaceView.tsx) kombiniert ein hierarchisches Bullet-Point Notizsystem (inspiriert von Logseq) mit einem persönlichen Wiki und einem globalen To-Do Rollup Dashboard.


🌳 1. Die Logseq-Outliner-Engine

Im Gegensatz zu klassischen Fließtext-Editoren basiert der MindSift Workspace auf Blöcken (document_blocks in SQLite). Jeder Block ist ein gedanklicher Knotenpunkt mit einer flexiblen Einrückungsebene (level: 0, 1, 2, ...).

• Projekt MindSift v2.0 (level 0)
  • Architektur-Entscheidung (level 1)
    - [x] Database-First Blocks implementieren (level 2)
    - [ ] Performance Benchmark mit 10.000 Blöcken (level 2)
  • Notizen aus dem Dev-Meeting (level 1)
    > Wichtig: Keine verschachtelten SQLite Queries ausführen! (level 2)

Tastatur-Navigation & Shortcuts

  • Enter: Erstellt einen neuen Block auf derselben Hierarchieebene.
  • Tab: Rückt den aktuellen Block ein (wird Kindknoten des vorherigen Blocks).
  • Shift + Tab: Rückt den Block um eine Ebene aus (verringert die Tiefe).
  • Shift + Enter: Weicher Zeilenumbruch innerhalb desselben Blocks (z.B. für mehrzeilige Notizen oder Code).
  • Backspace (auf leerem Block): Rückt den Block aus oder löscht ihn, wenn er auf Level 0 ist.
  • / (Slash-Commands): Öffnet das Umwandlungsmenü (/todo, /h1, /h2, /h3, /code, /callout, /quote, /divider).

Zoom-In Hoisting (Fokus-Modus)

Klickt der Benutzer auf den Bullet-Dot (•) eines Blocks, blendet der Editor alle übergeordneten und benachbarten Blöcke aus und zoomt ausschließlich in diesen Ast hinein.

  • Eine dezente Breadcrumb-Leiste oben zeigt den Pfad an (z.B. Workspace / Projekte / MindSift / Architektur).
  • Ein Klick auf ein beliebiges Breadcrumb-Element zoomt sofort auf die jeweilige Ebene zurück.

Drag & Drop von Blöcken

Der Bullet-Dot dient gleichzeitig als Drag-Anfasser. Wird ein Block verschoben, erkennt die Engine automatisch alle untergeordneten Kind-Blöcke (isDescendantBlock) und verschiebt den kompletten Unterbaum an die neue Zielposition.


  1. Interne Wiki-Links:
    • Text in doppelten eckigen Klammern (z.B. [[Reiseplanung 2026]]) wird automatisch als klickbarer Link gerendert.
    • Ein Klick darauf durchsucht die Notizen des Benutzers und öffnet das Ziel-Dokument direkt im Editor.
  2. Hashtags (#tag):
    • Hashtags im Fließtext werden automatisch indiziert (doc_block_tags-Tabelle).
    • In der linken Leiste listet der Tag-Explorer alle verwendeten Schlagworte auf. Klick auf ein Tag filtert alle Dokumente und Blöcke, die dieses Tag enthalten.


⚡ 3. Yjs CRDT Real-Time Engine & Dual-Persistence

Ab MindSift v2.1 setzt der Workspace auf ein konfliktfreies Replicated Data Type (CRDT) Modell auf Basis von Yjs:

Funktionsweise

  1. CRDT-Struktur im Client:
    • Ein Y.Doc pro geöffnetem Dokument.
    • Y.Array<string> (blocks): Führt die Block-IDs in korrekter Reihenfolge. Der YATA-Algorithmus garantiert, dass simultanes Einfügen, Verschieben oder Löschen von Blöcken durch mehrere Nutzer deterministisch und konfliktfrei konvergiert.
    • Y.Map (block:<id>): Speichert Inhalt (content), Einrückung (level), Erledigungsstatus (checked) und Faltungsstatus (collapsed).
  2. Kollaborative Bearbeitung ohne Sperren:
    • Nutzer können simultan dieselbe Notiz bearbeiten.
    • Fokus- und Cursor-Positionen werden via CRDT_AWARENESS übertragen und als farbige Benutzer-Pillen direkt am jeweiligen Block visualisiert.

Dual-Persistence in SQLite

Client (Y.Doc Mutation)
        │
        ├──▶ WebSocket (CRDT_UPDATE Base64 Delta)
        │         │
        │         ▼
        │    SQLite: document_crdt_updates / document_crdt_state
        │    (Mathematisch exakte CRDT-Konvergenz)
        │
        └──▶ Periodischer Snapshot / Flush
                  │
                  ▼
             SQLite: document_blocks
             (Relationale Indizes für Global To-Dos, Tag-Explorer & FTS)
  1. Mathematische CRDT-Garantie: Binäre Yjs-Updates werden in document_crdt_updates und periodisch als Snapshot in document_crdt_state gesichert. Auch nach einem Server-Neustart oder Offline-Phasen konvergieren alle Clients verlustfrei.
  2. Relationale Query-Fähigkeit: Um schnelle SQL-Abfragen für das globale To-Do Rollup Dashboard und Hashtags zu ermöglichen, werden die Blöcke parallel in document_blocks materialisiert. Es existieren keine Markdown-Dateien auf der Festplatte.

📊 4. Globaler To-Do Rollup Dashboard

Über den Tab „Globale To-Dos" bietet der Workspace eine aggregierte Übersicht aller im gesamten Wiki verteilten Aufgaben:

  • Scannt in Echtzeit alle unvollendeten - [ ] Checkboxen über alle Ordner und Notizen hinweg.
  • Übersichtliche Gruppierung nach Ordner ➔ Dokument ➔ Aufgabe.
  • Ordner-Filter: Klick auf einen Ordner isoliert nur dessen Aufgaben für fokussiertes Arbeiten.
  • 2-Wege-Live-Sync: Wird eine Checkbox im Rollup abgehakt, wird der Block in SQLite sofort auf checked = 1 aktualisiert und via WebSocket an alle aktiven Clients gebroadcastet.