Chat Channels Parity Registry
Snapshot of Channel.Capabilities() declarations across the implemented chat channels in core/bot-server/internal/channel/.
Spec: meta/docs/stack/specs/chat-channels/capability-matrix.kmd (#009). Authority: each channel's Capabilities() method is the source of truth. This registry mirrors it for human review.
*egend*— ✅ supported · — not supported · ◑ planned (in-flight ticket)
Last audited: 20260509 (commit landing #009).
1 — Receive (inbound message kinds)
| Feature |
Telegram |
WhatsApp |
WebChat |
| Text |
✅ |
✅ |
✅ |
| Image |
✅ |
✅ |
— |
| Video |
✅ |
✅ |
— |
| Audio |
✅ |
✅ |
— |
| Voice |
✅ |
✅ |
— |
| Document |
✅ |
✅ |
— |
| Location |
✅ |
✅ |
— |
| Contact |
✅ |
✅ |
— |
| Sticker |
✅ |
✅ |
— |
| ReplyThread |
✅ |
✅ |
— |
| Edit |
✅ |
— |
— |
| Reaction |
— |
— |
— |
2 — Send (outbound rendering)
| Feature |
Telegram |
WhatsApp |
WebChat |
| Text |
✅ |
✅ |
✅ |
| Image |
✅ |
✅ |
— |
| Video |
✅ |
✅ |
— |
| Audio |
✅ |
✅ |
— |
| Voice |
✅ |
✅ |
— |
| Document |
✅ |
✅ |
— |
| Location |
✅ |
✅ |
— |
| Sticker |
✅ |
✅ |
— |
| MarkdownFormatting |
✅ |
✅ |
✅ |
| EditMessage |
✅ |
— |
— |
| DeleteMessage |
✅ |
— |
— |
| Typing |
✅ |
✅ |
— |
| Thinking |
✅ |
— |
— |
| RealProgress |
✅ |
— |
— |
3 — Admin
| Feature |
Telegram |
WhatsApp |
WebChat |
| SetPhoto |
✅ (BOTSRV-008) |
— |
— |
| SetTitle |
✅ |
— |
— |
| SetDescription |
✅ |
— |
— |
| AddMember |
— |
— |
— |
| RemoveMember |
— |
— |
— |
| Promote |
— |
— |
— |
| Demote |
— |
— |
— |
| ListMembers |
— |
— |
— |
| Leave |
— |
— |
— |
4 — Identity
| Feature |
Telegram |
WhatsApp |
WebChat |
| UserName |
✅ |
✅ |
✅ |
| UserEmail |
— |
— |
— |
| UserAvatarURL |
— |
— |
— |
| ChatTitle |
✅ |
✅ |
— |
| ChatType |
✅ |
✅ |
— |
| MemberCount |
✅ |
— |
— |
5 — History
| Feature |
Telegram |
WhatsApp |
WebChat |
| PassiveLogging |
◑ #011 |
◑ #011 |
n/a (single-user) |
| MultimodalHistory |
◑ #010 |
◑ #010 |
— (no upload UI) |
*ross-rule constraint* a channel that declares Receive.Image=true MUST also declare History.MultimodalHistory=true per Capabilities.Validate(). Telegram and WhatsApp currently violate this — captured by ticket #010 (acceptance criterion 1) which lands the schema migration that lets both flip true honestly. Until then, the validator is *dvisory*in CI for those two channels.
6 — Commands
| Command |
Telegram |
WhatsApp |
WebChat |
| Help |
✅ |
✅ |
✅ |
| Status |
✅ |
✅ |
✅ |
| Clear |
✅ |
— |
— |
| Model |
✅ (via tool) |
✅ (via tool) |
✅ (via tool) |
| Keyboard |
✅ |
— |
— |
| SetAvatar |
✅ |
— |
— |
7 — Gate
| Mode |
Telegram |
WhatsApp |
WebChat |
| InviteCode |
✅ |
✅ |
— |
| ApprovedChatList |
✅ |
✅ |
— |
| OwnerOnly |
— |
— |
✅ |
| PublicByDefault |
— |
— |
— |
Pending channels (#016)
| Channel |
Status |
Notes |
| Signal |
not implemented |
spike via signal-cli or signald |
| Google Chat |
not implemented |
Workspace publishing required |
| Koder Chat |
not implemented |
depends on Koder Chat product API stabilization |
When each ships, append a column to every table above and an entry in core/bot-server/internal/channel/.
CI guard
koder-housekeep (when v0.2+ ships with channel-aware audit) will parse every channel's Capabilities() and diff against this registry. Drift triggers PR-blocking finding. Until then, the audit is manual: update this file in the same commit that changes a Capabilities() return value.