dsh-auto-open-web:讓 DSH Web GUI 以獨立應用窗口打開

前言

在終端執行 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)

  1. 啓動隨包分發的 DshAppWindow.exe(WinForms + WebView2,獨立進程,無標籤欄/地址欄),直接加載 GUI 根地址;
  2. 任務欄/窗口圖標爲 DSH 圖標;
  3. 隨 DSH 退出:宿主監視父進程 PID,DSH 進程結束時窗口一併關閉;
  4. 記憶窗口大小/位置/最大化狀態(%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、設置頁卡片(推薦):設置 → 插件配置 → 「自動打開網頁」卡片,可編輯 appWindowwindowKindbrowserPathexitOnWindowClose

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.1koffi 僅用於 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 / 幻方無官方從屬關係。

羽毛球分组比赛记分
小程序二维码

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

小夜