前言¶
在終端執行 dsh web 啓動 Web profile 後,DSH 默認會用系統默認瀏覽器打開一個普通標籤頁承載 GUI。這個標籤頁和日常瀏覽混在一起,任務欄裏也沒有獨立的窗口身份,切換、查找都不方便。DSH 的理念是「一切皆插件」,這個問題同樣可以交給插件解決:dsh-auto-open-web 是一個常駐插件,在 HTTP 服務綁定完成、取得實際監聽端口後,自動以獨立應用窗口(或瀏覽器 --app 窗口)打開 GUI,並在設置 → 插件配置中提供配置卡片。下面介紹它的行爲、配置和安裝方式。
這是什麼¶
dsh-auto-open-web 是 jinsiyu 維護的 DSH 插件,MIT 許可證。一句話定位:dsh web profile 啓動後自動打開獨立應用窗口(或網頁標籤頁)的常駐插件,內置隨包分發的 WebView2 宿主(DshAppWindow.exe)實現輕量級桌面化。
它是一個組合包(bundle):package.json 的 dsh.bundle 聲明配置層文件 cordis.patch.yml,安裝到 web profile 後按包名激活插件行(name: auto-open-web)。
與官方默認行爲的關係:安裝本插件後,插件的 bundle 補丁會把 web-runtime.openBrowser 置爲 false,打開行爲由插件接管;卸載插件後恢復官方默認行爲。
工作機制¶
觸發時機¶
插件把 webServer 聲明爲硬依賴(inject),DSH 會等 webServer 初始化完成(HTTP 服務綁定、端口寫入)後才激活本插件,因此插件激活時端口已可用,無需等待輪詢。端口取自 webServer 服務的真實監聽值,--port 自定義端口和 --port 0 都能拿到正確結果。
WebView2 宿主(windowKind: webview2,默認,僅 Windows)¶
- 啓動隨包分發的
DshAppWindow.exe(WinForms + WebView2,獨立進程,無標籤欄/地址欄),直接加載 GUI 根地址; - 任務欄/窗口圖標爲 DSH 圖標;
- 隨 DSH 退出:宿主監視父進程 PID,DSH 進程結束時窗口一併關閉;
- 記憶窗口大小/位置/最大化狀態(
%LOCALAPPDATA%\DeepSeekHarness\window-state.json),關閉時保存、啓動時恢復。
瀏覽器應用窗口(windowKind: browser)¶
以 --app 參數啓動 Edge/Chrome 專用實例,--user-data-dir=~/.dsh/<browser>-app-profile,進程樹與存儲獨立,不與正常瀏覽器頁面共用。
隨 DSH 退出(含強殺):專用實例加入 Job Object(JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE,koffi 驅動),DSH 正常退出、被 taskkill /F 強殺、崩潰、關機時實例都會隨之結束。另有退出清理與下次啓動預清理兩層兜底。
降級與抑制¶
- 所選窗口類型不可用時(宿主缺失、瀏覽器找不到、非 Windows 等),降級爲系統默認瀏覽器打開(官方同款 open 方式,普通標籤頁),保證至少能打開 GUI;
dsh web --no-open或 SSH 會話時不打開任何窗口/頁面:插件讀取與官方同一來源的 webStartup 服務做同樣的抑制。
配置¶
配置有兩條途徑,等價:
1、設置頁卡片(推薦):設置 → 插件配置 → 「自動打開網頁」卡片,可編輯 appWindow、windowKind、browserPath、exitOnWindowClose;
2、行配置:在 cordis.patch.yml 中編輯,作爲啓動種子,設置卡片保存前生效。
四個配置項的默認值:
| 字段 | 默認值 |
|---|---|
appWindow |
true |
windowKind |
webview2 |
exitOnWindowClose |
false |
browserPath |
'' |
browserPath 用於手動指定瀏覽器可執行文件路徑(僅瀏覽器模式使用)。設置卡片提供兩個輔助按鈕:
- 「瀏覽」:彈出原生文件對話框(子進程 + koffi 驅動 IFileOpenDialog);
- 「測試」:真實拉起一個
--app專用測試實例(獨立 user-data-dir~/.dsh/<browser>-test-profile,不污染正式實例),數秒後自動結束測試進程樹。
exitOnWindowClose 是實驗性功能,默認關閉,僅 appWindow 開啓時生效:窗口進程正常退出(用戶關閉窗口)時觸發 process.exit(0);啓動失敗、崩潰、被強殺等非 0 退出碼不觸發,避免誤退出。
browserPath 行配置示例(~/.dsh/profiles/web/cordis.patch.yml):
- id: auto-open-web
config:
browserPath: 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
這一步是給瀏覽器模式指定可執行文件的寫法:按插件行 id auto-open-web 覆寫對應 config 字段。
WebView2 宿主的系統要求(僅 webview2 模式)¶
- Windows 10 1803+ / Windows 11 / Windows Server 2016+(Win7/8.1 已於 2023-01 終止支持);
- WebView2 Runtime(常青版,通常隨 Edge 預裝;README 記錄本機已驗證 151.x);
- 無 .NET 10 運行時要求:宿主自 0.1.15 起目標 .NET Framework 4.7.2,由 Windows 10 1803+ / Windows 11 操作系統自帶。
安裝與卸載¶
npm 註冊表安裝:
dsh plugin --profile web add dsh-auto-open-web
其他安裝方式(任選其一):
# tarball(README 示例,文件名以實際打包產物爲準)
dsh plugin --profile web add ./dsh-auto-open-web-0.1.5.tgz
# 源碼 checkout(開發期,改動即時生效;使用絕對路徑)
dsh plugin --profile web add C:\path\to\dsh-auto-open-web
# GitHub 源碼
dsh plugin --profile web add github:jinsiyu/dsh-auto-open-web#main
卸載(同時移除依賴與對應配置層):
dsh plugin --profile web remove dsh-auto-open-web
安裝後重啓 dsh web 生效,設置頁會出現「自動打開網頁」卡片。
安裝產物的差異需要注意:
- npm 包已包含 WebView2 宿主編譯產物;
- GitHub main 分支與源碼 checkout 方式不含
host-publish/(構建產物被 .gitignore 忽略),webview2 模式需先在node_modules/dsh-auto-open-web下執行pnpm run build:host生成(需 .NET SDK);browser 模式無需構建。
自行打包時,在源碼目錄執行 pnpm pack,prepack 鉤子會先編譯 WebView2 宿主(dotnet publish),產出 tgz 文件。
實現細節¶
- 零 dependencies:運行時依賴由 DSH 部署提供,以 optional peer 聲明。
@deepseek-ai/dsh聲明兼容範圍>=0.1.0-rc.8 <0.2.0(不做運行時版本檢測);@deepseek-ai/schemastery^3.18.1;koffi僅用於 Windows 的 Job Object、進程校驗與原生對話框,運行時解析部署副本,失敗僅降級。 - 設置卡片 UI 完全自繪(自 0.1.10 起),觀感經官方設計令牌變量(
--dsw-alias-*/--dsw-static-*)對齊,淺/深色主題自動跟隨。 - WebView2 宿主的窗口/任務欄圖標來自插件生成的 DSH .ico(
~/.dsh/auto-open-web-icon.ico,自 0.1.14 起緩存固定,後續啓動直接複用);宿主 exe 另通過<ApplicationIcon>內嵌圖標兜底。
適用場景與注意事項¶
適合:
- 在 Windows 本機運行
dsh web,希望 GUI 以獨立窗口呈現、有獨立任務欄圖標、隨 DSH 進程一起退出的用戶; - 想要輕量級桌面化、不想爲此安裝額外運行時的用戶(宿主 exe 隨插件包分發,目標 .NET Framework 4.7.2 由系統自帶)。
注意事項:
- macOS/Linux:webview2 模式不可用,會降級爲默認瀏覽器打開;browser 模式未測試;
- browser 模式下重啓 DSH 後舊窗口保持原樣,需手動刷新,可能與新窗口短暫並存;webview2 模式下舊宿主窗口隨舊 DSH 進程退出;
exitOnWindowClose爲實驗性功能,默認關閉;- 插件不做 DSH 版本的運行時檢測,安裝前確認自己的 DSH 版本落在聲明的兼容範圍
>=0.1.0-rc.8 <0.2.0內; - 插件以當前 dsh 進程的權限運行,安裝前應檢查插件源碼與許可證(MIT)。
結語¶
經過上面的步驟,dsh web 啓動後的打開行爲就從「去瀏覽器裏找標籤頁」變成「自動彈出獨立應用窗口」:窗口身份、圖標、退出行爲都與 DSH 進程對齊,配置上既有設置頁卡片也有行配置,做不到的場景(非 Windows、宿主缺失)會安靜降級到默認瀏覽器。
- 社區插件目錄頁:https://www.skillhub.cn/plugins/jinsiyu/dsh-auto-open-web
- GitHub 倉庫:https://github.com/jinsiyu/dsh-auto-open-web
需要說明的是,上述目錄爲獨立社區站點的收錄頁面,與 DeepSeek / 幻方無官方從屬關係。