- 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>
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>