前言¶
DeepSeek Harness(DSH)裏,模型常用的 pwsh 等工具把命令跑在 Host 進程樹裏。Host 一旦退出——重啓、更新插件、崩潰——子進程會被一併清掉;前臺調用在重啓時還可能被平臺補一條 TOOL_OUTCOME_UNKNOWN,長任務只能從頭再來。
下面介紹獨立插件 逃生艙(倉庫 DX12xyz/dsh-escape-pod,包名 @local/dsh-escape-pod)。它用 detached 的 pod 進程接管命令壽命,DSH 只做客戶端;重啓或熱重載只斷連接,不殺正在跑的命令。權限仍跟隨會話文件策略,不是把沙箱一起搬走。
這是什麼¶
逃生艙由社區維護者 DX12xyz 發佈,分類爲工作流,許可證 MIT。當前 README 標明版本 1.1.1,僅支持 Windows,提供七個以 pod_* 爲前綴的工具,並自帶設置頁。
一句話定位:命令在 DSH 之外的 pod 裏繼續跑,輸出與賬本落在 %LOCALAPPDATA%\dsh-escape-pod-core\,Host 重啓後可以連回同一個 pod 續讀、繼續等結果。
核心功能¶
命令壽命與 DSH 解耦¶
pod 由 Host 以 detached: true 方式 spawn 並 unref(),不經過 ctx.subprocess / ctx.jobs / ctx.terminal,因此不在 DSH 的 kill-on-close Job 裏。DSH 重啓或崩潰只關閉連接,不停命令。
七個工具¶
| 工具 | 作用 |
|---|---|
pod_run |
後臺啓動命令,立即返回 jobId;不設命令超時,跨重啓繼續跑 |
pod_exec |
前臺同路徑 spawn,阻塞到結算;可通過 resumableToolCalls 跨重啓回填,避免 TOOL_OUTCOME_UNKNOWN |
pod_output |
從上次偏移續讀輸出,內部自動 ack |
pod_kill |
終止 runner,賬本記爲 killed |
pod_freeze |
凍結或解凍整棵命令樹;DSH 消失約 10 秒後可進入凍結,超時預算在凍結期間暫停 |
pod_status |
診斷 pod 身份、protocol、本會話 job、會話文件策略、命令行等;支持 action:"relaunch" 換代碼 |
pod_shell |
列出本機 PowerShell / bash / cmd 候選併爲當前會話選擇;不連接 pod |
插件不提供 shell,只探測本機可用候選(含其他插件或系統安裝的路徑)。
權限仍留在 DSH 會話裏¶
每次調用重新解析會話文件策略:
read-only/workspace-write:Host 用ctx.sandbox.confine()現籤受限 runner 前綴,命令在 Low 完整性 + WRITE_RESTRICTED 與 kill-on-close Job 裏跑。danger-full-access:無前綴,pod 以 Medium 完整性直接 spawn。
窄會話可對單條命令申請更寬模式:傳 sandbox_permissions 與 justification,走真實 DSH 審批;只有用戶選「僅本次允許」才執行。
凍結與生命週期¶
DSH 長時間不在時,可按設置凍結運行中的命令;回來立即解凍。長時間無人回來則按 freezeMinutes 再生,次數耗盡 pod 自毀。無客戶端、無運行中 job、無凍結 episode 時,pod 也會自行退出,不再空等。
安裝與啓用¶
要求:Windows、可用的 dsh 命令。裝好插件後重啓 DSH(Host 半身需重啓;Client 刷新頁面即可)。
方式一:插件頁(推薦)¶
- 打開 DSH 插件頁 →「安裝插件」;
- 安裝源填
https://github.com/DX12xyz/dsh-escape-pod,或github:DX12xyz/dsh-escape-pod; - 按提示重啓 DSH。
方式二:命令行從 git 源安裝¶
Web profile 示例(桌面版將 web 換成 desktop):
dsh plugin --profile web add github:DX12xyz/dsh-escape-pod
方式三:本地目錄(開發或離線)¶
dsh plugin --profile web add "link:<倉庫根目錄絕對路徑>"
方式四:離線 tgz¶
在倉庫根目錄執行 npm pack 後安裝產出的 tgz:
cd <倉庫根目錄>
npm pack
dsh plugin --profile web add "file:<倉庫根目錄>/local-dsh-escape-pod-1.1.1.tgz"
驗證是否裝好¶
重啓 DSH 後調用一次 pod_status,確認 podVersion=1.1.1、protocol=3,以及 podPid、pipe、會話文件策略、命令行映射等字段符合 README 中的「裝好判據」。
注意:Host 與 pod 必須同版本;舊 pod(protocol < 3)會導致 pod_run / pod_exec 報 EPROTOCOL。卸載前應在插件頁「逃生艙」卡片長按 5 秒關閉正在運行的 pod;卸載命令爲:
dsh plugin --profile web remove @local/dsh-escape-pod
典型用法¶
先做後臺長任務,DSH 重啓後繼續讀輸出:
pod_run({ command: "1..600 | ForEach-Object { Start-Sleep -Seconds 1; $_ }",
description: "long ticker" })
→ { jobId: "podc-...", runnerPid: 1234, ... }
pod_output({ jobId: "podc-..." })
pod_status({})
pod_kill({ jobId: "podc-..." })
前臺跑一條命令並拿完整結果(含跨重啓):
pod_exec({ command: "npm test" })
只讀會話裏需要寫盤構建時,可申請一次性提權(須用戶批准):
pod_run({ command: "npm run build",
description: "build(當前會話是隻讀)",
sandbox_permissions: "workspace-write",
justification: "構建要寫 dist/ 與 node_modules/.cache,當前會話是隻讀" })
適用場景與注意¶
適合誰:在 Windows 上用 DSH 跑長時間構建、測試、批處理,且希望 Host 重啓、插件熱重載或崩潰時不中斷命令、又能續讀輸出的開發者。
務必知曉:
- 插件與 pod 以當前用戶權限運行;
danger-full-access會話下命令能力等同於用戶本機權限。安裝前應閱讀倉庫源碼與 MIT 許可證,自行評估風險。 - 賬本在工作區外的
%LOCALAPPDATA%\dsh-escape-pod-core\,卸載插件不會自動刪除;確認不需要時再手動清理。 - 社區目錄 SkillHub 插件頁 與 GitHub 倉庫相互獨立索引,並非 DeepSeek 或幻方官方應用商店;生態遵循 DSH「一切皆插件」的思路,選型以倉庫 README 與 TECHDOC 爲準。
結尾¶
逃生艙解決的是「DSH 一動長任務就死」的問題:壽命搬到 detached pod,權限仍綁在會話策略與 DSH 審批上。需要細節時見倉庫 README 與 TECHDOC.md。
- 目錄頁:https://www.skillhub.cn/plugins/DX12xyz/dsh-escape-pod
- GitHub:https://github.com/DX12xyz/dsh-escape-pod