* 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>
* docs: add PT v2 and token-info-feedback design docs
- Add phonetic-transcription-v2-design.instructions.md (client PT v2 migration)
- Add token-info-feedback-v2.instructions.md (client token feedback v2 migration)
* fix: update applyTo path for token info feedback v2 migration
* feat: Refactor phonetic transcription to v2 models and repository (in progress)
* feat: PT v2 migration - tts_phoneme rename, v1 cleanup, disambiguation, TTS integration
* feat: Update phonetic transcription v2 design document for endpoint changes and response structure
* docs: fix stale _storageKeys claim in pt-v2 design doc
* style: reformat PT v2 files with Dart 3.10 formatter (Flutter 3.38)
* feat: add speakingRate to TTS request model (default 0.85)
Passes speaking_rate to the choreo TTS endpoint. Default preserves
current behavior; can be overridden for single-word playback later.
* feat: use normal speed (1.0) for single-word TTS playback
The 0.85x slowdown is helpful for full sentences but makes single
words sound unnaturally slow. tts_controller._speakFromChoreo now
sends speakingRate=1.0. Full-sentence TTS via pangea_message_event
still defaults to 0.85.
* style: clean up formatting and reduce line breaks in TtsController
* fix: env goofiness
* formatting, fix linter issues
* don't return widgets from functions
---------
Co-authored-by: ggurdin <ggurdin@gmail.com>
Co-authored-by: ggurdin <46800240+ggurdin@users.noreply.github.com>