Passer au contenu principal
D

dsh-im-union

drscrewdriver/dsh-im-union

Union IM bridge for DSH — an independent implementation uniting the capability sets of community peer plugins (xmanrui/dsh-im, MichengAI/dsh-im-connect). Drive your agent session from 15 channel adapters across 12 platforms (including email; WeCom/DingTalk/QQ each contribute two: bot + self-built app or notify tier) — WeChat (official iLink QR bind), Feishu/Lark (long-connection + streaming cards; the voice tier requires system ffmpeg), Telegram, Discord, WeCom intelligent bot & self-built app (signed callback), DingTalk (stream + AI Card and custom-robot notify), QQ official bot (plus notify tier), Slack (Socket Mode), WhatsApp (Baileys QR pairing; the dependency ships as an optionalDependency of the plugin package), Matrix, iMessage (macOS only), Email (IMAP/SMTP thread routing). The cross-version narrow waist auto-adapts settings gen1/gen2/gen3 across hosts 0.1.2-rc.1→0.2.1-rc.2 (12-tag enum; rc.2 verified by a real desktop-profile install with double read-back) using capability probing only, never version branches. In chat: a 25-command panel, tool-approval and question loops answered in the originating chat (deny-by-default, initiator-only, 5-min expiry), image/file input gated on host model metadata, deliverable file return, a delivery log with bounded retry (uncertain is never re-sent), proactive delivery and fragment composition. It also splits the native sidebar into self-owned Tasks / Channels tabs (standing down entirely when another plugin already owns the slot), registers an `im-concise` agent preset plus reply sanitisation that keeps GenUI fences and raw HTML out of text-only chats, renders `svg` fences to PNG images, guards model choice with an allowlist, and mirrors each turn's final answer to notify channels via `/relay` (addressed by account ID or alias, never guessed on ambiguity). Secrets are one-way into the vault and never echoed back. npm: `dsh-im-union`.

Installer

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   # 宿主版本声明单源下发

Plugins associés