# Reference Examples for Bot Development

Sanitized code examples from the agent-core project for building
Telegram and Matrix bots that integrate with LLM backends.

## Files

### Telegram Bot with Forum Topics

**`telegram_bot_topics.py`** — Complete Telegram bot using python-telegram-bot 22+.

Key patterns:
- **Forum topics**: Create/rename topics, route messages by `message_thread_id`
- **Message types**: Text, photos, voice/audio, documents — each with its own handler
- **Streaming responses**: Progressive message editing as LLM generates text
- **Outbox pattern**: LLM writes to `outbox.jsonl`, bot sends files after response
- **Topic naming**: LLM generates topic labels, bot auto-renames forum topics
- **Voice transcription**: Download voice → external STT → send text to LLM
- **Proxy support**: SOCKS5 proxy with retry logic for unreliable connections

Dependencies: `python-telegram-bot>=22.0`, `httpx`, `pyyaml`

### Matrix Bot with Room Management

**`matrix_bot_rooms.py`** — Matrix bot using matrix-nio with E2E encryption.

Key patterns:
- **Room creation**: Create private encrypted rooms, invite users, set avatars
- **Room modes**: Per-room behavior (quiet/context/full) stored in config.json
- **Multi-user**: Users map with per-user profiles loaded from YAML
- **E2E encryption**: Crypto store, key upload, cross-signing, device verification
- **Media handling**: Download + decrypt encrypted media (images, voice, files)
- **Message queuing**: Persistent queue (queue.jsonl) for messages arriving while busy
- **Status threads**: Post tool progress as thread replies under user's message
- **Session management**: Per-room Claude sessions with idle timeout, cancel support
- **Room naming**: Auto-generate room names from conversation content via local LLM
- **Bot commands**: `!new`, `!mode`, `!status`, `!security`, `!help`
- **Security modes**: strict/guarded/open for E2E device verification policy
- **Typing indicators**: Show typing while LLM processes

Dependencies: `matrix-nio[e2e]>=0.24`, `httpx`, `markdown`, `pyyaml`

### Shared: LLM Session Manager

**`llm_session.py`** — Process manager for Claude Code CLI (adaptable to any LLM).

Key patterns:
- **Session persistence**: Save/restore session IDs for conversation continuity
- **Stream parsing**: Parse `stream-json` output for real-time tool/status tracking
- **Idle timeout**: Watchdog task resets on output, kills on silence
- **Cancel support**: External event to kill LLM process mid-turn
- **Fallback chain**: Primary LLM fails → try secondary provider
- **Sandbox**: bubblewrap (bwrap) wrapper for filesystem isolation
- **Status callbacks**: Emit events for tool_start, tool_end, thinking text
- **Environment isolation**: Strip sensitive env vars before spawning subprocess

### Shared: Config

**`config_example.py`** — Simple dataclass config loaded from environment variables.

## Architecture

```
User ──► Bot (Telegram/Matrix) ──► LLM Session Manager ──► Claude CLI (sandboxed)
                │                          │
                ├── media download         ├── session persistence
                ├── typing indicators      ├── stream parsing
                ├── outbox file sending    ├── timeout watchdog
                └── topic/room management  └── fallback provider
```

The bot and LLM session are decoupled — the session manager doesn't know
about Telegram or Matrix. It takes a message string, runs the CLI process,
and returns text + status callbacks. The bot handles all platform-specific
concerns (formatting, media, rooms/topics).
