前言¶
在使用 DeepSeek Harness (DSH) Web UI 進行智能體開發時,開發者經常需要從瀏覽器環境切換回本地文件系統,打開當前會話的工作區文件夾。這種跨窗口的操作會打斷工作流。dsh-open-in-app 插件通過在 DSH Web UI 的會話頭部工具行集成一個 Codex 風格的控件,提供了一鍵打開文件夾的能力。
核心功能¶
該插件在會話頭部工具行新增了一個膠囊狀的拆分控件。控件包含一個文件夾按鈕和一個下拉箭頭。
- 文件夾按鈕:點擊後使用上次爲該工作區選擇的應用打開文件夾。如果無歷史記錄,則回退到默認編輯器(優先級:VS Code > Cursor > Windsurf > Zed > …)。按鈕上會顯示對應應用的圖標。
- 下拉箭頭:點擊展開菜單,包含“最近使用”、“系統默認應用”以及主機上已安裝的終端和編輯器白名單。每一項均帶有應用圖標(如 macOS 的 Finder、Windows 的資源管理器)。
- Remote 端點:插件在宿主端註冊了
openInApp服務,提供listApps、openWith、openDefault、openDefaultEditor四個方法,供其他插件或邏輯調用。
安裝與啓用¶
插件安裝命令如下:
dsh plugin --profile web add dsh-open-in-app
安裝完成後,必須重啓 dsh web 應用。插件加載器與客戶端模塊圖在啓動時組合,新增插件不支持熱重載。重啓後,該控件會出現在會話標題旁。
典型用法¶
- 在聊天窗口右上角找到該控件。
- 直接點擊文件夾圖標,使用默認或上次選擇的應用打開工作區。
- 點擊下拉箭頭,選擇特定應用(如 Terminal、VS Code)打開。
- 若需自定義白名單,編輯
lib/apps.js中的WHITELIST數組。
白名單與配置¶
菜單中的應用由白名單控制。默認白名單包含常用的終端和編輯器,如 Terminal、iTerm2、Ghostty、Warp、VS Code、Cursor、Zed 等。
要增刪條目,需編輯 lib/apps.js 中的 WHITELIST 數組。每個條目爲 { id, category, match, exact? } 結構:
* id:規範顯示名(也是原生打開命令必須能找到的名稱)。
* match:用於子串匹配的別名。
* exact:用於全名匹配,防止短名稱衝突(如 code 誤匹配 CodeRunner)。
技術細節與注意事項¶
- 平臺實現:
- macOS:通過
sips轉換.icns爲 32px PNG,使用open -a "<app>" <path>。 - Windows:通過 PowerShell 提取
.exe內嵌圖標,使用cmd /c start "" <exe> <path>。 - Linux:解析
.desktop文件,使用gtk-launch <id> <path>或回退到xdg-open。
- macOS:通過
- 圖標解析:僅讀取枚舉的應用路徑和 freedesktop 圖標主題目錄,緩衝區上限 256KB。緩存機制按源路徑 + mtime,降低重複打開開銷。
- 安全與權限:
- Remote 端點不在特權方法列表中,僅限 loopback 或可信主機訪問。
- 打開路徑派生原生進程,路徑來自會話自身的
cwd。 - 命令失敗(如應用缺失)會在菜單中顯示錯誤行,不拋出異常。
- 開發約束:客戶端 bundle 必須保持自包含,無構建步驟。
結尾¶
dsh-open-in-app 通過在 Web UI 中嵌入原生文件系統操作能力,簡化了智能體開發中的環境切換流程。該插件基於 MIT 許可證開源,適合需要頻繁在瀏覽器與本地編輯器之間切換的開發者使用。