- Rewrite delivery section: 'When done' framing, 'Run silently' default,
auto-detected channels from /api/channels, context-aware placeholders
- Distinguish task vs delivery failures in cron list (green+warning vs red)
- Replace emoji icons with Lucide (Timer, CornerDownRight) in session panel
- New GET /api/channels endpoint (reads configured channels from openclaw.json)
- Fix server tsconfig: exclude test files to prevent rootDir expansion on clean builds
Relaxes strict YYYY-MM-DD filename validation to accept any safe filename
(alphanumeric, hyphens, underscores, dots). Files like 2026-02-26-HEAL.md
in the memory directory now display and edit correctly instead of throwing
'Invalid date format' errors.
Path traversal prevention maintained via SAFE_FILENAME regex.
Fixes#27
* feat: multilingual voice support (STT + TTS) for 11 languages
Add language preference system that drives both speech-to-text and
text-to-speech across all providers with graceful fallback to English.
Supported languages: English, Chinese, Hindi, Spanish, French, Arabic,
Bengali, Portuguese, Russian, Japanese, German.
Phase 1 - Constants & Language Registry:
- Add multilingual whisper models (tiny, base, small) alongside .en models
- New SUPPORTED_LANGUAGES registry with Edge TTS voices, Qwen3 mappings
- Default model changed to 'tiny' (multilingual) for new installs
Phase 2 - Server Provider Wiring:
- New server/lib/language.ts with resolution helpers
- whisper-local: accepts language param, warns on .en model + non-English
- openai-whisper: passes language hint to API for better accuracy
- edge-tts: language-aware voice selection via resolveEdgeTTSVoice()
- replicate-tts: Qwen3 language resolution with English fallback + warning
- tts-config: language-aware voice resolution chain
- config: new language and edgeVoiceGender fields (hot-reloadable)
Phase 3 - Settings API:
- GET/PUT /api/language — read/write language preference
- GET /api/language/support — full provider × language compatibility matrix
- PUT /api/transcribe/config accepts language field
- All changes hot-reload (no server restart needed)
Phase 4 - UI:
- Language dropdown in Audio settings (name + native name display)
- Auto-detect option for whisper to decide
- Compatibility warnings (Qwen3 unsupported, .en model + non-English)
- Edge TTS voice gender toggle (female/male per language)
- STT model selector now shows both .en and multilingual models
Phase 5 - Migration:
- No breaking changes — .en models still work, English stays default
- Language features are opt-in via settings UI
- All new env vars (LANGUAGE, EDGE_VOICE_GENDER) are optional
* feat: per-language voice phrases with configuration modal
Add per-language stop/cancel phrase support for multilingual voice input.
When switching to a non-English language, a modal prompts the user to
configure send/cancel phrases in that language, pre-populated with
translated defaults for all 11 supported languages.
Changes:
- Extend voice-phrases.json to per-language format (auto-migrates v1 flat)
- Add DEFAULT_VOICE_PHRASES with translations for all 11 languages
- New VoicePhrasesModal component with add/remove phrase editing
- Voice phrases API: per-language GET/PUT + status endpoint
- useVoiceInput: refetch phrases on language change, invalidate cache
- InputBar: listen for language-changed events to update phrase matching
- English phrases always included as fallback (people code-switch)
- Merged phrase matching: language-specific + English (deduplicated)
* feat: persistent voice phrases config button + wake word support
- Add 'Voice Phrases' button in settings (always visible for non-English)
- Opens modal anytime, not just on first language switch
- Add wake phrase configuration to modal (wake + send + cancel)
- Wake phrases merge with English defaults (both work)
- Add Turkish language support (Edge TTS: Emel/Ahmet)
- Server: wakePhrases field in LanguageVoicePhrases type
- Server: PUT endpoint accepts wakePhrases
- Client: useVoiceInput merges server wake phrases with defaults
* feat: refine multilingual voice flow and settings UX
* feat(voice): finalize multilingual integration and runtime phrase storage
* fix(review): address CodeRabbit follow-ups for multilingual voice
* fix(review): resolve remaining CodeRabbit findings
* fix(voice): reload wake phrases after modal save without refresh
* chore(ui): rename Advanced settings category to Connection
* chore: fix stale language-count comment in support API