tkwkeven/dsh-lark

dsh-lark

Feishu/Lark channel for DeepSeek Harness: prefix-created task sessions, thread routing, streaming thinking cards, interactive questions, media delivery, lifecycle notices, runtime policies, web mirror

待分类channelchatbotcordis

dsh-lark

English · 中文

为 DeepSeek Harness(DSH)提供飞书/Lark 渠道,基于 deepseek-harness-lark 桥接层构建。在原生桥接层之上增加了面向任务的工作流:通过前缀创建任务会话并支持话题路由、流式思考卡片、交互式提问、媒体投递、生命周期通知、运行时策略,以及 Web UI 镜像。

这是该插件的开源版本;此前它以三个独立包(dsh-lark-tasks + dsh-lark-policies + dsh-lark-mirror)维护,现已合并为一个。

功能特性

功能描述
任务会话通过主聊天前缀创建任务会话:ptc任务: / 标准任务: / 极简任务: / 创造任务: / 任务:(预设映射可配置)。一个任务 = 一个持久的 DSH 会话,管理与 Web 会话完全一致
话题路由任务话题内的每条消息都会被投递到该任务对应的会话——话题内无需再带前缀
流式卡片任务运行期间,思考过程会以流式方式写入话题内的交互卡片(事件驱动 + 每秒心跳)。每轮都会生成一张新卡片;已完成的卡片冻结在其最终状态
任务报告最终答案会作为同话题中的一条独立消息发送,带固定格式前缀(✅[dsh] [YYYY-MM-DD-任务-N],按日序号递增)
交互式提问ask_user_question 被重定向到飞书卡片按钮(支持文本回复兜底),不再依赖不可见的 Web 提示
媒体投递lark_send_media(图片/文件/音频/视频,≤30 MB)、lark_send_bigfile(>30 MB → 云空间 + 链接,查看权限授予发送者)、lark_create_doc(markdown → 飞书 docx 文档)
生命周期通知🔴 停机 / 🟢 恢复通知,投递到用户的私聊(自动学习或手动配置)
运行时策略精确匹配 restartCommandText(默认 重启进程)可重启 DSH 进程;单轮硬性时长上限(默认 6 小时);全局中文输出提示段落
Web 镜像将任务会话单向同步到 Web GUI:/lark-mirror/* 只读路由 + "飞书任务"侧边栏面板;任务会话归组到"飞书"工作区

安装

来自 deepseek-harness-lark 的原生 lark-channel 被禁用,由本插件取代。将包放到 DSH profile(plugins/ 或 node_modules/)下,然后在 cordis.patch.yml 中:

- id: lark-channel
  disabled: true
- insert:
    - id: lark
      name: dsh-lark
      config:
        appId: <your feishu app id>
        appSecretRef: LARK_APP_SECRET
        cwd: !!js process.env.DSH_LARK_CWD ?? process.cwd()
        lifecycleChatId: <optional: DM chat id for lifecycle notices>
        restartCommandText: 重启进程
        turnHardLimitHours: 6

凭据通过 DSH 凭据存储解析(appSecretRef 指向环境变量/凭据条目——切勿把密钥写进 patch 文件)。

配置

配置项是三个被合并插件键的并集。要点如下:

键默认值描述
appId / appSecretRef—飞书应用凭据(必填)
taskPresetsptc→code, standard→standard, minimal→minimal, creation→cordis, default→anchor-standard前缀 → agent 预设映射(default 同时服务无前缀消息与"任务:"前缀)
taskPermissiondanger-full-access固定到新任务会话上的权限预设('' 表示禁用;飞书没有交互式审批界面)
registryPath~/.dsh/lark/registry.json任务注册表持久化路径(可覆盖以保留旧布局的历史数据)
reportSymbol / reportIdentity / reportTaskLabel✅ / dsh / 任务任务报告前缀的各部分
restartCommandText重启进程触发重启 DSH 的精确用户消息
turnHardLimitHours6单轮硬性时长上限(小时;0 表示禁用)
questionEnable / questionTimeoutMstrue / 30 min飞书交互式提问行为
lifecycleChatId自动学习🔴/🟢 通知的私聊 chat id

已知上游问题

较长的 markdown/文本回复会被官方 SDK 分块发送,且只有第一个分块携带 replyTo——第 2 页及之后的内容会落到主聊天而不是话题中(影响较长的任务报告)。根因在 @larksuiteoapi/node-sdk 的 OutboundSender:

  • larksuite/node-sdk#205
  • sliverp/DeepSeek-harness-lark#1

在上游修复发布之前,请修补 dist/index.js 中打包的 SDK 代码(两处):

-          replyTo: i === 0 ? opts.replyTo : void 0,
+          replyTo: opts.replyTo,

(sendMarkdown 与 sendText 各 1 处,共 2 处;已在生产环境验证:所有分块页面都会留在话题内,@提及仍然只在第 1 页。)

开发

node --check lib/*.js
node test/self-test.mjs

许可协议

MIT