feat(meetings): F1 native calls — backend-neutrale interface + video-calls-module + call-paneel #1104

Merged
brenno merged 4 commits from feat/native-calls-f1 into main 2026-08-02 01:04:50 +00:00
Owner

De eerste bouwfase (F1) van natieve calls: de verenigde, backend-neutrale call-interface, gewired als een echte (standaard-uit) module met een paneel. Vervolg op de ontwerp-PR's #1095 (native-calls-ontwerp) en #1097 (XMPP-spine-besluit). F0 (ontwerp-only) is afgerond; dit is de eerste code.

Wat dit toevoegt

  • De interface (lib/meetings/): MeetingProvider/MeetingSession, MeetingParticipant + een dependency-neutrale MeetingTrack (geen native mediatype → géén media-dependency), sealed MeetingEvent, MeetingPreflight (getypeerde feiten, E2EE-status incl. unknown). Één UI rendert hieruit; Jitsi en (later) MatrixRTC passen achter hetzelfde contract.
  • De module (standaard uit): ModuleId.videoCalls + root-scoped meetingSessionProvider (een call overleeft een tabwissel) + VideoCallsModuleCard + een CallPanel in de workspace-rail (deelnemer-tegels + capability-gestuurde mic/camera/scherm/verlaten-knoppen), met een placeholder tot er een call is.
  • Fake-adapter (test-only) + tests: het contract, de module (schakelaar + reveal-gate incl. actieve call), en het paneel.
  • Companion-kanaal-ontwerp (NATIVE_CALLS.md §5.1, antwoord op een beheerdersvraag): OciDecks stuurinformatie loopt in een aparte XMPP-MUC, niet in de Jitsi-conferentiekamer — zo merken niet-OciDeck-deelnemers niets en herkennen OciDeck-gebruikers elkaar via presence.

Belangrijk

  • Nog géén echte adapter/join-flow — die komt in F3 (Jitsi over lib/xmpp/ + flutter_webrtc, ná de ketenkeuring-bouwvoorwaarden). De module is de structurele fundering; joinen kan in-app nog niet, en de kaart zegt dat eerlijk ("volgt in een volgende versie"). Geen dependency toegevoegd, geen netwerkverkeer, geen formaat-/opslagwijziging.
  • De dead-code-poort dwong terecht dat de interface mét een consument landt (de repo verbiedt de allowlist voor "nog niet ingehaakt").

