dsh-plugin-feishu: Running DSH Sessions via Persistent Connections in Feishu

前言

把 DSH(DeepSeek Harness)接到 IM 上,常见做法是另起一个桥接进程,再配公网回调或 ngrok。对只想在本机出网、不想多维护一个守护进程的场景,这套链路偏重。

dsh-plugin-feishu 是 maintainer suveng 发布的 DSH 客户端类插件(cordis 插件包):装进 profile 后由 DSH 进程加载,通过飞书 / Lark 长连接(WebSocket) 收消息,回复以流式卡片写回。思路与同作者的 pi-feishu-bridge 相近,但嵌在宿主进程里,用 DSH 自己的 Agent API 驱动会话。

下面介绍定位、能力、安装配置与使用注意。

这是什么

  • 名称:dsh-plugin-feishu(npm 包名一致,当前资料中版本 0.6.2,MIT 许可证)。
  • 维护者:suveng;源码与说明见 GitHub 仓库,社区目录页:skillhub.cn/plugins/suveng/dsh-plugin-feishu。
  • 一句话:把 DSH 会话接进飞书 / Lark 长连接,回复以流式卡片回写;不需要另起守护进程,不需要公网回调地址。

插件安装后默认处于休眠状态(无凭证时只打 warn,不影响 dsh --dump-config 与其它插件)。凭证配好后自动连上。

核心功能

资料中列出的能力如下(节选,均以 README 为准)。

会话与消息

能力 说明
单聊 / 群聊 / 话题 一个飞书会话对应一个 DSH 会话;话题(thread)单独成会话
会话保持 飞书会话 ↔ DSH 会话映射落盘,DSH 重启后可接着聊;网页端同会话能复用则直接复用
消息串行 同一会话连发多条按顺序处理,避免两条消息抢同一轮次
内容去重 同一会话 5 秒内完全相同的一条文字只处理一次

回复与交互

  • 流式卡片:边生成边往卡片里写,轮次结束卡片转终态。
  • 正文模式:默认 replyBodyMode=final,只把本轮最终回复写进卡片正文;中间旁白、思考收进「执行过程」折叠面板(live 可退回旧行为)。
  • 执行过程:工具调用在卡片顶部折叠面板逐条显示步骤、成败与耗时。
  • 停止按钮:卡片末尾「停止」等价于 /stop。
  • 表情回执:收到消息先挂「收到」类表情(默认 Get),跑完 DONE,失败 CRY(可关或自定义收到表情)。
  • 引用展开:回复某条消息时,被引用内容以 [Quoted message] 前缀附在正文前(可配置字数上限)。
  • 选择题:模型用 ask_user_question 时,问题以卡片发到飞书,可点按钮、在输入框填写(最多 200 字)或直接回文字。

权限与安全

  • 权限白名单 allowedOpenIds:只认指定 open_id;留空则谁都能用(README 建议自用也配一下)。
  • 群聊 @:默认 requireMentionInGroup=true,群里需 @ 机器人才响应;不 @ 也要响应时需开「获取群组中所有消息」并设 requireMentionInGroup=false。

斜杠命令与身份

斜杠命令不进模型上下文:/new、/stop、/status、/cwd、/whoami、/help。

每条普通消息首行带提问人来源摘要(如 【飞书 · 群聊|单聊 · …】);详细字段可通过飞书专用工具 feishu_identity 查询。

仅在飞书发起的轮次里可见的飞书工具包括:feishu_identity、feishu_send,以及审批相关 feishu_learn_approval_submit / feishu_learn_approval_status(审批定义号在插件「审批」分组配置)。

工作原理(概要)

飞书客户端经长连接上报 im.message.receive_v1 → 插件内 FeishuBridge 做归一化、去重、白名单与 per-session 串行队列 → 斜杠命令本地处理,普通消息进入 AgentPool,由 DSH Agent 跑一轮,经 assistant-stream 更新 ReplyCard,工具 call/result 同步进「执行过程」面板。

长连接为集群模式、不广播:同一 appId 多条连接时事件随机落到一条。一个飞书应用只应配一个 DSH 实例;多工作区请各建独立应用。

环境要求

  • Node.js >= 22
  • DSH >= 0.2.1-rc.2,< 0.3.0
  • 飞书企业自建应用,并开通 README 所列 IM、通讯录(可选)等权限;事件订阅方式为使用长连接接收事件(含 im.message.receive_v1;选择题需额外长连接订阅 card.action.trigger)。

国际版 Lark 将 domain 设为 https://open.larksuite.com。

安装与启用

官方 README 给出的安装方式如下(不要自行拼接未在文档出现的 github:owner/repo 形式):

