现在 Slack 这条链路只到「OAuth 装上 + 装完打招呼」就停住了,bot 自己回的是写死的 echo。 本文画清楚:(1) 已经搭起来的部分长什么样、(2) 一条消息今天怎么走、(3) 接入 metabot 之后会怎么走。
用户访问 slack.minicto.ai → CF DNS-only → 我们机器 nginx → node。
installations从用户点 Add to Slack 到 bot 出现在 Slack + 收到欢迎 DM。
还没接 metabot;app_mention 触发的回话是 hardcoded。
// src/server.js — 现在的 handler app.event('app_mention', async ({ event, client }) => { await client.chat.postMessage({ channel: event.channel, thread_ts: event.thread_ts ?? event.ts, text: `hi <@${event.user}> — miniCTO 在线。你刚说: "..."`, }); });
把 minicto-slack 定位成 Slack 网关:管 OAuth + token,不做对话逻辑。对话交给 metabot。
前缀化避免跟飞书 oc_* / p_* 冲突;team_id 嵌进去让 adapter 反向找 token。
| 场景 | chatId | senderId |
|---|---|---|
| 频道里 @ bot | slack:T914QLDUL:C03ABCDEF |
slack:U07XYZ |
| DM 给 bot | slack:T914QLDUL:dm:U07XYZ |
slack:U07XYZ |
| 多人 DM (mpim) | slack:T914QLDUL:G04MPIM |
slack:U07XYZ |
chatId 隔离,不按 sender 拆。一个频道 = 一条 Claude 会话,跟飞书目前一样。makeTaskKey(chatId, senderId) 机制,加一行配置即可启用。v1 只追求 Slack DM/@ → metabot → 文本回话 打通;流式卡片、图片、Block Kit 都 v2。
| 层 | 事项 | 状态 |
|---|---|---|
| gateway | 加 POST /api/internal/send-text(Bearer 鉴权 + 查表 + chat.postMessage) |
待做 |
| gateway | 把 app_mention + message.im handler 改成转发 POST /api/talk 到 metabot |
待做 |
| gateway | 消息去重(Slack retry 标头 X-Slack-Retry-Num 要忽略) |
待做 |
| metabot | 新建 src/slack/slack-sender-adapter.ts 实现 IMessageSender |
待做 |
| metabot | 在 index.ts 加 startSlackBot(),注册 platform: 'slack' 的 bot |
待做 |
| metabot | 共享 secret 配置 + URL 配置(gateway 地址 / 鉴权 token) | 待做 |
| — | 端到端测:miniCTO workspace DM bot → 看到 metabot 起会话 → bot 回话 | 待做 |