CoderClaw routes replies back to the channel where a message came from. The model does not choose a channel; routing is deterministic and controlled by the host configuration.
whatsapp, telegram, discord, slack, signal, imessage, webchat.Direct messages collapse to the agent’s main session:
agent:<agentId>:<mainKey> (default: agent:main:main)Groups and channels remain isolated per channel:
agent:<agentId>:<channel>:group:<id>agent:<agentId>:<channel>:channel:<id>Threads:
:thread:<threadId> to the base key.:topic:<topicId> in the group key.Examples:
agent:main:telegram:group:-1001234567890:topic:42agent:main:discord:channel:123456:thread:987654Routing picks one agent for each inbound message:
bindings with peer.kind + peer.id).guildId + roles.guildId.teamId.accountId on the channel).accountId: "*").agents.list[].default, else first list entry, fallback to main).When a binding includes multiple match fields (peer, guildId, teamId, roles), all provided fields must match for that binding to apply.
The matched agent determines which workspace and session store are used.
Broadcast groups let you run multiple agents for the same peer when CoderClaw would normally reply (for example: in WhatsApp groups, after mention/activation gating).
Config:
{
broadcast: {
strategy: "parallel",
"[email protected]": ["alfred", "baerbel"],
"+15555550123": ["support", "logger"],
},
}
See: Broadcast Groups.
agents.list: named agent definitions (workspace, model, etc.).bindings: map inbound channels/accounts/peers to agents.Example:
{
agents: {
list: [{ id: "support", name: "Support", workspace: "~/.coderclaw/workspace-support" }],
},
bindings: [
{ match: { channel: "slack", teamId: "T123" }, agentId: "support" },
{ match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" },
],
}
Session stores live under the state directory (default ~/.coderclaw):
~/.coderclaw/agents/<agentId>/sessions/sessions.jsonYou can override the store path via session.store and {agentId} templating.
WebChat attaches to the selected agent and defaults to the agent’s main session. Because of this, WebChat lets you see cross‑channel context for that agent in one place.
Inbound replies include:
ReplyToId, ReplyToBody, and ReplyToSender when available.Body as a [Replying to ...] block.This is consistent across channels.