在 DeepSeek Harness(DSH)中,当开启 run_in_background: true 运行后台 bash 任务或后台子代理时,任务会注册 ctx.jobs 并在返回 job id 后使用 job cancellation 机制而非工具调用信号来控制。这意味着当用户点击停止按钮时,前台回复会被中断,但后台任务往往会继续运行。任务完成后,其完成通知会唤醒模型,导致为已取消的对话产生额外的请求。dsh-stop-kills-jobs 插件监听 UI 的 turn/end 事件,识别用户按停止的行为,并取消当前会话关联的后台任务,防止这种情况发生。
插件概况¶
这是一个客户端插件,由 Ezisup 维护,采用 MIT 许可证。它的核心作用是在用户主动中断对话时,一并结束本轮发起的后台任务。
安装¶
通过命令行添加插件:
dsh plugin --profile web add link:/xxx/dsh-stop-kills-jobs
安装后需要重启 DSH 才能生效(客户端部分需要重新加载)。
配置与使用¶
- 进入 设置 → 插件 → 插件配置,找到「停止时结束后台任务」卡片。
- 默认情况下该卡片是折叠的,点击标题展开。
- 卡片分为两部分:「停止时结束什么」和「插件自身的输出」。
- 停止时结束什么:控制是否结束后台 bash 任务和后台子代理,受总开关管辖。
- 插件自身的输出:显示提示和详细日志,与停止按钮无关,任何时候都生效。
- 总开关:默认开启。关闭总开关后,「停止时结束什么」整段隐藏(插件不做任何事),但已保存的设置会原样保留,重新开启即可恢复。
开关说明¶
| 开关 | 默认值 | 说明 |
|---|---|---|
| 启用 | 开 | 总开关,关闭即恢复 DSH 原行为 |
| 后台命令(bash) | 开 | 是否结束 run_in_background 的 bash 任务 |
| 后台子代理(subagent) | 开 | 是否结束后台子代理 |
| 在对话中显示提示 | 开 | 在设置页显示最近结束的任务 |
| 输出详细日志 | 关 | 将判断过程写入服务端日志 |
核心功能¶
- 监听与识别:监听 UI 的
turn/end事件,精确匹配reason?.kind === 'aborted' && reason?.reason?.kind === 'user',仅对用户主动点击停止的行为响应。 - 取消任务:利用授权凭据(
ctx.agents.get(session.id))取消当前会话及其子代理注册的后台任务。 - 防止唤醒:通过及时取消任务,防止任务完成后通知唤醒模型,避免已取消的对话产生额外请求。
- Verbose 模式:支持开启详细日志,便于排查任务未正常终止的问题。
注意事项¶
- 作用范围:仅影响当前会话发起的任务,不影响其他会话。
- 依赖环境:插件以当前 dsh 进程权限运行,使用前应检查源码与许可证。
- 会话隔离:子代理任务注册时使用
owner: parent,插件通过ownerSession过滤条件同时覆盖了父会话和子代理任务。 - 卸载:如需移除,使用
dsh plugin --profile web remove dsh-stop-kills-jobs,并重启 DSH。