在 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。