dsh-connect
by IvanWu2015
桥接DeepSeek Harness (DSH)代理至飞书/Lark与钉钉 — 在您的消息应用中聊天、流式回复和安排工作。
Bridge DeepSeek Harness (DSH) agents to Feishu/Lark & DingTalk — chat, stream replies, and arrange work from your messaging app.
安装
dsh plugin --profile web add github:IvanWu2015/dsh-connectGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗
安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。
README
English | 中文
将 DeepSeek Harness(DSH)智能体接入聊天平台——优先飞书 / Lark,钉钉等更多平台随后跟进。从你的聊天应用发送任务,观看智能体实时流式执行,保持多轮上下文,任务结束时自动把结果摘要推送回来。
功能特性
- 双向消息:飞书消息 → DSH 智能体(
agent.followup);智能体的回复以打字机风格的卡片流式回传到飞书。 - 多轮上下文:每个飞书会话(私聊或群聊)都绑定一个 DSH
Session,进程重启后自动resume。 - 工作安排:任务结束时推送结果摘要卡片;
ctx.connect.notify()让 goals/jobs 钩子可以主动推送进度。 - 任务结束统计:任务完成时,卡片报告所用模型、输入/输出/缓存 token 数、步数、耗时与上下文占用率;当上下文占用 ≥ 75% 时给出
/compact建议。 - 通知级别:
full(全量流式)/important(关键里程碑,默认)/result(仅答案)——每个会话可通过设置菜单或/notify切换,重启后保持。 - 即时反馈 + 主动进度:每条任务收到后立即确认(“✅ 已收到,开始处理”,繁忙时附带排队消息数);关键里程碑(思考、带步数计数的工具调用、提问、权限)实时响应;可配置的看门狗在一轮对话静默过久时(默认 5 分钟,可通过
/progress或/settings按会话调整)推送一张独立的状态卡片。 - 首次欢迎:每个会话的第一条消息触发一次性欢迎卡片,介绍机器人的能力与常用命令。
- 可操作的错误提示:失败的任务显示与错误匹配的建议——权限 / 网络 / 模型配额问题各有对应的修复提示,而不是一行裸的错误字符串。
- 安全的破坏性操作:
/clear、/new和菜单中的“新建对话”都会先请求确认,历史记录绝不会被误清。 - 聊天中的用户选择与权限审批:当智能体提问(
ask_user_question)或请求权限审批(沙箱升级等)时,飞书里会直接出现带按钮的交互卡片——点按或回复文字(数字或选项标签)即可作答,无需打开 Web GUI。 - 安全:群聊默认要求 @提及;用户/会话允许列表;飞书凭据通过环境变量或配置提供。
- 交互式菜单:
/menu提供层级化点按导航(workdir / chats / settings / plugins / compact 等)——同一张卡片就地更新,支持返回/退出,连续操作中持续可用。 - 智能图片与文件处理:发送给机器人的图片自动下载;主模型若支持视觉则直接查看,否则由视觉模型子任务生成描述并注入——纯文本主模型不会在图片上卡住。附件/音频/视频也会下载到 workdir。
- Web 镜像:每个会话可将其 DSH 会话镜像到 DSH Web GUI(
/mirror,或通过autoMirror自动开启)。镜像锁只在飞书侧强制(lockOwner):Web GUI 直接读写 DSH 会话、从不查询锁,因此互斥是单侧的(仓库层面无法修复,已如实记录)。/new、/clear或切换会话会重置镜像指向;autoMirror会为新会话重建镜像。 - 本地命令(不消耗模型 token):
/status/task/chat/dir/workspace/workspaces/plugins/compact/history/export/goals/schedule/model/notify/progress/mirror/unlock/renew/new/clear/stop/settings/help。 - 可扩展、多平台:
dsh-connect(通道无关核心)+ 各通道适配器包——dsh-connect-feishu(飞书/Lark 双向)、dsh-connect-telegram(Telegram 双向)、dsh-connect-dingtalk(钉钉单向群推送)。新增一个通道只需再写一个适配器包。
仓库结构
packages/
connect/ dsh-connect core: services, bindings, runner, streaming bridge, commands
connect-feishu/ dsh-connect-feishu Feishu adapter: createLarkChannel long connection, normalization, streaming replies
connect-telegram/ dsh-connect-telegram Telegram adapter: Bot API long-polling, streaming edits, inline-keyboard choices
connect-dingtalk/ dsh-connect-dingtalk DingTalk group-webhook push: text/markdown/@-mention notices (one-way)
connect-web/ dsh-connect-web Web mirror adapter: tracks mirror sessions for DSH Web GUI (no synthesized messages; outbound is a contract no-op)
docs/
QUICKSTART.md step-by-step run guide (DSH side + Feishu side)
feishu-setup.md Feishu Open Platform configuration manual
telegram-setup.md Telegram BotFather setup manual
dingtalk-setup.md DingTalk group custom-robot setup manual
PUBLISHING.md naming + GitHub/npm discoverability guide
examples/
profile-cordis.patch.yml
通道矩阵
| 通道 | 包 | 方向 | 传输方式 | 说明 |
|---|---|---|---|---|
| 飞书 / Lark | dsh-connect-feishu |
双向 | WebSocket 长连接 | 功能完整(流式、菜单、图片) |
| Telegram | dsh-connect-telegram |
双向 | Bot API 长轮询 | 功能完整(流式编辑、内联键盘) |
| 钉钉 | dsh-connect-dingtalk |
单向推送 | 群机器人 webhook | 单向推送服务(sendMarkdown / sendText / @提及)——不能接收消息 |
所有双向适配器共享同一个 dsh-connect 核心:命令、/menu、通知级别、主动进度看门狗、交互式选择与审批以及按会话设置,在每个通道上行为完全一致。
快速开始
安装
5 个包在每次 GitHub Release 时自动发布到 npm——.github/workflows/publish.yml 会先运行 pnpm build + typecheck,再串行发布 5 个包。直接安装到你的 DSH profile:
dsh plugin --profile web add dsh-connect dsh-connect-feishu dsh-connect-telegram dsh-connect-dingtalk
本地开发(包尚未发布时)请按 快速开始 中的绝对路径方式加载本地构建的包。
配置
在 profile 的 cordis.patch.yml($DSH_HOME/profiles/web/cordis.patch.yml)末尾追加一个 insert 块(Host 平面):
- insert:
- id: connect
name: dsh-connect
- id: connect-feishu
name: dsh-connect-feishu
config:
appId: cli_xxxx
appSecret: cli_secret_xxxx
transport: websocket
requireMention: true
dmMode: open
- id: connect-telegram
name: dsh-connect-telegram
config:
botToken: "123456:ABC-YourBotToken" # from @BotFather
requireMention: true
- id: connect-dingtalk
name: dsh-connect-dingtalk
config:
webhookUrl: "https://oapi.dingtalk.com/robot/send?access_token=xxx"
运行
重启 dsh web(Host 插件需要进程重启才能加载),按 飞书配置、Telegram 配置 或 钉钉配置 完成平台侧的订阅,然后与机器人聊天。
详细的分步指南(包括飞书侧配置与验证)见 快速开始。
命令列表
| 命令 | 说明 |
|---|---|
/menu |
打开主菜单(层级化点按;同一张卡片就地更新;支持返回/退出) |
/settings(/set) |
设置:切换模型 / 推理力度 / 通知级别 / 配置概览 |
/model |
显示当前模型,点按切换 |
/notify(/notice) |
选择通知级别:full / important / result(立即生效) |
/progress |
选择静默任务在收到主动进度卡片前可运行多久(默认 5 分钟;关闭 可禁用) |
/mirror [--timeout N] |
为本会话创建(或显示)Web 镜像会话;可选锁超时分钟数 |
/unlock |
手动释放会话锁(仅飞书/Web 镜像场景) |
/renew(/renew-lock) |
续期当前会话锁超时 |
/status |
会话状态、模型、workdir、队列长度、上下文 token、会话 ID |
/task(/tasks /todo) |
显示当前任务列表 |
/schedule(/reminders) |
显示本会话的定时提醒 |
/chat(/session /sessions) |
列出会话;点按切换或新建 |
/dir(/cd /pwd) |
切换 workdir(点按选择,或 /dir <绝对路径>) |
/workspace <绝对路径> |
创建新的工作区 |
/workspaces |
列出所有工作区 |
/plugins |
列出已安装插件 |
/compact |
压缩当前会话上下文 |
/history [count] |
显示最近的会话消息 |
/export [markdown|pdf] |
导出对话历史为 Markdown(pdf 暂不支持,会提示) |
/goals |
显示当前目标 |
/new(/reset) |
开始新对话(请求确认) |
/clear |
清空当前对话(请求确认) |
/stop(/cancel) |
停止当前任务 |
/help |
列出所有命令 |
所有
/命令都由插件在本地执行,不消耗模型 token;其他任何文本都会作为任务发送给 DSH 智能体。
配置
dsh-connect(核心)
| 键 | 默认值 | 说明 |
|---|---|---|
agentPreset |
未设置 = roster 默认 | 每个绑定会话使用的智能体预设(如 standard) |
workDir |
第一个 DSH 工作区 | 智能体工作目录(绝对路径,可显式设置) |
workspaces |
[] |
/dir 交互选择器中列出的工作目录 |
visionModel |
自动检测 | 图片子任务的视觉模型 {provider, model};未设置时自动检测第一个支持图片的模型 |
language |
zh |
面向用户的消息语言:zh(默认)或 en |
allowUsers |
[] |
发送者允许列表(空 = 允许所有人) |
allowChats |
[] |
会话允许列表(空 = 允许所有人) |
stateDir |
./.dsh-connect |
绑定路由 bindings.json 的存放目录 |
autoMirror |
true |
为每个新会话自动创建 Web 镜像会话 |
streamHeartbeatMs |
60000 |
流式卡片存活心跳间隔(毫秒);0 禁用 |
notifyLevel |
important |
默认通知级别:full(全量流式)/ important(关键里程碑)/ result(仅答案);可通过 /settings 或 /notify 按会话覆盖 |
progressTimeoutMs |
300000 |
主动进度通知间隔(毫秒):一轮对话在此时间内未发送任何内容时,推送一张独立状态卡片;0 禁用;可通过 /settings 或 /progress 按会话覆盖 |
dsh-connect-feishu(飞书)
| 键 | 默认值 | 说明 |
|---|---|---|
appId / appSecret |
环境变量 FEISHU_APP_ID / FEISHU_APP_SECRET,或一键开通 |
应用凭据(未设置时进入开通模式,通过扫码创建应用) |
transport |
websocket |
websocket(默认,长连接);webhook 需要公网 HTTPS 回调地址,适配器自带 HTTP 服务并自动应答 url_verification 挑战 |
webhookPort |
9000 |
webhook 传输模式的 HTTP 监听端口 |
webhookPath |
/ |
飞书事件回调路径 |
verificationToken / encryptKey |
空 | 仅 webhook 模式需要 |
requireMention |
true |
群聊仅在 @提及机器人时响应 |
dmMode |
open |
私聊策略:open / allowlist / pair / disabled(disabled = 忽略私聊) |
language |
zh |
面向用户的消息语言:zh(默认)或 en |
一键开通:不带
appId/appSecret启动插件,它会打印一个开通链接(约 10 分钟有效)。用飞书扫码(或点击并确认),机器人应用即自动创建,权限与事件订阅均已预设;凭据保存到$DSH_HOME/.dsh-connect/feishu-credentials.json。
工作原理
- 智能体创建/恢复:复用标准 DSH 驱动模式(见
dsh-headless)——ctx.agents.create({ meta:{cwd, agentPreset}, agentOptions:{provider,model}, setup });恢复走ctx.agents.resume。每个会话的模型选择由 DSH api-proxy 负责(selectionFor),因此在 Web GUI 中切换模型会应用到绑定会话。 - 预设挂载:
setup挂载配置的智能体预设(ctx.agentPresets.mount),为绑定会话提供标准工具集(bash/fs/…)。 - 流式:
session/event上的assistant/chunk事件(推理/文本增量、块开始/结束)通过createAsyncQueue桥接到飞书流式卡片;块之间以空行分隔,推理实时流式输出,工具调用显示状态行,可配置的心跳在长静默阶段保持卡片存活。turn/end决定回合结果并发布任务统计卡片。 - 主动进度:每条消息立即确认;若在
progressTimeoutMs内未发送任何独立卡片/文本,则推送状态卡片报告最新里程碑(思考 / 最近一次工具调用),长回合看起来不会卡死。 - 交互式选择与审批:插件作为宿主 api-proxy(
ctx.apiProxy)的进程内客户端:订阅与 Web GUI 相同的 mux 流,将 connect 绑定会话的question/requested/approval/requested帧渲染为带按钮的飞书卡片,并通过apiProxy.respond回传用户的答案——Web GUI 保持完全可用,先到者先答。 - 串行化:每个 chatKey 对应一个
AgentRunner——消息排队串行执行;agent.followup天然排队。
测试
5 个测试套件,全部使用 node:test(需先构建 lib/):
pnpm build # build first (generates lib/)
pnpm test # 5 个测试套件,全部 node:test
packages/connect/test/unit.test.mjs+packages/connect/test/smoke.mjs(connect 核心套件):命令解析、绑定持久化、异步队列、回合结果推导;以及把插件加载进真实 Cordis 上下文验证插件契约,含isChatAllowed允许列表预过滤断言。packages/connect-dingtalk/test/unit.test.mjs:签名校验、重试/限流、20000 字符截断。packages/connect-telegram/test/unit.test.mjs:HTML 转义、@提及判断、offset 确认语义。packages/connect-feishu/test/unit.test.mjs:按钮网格、标签对齐、文件名清洗、错误提取。packages/connect-web/test/unit.test.mjs:镜像记录、无合成消息回归测试。
文档
许可证
MIT
原始 README: https://github.com/IvanWu2015/dsh-connect/blob/main/README.zh.md ↗
同类插件
查看全部 →
dsh
将 DeepSeek Harness 的生命周期状态、错误与审批请求,桥接到本地运行的 OpenPets 桌面伙伴。

dsh-qqbot
让 QQ Bot 接入 DeepSeek Harness(dsh)的官方插件

dsh-open-in-vscode
从 Web GUI 一键在 VS Code 中打开工作区目录。

dsh-notification
回合完成桌面通知,按结果分控 + 关键词过滤。

dsh-notifier
DSH 统一通知推送与远程控制:一个 `notify()` API 打通 25+ 渠道(Telegram / 钉钉 / 飞书 / 企业微信 / QQ 机器人 / WxPusher / PushPlus / Server 酱 / Bark / Discord / Slack / ntfy / webhook 等),timeSensitive / active / passive 分级路由并重试;五通道反向审批(Telegram 按钮 / 飞书卡片 / QQ / WxPusher / 微信 iLink);QQ/钉钉/飞书官方扫码登录;本地 Web 管理台;多 agent 路由;系统桌面通知——以及**手机指挥中心**:在手机上发 `!status` / `!stop` / `!retry` 遥控 agent,通知带可操作按钮(查看结果 / 重试 / 日志,点击回调 agent)。密钥脱敏、工具限流、零运行时依赖。

chatccc
飞书(Lark)或微信(WeChat)聊天控制 DeepSeek Harness / Claude Code / Cursor / Codex / CCC Agent