feat(collab): sessie-chat, E2EE en ondertekend (Matrix) #1071

Merged
brenno merged 1 commit from feat/matrix-chat into main 2026-08-01 11:47:13 +00:00
Owner

De laatste brok van #977: een chat-paneel tijdens een realtime sessie, zodat mede-auteurs kunnen overleggen zonder het deck te verlaten.

Wat

  • matrix_chat.dartMatrixChat + ChatMessage. Berichten op timeline-events (een gesprek is historie, dus het stapelt), verzegeld zoals de deck-inhoud én ondertekend: alle sessieleden delen de epoch-sleutel, dus zonder handtekening zou één lid een bericht kunnen vervalsen op naam van een ander, en chat is juist waar "wie zei wat" moet kloppen. Eigen berichten echoën lokaal en worden bij ontvangst overgeslagen; peers die vóór hun sleutel binnenkomen worden gebufferd en heropend in retryPending.
  • Sessie-naad: MatrixCollabLaunch.sendChat/chatMessages/onChatChanged; syncNow retryt chat elke ronde; ownUserId doorgevoerd voor de eigen echo.
  • Provider: CollabSessionState.chatMessages, sendChatMessage, en collabChatOpenProvider.
  • UI: CollabChatPanel als niet-blokkerend rechterpaneel (naast de editor — bewerken loopt door), geopend via het commandopalet; collabChatRail spreidt het in de werkruimte-rij. Eigen berichten rechts, peers links met een presence-gekleurde stip.

Toetsing

  • Chat-rondgang host→guest (ondertekend, gebufferd bij vroege aankomst) en het paneel (lege staat, versturen wist het veld, live render van een verzonden bericht).
  • make check groen: 7819 tests, dekking 87,5%, per-bestandsvloer 0 onder.
  • l10n: 6 nieuwe bronstrings × 31 talen. SOURCE_MAP bijgewerkt.

Rondt #977 volledig af: onboarding → transport → sessie → host/deel/join → apparaatverificatie → presence → chat. Alles pure Dart, EUPL-1.2 behouden, geen AGPL/Rust. Rollen-als-power-levels bewust niet gebouwd (app-autoriteit dekt het; toegelicht bij het sluiten van #977).

De laatste brok van #977: een chat-paneel tijdens een realtime sessie, zodat mede-auteurs kunnen overleggen zonder het deck te verlaten. ## Wat - **`matrix_chat.dart`** — `MatrixChat` + `ChatMessage`. Berichten op timeline-events (een gesprek is historie, dus het stapelt), verzegeld zoals de deck-inhoud én **ondertekend**: alle sessieleden delen de epoch-sleutel, dus zonder handtekening zou één lid een bericht kunnen vervalsen op naam van een ander, en chat is juist waar "wie zei wat" moet kloppen. Eigen berichten echoën lokaal en worden bij ontvangst overgeslagen; peers die vóór hun sleutel binnenkomen worden gebufferd en heropend in `retryPending`. - **Sessie-naad:** `MatrixCollabLaunch.sendChat`/`chatMessages`/`onChatChanged`; `syncNow` retryt chat elke ronde; `ownUserId` doorgevoerd voor de eigen echo. - **Provider:** `CollabSessionState.chatMessages`, `sendChatMessage`, en `collabChatOpenProvider`. - **UI:** `CollabChatPanel` als **niet-blokkerend** rechterpaneel (naast de editor — bewerken loopt door), geopend via het commandopalet; `collabChatRail` spreidt het in de werkruimte-rij. Eigen berichten rechts, peers links met een presence-gekleurde stip. ## Toetsing - Chat-rondgang host→guest (ondertekend, gebufferd bij vroege aankomst) en het paneel (lege staat, versturen wist het veld, live render van een verzonden bericht). - `make check` groen: 7819 tests, dekking 87,5%, per-bestandsvloer 0 onder. - l10n: 6 nieuwe bronstrings × 31 talen. SOURCE_MAP bijgewerkt. **Rondt #977 volledig af:** onboarding → transport → sessie → host/deel/join → apparaatverificatie → presence → chat. Alles pure Dart, EUPL-1.2 behouden, geen AGPL/Rust. Rollen-als-power-levels bewust niet gebouwd (app-autoriteit dekt het; toegelicht bij het sluiten van #977).
feat(collab): sessie-chat, E2EE en ondertekend (Matrix)
All checks were successful
scans / scans (pull_request) Successful in 3m43s
2313f029d2
De laatste brok van #977: een chat-paneel tijdens een realtime sessie, zodat
mede-auteurs kunnen overleggen zonder het deck te verlaten.

- `matrix_chat.dart`: `MatrixChat` + `ChatMessage`. Berichten rijden op
  timeline-events (een gesprek is historie, dus het stapelt), verzegeld zoals de
  deck-inhoud én **ondertekend** — alle sessieleden delen de epoch-sleutel, dus
  zonder handtekening zou één lid een bericht kunnen vervalsen op naam van een
  ander, en chat is juist waar "wie zei wat" moet kloppen. Eigen berichten echoën
  lokaal en worden bij ontvangst overgeslagen; peers die vóór hun sleutel
  binnenkomen worden gebufferd en heropend in `retryPending`.
- Sessie-naad: `MatrixCollabLaunch.sendChat`/`chatMessages`/`onChatChanged`;
  `syncNow` retryt chat elke ronde. `ownUserId` doorgevoerd voor de eigen echo.
- Provider: `CollabSessionState.chatMessages`, `sendChatMessage`, en
  `collabChatOpenProvider` (app-globale open/dicht-vlag).
- UI: `CollabChatPanel` als niet-blokkerend rechterpaneel (naast de editor,
  bewerken loopt door), geopend via het commandopalet; `collabChatRail` spreidt
  het in de werkruimte-rij. Eigen berichten rechts, peers links met een
  presence-gekleurde stip.

- Tests: chat-rondgang host→guest (ondertekend, gebufferd) en het paneel (lege
  staat, versturen, live render). `make check` groen (7819 tests, 87,5% dekking).
- l10n: 6 nieuwe bronstrings × 31 talen. SOURCE_MAP bijgewerkt.

Rondt #977 af: onboarding → transport → sessie → host/deel/join →
apparaatverificatie → presence → chat, alles pure Dart, EUPL-1.2 behouden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 141f166fcc into main 2026-08-01 11:47:13 +00:00
brenno deleted branch feat/matrix-chat 2026-08-01 11:47:14 +00:00
Sign in to join this conversation.
No description provided.