IM 渠道适配器
wesgine 的 Channel 适配器为每个 Cell 提供即时通讯渠道管理能力,支持企业微信、飞书、钉钉等平台。
API 端点
GET /cells/{id}/channels 渠道列表
POST /cells/{id}/channels 注册/更新渠道
DELETE /cells/{id}/channels/{platform}/{account} 删除渠道
GET /cells/{id}/channels/bindings 绑定列表
PUT /cells/{id}/channels/bindings 替换绑定
POST /cells/{id}/channels/preflight 预检验证
POST /cells/{id}/channels/send 发送消息
GET /cells/{id}/channels/events SSE 事件流
Webhook 入口
POST /cells/{id}/webhook/wecom 企业微信回调
POST /cells/{id}/webhook/feishu 飞书回调
POST /cells/{id}/webhook/dingtalk 钉钉回调
Webhook URL 中 cellID 是路由依据——每个部门/Cell 配独立 URL。
Cell Handle
cell.Channels() → ChannelHandle
.List(ctx)
.Upsert(ctx, config)
.Delete(ctx, platform, account)
.Bindings(ctx)
.ReplaceBindings(ctx, bindings)
.Preflight(ctx, config)
.Send(ctx, msg)
CellSpec 声明模式
Channels 与 MCPs 没有运行时存储,CellSpec 就是唯一副本:
- spec 权威——两种形状都是单一真相
- 与 Cron/Email 不同(后两者有运行时存储,spec 仅是出生声明)
配额管理
受 CellQuotas.MaxIMChannels 限制:
- 配额在唯一增长点(
Channels适配器的 append 路径)校验 - 整体替换(
UpdateSpec)对 cap 幂等 - 覆盖已有名字
delta=0
凭证管理
渠道凭证通过 SecretRef 管理:
inline:AES-256-GCM 加密存hypervisor.dbenv:环境变量live:运行时注入
降级保护(INV-PERSIST-07)防止未解密凭证被空值覆盖。
Per-Cell 隔离
- Cell A 的渠道消息物理隔离(不同 credentials 不可能收到对方消息)
- 每个部门可以有独立的企业微信 Corp / 群机器人
反模式
| 禁止 | 正确做法 |
|---|---|
| 全局 webhook URL + header 传 cellID | 每部门独立 URL /cells/{id}/webhook/{platform} |
| 共享 IM 渠道 credentials 跨 Cell | 物理隔离 |
| 在 Cell.Start 校验渠道数量 | 运行时在增长点校验(INV-QUOTA-05) |