| 02-telegram-integration |
02 |
telegram |
| telegram |
| bot |
| typing-indicator |
| batching |
| file-handling |
| systemd |
| markdownv2 |
|
| phase |
plan |
provides |
| 02-telegram-integration |
01 |
Persistent subprocess and telegram utils |
|
|
| End-to-end Telegram-Claude Code messaging with typing indicators |
| Message batching with debounce for rapid sequential messages |
| Photo/document handling with auto-analysis |
| Tool call progress notifications |
| Systemd user service for reliability |
|
| 03-lifecycle-management |
| bot-reliability |
|
| added |
patterns |
| MessageBatcher (asyncio.Queue + debounce timer) |
| systemd user service (KillMode=mixed) |
|
| Dynamic typing event lookup via session name in typing_tasks dict |
| Debounce-based message batching with asyncio.Queue |
| --append-system-prompt preserves Claude Code defaults while adding persona |
| --dangerously-skip-permissions for full tool access in non-interactive mode |
|
|
| created |
modified |
| telegram/message_batcher.py |
| ~/.config/systemd/user/telegram-bot.service |
|
| telegram/bot.py |
| telegram/claude_subprocess.py |
| telegram/telegram_utils.py |
| telegram/personas/default.json |
|
|
| Dynamic typing event lookup: callbacks reference typing_tasks dict by session name, not captured event |
| --append-system-prompt instead of --system-prompt: preserves Claude Code model identity |
| --dangerously-skip-permissions: allows all tools in non-interactive subprocess |
| Full model ID in persona (claude-sonnet-4-5-20250929) instead of alias |
| Stream-json NDJSON format: {type: user, message: {role: user, content: text}} |
|
| Pattern 1: Dynamic callback binding - closures look up mutable state by key instead of capturing immutable reference |
| Pattern 2: Stale task cleanup - check task.done() and delete from dict before creating replacement |
| Pattern 3: Persona via append - use --append-system-prompt to layer persona on top of CLI defaults |
|
~90min (including interactive debugging with user) |
2026-02-04 |