Channels
Use this skill when users ask to connect Telegram/Discord/Slack/Feishu/Email/WeCom channels, bind a session to a remote channel, or debug channel routing.
Policy
- Prefer session-level channel binding.
- Treat global
Channels settings as controller/status only.
- Prioritize automation and guided discovery over manual IDs.
Telegram Setup
- Open target session settings from sidebar.
- Set
Channel = Telegram.
- Paste
Telegram Bot Token.
- Ask user to send one message to the bot in Telegram.
- Tap
Detect Chats.
- Select a detected chat.
- Save.
Manual chat ID entry is optional fallback only.
Discord Setup
- Open target session settings from sidebar.
- Set
Channel = Discord.
- Paste
Discord Bot Token.
- Invite bot to server and send one message in target channel.
- Paste
Discord Channel ID and save.
Tip: Enable Discord Developer Mode, then right-click target channel and copy ID.
If server-channel message text appears empty, enable Message Content Intent for the bot in Discord Developer Portal.
Slack Setup
- Open target session settings from sidebar.
- Set
Channel = Slack.
- Fill
Slack App Token (xapp...).
- Fill
Slack Bot Token (xoxb...).
- Fill
Target Channel ID (usually starts with C, G, or D).
- Choose
Response Mode:
mention = reply only when bot is mentioned in channels
open = reply to all messages in the bound channel
- Optional: fill
Allowed User IDs allow-list.
- Save.
Slack app prerequisites:
- Socket Mode enabled
- App-level token with
connections:write
- Bot scopes:
chat:write, reactions:write, app_mentions:read
- Event subscriptions include message/app mention events
- App installed to workspace
Feishu Setup
- Open target session settings from sidebar.
- Set
Channel = Feishu.
- Fill
Feishu App ID and Feishu App Secret, then save once in PalmClaw.
- In Feishu Open Platform:
- enable Bot capability,
- in
Events & Callbacks, select Long Connection,
- add
im.message.receive_v1,
- in
Permission Management, add im:message and im:message.p2p_msg:readonly,
- if you test in a group by
@-mentioning the bot, also add im:message.group_at_msg:readonly.
- Publish the app, open it in Feishu, and confirm/save the
Long Connection configuration while PalmClaw is running.
- Send one message to the bot from Feishu.
- Re-open session settings and tap
Detect Chats.
- Select the detected conversation:
- private chats bind to
open_id (ou_...)
- group chats bind to
chat_id (oc_...)
- Optional: add
Allowed Open IDs.
- Save again if you changed the detected target.
Encrypt Key and Verification Token are optional for Long Connection mode and can stay blank unless your app setup requires them.
If outbound works but inbound does not, re-check the receive permission, im.message.receive_v1, the publish/open step, and the Long Connection confirmation step.
Email Setup
- Open target session settings from sidebar.
- Set
Channel = Email.
- Turn
Consent Granted on.
- Fill IMAP settings:
IMAP Host
IMAP Port
IMAP Username
IMAP Password
- Fill SMTP settings:
SMTP Host
SMTP Port
SMTP Username
SMTP Password
From Address
- Optional: disable
Auto Reply if the mailbox should only ingest mail and not answer automatically.
- Save once so mailbox polling can start.
- Send one email to the bot mailbox from the target sender address.
- Tap
Detect Senders.
- Select the detected sender address.
- Save again if you changed the detected target.
Recommended Gmail defaults:
imap.gmail.com:993
smtp.gmail.com:587
- use an app password after enabling 2-Step Verification
From Address should match the mailbox account
WeCom Setup
- Open target session settings from sidebar.
- Set
Channel = WeCom.
- Fill
WeCom Bot ID and WeCom Secret.
- Save once so the long connection can start.
- Open the bot in WeCom and send one message.
- Tap
Detect Chats.
- Select the detected conversation.
- Optional: add
Allowed User IDs.
- Save again if you changed the detected target.
Binding note:
- Prefer detect-driven binding after inbound traffic appears in diagnostics.
- Manual target ID is fallback only.
Expected Runtime Behavior
- Telegram -> Session:
- inbound message routes to the bound local session,
- local session shows processing state,
- Telegram shows typing while processing,
- final response is sent back to Telegram.
- Discord -> Session:
- inbound message routes to the bound local session,
- local session shows processing state,
- Discord shows typing while processing,
- final response is sent back to Discord.
- Slack -> Session:
- inbound message routes to the bound local session,
- local session shows processing state,
- Slack final response is sent back to the same bound channel.
- Feishu -> Session:
- inbound message routes to the bound local session,
- local session shows processing state,
- final response is sent back to the same bound Feishu target.
- WeCom -> Session:
- inbound message routes to the bound local session,
- local session shows processing state,
- final response is sent back to the same WeCom target.
- Email -> Session:
- unread inbound mail is polled from the configured mailbox,
- matching sender mail routes to the bound local session,
- local session shows processing state,
- final response is sent back via SMTP when auto reply is enabled.
- Local -> Telegram in the same bound session:
- local session keeps full history,
- final response is mirrored to Telegram (unless already sent by message tool in-turn).
- Local -> Discord in the same bound session:
- local session keeps full history,
- final response is mirrored to Discord (unless already sent by message tool in-turn).
- Local -> Slack in the same bound session:
- local session keeps full history,
- final response is mirrored to Slack (unless already sent by message tool in-turn).
- Local -> Feishu in the same bound session:
- local session keeps full history,
- final response is mirrored to Feishu (unless already sent by message tool in-turn).
- Local -> WeCom in the same bound session:
- local session keeps full history,
- final response is mirrored to WeCom when the session still has a valid reply route or active target binding.
- Local -> Email in the same bound session:
- local session keeps full history,
- final response is emailed back to the bound sender address when auto reply is enabled or when an explicit outbound send is requested.
Quick Verification
- Session row shows
<channel>:<chat_id>.
- Global Channels page lists the session as connected.
- Bidirectional message flow works in the same session.
Recovery
- Detect returns empty: send a message to the bot first, then detect again.
- Inbound not routed: verify saved chat ID matches incoming chat ID.
- No outbound: verify channels gateway is enabled and this session has token + chat ID.
- Discord group no response: mention the bot once in that channel (default mention policy).
- Slack no response in channels: use mention mode and mention the bot once; verify Socket Mode and tokens.
- Feishu detect empty: save App ID / Secret first so long connection can start, then send a bot message and detect again.
- Email detect empty: save mailbox credentials first so polling can start, then send one unread email to the bot mailbox and detect again.
- Email no outbound: verify SMTP host/port/username/password, and check whether
Auto Reply is enabled for reply flows.
- WeCom detect empty: save Bot ID / Secret first so long connection can start, then send a WeCom message to the bot and detect again.
1---2name: channels3description: Configure per-session remote channels (Telegram/Discord/Slack/Feishu/Email/WeCom), then verify inbound/outbound routing and processing visibility.4---5
6# Channels
7
8Use this skill when users ask to connect Telegram/Discord/Slack/Feishu/Email/WeCom channels, bind a session to a remote channel, or debug channel routing.
9
10## Policy
11
12- Prefer session-level channel binding.
13- Treat global `Channels` settings as controller/status only.
14- Prioritize automation and guided discovery over manual IDs.
15
16## Telegram Setup
17
181. Open target session settings from sidebar.
192. Set `Channel = Telegram`.
203. Paste `Telegram Bot Token`.
214. Ask user to send one message to the bot in Telegram.
225. Tap `Detect Chats`.
236. Select a detected chat.
247. Save.
25
26Manual chat ID entry is optional fallback only.
27
28## Discord Setup
29
301. Open target session settings from sidebar.
312. Set `Channel = Discord`.
323. Paste `Discord Bot Token`.
334. Invite bot to server and send one message in target channel.
345. Paste `Discord Channel ID` and save.
35
36Tip: Enable Discord Developer Mode, then right-click target channel and copy ID.
37If server-channel message text appears empty, enable `Message Content Intent` for the bot in Discord Developer Portal.
38
39## Slack Setup
40
411. Open target session settings from sidebar.
422. Set `Channel = Slack`.
433. Fill `Slack App Token (xapp...)`.
444. Fill `Slack Bot Token (xoxb...)`.
455. Fill `Target Channel ID` (usually starts with `C`, `G`, or `D`).
466. Choose `Response Mode`:
47 - `mention` = reply only when bot is mentioned in channels
48 - `open` = reply to all messages in the bound channel
497. Optional: fill `Allowed User IDs` allow-list.
508. Save.
51
52Slack app prerequisites:
53- Socket Mode enabled
54- App-level token with `connections:write`
55- Bot scopes: `chat:write`, `reactions:write`, `app_mentions:read`
56- Event subscriptions include message/app mention events
57- App installed to workspace
58
59## Feishu Setup
60
611. Open target session settings from sidebar.
622. Set `Channel = Feishu`.
633. Fill `Feishu App ID` and `Feishu App Secret`, then save once in PalmClaw.
644. In Feishu Open Platform:
65 - enable Bot capability,
66 - in `Events & Callbacks`, select `Long Connection`,
67 - add `im.message.receive_v1`,
68 - in `Permission Management`, add `im:message` and `im:message.p2p_msg:readonly`,
69 - if you test in a group by `@`-mentioning the bot, also add `im:message.group_at_msg:readonly`.
705. Publish the app, open it in Feishu, and confirm/save the `Long Connection` configuration while PalmClaw is running.
716. Send one message to the bot from Feishu.
727. Re-open session settings and tap `Detect Chats`.
738. Select the detected conversation:
74 - private chats bind to `open_id` (`ou_...`)
75 - group chats bind to `chat_id` (`oc_...`)
769. Optional: add `Allowed Open IDs`.
7710. Save again if you changed the detected target.
78
79`Encrypt Key` and `Verification Token` are optional for Long Connection mode and can stay blank unless your app setup requires them.
80
81If outbound works but inbound does not, re-check the receive permission, `im.message.receive_v1`, the publish/open step, and the Long Connection confirmation step.
82
83## Email Setup
84
851. Open target session settings from sidebar.
862. Set `Channel = Email`.
873. Turn `Consent Granted` on.
884. Fill IMAP settings:
89 - `IMAP Host`
90 - `IMAP Port`
91 - `IMAP Username`
92 - `IMAP Password`
935. Fill SMTP settings:
94 - `SMTP Host`
95 - `SMTP Port`
96 - `SMTP Username`
97 - `SMTP Password`
98 - `From Address`
996. Optional: disable `Auto Reply` if the mailbox should only ingest mail and not answer automatically.
1007. Save once so mailbox polling can start.
1018. Send one email to the bot mailbox from the target sender address.
1029. Tap `Detect Senders`.
10310. Select the detected sender address.
10411. Save again if you changed the detected target.
105
106Recommended Gmail defaults:
107- `imap.gmail.com:993`
108- `smtp.gmail.com:587`
109- use an app password after enabling 2-Step Verification
110- `From Address` should match the mailbox account
111
112## WeCom Setup
113
1141. Open target session settings from sidebar.
1152. Set `Channel = WeCom`.
1163. Fill `WeCom Bot ID` and `WeCom Secret`.
1174. Save once so the long connection can start.
1185. Open the bot in WeCom and send one message.
1196. Tap `Detect Chats`.
1207. Select the detected conversation.
1218. Optional: add `Allowed User IDs`.
1229. Save again if you changed the detected target.
123
124Binding note:
125- Prefer detect-driven binding after inbound traffic appears in diagnostics.
126- Manual target ID is fallback only.
127
128## Expected Runtime Behavior
129
130- Telegram -> Session:
131 - inbound message routes to the bound local session,
132 - local session shows processing state,
133 - Telegram shows typing while processing,
134 - final response is sent back to Telegram.
135- Discord -> Session:
136 - inbound message routes to the bound local session,
137 - local session shows processing state,
138 - Discord shows typing while processing,
139 - final response is sent back to Discord.
140- Slack -> Session:
141 - inbound message routes to the bound local session,
142 - local session shows processing state,
143 - Slack final response is sent back to the same bound channel.
144- Feishu -> Session:
145 - inbound message routes to the bound local session,
146 - local session shows processing state,
147 - final response is sent back to the same bound Feishu target.
148- WeCom -> Session:
149 - inbound message routes to the bound local session,
150 - local session shows processing state,
151 - final response is sent back to the same WeCom target.
152- Email -> Session:
153 - unread inbound mail is polled from the configured mailbox,
154 - matching sender mail routes to the bound local session,
155 - local session shows processing state,
156 - final response is sent back via SMTP when auto reply is enabled.
157- Local -> Telegram in the same bound session:
158 - local session keeps full history,
159 - final response is mirrored to Telegram (unless already sent by message tool in-turn).
160- Local -> Discord in the same bound session:
161 - local session keeps full history,
162 - final response is mirrored to Discord (unless already sent by message tool in-turn).
163- Local -> Slack in the same bound session:
164 - local session keeps full history,
165 - final response is mirrored to Slack (unless already sent by message tool in-turn).
166- Local -> Feishu in the same bound session:
167 - local session keeps full history,
168 - final response is mirrored to Feishu (unless already sent by message tool in-turn).
169- Local -> WeCom in the same bound session:
170 - local session keeps full history,
171 - final response is mirrored to WeCom when the session still has a valid reply route or active target binding.
172- Local -> Email in the same bound session:
173 - local session keeps full history,
174 - final response is emailed back to the bound sender address when auto reply is enabled or when an explicit outbound send is requested.
175
176## Quick Verification
177
178- Session row shows `<channel>:<chat_id>`.
179- Global Channels page lists the session as connected.
180- Bidirectional message flow works in the same session.
181
182## Recovery
183
184- Detect returns empty: send a message to the bot first, then detect again.
185- Inbound not routed: verify saved chat ID matches incoming chat ID.
186- No outbound: verify channels gateway is enabled and this session has token + chat ID.
187- Discord group no response: mention the bot once in that channel (default mention policy).
188- Slack no response in channels: use mention mode and mention the bot once; verify Socket Mode and tokens.
189- Feishu detect empty: save App ID / Secret first so long connection can start, then send a bot message and detect again.
190- Email detect empty: save mailbox credentials first so polling can start, then send one unread email to the bot mailbox and detect again.
191- Email no outbound: verify SMTP host/port/username/password, and check whether `Auto Reply` is enabled for reply flows.
192- WeCom detect empty: save Bot ID / Secret first so long connection can start, then send a WeCom message to the bot and detect again.