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.
🔗 2. Wiki-Links ([[Link]]) & Hashtags
- 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.
- Text in doppelten eckigen Klammern (z.B.
- 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.
- Hashtags im Fließtext werden automatisch indiziert (
⚡ 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
- CRDT-Struktur im Client:
- Ein
Y.Docpro 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).
- Ein
- 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)
- Mathematische CRDT-Garantie: Binäre Yjs-Updates werden in
document_crdt_updatesund periodisch als Snapshot indocument_crdt_stategesichert. Auch nach einem Server-Neustart oder Offline-Phasen konvergieren alle Clients verlustfrei. - 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_blocksmaterialisiert. 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 = 1aktualisiert und via WebSocket an alle aktiven Clients gebroadcastet.