配置驱动生命周期 hooks:在 cordis.patch.yml 声明事件→命令,附飞书卡片通知与扫码一键创建机器人。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-hooks
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:PeterBon/dsh-hooks
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本。请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DeepSeek Harness(dsh)的配置驱动生命周期 hooks 插件。
直接在 profile 的 cordis.patch.yml 里声明「事件 → 命令」——就像 Codex CLI / OpenCode 的 hooks,但属于 dsh。不需要写插件代码。
安装
dsh plugin --profile web add dsh-hooks # 从 npm 安装
# 或直接从 git 安装:
dsh plugin --profile web add github:PeterBon/dsh-hooks
重启 dsh web 生效。
配置
在你的 profile 的 cordis.patch.yml 里添加配置块:
- id: dsh-hooks
name: dsh-hooks
config:
hooks:
- on: 'turn/end'
when: 'completed' # 可选:只在回合正常完成时触发
run: 'node examples/notify-feishu.mjs'
timeoutMs: 10000 # 可选,默认 10000
- on: 'approval/asked'
run: 'powershell -Command "Add-Content hooks.log approval-requested"'
事件(v1)
| 事件 | 触发时机 | 有用上下文 |
|---|---|---|
turn/start |
回合开始 | 会话 id、回合号 |
turn/end |
回合结束(completed / error / aborted / blocked / max-tokens / interrupted) |
reason、回合号、耗时 |
approval/asked |
工具调用请求用户审批 | 工具名、调用 id、原因 |
agent/created |
Agent 发布 | 会话 id |
agent/disposed |
Agent 离开注册表 | 会话 id |
agent/error |
Agent 循环报错 | 错误文本 |
agent/status |
Agent 状态切换 | 状态 |
turn/end 的 when 匹配结束原因(completed、error…);其他事件的 hook 无条件执行。
命令执行
- 每个命中的 hook 通过系统 shell 执行
run,fire-and-forget:失败只console.warn,绝不重试、绝不阻塞 agent 循环。 - 上下文通过环境变量传递(数据不拼接进 shell 字符串,防注入):
| 变量 | 含义 |
|---|---|
DSH_HOOK_EVENT |
事件类型,如 turn/end |
DSH_HOOK_SESSION_ID |
会话 id |
DSH_HOOK_SESSION_NAME |
会话可读标题(最新 session/title 日志事件,或首个用户消息回退) |
DSH_HOOK_TURN |
回合号(回合事件) |
DSH_HOOK_REASON |
回合结束原因 |
DSH_HOOK_TOOL |
工具名(审批事件) |
DSH_HOOK_CALL_ID |
工具调用 id(审批事件) |
DSH_HOOK_DURATION_MS |
回合耗时毫秒(turn/end) |
DSH_HOOK_STATUS |
Agent 状态(agent/status) |
DSH_HOOK_ERROR |
错误文本(agent/error,以及 turn/end 出错时的失败详情) |
DSH_HOOK_CONTENT |
该回合最后一段助手回复文本(回合事件) |
DSH_HOOK_TIMESTAMP |
ISO 时间戳 |
run里的{{变量}}占位符会从同一上下文替换,例如run: 'echo {{DSH_HOOK_SESSION_ID}} >> log.txt'。
飞书通知示例
最快的方式是一步到位的 setup CLI——扫码自动创建飞书应用并写好全部 hook 配置:
dsh-hooks feishu-setup # 默认 profile:web
dsh-hooks feishu-setup --profile work # 指定其他 profile
dsh-hooks feishu-test # 用已存凭据发送测试卡片验证
feishu-setup 会打印二维码(并在浏览器中打开),等你用飞书扫码后,自动创建名为「DSH 通知机器人」的应用(带消息发送权限),并写入:
| 文件 | 用途 |
|---|---|
~/.dsh/dsh-hooks/feishu-config.json |
app id/secret 与你的 open_id(通知目标),权限 0600,严禁提交;result_max_chars 控制卡片内容截断长度(默认 300) |
~/.dsh/dsh-hooks/notify-feishu.mjs |
hook 引用的通知脚本稳定副本 |
~/.dsh/profiles/<profile>/cordis.patch.yml |
dsh-hooks 配置块:turn/end(completed/error/aborted)+ approval/asked + agent/error 卡片 hook |
完成后重启 dsh web——回合结束、请求审批、agent 出错时就会收到卡片通知。
手动配置
想自己接线?见 examples/notify-feishu.mjs——零依赖脚本,通过飞书应用 API(不需要群自定义机器人)发送回合完成 / 审批通知。配置示例:
- id: dsh-hooks
name: dsh-hooks
config:
hooks:
- on: 'turn/end'
when: 'completed'
run: 'node D:/path/to/examples/notify-feishu.mjs'
- on: 'approval/asked'
run: 'node D:/path/to/examples/notify-feishu.mjs --approval'
同时在 dsh 进程环境中提供 DSH_HOOKS_FEISHU_APP_ID / DSH_HOOKS_FEISHU_APP_SECRET / DSH_HOOKS_FEISHU_TO(绝不能写进配置文件)。
安全
Hook 会以 dsh 进程的权限执行任意命令,只配置你信任的命令。Secret 放环境变量或 dsh 凭据存储——永远不要写进 cordis.patch.yml。
设计
遵循 dsh 插件约定:dsh.bundle.patch 挂载插件行;插件监听持久 session/event firehose 与 agent 生命周期事件;发射是不可逆副作用,补偿而非阻塞(失败仅警告、绝不重试)。
开发
pnpm install
pnpm run check # typecheck + test + build
发布与 CI 运维(Trusted Publishing、安全扫描、踩坑记录):见 docs/RELEASING.md。
License
MIT
链接
同类插件
omdsh-dev/dsh-notification★ 49
回合完成桌面通知,按结果分控 + 关键词过滤。
omdsh-dev/dsh-open-in-vscode★ 46
从 Web GUI 一键在 VS Code 中打开工作区目录。
whyihaveyou/dsh-suite#plugin-notify★ 27
回合完成、错误或待审批时推送 IM webhook(飞书/企微/钉钉/Slack/Discord/自定义)与本地通知。
omdsh-dev/dsh-lark★ 17
DeepSeek Harness 的飞书/Lark 机器人渠道:每个会话驱动独立 agent,工具审批、模型提问与计划审阅都以卡片回到聊天,点按钮或直接回复即可作答;聊天里用 `/cd`、`/model`、`/new` 切工作区、换模型、重开会话,多个机器人各自独立并可在同群交接回合。
bill9109/dsh-web-ui-notify★ 12
桌面通知提醒。
bobleer/dsh-acp-for-bitfun★ 9
BitFun 与 DSH 的 ACP 交互对接。