feat(collab): samenwerking-UI + per-tab provider (increment 3c van #996) #1003

Merged
brenno merged 2 commits from collab/inc3c-app-wiring into main 2026-07-30 18:51:49 +00:00
Owner

Increment 3c van #996 — de laatste stap: de samenwerking is nu vanuit de interface bereikbaar. Bovenop 3a (diff) en 3b (controller).

Provider-bedrading. collab_session_provider.dart bezit per tab een sessie: host()/join() bouwen een WebdavCollabLogStore uit de WebDAV-bron van het tabblad, hosten of komen bij een sessie, bewaren hem op TabInfo.collabSession, en koppelen een CollabSessionController tussen de sessie en deckProvider — lokale bewerkingen stromen als ops naar buiten (via de 3a-diff), wijzigingen op afstand vloeien gemerged terug via de nieuwe DeckNotifier.applyCollabDeck (buiten undo, met revisie-bump). Per tab overschreven in app_shell's _tabScope, net als deckProvider; provider_scope_test bevestigt de registratie.

Interface. Het command palette biedt op een WebDAV-deck "Samenwerking starten" / "Deelnemen aan samenwerking", en "Samenwerking verlaten" tijdens een sessie; elke actie meldt de uitkomst in een snackbar. Alleen zichtbaar bij een WebDAV-deck (de sidecar-log moet ergens leven, P2/§5.7). De handlers zijn top-level functies zodat de shell-klasse onder haar plafond blijft. Acht nieuwe bronstrings, vertaald naar alle 31 talen via make add-l10n.

Getest & geverifieerd. make check groen (7500+ tests, dekking 87,3%); provider-logica headless getest (guards, levenscyclus, padafleiding). Een echte macOS-run (10+ min, vanuit de worktree) bevestigde dat de nieuwe per-tab-provider-override de opstart niet breekt — de override wordt bij het standaard-tabblad daadwerkelijk geconstrueerd, geen exception. (Schermafdrukken van het palette niet vastgelegd: de computer-use-toegangsdialoog werd geweigerd; de palette-zichtbaarheid is via de logica + provider-tests gedekt.)

Hiermee is de asynchrone WebDAV-samenwerking (Fase 0.5) end-to-end af en gebruiker-bereikbaar. Vervolg binnen de fase: eigenaarsoverdracht (§5.3) en herbaselijning op een niet-nul versie (§5.2). Sluit #996.

Increment 3c van #996 — de laatste stap: de samenwerking is nu vanuit de interface bereikbaar. Bovenop 3a (diff) en 3b (controller). **Provider-bedrading.** `collab_session_provider.dart` bezit per tab een sessie: `host()`/`join()` bouwen een `WebdavCollabLogStore` uit de WebDAV-bron van het tabblad, hosten of komen bij een sessie, bewaren hem op `TabInfo.collabSession`, en koppelen een `CollabSessionController` tussen de sessie en `deckProvider` — lokale bewerkingen stromen als ops naar buiten (via de 3a-diff), wijzigingen op afstand vloeien gemerged terug via de nieuwe `DeckNotifier.applyCollabDeck` (buiten undo, met revisie-bump). Per tab overschreven in `app_shell`'s `_tabScope`, net als `deckProvider`; `provider_scope_test` bevestigt de registratie. **Interface.** Het command palette biedt op een WebDAV-deck "Samenwerking starten" / "Deelnemen aan samenwerking", en "Samenwerking verlaten" tijdens een sessie; elke actie meldt de uitkomst in een snackbar. Alleen zichtbaar bij een WebDAV-deck (de sidecar-log moet ergens leven, P2/§5.7). De handlers zijn top-level functies zodat de shell-klasse onder haar plafond blijft. Acht nieuwe bronstrings, vertaald naar alle 31 talen via `make add-l10n`. **Getest & geverifieerd.** `make check` groen (7500+ tests, dekking 87,3%); provider-logica headless getest (guards, levenscyclus, padafleiding). Een echte macOS-run (10+ min, vanuit de worktree) bevestigde dat de nieuwe per-tab-provider-override de **opstart niet breekt** — de override wordt bij het standaard-tabblad daadwerkelijk geconstrueerd, geen exception. (Schermafdrukken van het palette niet vastgelegd: de computer-use-toegangsdialoog werd geweigerd; de palette-zichtbaarheid is via de logica + provider-tests gedekt.) Hiermee is de asynchrone WebDAV-samenwerking (Fase 0.5) end-to-end af en gebruiker-bereikbaar. Vervolg binnen de fase: eigenaarsoverdracht (§5.3) en herbaselijning op een niet-nul versie (§5.2). Sluit #996.
The app glue over lib/collab/ (COLLABORATION.md §5.7). A per-tab
collabSessionProvider owns a session: host()/join() build a
WebdavCollabLogStore from the tab's webdavOrigin, host or join a session,
keep it on TabInfo.collabSession, and wire a CollabSessionController
between the session and deckProvider — local edits flow out as ops,
remote changes flow back merged via the new DeckNotifier.applyCollabDeck
(outside undo, bumping the revision so editor fields re-read). Overridden
per tab in app_shell's _tabScope, like deckProvider, so a collab action
reads it from the same scope and sees the tab's own deck; the unbound
root notifier is idle.

Tested headlessly: the sidecar path derivation, the state lifecycle, and
the no-tab guards (host/join fail not-webdav, leave returns to idle);
provider_scope_test confirms the new deck-facing provider is registered
in the per-tab overrides. The start/join UI (§5.7) is the last step.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(collab): start/join/leave collaboration from the command palette (#996)
All checks were successful
scans / scans (pull_request) Successful in 3m36s
15088ce23a
The last of #996: the user-facing actions. On a deck that lives on
WebDAV, the command palette offers "Samenwerking starten" / "Deelnemen
aan samenwerking", and "Samenwerking verlaten" while a session runs; each
calls collabSessionProvider and reports the outcome in a snackbar (a
joiner with no host yet is told to start one). Shown only for a WebDAV
deck — the sidecar log needs somewhere to live (P2/§5.7).

The handlers are top-level functions, not _MainLayoutState methods, so
the shell class stays under its ceiling; app_shell's file baseline rises
by the three lines of the per-tab override. Eight new source strings,
translated into all 31 languages via make add-l10n. COLLABORATION.md §10
now records Fase 0.5 as built end to end.

With this the async WebDAV collaboration of Fase 0.5 is reachable from
the interface. Follow-ups within the phase: owner-drop handover (§5.3)
and non-zero re-baselining (§5.2).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 321bcb9989 into main 2026-07-30 18:51:49 +00:00
Sign in to join this conversation.
No description provided.