feat(frontend): Zeilen-Diff und Adressen fuer Server-Dokumente (live.js)

Die entscheidbare Haelfte des Live-Editing-Clients (D76), headless und
geprueft: ?live=-Adressen normalisieren, Zeilen-Diff berechnen und anwenden,
die Cursor-Zeile durch fremde Aenderungen mitfuehren, und die Regel, wann eine
Feed-Antwort ueberhaupt angewendet werden darf.

Zerlegen und Hashen liegen hier und nicht verstreut in app.js: Beide Seiten
muessen Text gleich in Zeilen zerlegen, sonst zeigen die Indizes auseinander.
Das Diff-Modell ist dasselbe wie im Backend (de.werkbaum.diff.LineDiff).

Die Cursor-Rechnung ist der Teil, ohne den "kein Neuladen" nichts wert waere:
Ohne sie spraenge die Schreibmarke bei jeder fremden Aenderung weiter oben im
Dokument.

518 Tests (31 neu). Gegenprobe: Feed-Basis nicht geprueft, Zeile im Eingriff
wie darunter behandelt, Protokoll nicht geprueft -> es faellt jeweils genau
die danach benannte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-26 17:32:59 +02:00
co-authored by Claude Opus 5
parent bc8850a518
commit 5881be1a2c
3 changed files with 390 additions and 0 deletions
+2
View File
@@ -77,6 +77,8 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der
`cheapPathOn` lebt als UI-State in `app.js`. Tests: `tests/*.test.js`.
- **Was entscheidbar ist, gehört in ein eigenes Modul** — auch bei Features, die
wie reine UI aussehen: `remote.js` (Pad-URLs normalisieren, D31),
`live.js` (Server-Dokumente: Adressen, Zeilen-Diff, Cursor-Rechnung, wann eine
Feed-Antwort angewendet werden darf — D76),
`warnings.js` (Warnung → Text), `snapshots.js` (frühere Stände: wann entsteht
ein Stand, was fliegt bei Platzmangel raus, wie sieht der Speicherinhalt aus).
Dort steht **was gilt**, in `app.js` bleibt **woher die Werte kommen und wohin