前言¶
DeepSeek Harness (DSH) 的插件化架構允許在運行時動態擴展能力。在 agent 執行耗時任務(如長文本生成、工具調用)時,傳統的交互模型往往要求用戶等待當前輪次結束,或者使用 steer 等待下一個 step 邊界。這會導致用戶在等待期間無法插入新指令,交互被割裂。
dsh-autofork 插件通過 harness 側的被動觸發機制解決了這個問題:當檢測到 agent 正在忙碌且無法被打斷時,用戶提交的新指令會自動在一條新的會話(分叉)中執行;原會話留在後臺繼續運行直至完成,跑完後將結果回注到前臺會話。這種機制將”必須等待”的串行交互轉變爲”隨時可插話”的並行交互。
核心功能¶
- 自動分叉:Agent 忙碌時,新指令自動觸發分叉,用戶立即在空閒會話中響應。
- 後臺續跑與回注:原會話不中止,跑完後將結果注入當前會話。
- 家族血緣視圖:提供”分叉”頁籤,展示分叉會話的血緣樹。
- 工具集:暴露
fork_list、fork_steer、fork_cancel三個工具供前臺調用。 - 容器模式:實驗性功能,嘗試將消息交給綁定實例處理。
安裝與啓用¶
通過官方插件命令安裝:
dsh plugin --profile web add github:vlln/dsh-autofork
安裝後需重啓 web 進程,bundle 會重新加載層棧。
使用方式¶
- 觸發條件:只有當 agent 正在運行當前輪次且來不及被打斷時,新指令纔會觸發分叉。如果 agent 空閒,它會直接響應,不會平白多出會話。
- 分叉行爲:
- 左側列表會冒出新會話,命名爲
⑂n <原會話名>。 - 焦點會自動切到新會話,用戶立即與空閒 agent 交互。
- 舊會話在後臺繼續運行,完成後結果回注。
- 分叉頁籤:顯示整個家族的血緣樹,包含會話狀態、觸發指令和分叉時間。
- 注入摘要:回注內容默認摺疊成一行摘要,可展開查看。
工具與參數¶
插件向前臺暴露了三個工具:
| 工具 | 說明 |
|---|---|
fork_list |
列出家族會話,顯示名字與實時狀態(運行中 / 空閒 / 已結束)。↑ 表示接管了前臺,↓ 表示被前臺接管,~ 表示同族另一條分叉。 |
fork_steer |
給家族裏的一條會話發中途指令,等價於 steer,無需中止。 |
fork_cancel |
中止家族裏的一條會話。參數 keepInbox=true 只中止當前 turn 並保留待處理項。 |
配置參數集中在 src/params.mjs,關鍵參數如下:
| 參數 | 默認值 | 說明 |
|---|---|---|
enabled |
true |
總開關。 |
minStepAgeMs |
0 |
分叉門檻:step 已運行低於此時長則不分叉。 |
coalesceWindowMs |
2000 |
距下一個 step 邊界不足此時長時降級爲 steer。 |
maxActiveBranches |
3 |
同一前臺下的活躍後臺分叉上限。 |
followHead |
true |
是否把焦點切到新分叉。 |
titleMark |
'⑂' |
分叉會話命名標記,格式爲 <標記><序號> <家族根名>。 |
noticeSummaries |
true |
注入消息是否摺疊成一行摘要。 |
exposeDispatchTools |
true |
是否向前臺暴露工具。 |
containerMode |
false |
容器模式(實驗),默認關閉。 |
mirrorDelivery |
'safe' |
實例回覆投遞方式,'immediate' 已知會寫壞容器轉寫。 |
限制與注意事項¶
- 非子代理樹:分叉出來的會話是普通會話,不會出現在原生「子代理」實例樹中,家族關係由「分叉」頁籤與
fork_list表達。 - 命名限制:開啓分叉命名後,會話不再被自動命名,標題被釘住。
- 文件隔離:無文件級隔離,分叉與舊會話共享同一個 cwd。併發寫文件需手動協調(如使用 stale-version 守衛)。
- 實驗性開關:
containerMode會導致容器與分叉重複勞動,mirrorDelivery: 'immediate'已知會破壞會話轉寫,建議保持默認。 - 平臺限制:部分客戶端功能僅在 web 平臺生效(
dsh.client.platform = web)。
驗證與自檢¶
- 健康檢查:
GET /api/dsh-autofork/health[?sessionId=<id>]返回插件參數、已註冊工具與家族狀態。 - 本地驗證:運行
npm run verify進行語法檢查、靜態門禁和測試。
許可證¶
MIT