dsh-open-folder-fix:修正 Windows 上 DSH「打開工作區」無窗口問題

前言

在 DSH Web GUI 的 Session 頭部,「在應用中打開工作目錄」分裂按鈕會把當前工作目錄交給本機應用打開。Windows 上該能力走 shell-open 通道,由 @deepseek-ai/dsh-native-command 執行。若你遇到過:按鈕變回空閒、界面不報錯,但資源管理器窗口始終沒有彈出——這與上游在某些主機上的已知限制一致。下面介紹社區插件 dsh-open-folder-fix 如何在不破壞 VS Code、Windows Terminal 等其它「在應用中打開」選項的前提下,只修正 Explorer 打開目錄的行爲。

這是什麼

dsh-open-folder-fix 由 Martlet-Tech 維護,倉庫地址爲 github.com/Martlet-Tech/dsh-open-folder-fix。插件通過 Cordis bundle patch 與瀏覽器注入,在 Windows 上把打開工作目錄的 Explorer 調用從上游的 explorer.exe "<file:// URI>" 改爲 explorer.exe /e,<目錄>,解決「報告成功卻不開窗」的問題。

社區目錄頁:skillhub.cn/plugins/Martlet-Tech/dsh-open-folder-fix。SkillHub 爲 DSH 社區插件目錄,與 DeepSeek / 幻方無官方從屬關係;安裝方式以目錄頁與 DSH 當前版本的插件管理文檔爲準。已抓取資料中未給出固定的 CLI 安裝命令,請勿自行拼接未在文檔中出現的 dsh plugin add 形式。

問題背景

上游在 0.1.7-rc.1 等版本對 Windows 使用類似下面的調用:

explorer.exe "<目錄的 file:// URI>"

更早版本則走 PowerShell Invoke-Item。兩者在部分 Windows 主機上症狀相同:dsh-native-command 的 Known Limitations 指出,在非交互會話等環境下,explorer.exe 可能不調用文件關聯,約 1 秒後仍以退出碼 1 返回;上游把退出碼 1 當作「已交接給桌面進程」,再配合 launchWatchMs 看門狗,導致「窗口未開」與「已成功打開」在 DSH 側無法區分。

README 中在 Windows 10 19045.7663 上的對比示例:openNativePath 報告成功但 Explorer 窗口數不變;而 explorer.exe /e,D:\Projects\dshell 能穩定新開窗口。

核心功能

Host 側

  • 註冊獨立路由 POST /open-folder-fix/open,路徑刻意不與上游 /open-in-app/* 重疊,避免 webServer.register 重複註冊導致插件加載失敗。
  • 非 Windows(非 win32)請求返回 501;macOS / Linux 仍使用上游行爲。
  • 可配置項 launchWatchMs(默認 1500):觀察 explorer.exe 交接後早期 spawn 失敗的時間窗口;成功不與進程退出碼綁定(Explorer 委派後常返回退出碼 1,與上游 runExplorer 的處理一致)。

瀏覽器側

  • 從上游公開的 /open-in-app/apps 讀取已安裝應用列表;僅對 explorer 這一 id 轉發到本插件路由,其餘應用(VS Code、Windows Terminal、Git Bash 等)仍 POST 到上游 /open-in-app/open。
  • 通過 cordis.patch.yml 禁用上游 ui-open-in-app 瀏覽器半邊,避免與插件爭搶同一 slot cell id(open-in-app)導致註冊順序不確定。
  • 上游 @deepseek-ai/dsh-host-open-in-app 保持掛載,繼續提供應用目錄與圖標;Explorer 圖標仍走 /open-in-app/icon/explorer。

包結構(便於理解行爲)

package.json        bundle 清單:聲明 dsh.bundle.patch 與 dsh.client
cordis.patch.yml    禁用上游 ui-open-in-app,插入本插件的 Host 行
index.js            Host:註冊 POST /open-folder-fix/open
client.js           瀏覽器:接管 Session 頭部分裂按鈕

插件僅使用 Node 內置模塊,不 import @deepseek-ai/dsh-native-command 的 revealNativePath(/select, 用於定位文件,與本插件打開工作目錄無關)。

配置

Host 導出的 Config 必須符合 Standard Schema(含 ~standard.validate)。Cordis 的 resolveConfig 在發現插件導出 Config 時會無條件調用 Config['~standard'].validate(config);若寫成普通字段描述對象,會導致 DSH 組合樹啓動階段拋錯、整個 DSH 無法啓動。正確實現見倉庫 index.js 中的 Config。

配置項 說明
launchWatchMs 默認 1500,範圍校驗見 Config.validate;僅用於 spawn 錯誤等早期失敗觀察

安裝與啓用

  1. 在 SkillHub 目錄頁 查看當前是否可安裝及版本(資料中 package 版本爲 1.0.0)。
  2. 按你使用的 DSH 版本,通過 profile 的 bundle / 插件管理流程安裝該 bundle(具體命令以目錄頁與官方文檔爲準;資料未提供可引用的固定 CLI 字符串)。
  3. 啓用後刷新 Web GUI;若 profile 裏包爲符號鏈接指向本地開發目錄,改代碼後刷新頁面即可生效,無需重複 install_bundle。

重複安裝注意: 同路徑再次 install_bundle 可能觸發上游 plugin-manager 的 ambiguous-install(依賴變化識別邏輯)。開發調試時優先依賴符號鏈接與刷新,而非反覆重裝。

典型用法

安裝並啓用 bundle 後,無需額外 CLI:

  1. 在 DSH 中打開一個 Session,確認工作區目錄在 Windows 上有效。
  2. 點擊 Session 頭部「在應用中打開工作目錄」分裂按鈕,選擇 Explorer(或列表中與 explorer id 對應的項)。
  3. 預期行爲:資源管理器新開窗口並進入該工作目錄。其它應用入口仍走上游邏輯,行爲與未裝本插件時一致。

Host 側實際執行的 Explorer 形式爲:

explorer.exe /e,<目錄>

README 還記錄了 explorer.exe <目錄>、explorer.exe /select,<父目錄> 等變體的行爲差異;本插件選用 /e,<目錄> 作爲穩定新開窗口的方案。

適用場景與注意

適合誰: 在 Windows 上使用 DSH Web GUI,且「打開工作目錄」經常無窗口、無報錯的技術用戶與智能體開發者。

邊界:

  • 僅 Windows 有意義;其它平臺請依賴上游。
  • 不修改上游 native-command 裏「在資源管理器中顯示某個文件」的路徑。
  • 插件 Host 代碼在 DSH 進程權限下運行;安裝前應閱讀倉庫源碼與許可證(package.json 爲 @local/dsh-open-folder-fix,private: true,以 GitHub 倉庫爲準)。

DSH 生態強調「一切皆插件」;本插件是社區維護的補丁型 bundle,不是 DSH 核心發行版的一部分。

結尾

dsh-open-folder-fix 用最小侵入的方式修正 Windows 上 Explorer 打開工作目錄的參數,並保留上游應用列表與其它應用的啓動路徑。若你正被「按鈕成功但文件夾沒出來」困擾,可以從目錄頁進入倉庫閱讀實測表格與 patch 設計,再決定是否加入 profile。

  • 目錄頁:https://www.skillhub.cn/plugins/Martlet-Tech/dsh-open-folder-fix
  • GitHub:https://github.com/Martlet-Tech/dsh-open-folder-fix
羽毛球分组比赛记分
小程序二维码

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

小夜