daemon
Manage the Telegram daemon lifecycle — start, stop, restart, check status, tail logs. Use when the user says "start the bot", "stop the daemon", "restart telegram", "daemon status", "show bot logs", or "is the bot running".
/telegram:daemon — Telegram Daemon Lifecycle Manager
Full lifecycle management for the Telegram bot daemon (launchd + supervisor + Claude).
Arguments — dispatch on first word
start (default if no args and daemon is not running)
Start the daemon via launchd:
launchctl load ~/Library/LaunchAgents/com.user.claude-telegram.plist 2>&1
If it fails with "already loaded", report that the daemon is already running. After loading, wait 5 seconds, then run the status check to confirm it started.
stop
Stop the daemon:
launchctl unload ~/Library/LaunchAgents/com.user.claude-telegram.plist 2>&1
Wait 3 seconds, verify all processes are gone:
ps aux | grep -E "channels.*telegram" | grep -v grep
Report success or if orphan processes remain.
restart
Unload then load:
launchctl unload ~/Library/LaunchAgents/com.user.claude-telegram.plist 2>/dev/null
sleep 2
launchctl load ~/Library/LaunchAgents/com.user.claude-telegram.plist
Wait 10 seconds, then run full status check.
status (default if no args and daemon IS running)
Run the full monitor check — same as /telegram:monitor:
- Process status (supervisor, expect, claude, MCP server, caffeinate)
- Launchd loaded/not
- Remote control URL
- Lock file
- Last 5 log lines
logs
Tail the last 30 lines of supervisor stderr:
tail -30 ~/.claude/channels/telegram/data/supervisor-stderr.log
stdout
Tail the last 30 lines of daemon's Claude output:
tail -30 ~/.claude/channels/telegram/data/supervisor-stdout.log
url
Just show the remote control URL:
cat ~/.claude/channels/telegram/data/supervisor-stdout.log | strings | grep "session_" | tail -1
No args
Check if daemon is running. If running → show status. If not running → ask if user wants to start it.
Important notes
- The
launchctl load/unloadcommands may fail with "Input/output error" — this usually means the service is already in the requested state. Handle gracefully. - After start/restart, always verify the daemon actually started by checking processes.
- The plist path is always:
~/Library/LaunchAgents/com.user.claude-telegram.plist - Show the remote control URL after every start/restart so the user can monitor.