Files
MindSift/Doku/modules/workspace.md
T
sandrodachandClaude Opus 5.5 1ea0c78b41
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 50s
feat(notes): operation log, block leases and sync API for collaborative editing
Phase 1 of the collaboration plan (server side):
- internal/collab: block tree with parent IDs and fractional order keys,
  operations with conflict rules (version check, block leases, conflict
  copies instead of lost text, restore on late edits, cycle checks),
  in-memory leases/sessions and long-poll notifier.
- Storage: per-note lock + transaction, append-only effect log (doc_ops),
  idempotent results per opId (doc_op_results), snapshot, log paging,
  central DocRole. Old flat block data is converted to the tree.
- The existing whole-document save (PUT/PATCH) runs as an adapter through
  the same engine, so the current editor keeps working and writes to the log.
- API: GET /docs/{id}/snapshot, POST /docs/{id}/sync, GET /docs/{id}/changes
  (long poll), POST /docs/{id}/leave; DOC_SEQ poke for WebSocket/SSE rooms.
- Backend accepts editor (write) shares for notes and folders; the forced
  read-only migration is gone. The share dialog still offers read only.
- Tests: conflict matrix, order keys, leases, storage adapter round trip,
  idempotency, API protocol incl. long poll, and a randomized simulation
  (4 clients, lost/duplicated requests and responses, offline phases,
  lease expiry) checking convergence, no lost text and exactly-once results.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 11:47:56 +01:00

3.8 KiB
Raw Blame History

Modul: Workspace (Outliner-Notizen)

Code: WorkspaceView.tsx (Explorer, Tags, To-Do-Rollup), DocumentEditor.tsx, OutlinerTree.tsx, OutlinerBlock.tsx, CodeBlockItem.tsx, LinkModal.tsx; Backend: Dokument-, Ordner- und Tag-Handler, Store.PatchDocumentBlocks.

Datenhaltung

  • Eine Notiz ist ein Datensatz in documents plus ein Baum von Blöcken in blocks (parent_id, Sortierschlüssel order_key). Jede Änderung läuft über internal/collab und wird im Log doc_ops festgehalten. Ebene und Position für die Oberfläche berechnet der Server beim Lesen. Alles liegt in SQLite; es gibt keine Dateien auf der Platte.
  • Bei jeder Änderung wird documents.markdown_cache neu erzeugt; block_tags wird aus #Hashtags der Blöcke neu aufgebaut.
  • Der Export als .md erfolgt im Browser (Button im Editor, Blob-Download).
  • Blocktypen: Überschriften h1–h3, paragraph/text, bullet, todo, code, callout, divider, table, progress.

Editor

  • Outliner: Enter neuer Block, Tab/Shift+Tab ein-/ausrücken, Shift+Enter weicher Umbruch, Blöcke ein-/ausklappen.
  • Zoom (Hoisting): Klick auf den Bullet fokussiert den Ast; die Breadcrumb-Leiste führt zurück.
  • Drag & Drop verschiebt Blöcke samt Unterästen; auf einen anderen Block gezogen, wird der Block zum Unterpunkt.
  • Slash-Befehle: /todo, /link, /h1, /h2, /h3, /code, /callout, /divider (Liste in OutlinerBlock.tsx).
  • Links: [[Notiztitel]], Markdown-Links [Titel](url) und reine URLs werden als Token dargestellt; LinkModal hilft beim Verknüpfen von Notizen.
  • Einfügen: Mehrzeiliger Text wird anhand von Markdown-Präfixen und Einrückung in Blöcke zerlegt; Überschriften gruppieren darunterliegenden Text und Code.
  • Speichern: Der Editor speichert 800 ms nach der letzten Eingabe das gesamte Dokument (PUT /documents/{id}). Der schlanke Block-Endpunkt PATCH /documents/{id}/blocks wird derzeit vom To-Do-Rollup beim Abhaken genutzt.

Explorer, Tags, To-Dos

  • Ordnerbaum mit Favoriten (doc_pins), Verschieben per Drag & Drop (/documents/{id}/move, /folders/move).
  • Tags: Alle #Hashtags werden aggregiert (/workspace/tags). Eine Tag-Seite zeigt alle Fundstellen gruppiert nach Notiz und kann eine eigene Freitext-Notiz tragen (tag_pages).
  • To-Do-Rollup: Die Ansicht „To-Dos“ sammelt alle todo-Blöcke aller Notizen, filterbar nach Ordner. Abhaken im Rollup ändert den Block in der Notiz.
  • Enhanced Tasks: Ein todo-Block lässt sich als verknüpfte Aufgabe führen (/documents/{id}/blocks/{blockId}/enhanced-task); Erledigt-Status bleibt zwischen Notiz und Aufgabenansicht synchron.

Freigabe

  • Einzelne Notizen und ganze geteilte Ordner lassen sich an Benutzer oder Gruppen geben. Empfänger haben nur Leserechte; nur der Eigentümer schreibt (sharing-and-permissions.md, FLAW-17).
  • Empfänger ordnen geteilte Notizen und Ordner in ihrem eigenen Baum ein (doc_user_folders, workspace_folder_mounts), ohne dass der Eigentümer etwas davon merkt.
  • Änderungen erreichen offene Fenster über DOC_BLOCKS_PATCHED/DOC_UPDATED (websocket.md).

Grenzen

  • Keine gleichzeitige Mehrbenutzerbearbeitung, keine Cursor-Anzeige, keine Versionshistorie.
  • Keine Virtualisierung langer Dokumente; sehr große Notizen können auf Mobilgeräten träge werden (nicht gemessen).
  • Suche (/search) erfasst nur Titel und Inhalt eigener Notizen (FLAW-18).