Poorten

  • make check groen op de gerebasede stand (87,5% dekking; dead-code, hardcoded-text, projectiegrens, per-bestand-vloer allemaal door). l10n: 10 strings × 31 talen (taalbouwer). Ratchet-baselines +1 (app_shell/settings_dialog, zoals #1100 bij assetRights). SOURCE_MAP aangevuld voor de zes nieuwe lib-bestanden.
  • Gerebased op de actuele main; l10n-conflicten met #1099 opgelost via een union-merge (schone diff, geen dubbele sleutels, geen conflictmarkeringen).

Bewaker

Bewuste, expliciete overslag van een nieuwe bewaker-ronde: de ontwerprichting is al goedgekeurd op #1095/#1097; deze PR voegt géén afhankelijkheid, netwerkverkeer of formaat-/opslagwijziging toe, en de nieuwe module staat standaard uit met eerlijke "in ontwikkeling"-tekst — raakt dus niets uit de bewaker-triggerlijst.

🤖 Generated with Claude Code

De eerste bouwfase (F1) van natieve calls: de verenigde, backend-neutrale call-interface, gewired als een echte (standaard-uit) module met een paneel. Vervolg op de ontwerp-PR's #1095 (native-calls-ontwerp) en #1097 (XMPP-spine-besluit). F0 (ontwerp-only) is afgerond; dit is de eerste code. ## Wat dit toevoegt - **De interface** (`lib/meetings/`): `MeetingProvider`/`MeetingSession`, `MeetingParticipant` + een dependency-neutrale `MeetingTrack` (geen native mediatype → géén media-dependency), sealed `MeetingEvent`, `MeetingPreflight` (getypeerde feiten, E2EE-status incl. `unknown`). Één UI rendert hieruit; Jitsi en (later) MatrixRTC passen achter hetzelfde contract. - **De module (standaard uit):** `ModuleId.videoCalls` + root-scoped `meetingSessionProvider` (een call overleeft een tabwissel) + `VideoCallsModuleCard` + een `CallPanel` in de workspace-rail (deelnemer-tegels + capability-gestuurde mic/camera/scherm/verlaten-knoppen), met een placeholder tot er een call is. - **Fake-adapter** (test-only) + tests: het contract, de module (schakelaar + reveal-gate incl. actieve call), en het paneel. - **Companion-kanaal-ontwerp** (`NATIVE_CALLS.md` §5.1, antwoord op een beheerdersvraag): OciDecks stuurinformatie loopt in een **aparte** XMPP-MUC, niet in de Jitsi-conferentiekamer — zo merken niet-OciDeck-deelnemers niets en herkennen OciDeck-gebruikers elkaar via presence. ## Belangrijk - **Nog géén echte adapter/join-flow** — die komt in F3 (Jitsi over `lib/xmpp/` + `flutter_webrtc`, ná de ketenkeuring-bouwvoorwaarden). De module is de structurele fundering; joinen kan in-app nog niet, en de kaart zegt dat eerlijk ("volgt in een volgende versie"). **Geen dependency toegevoegd, geen netwerkverkeer, geen formaat-/opslagwijziging.** - De dead-code-poort dwong terecht dat de interface mét een consument landt (de repo verbiedt de allowlist voor "nog niet ingehaakt"). ## Poorten - `make check` **groen** op de gerebasede stand (87,5% dekking; dead-code, hardcoded-text, projectiegrens, per-bestand-vloer allemaal door). l10n: 10 strings × 31 talen (taalbouwer). Ratchet-baselines +1 (app_shell/settings_dialog, zoals #1100 bij assetRights). SOURCE_MAP aangevuld voor de zes nieuwe lib-bestanden. - Gerebased op de actuele main; l10n-conflicten met #1099 opgelost via een union-merge (schone diff, geen dubbele sleutels, geen conflictmarkeringen). ## Bewaker Bewuste, **expliciete overslag** van een nieuwe bewaker-ronde: de ontwerprichting is al goedgekeurd op #1095/#1097; deze PR voegt géén afhankelijkheid, netwerkverkeer of formaat-/opslagwijziging toe, en de nieuwe module staat standaard uit met eerlijke "in ontwikkeling"-tekst — raakt dus niets uit de bewaker-triggerlijst. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
De drie F0-sub-keuzes van de beheerder in NATIVE_CALLS.md gemarkeerd:
- GO om te bouwen (header/gated-noot).
- Open vraag 1 BESLIST: lib/xmpp/ from-scratch, geen fork (eigen code boven
  afhankelijkheden).
- Open vraag 2 BESLIST: media-E2EE uniform over alle platformen tot de upstream-fix
  (flutter-webrtc#2135) gemerged + uitgebracht + op Apple-hardware geverifieerd is;
  geen per-platform-split.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Het fundament van de verenigde call-interface (NATIVE_CALLS.md §1/§3), pure Dart,
géén flutter_webrtc: de UI-facing oppervlakte is nu vastgelegd en getoetst, zodat
een echte Jitsi- en (later) MatrixRTC-adapter er achter passen zonder dat de UI de
backend kent.

- lib/meetings/meeting_participant.dart — MeetingParticipant + dependency-neutraal
  MeetingTrack (geen native mediatype) + MeetingCapabilities + MeetingRole.
- lib/meetings/meeting_event.dart — sealed MeetingEvent (join/left/updated,
  connection, capabilities, chat, recording, error) + MeetingConnectionState.
- lib/meetings/meeting_provider.dart — MeetingProvider/MeetingSession-interfaces +
  MeetingPreflight (getypeerde feiten, nooit een bool; E2EE-status incl. unknown) +
  MeetingLinkMatch/MeetingJoinRequest + support/failure-enums.
- test/meetings/fakes/fake_meeting_provider.dart — scriptbare test-double (in test/,
  niet in lib/).
- test/meetings/meeting_contract_test.dart — 9 tests: herkenning, preflight-feiten,
  roster/events, mic/cam/scherm, rol/capabilities/verbinding/opname/fout, leave, en
  een exhaustieve switch over de sealed events.

Poorten groen: dart format, analyze (--fatal-infos schoon), 9/9 tests, conventies
(lagen/groottes/print/catch schoon). flutter_webrtc landt pas na de bouwvoorwaarden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Maakt de F1 meeting-interface een echte, bereikbare functie — de dead-code-poort
blokkeert terecht een interface zonder consument. Standaard uit; nog géén in-app
join-flow (dat komt met de eerste adapter in F3).

- lib/state/meeting_session_provider.dart — de Videovergaderingen-module (standaard
  uit, sleutel videoCallsModuleEnabled) + de root-scoped actieve MeetingSession
  (meetingSessionProvider, app-globaal zodat een call een tabwissel overleeft).
  videoCallsRevealProvider = aan OF er loopt een call.
- lib/widgets/panels/call_panel.dart — CallPanel + callRail: de workspace-call-rail
  die de actieve sessie backend-agnostisch rendert (deelnemer-tegels + capability-
  gestuurde mic/camera/scherm/verlaten-knoppen), placeholder tot er een call is.
- lib/widgets/dialogs/settings/video_calls_module_card.dart — de Uitbreidingen-kaart;
  de tekst zegt eerlijk dat joinen met de adapter in een volgende stap komt.
- Bedrading: ModuleId.videoCalls in het register + de settings-switch-case + de
  callRail-spread in app_shell. l10n: 10 strings × 31 talen.
- Tests: video_calls_module_test (schakelaar, register, reveal-gate incl. actieve
  call), meetings/call_panel_test (placeholder, tegels, knoppen, verlaten,
  dominant/scherm).
- Poort-huishouding: +1 file-/class-size-baselines (app_shell/settings_dialog, zoals
  #1100 bij assetRights) en SOURCE_MAP-entries voor de zes nieuwe lib-bestanden.

make check groen (87,5% dekking; dead-code, hardcoded-text, projectiegrens en de
per-bestand-vloer allemaal door).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(design): companion-kanaal — OciDeck-stuur in een aparte MUC (§5.1)
All checks were successful
scans / scans (pull_request) Successful in 3m40s
0afa0a95c6
Antwoord op een ontwerpvraag van de beheerder: OciDecks data-plane (presenter-sync,
ops, presence) loopt in een APARTE companion-XMPP-kamer, niet in de Jitsi-
conferentiekamer zelf. Zo merken niet-OciDeck-deelnemers niets (zij zien nooit
nl.ocideck.*-verkeer), herkennen OciDeck-gebruikers elkaar via presence in het
companion-kanaal, en blijven de twee stromen gescheiden — het twee-naden-model als
twee MUC's. Backend-exclusiviteit blijft gelden; in Matrix-mode is het analogon een
aparte Matrix-kamer. Pairing via deterministische afleiding uit de gedeelde
conferentie-URL is het open F3-detail.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit a9cd4781c1 into main 2026-08-02 01:04:50 +00:00
brenno deleted branch feat/native-calls-f1 2026-08-02 01:04:51 +00:00
Sign in to join this conversation.
No description provided.