逃生艙(dsh-escape-pod):讓命令活在 DSH 進程樹之外

前言

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 刷新頁面即可)。

方式一:插件頁(推薦)

  1. 打開 DSH 插件頁 →「安裝插件」;
  2. 安裝源填 https://github.com/DX12xyz/dsh-escape-pod,或 github:DX12xyz/dsh-escape-pod;
  3. 按提示重啓 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