# 从本地目录安装(开发 / 自用)
dsh plugin --profile web add /absolute/path/to/dsh-plugin-feishu

# 发布到 npm 之后
dsh plugin --profile web add dsh-plugin-feishu

插件自带 cordis.patch.yml,安装后在 bundle 中插入 id 为 feishu 的插件行。

可选:将仓库托管的插件索引添加为 DSH 自定义索引源(插件页 → 实验性插件 → 自定义插件索引 → 发现 → 添加):

https://raw.githubusercontent.com/suveng/dsh-plugin-feishu/main/market/index.json

DSH 不内置索引源;索引由发布者托管,安装前自行判断是否信任来源。

配置(三种方式)

优先级:界面 / 配置文件 > 环境变量。

推荐:侧边栏扫码创建应用

侧边栏 飞书 →「扫码创建应用」→ 飞书 / Lark 扫码确认。应用自动创建并作为机器人加入列表,插件即用该凭证连上。一个工作区可绑多台机器人(多 App ID,各一条长连接);配置形态为 bots: { "cli_xxx": { name, appSecret } }。

手动:App ID / App Secret

  • 侧边栏飞书图标 →「飞书 / Lark」表单,或插件页 dsh-plugin-feishu →「飞书 / Lark 连接」卡片。
  • 保存后插件自动断开重连,无需重启 dsh;连接状态经 GET /api/feishu.status 反映到界面(非「填了凭证就亮绿灯」)。

环境变量(密钥不落地 profile 时):

export DSH_FEISHU_APP_ID=cli_xxxxxxxxxxxx
export DSH_FEISHU_APP_SECRET=xxxxxxxxxxxxxxxxxxxx

配置文件示例(改 profile 内 cordis 配置后需重启 dsh):

- id: feishu
  name: dsh-plugin-feishu
  config:
    appId: cli_xxxxxxxxxxxx
    appSecret: xxxxxxxxxxxxxxxxxxxx
    workdir: /home/me/work/my-repo
    allowedOpenIds:
      - ou_xxxxxxxxxxxxxxxx

常用配置项(完整表见 README):

配置项 默认值 说明
workdir 跟随最近一次 dsh 会话工作区 飞书会话建在哪个工作区;显式填写则固定
agentPreset 本机 dsh 默认(如 ptc) 决定飞书会话挂哪些工具
permissionPreset 空(跟随 dsh 默认) 如 danger-full-access 关闭沙箱与审批;改配置后下一轮对话生效
allowedOpenIds [] 空 = 不限制
requireMentionInGroup true 群聊是否必须 @ 机器人
streamIntervalMs 700 卡片流式刷新间隔,不建议低于 200
progressMode steps 执行过程:steps / action / off
replyBodyMode final 卡片正文:final 或 live
approvalCode 空 飞书审批定义号;未配置时审批工具明确失败

执行过程、表情回执、引用展开等可在侧边栏 飞书 → 消息交互 分组里改,保存后下一轮消息生效。

典型用法

  1. 按上文安装插件并配置凭证(或扫码),确认侧栏飞书图标为已连接(绿点)。
  2. 在飞书单聊或群里 @ 机器人(若未改 requireMentionInGroup)发送任务描述;插件为每个飞书会话维护 DSH Agent,workdir 决定代码与文件操作落在哪个目录。
  3. 需要新开上下文时发送 /new;长任务可在卡片点「停止」或发 /stop。
  4. 若使用 /learn 等需人工把关的流程,可在插件配置 approvalCode,由模型走飞书审批工具,拿到 APPROVED 后再动文件(具体审批定义需在飞书后台准备)。

飞书侧新建的会话使用 profile 的默认模型(agent-default-model);与网页端是同一套 DSH 能力,只是入口在 IM。

适用场景与注意

适合:希望在飞书 / Lark 里直接驱动本机 DSH Agent、看重流式卡片与工具过程可视化、且能接受企业自建应用(或扫码创建)配置流程的开发者或小团队自用。

务必注意:

  • 插件在 当前 dsh 进程的权限下运行;permissionPreset 若设为高权限预设,飞书一条消息即可触发与本地终端等价的操作。安装前应阅读源码与 MIT 许可证,并配置 allowedOpenIds。
  • 依赖 DSH 0.2.x 与 Node 22+,大版本升级宿主前需核对 engines.dsh 范围。
  • 社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系;DSH 生态是「一切皆插件」,索引与包装由社区维护者自行发布。

结尾

dsh-plugin-feishu 把飞书长连接、DSH Agent 与会话持久化收进一个 cordis 插件:少一层桥接进程,也少公网回调。若要试用,可从目录页了解分类与简介,并按 README 安装、配凭证后直接在飞书里发消息验证流式卡片与斜杠命令。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye