前言¶
在 DSH 里用任务看板并行派卡时,常见做法是:对话里把活拆成几张卡,让它们在各自执行会话里跑,自己先去做别的事。看板能管派卡与执行,但宿主会话不会自动知道「哪张卡跑完了、卡在哪一步卡住要问人」。于是要么隔一阵回对话问进度,要么设定时唤醒让 agent 自己查板——本质都是人肉轮询。更麻烦的是:卡在执行会话里调用 ask_user_question 时,看板侧往往没人守着提问面板,卡会停在那里等。
下面介绍社区插件 dsh-task-settle-notify(维护者 chenvinc):它不派卡、不执行、不改看板账本,只订阅看板「卡结算」事件,并把结算摘要与中途提问中继到发起那张卡的那条会话。分类属于 DSH 插件目录中的「工作流」。
这是什么¶
dsh-task-settle-notify 的定位可以概括成一句话:任务看板上的卡片执行结束(或中途需要用户决策)时,通过宿主会话网关把消息排队投进发起会话,而不是广播或弹全局窗。
与「只负责建卡、排队、跑卡」的看板类插件互补:本插件依赖已有 taskBoard 服务与 provider extension 契约,自己只注册扩展、只读事件。手写卡片、定时任务发起的卡没有「发起会话」,插件按设计不通知——补的是「从对话里派出去的卡」这条回程线。
核心功能¶
结算通知¶
看板每跑完一张卡会向订阅者广播结算。插件旁路订阅该事件,回查本次执行的发起会话,经去重、父子关系判断与合批后,用 session/prompt 投递消息。
行为要点(资料中的设计说明):
- 只回发起会话:不广播,宿主始终只跟一个窗口说话。
- 排队不抢断:会话正忙则等当前回合结束,不打断手上的活。
- 合批与优先级:默认 30 秒窗口内多张成功卡合成一条;失败卡不参与合批,立刻单发;父卡结算时可汇总子任务一行摘要。
- 无轮询:不监听账本文件,也不打断进行中的回合。
单卡成功消息示例(正文格式来自 README):
〔看板〕M2-B 已结算 · 成功 · 用时 9 分(会话 session-9f3c…)
产物在 src-tauri/src/kp_document.rs
失败卡示例:
〔看板〕构建 Linux 包 已结算 · 失败 · 用时 2 分(会话 session-9f3c…)
原因:cargo build failed: linking with `cc` failed
下一步:查看 ~/.dsh/dsh-task-settle-notify/trace.log,或重跑该卡
卡片提问中继¶
卡在执行中调用 ask_user_question 时,插件可拦截并把题目原样推进发起会话;宿主侧用 answer_card_question 结构化交回答案,卡继续执行。默认开启,等待时限默认 10 分钟(可配置 60–3600 秒)。时限内无人答,卡会按文档说明收到保守继续的提示,并在结果里写明待确认点。
中继开启后,该题不再走看板/GUI 的提问面板,只走发起会话这一路。
设置与观测¶
Web 侧设置入口:设置 → 任务结算通知。六项包括:总开关、合批窗口(默认 30 秒)、只看自己发起的卡、父卡是否汇总子任务、卡片提问中继、提问等待时限。也可直接编辑:
~/.dsh/profiles/web/task-settle-notify/settings.json
运行状态可 HTTP 查询(默认 DSH Web 端口示例):
curl -s http://127.0.0.1:3080/api/task-settle-notify/status
extensionActive: true 表示已接上任务看板扩展;未安装或未提供 taskBoard 时插件静默待命,不影响看板本身。
依赖与环境¶
| 依赖 | 要求 |
|---|---|
| DSH 宿主 | ≥ 0.2.1-rc.2 |
| 任务看板 | @linxin666/dsh-client-ui-task-board ≥ 0.4.8(provider extension v1) |
| Node | ≥ 20 |
@deepseek-ai/cordis |
~4.0.5(peer,由宿主提供) |
会话投递依赖宿主自带的 typertGateway。README 记录已实测组合:DSH 0.2.1-rc.2、看板 0.4.8、Node 24.19.0、macOS;其它平台资料写明未测、理论上可跑。
npm 包名 dsh-task-settle-notify,当前资料中版本 0.2.0,许可证 MIT。插件以当前 DSH 进程权限运行;安装前建议自行查看 GitHub 源码 与 LICENSE。
安装与启用¶
官方 README 给出的两条步骤(profile 为 web):
dsh plugin --profile web add dsh-task-settle-notify
再把 "dsh-task-settle-notify" 加进 ~/.dsh/profiles/web/package.json 的 dsh.profile.bundles。
若从源码安装,在仓库目录执行(脚本会备份 profile 相关文件并以 link: 写入 bundles):
git clone https://github.com/chenvinc/dsh-task-settle-notify.git
cd dsh-task-settle-notify
node scripts/install.mjs
profile 未开 live reload 时需重启一次 dsh web。卸载:node scripts/uninstall.mjs。
典型用法与验证思路¶
1、在宿主会话中通过看板派卡,允许会话结束或去做其它事;卡在执行会话中自行跑完或中途提问。
2、结算或提问消息会在下一轮边界进入发起会话(不抢断当前回合)。中途提问时,按消息中的 card_question_id 调用 answer_card_question 作答。
3、用 GET /api/task-settle-notify/status 查看 delivered、failed、relayed 等计数;深度复现步骤与日志片段见仓库 docs/VERIFICATION.md。
README 还给出 2026-10-28 真机链路:提问中继 → 代答 → 卡收尾 → 约 30 秒合批窗口后结算消息投递(delivered: 1, failed: 0)。单元测试资料写 60 条,node --test 通过,不依赖真实看板。
适用场景与边界¶
适合谁:已经在 DSH Web profile 里用任务看板并行派卡,希望宿主会话被动收到「完工/失败/产物路径」和「卡在中途要问的事」,而不是自己轮询看板或堆定时提醒。
务必留意的限制(摘自 README「边界」):
- 仅同一 Host、同一 profile;会话删除或跨机会失败并记入
error.log。 - cron 定时任务、非会话发起的卡:无回程地址,不通知。
- 重启不补发历史结算;投递成功只表示消息进队列,不等于人已读。
- 消息正文目前只有中文;设置卡已中英双语。
- 自由文本需由宿主会话通过
answer_card_question结构化交回,插件不解析自然语言。
契约与模块划分见 docs/ARCHITECTURE.md、docs/CONTRACT.md。
结尾¶
dsh-task-settle-notify 把看板执行层的噪音留在执行侧,只把你必须知道的结算与提问推回派卡的那条会话;与看板插件分工清晰,适合作为工作流里的「回程通知」层。
- 插件目录页:https://www.skillhub.cn/plugins/chenvinc/dsh-task-settle-notify
- 源码与完整文档:https://github.com/chenvinc/dsh-task-settle-notify
DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。本插件为社区作品,非 DeepSeek 官方项目。