跳过主要内容
D

dsh-im-union

drscrewdriver/dsh-im-union

DSH 的 IM 联合桥:整合社区同类插件(xmanrui/dsh-im、MichengAI/dsh-im-connect)能力合集的独立实现——用 12 个平台的 15 个渠道适配器(含邮件;企微/钉钉/QQ 各含机器人与自建应用或推送两档)驱动宿主会话——微信(官方 iLink 扫码绑定)、飞书(长连接+流式卡片,语音档需系统 ffmpeg)、Telegram、Discord、企微智能机器人与自建应用(回调验签)、钉钉(stream+AI Card 与自定义机器人推送)、QQ 官方机器人(另含推送档)、Slack(Socket Mode)、WhatsApp(Baileys 扫码,依赖以插件包 optionalDependencies 随包分发)、Matrix、iMessage(仅 macOS)、邮件(IMAP/SMTP 线程路由)。跨版本窄腰在 0.1.2-rc.1→0.2.1-rc.2 宿主间(12 tag 枚举,rc.2 已按桌面 profile 装机双回读实证)以能力探测自适配设置面 gen1/gen2/gen3(禁版本号分支);IM 内 25 命令面板、工具审批与交互提问原聊天闭环(默认拒绝、发起者限定、5 分钟超时)、图片/文件输入(宿主元数据判视觉)、产物文件回传、投递日志限额补发(结果不明绝不重发)、主动投递与碎片续写;原生侧栏「任务/频道」两页签自持分离(检测到该槽位已被其它插件接管则完全不插手)、im-concise 智能体预设配合出站净化把 GenUI 围栏与裸 HTML 等富结构挡在纯文字聊天之外、svg 围栏自动渲染为 PNG 图片发送、模型白名单护栏、/relay 把每回合最终回答镜像到通知渠道(按账号 ID 或别名绑定,歧义不猜)。secret 单向入凭据库,永不回显。npm 包名:`dsh-im-union`。

安装

dsh plugin --profile web add github:drscrewdriver/dsh-im-union

README

dsh-im-union

DeepSeek Harness 的 IM 联合桥——净室重写,能力合集来自社区两仓(xmanrui/dsh-im 与 MichengAI/dsh-im-connect),不复制其源码。

  • 支持的 DSH 宿主: 0.1.2-rc.1 0.1.5-rc.1 0.1.5-rc.2 0.1.5-rc.3 0.1.7-rc.1 0.1.7-rc.2 0.2.0-rc.1 0.2.0-rc.2 0.2.1-alpha.2 0.2.1-alpha.3 0.2.1-rc.1 0.2.1-rc.2 0.2.1-rc.3(覆盖 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 / 0.2.1 共 13 个 rc/alpha)

状态

0.4.7:15 个渠道适配器(覆盖 12 个平台,含邮件;企微/钉钉/QQ 各含机器人与自建应用或推送两档)、跨版本窄腰、会话引擎、审批/提问 IM 闭环、多账号管理面、原生「任务/频道」侧栏分离、IM 简洁预设与出站净化、SVG 图表转图、final 抄送 relay 均已交付(单测 728 项;宿主农场 0.1.2/0.1.5/0.1.7/0.2.1 四线冒烟全绿;桌面 profile 真机装机与浏览器目视实证至 0.4.6)。真机验收项逐项登记在 CHANGELOG;能力分期见开发仓计划台账。

