* 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
* feat: unified use-type-aware practice scoring on ConstructUses
- Add practiceScore() and practiceTier to ConstructUses for shared
scoring across message practice and standalone practice
- Add isChatUse, isAssistedChatUse, isIncorrectPractice getters to
ConstructUseTypeEnum with exhaustive switches
- Add PracticeTier enum (suppressed/active/maintenance)
- Wire into PracticeSelectionRepo and AnalyticsPracticeSessionRepo
- 28 unit tests covering tier classification, scoring, and ordering
Closes#5700
* formatting, fix linting issue
* move some stuff around
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
Closes#5697
- Extract buildUpdatedBotOptions (pure) and applyBotOptionUpdatesInOrder
(async orchestration) as top-level @visibleForTesting functions
- Handle bot DM independently of _targetBotChats filter — the DM may
lack a botOptions state event or have a stale activityPlan, but it's
the most important room to keep current
- Update remaining rooms sequentially (not Future.wait) to avoid rate-limiting
- DM errors propagate; other room errors are logged and isolated
- Add 17 unit tests covering both extracted functions
- Add profile.instructions.md design doc for profile settings architecture
* feat: nicer unsubscribed word card
with a small shimmer animation placeholder, and audio on word click
* create new widget instead of returning widget from function
* translations
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>