- /speak <voice> enables TTS with selected voice (irina, denis, dmitri)
- /speak stop disables TTS in the chat
- Private chats keep always-on TTS behavior
- Add PIPER_VOICES env var for voice-to-URL mapping
- Add chat type field to distinguish private/group chats
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ziglang.org unreachable from cluster, use pre-built Docker image instead.
Lower minimum_zig_version to 0.15.1 for compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Root cause: parseFromSlice returns slices pointing into the raw JSON
body, but body was freed immediately after parsing in getUpdates
- Fix: return OwnedParsed wrapper that keeps both parsed result and
raw body alive together
- Switch HTTP layer to curl subprocess (more reliable than std.http
with static linking)
- Fix downloadToFile: use spawnAndWait instead of collectOutput
(collectOutput requires both pipes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Simplify Dockerfile: use pre-built cross-compiled binary instead of
building in Alpine (Alpine only has Zig 0.13, we need 0.15)
- Fix image URL in k8s manifest: git.mikhailkilin.ru (not gitea.)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Long-polling bot that accepts voice messages and video notes,
sends them to Whisper STT API, and replies with transcription text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>