- New chatd-rs backend/matrix module: m.login.password auth, /sync-based
multi-room connect loop, and full E2EE via matrix-sdk-crypto (device key
upload, Megolm session establishment, encrypt/decrypt) - verified live
against real homeservers with two independent devices exchanging an
encrypted message neither one decrypted itself.
- Reactions, edits, redactions, replies, and media upload/download, mapped
onto the existing Reaction/Embed/ReplyPreview model.
- Frontend wiring: MatrixConnectForm.qml, AccountsPanel/ChatView hookup,
and the real addMatrixAccount RPC handler (replacing the stub).
- Fix messages doubling in the UI: the Matrix backend never called
Runtime::set_own_identity, so every message - including the account's
own - was stored with is_own=false, defeating the frontend's optimistic-
send reconciliation.
- Fix accounts getting stuck showing "connecting" forever: the Connected
state transition was gated on this being the account's very first-ever
sync (next_batch.is_none()), which is never true again once a cursor is
persisted across a restart - a real account could sync successfully
forever and never have its state announced as connected.
Co-Authored-By: Claude Sonnet 5 <[email protected]>