* fix: show knock-accepted notification body when invite follows a knock (#5823)
When Synapse accepts a knock it sends an m.room.member invite event. The client
was displaying the generic 'You have been invited by X' push notification body
because the invite event alone doesn't carry prev_content on the push path.
Use KnockTracker (already used for auto-join) to detect knock-accepted invites
and show a dedicated 'Your join request was accepted!' notification body instead.
- Add knockAccepted string to intl_en.arb
- Extract condition into isKnockAcceptedInvite() pure util for testability
- Expose KnockTracker.getKnockedRoomIds() publicly (was _getKnockedRoomIds)
- Override notification body in push_helper.dart (background) and
local_notifications_extension.dart (foreground/web)
- Unit tests for all isKnockAcceptedInvite() branches (9 tests)
* formatting
* fix up pangea comments
* fix: avoid race condition with knocked room account data updates and local push notification content
* translations
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* move activity session page bottom section into its own widget
* activity session full mode
* fix loading of activity session preview on open app via course ping
* "docs: writing assistance redesign design spec (#5655)
Add comprehensive design doc for the WA redesign:
- AssistanceRing replaces StartIGCButton (segmented ring around Pangea icon)
- Background highlights with category colors (not red/orange error tones)
- Simplified match lifecycle: open → viewed → accepted (no ignore)
- Persistent span card with smooth transitions between matches
- Send always available, no gate on unresolved matches
Remove superseded design docs (SPAN_CARD_REDESIGN_FINALIZED.md,
SPAN_CARD_REDESIGN_Q_AND_A.md, choreographer.instructions.md)."
* feat: replace ignored status with viewed status, initial updates to span card
* resolve merge conflicts
* rebuild input bar on active match update to fix span hightlighting
* cleanup
* allow opening span cards for closed matches
* no gate on sending, update underline colors
* animate span card transitions
* initial updates to add segmented IGC progress ring
* update segment colors / opacities based on match statuses
* use same widget for igc loading and fetched
* more segment animation changes
* fix scrolling and wrap in span card
* better disabled color
* close span card on assistance state change
* remove print statements
* update design doc
* cleanup
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* feat: client-side knock auto-accept via KnockTracker
Replace server-side AutoAcceptInviteIfKnocked (removed in
synapse-pangea-chat PR #21) with client-side KnockTracker.
- Record knocked room IDs in Matrix account data (org.pangea.knocked_rooms)
- Auto-join when invite arrives for a previously knocked room
- Migrate storage from GetStorage to Matrix account data for
cross-device sync and reinstall persistence
- Add joining-courses.instructions.md design doc
* formatting
* centralizes calls to knock-storage related functions
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* chore: split up analytics activity page widgets into separate files
* started analytics practice refactor
* refactor how UI updates are triggered in analytics practice page
* some fixes
* feat: embed STT transcription in audio event content
Before sending the audio event, the client now fetches the STT
transcript first, then embeds it under 'user_stt' in the event
content. This mirrors the 'original_sent' pattern for text messages
and lets the bot read the transcript immediately without downloading
audio or calling choreo.
- Add ModelKey.userStt constant
- Rewrite onVoiceMessageSend to get transcript before sending audio
- Update getSpeechToTextLocal() to check userStt before botTranscription
* chore: replace inaccurate comment with TODO referencing #5730
* formatting
* fix pangea comments
* feat: make stt translations relate to pangea message events instead of stt representation events
* clean up pangea event types
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
* feat: add transcription and translation to audio practice
* fix: make sure answer form matches word in audio
and optimize distractor/answer selection with one pass through the list
* feat: audio practice progress bar
* fix: simplify audio logic