能力总览:

  • 渠道:微信(官方 iLink 扫码)、飞书(长连/流式卡片/语音档可选,语音需系统 ffmpeg)、Telegram、Discord、企微智能机器人(长连)、钉钉(stream+AI Card,另有自定义机器人推送档)、QQ 官方机器人(另有推送档)、Slack(Socket Mode)、WhatsApp(Baileys 扫码,依赖随包 optionalDependencies 分发)、Matrix、iMessage(仅 macOS)、企微自建应用(回调)、邮件(IMAP/SMTP 线程路由)等;未配置渠道零依赖零加载(懒 import)。
  • IM 内闭环:25 命令面板(/help /status /new /stop /steer /model(s) /reasoning /preset(s) /session(s) /workspace(s) /fork /rename /queue /mute /unbind /goal /delivery /export /speak /relay /menu);工具审批与交互提问原聊天回答(默认拒绝、5 分钟超时、发起者限定)。
  • IM 友好呈现:原生侧栏「任务/频道」两页签自持分离(包裹宿主官方任务树,过滤 IM 会话不入任务页;检测到他人已接管则绝不插手);im-concise 智能体预设(persona 完整模式从源头阻断 GenUI 围栏/裸 HTML 等富结构注入)+ 出站净化兜底;```svg 围栏自动转 PNG 图片发送(需宿主侧渲染依赖在位,缺位降级纯文字);模型白名单护栏(渠道外兜底集合);/relay 回合结果镜像到通知渠道(钉钉群 webhook / QQ 主动推送,可用账号 ID 或别名绑定)。
  • 跨版本:设置面 gen1/gen2/gen3 三态自适配;能力探测优先,禁版本号分支。

安装

dsh plugin --profile web add dsh-im-union@latest --registry=https://registry.npmjs.org/

装好后在宿主侧栏/设置页的「IM 联合桥」面板添加账号:大部分渠道走凭据绑定(Bot Token/App 凭据,secret 字段只单向入库不回显);微信/WhatsApp 走扫码绑定;企微自建应用需将本插件管理面回调 URL(/api/dsh-im-union/wecom-app/callback)配入后台接收服务器。隐私与凭据红线见 SECURITY.md;第三方依赖声明见 THIRD_PARTY_NOTICES.md(净室重实现,不复制任何上游源码)。

安装前提:

  • WhatsApp 渠道的 @whiskeysockets/baileys 已声明为 optionalDependencies,随包自动安装;若安装时离线被跳过,渠道启动时会明确报「未安装」并拒绝,不崩溃。
  • 飞书语音档需要系统 ffmpeg 在 PATH 中(转码二进制不随包分发,仅启用语音档时才会调用)。
  • iMessage 渠道仅 macOS 可用。

使用说明

装好后在宿主设置页/侧栏的「IM 联合桥」面板管理账号与偏好;日常操作全部可在聊天内完成(发 /help 看命令)。

添加账号

三类绑定形态,面板按渠道元数据自动出表单:

形态渠道说明
凭据表单(9)telegram / discord / slack / matrix / imessage / wecom-app / email / dingtalk-notify / qq-notify填 Bot Token 或 App 凭据;secret 字段只单向入库,任何回包零凭据
凭据或扫码(4)feishu / wecom / dingtalk / qq二选一:填应用凭据,或走面板扫码建机器人
扫码(2)weixin / whatsapp微信走官方 iLink 扫码;WhatsApp 走 Baileys 配对

账号 ID 由系统自动生成(<channel>-<ts36><rand>),无需也不应手填;「别名」才是给人看的名字,可在面板设置。

命令面板(25 条)

组命令
会话/help /menu /status /new /stop /steer <文本> /sessions [all] [页] /session <序号|id片段> /fork /rename <标题> /unbind /goal <文本|-> /queue /mute
模型与预设/models /model <id> /reasoning <档位> /presets /preset <名称> /workspaces /workspace <路径|->
投递与抄送/delivery [retry <序号>] /export /relay <账号|-> /speak <文本>

命令默认只对白名单用户开放;群聊只认显式 @ 本机器人。工具审批与交互提问在原聊天回答(默认拒绝、发起者限定、5 分钟超时)。

通知抄送(/relay)

把当前会话每回合的最终回答镜像到一个纯出站通知账号(钉钉群 webhook / QQ 主动推送):

/relay                          列出本会话绑定(未绑定时回用法提示)
/relay -                        解绑
/relay <账号>                    绑定;<账号> 可为代理键 ID 或别名
/relay <账号>:<targetId>         绑定并指定推送目标
  • 解析顺序:先按账号 ID 直查,未命中再按别名唯一匹配;别名歧义时直接拒绝并提示改用账号 ID,绝不猜。
  • targetId 按渠道:钉钉的 webhook 已锁定目标群,可省;QQ 用 chatId 作 openid/group_openid,必填。
  • 语义:会话级绑定、重复绑定即换目标(覆盖)、多会话可指向同一账号;抄送文本带 [源渠道/会话短id] 前缀与同款收轮后缀;投递结果不明时绝不自动重发,失败落 plugin.log。
  • /new 轮换后新会话不继承旧绑定(需重新 /relay);一个会话同时只指向一个通知账号。

侧栏「任务 / 频道」

插件把宿主侧栏包成两个自持页签:任务=官方会话树(已过滤 IM 会话,不会冒出「未分组」条目)、频道=按渠道分组的 IM 会话列表(搜索、运行状态点、点击打开)。检测到侧栏已被其它插件接管时完全不插手,此时渠道列表退化为设置面板内的卡片。

模型白名单

设置面板「模型白名单」框一行一个 provider/model(留空=不限)。非空时 /models 只列白名单内、/model 越界被拒并回列可用项;账号级模型偏好不受约束。用途:模型异常时 IM 远端仍有可切的兜底集合。

图表(svg → 图片)

需要图示时让助手输出一个 svg 代码围栏(完整内联 SVG、白底深色前景、宽 ≤1000),插件会渲染成 PNG 作为图片消息发出;渲染依赖不在位或渠道不支持图片时降级为纯文字,不阻断回答。

IM 简洁预设

插件向宿主注册 im-concise 预设并作为 IM 会话默认:persona 完整模式(从源头阻断 GenUI 围栏、裸 HTML 等富结构注入)+ 简短纯文字纪律。账号「会话偏好 → Agent 预设」可改用其它预设;出站净化作为兜底安全网始终生效。

管理 API

/api/dsh-im-union/* 复用宿主登录态(每请求过 Host/Origin/Cookie 三查),回包零凭据零内部异常细节:

组端点
探针/ping /state
账号/accounts /accounts/save /accounts/pause /accounts/remove /accounts/allowlist /accounts/check
目录/session-catalog /channels
扫码/weixin/qr/start /weixin/qr/status
主动投递/proactive/send /proactive/targets /proactive/targets/remove /proactive/syncback
抄送与白名单/relay-bindings /relay-bindings/bind /relay-bindings/unbind /model-whitelist
其它/connector/jobs /connector/jobs/cancel /wecom-app/callback(第三方回调,验签即认证)

开发

npm install
npm run typecheck
npm test
node scripts/sync-hosts.mjs --write   # 宿主版本声明单源下发

相关插件