Telegram plugin: reply-generation listener does not survive/respawn after being killed, breaking DM replies for all configured bots
Status Open
Maintainer reply None cached
Activity 0 comments · opened Sep 29, 2026
Summary
After a background process associated with the Telegram plugin channel (visible in ps as claude --channels plugin:telegram@claude-plugins-official) was stopped, Telegram DMs to configured bots are received and acknowledged (a "typing..." indicator appears, and the message is consumed from Telegram's getUpdates queue) but no reply is ever generated or sent. This persisted across a session restart, a full app restart, a full computer restart, and even deleting and recreating the bot from scratch with a brand new token.
Setup
- Two Telegram bots configured on one machine:
- An existing bot using the default state dir (
~/.claude/channels/telegram) - A second bot for a different project, configured via a project-level
.claude/settings.jsonwith"env": {"TELEGRAM_STATE_DIR": "<custom path>"}pointing to a separate state dir, specifically to avoid credential collision between the two bots
- The second (custom-state-dir) bot never successfully sent a reply, even before anything was killed
Steps to reproduce
- Configure a Telegram bot via
/telegram:configure <token>with a non-defaultTELEGRAM_STATE_DIR(project-scoped, to avoid clobbering another bot's token at the default path) - Pair/approve access via
/telegram:access pair <code>, setdmPolicytoallowlist - DM the bot on Telegram
- Observe: "typing..." appears, but no reply is ever sent
getUpdateson the bot token shows the message was consumed (queue empty), confirming the plugin's MCP stdio server (bun server.ts) did receive it- Restarting the Claude Code session, restarting the desktop app, and restarting the whole computer did not resolve it
- Separately, two long-lived
claude --channels plugin:telegram@claude-plugins-officialprocesses were found running (started at different times, unclear how they were spawned). Killing both (attempting to force a clean respawn) caused a previously-working Telegram bot (the default-state-dir one) to stop responding too — itsgetUpdatesnow shows multiple unconsumed messages, confirming nothing is polling it at all anymore - No new
claude --channels ...process has respawned since, despite session/app/computer restarts, even though the underlyingbun server.tsMCP process for at least one bot did restart fine - Deleted the affected bot via @BotFather and created a brand new one from scratch (new token, new bot ID, same username). Reconfigured with
/telegram:configure, pre-authorized the known sender ID directly inaccess.json(dmPolicy: allowlist). The bot's built-in hardcoded/startresponse worked (proving the MCP stdio server and basic bot plumbing is fine), but a real message ("Hi") showed the identical failure: typing indicator appears, message is consumed fromgetUpdates, but no Claude-generated reply is ever sent, confirmed with a fully-delivered (blue double-tick) message on a clean connection. This rules out both the bot token/identity and network/connectivity as the cause — the issue is specifically in the reply-generation path. - Reproduced independently in a second, separate Claude Code session/project on the same machine (different Telegram bot, default state dir config) — same symptom: connector shows "connected", MCP tools load fine, but no
<channel source="telegram">message ever arrives in that session either, confirming this is systemic rather than specific to one project's setup.
Expected behavior
- A Telegram DM to a properly configured + paired bot should receive an actual reply from Claude, not just a typing indicator
- Killing/losing the
claude --channels plugin:telegram@claude-plugins-officialprocess should not permanently break reply generation — the app should detect this and respawn it (similar to how the MCP stdio server itself does get relaunched on session/app restart) - Recreating the bot from scratch should not be necessary, and in this case did not fix the issue either
Impact
- Both Telegram bots on this machine are currently non-functional for replies (messages are received/consumed but never answered)
- No way found from within a Claude Code session to manually respawn the missing listener process (no exposed tool/command found for this)
Environment
- macOS, Claude desktop app, Code tab
- Telegram plugin version 0.0.7 (claude-plugins-official)