用 dsh-workbench 給 DeepSeek Harness 網頁界面加上 VS Code 風格三欄工作臺

前言

DeepSeek Harness(dsh)的核心理念是「一切皆插件」:模型、工具、會話、沙箱和 Web UI 都可以在配置層替換或重組。官方倉庫把這件事寫得很清楚,開發者預覽版也已經把源碼公開。實際用 npx @deepseek-ai/dsh web 打開網頁界面時,中間一列通常還是會話:智能體在沙箱裏改文件,人要覈對內容,往往得另開編輯器,或者來回切換標籤。

社區插件 dsh-workbench 做的就是這塊界面:給 Web GUI 加上接近 VS Code 的三欄佈局——左側邊欄保持原樣,中間在「會話」和「文件內容」之間切換,右側常駐 Explorer 文件樹。點開文件後,中間列變成 Monaco 編輯器;打開 Markdown 還可以切到渲染預覽。它由 Dpf555 維護,MIT 許可證,倉庫地址是 Dpf555/dsh-workbench。社區目錄目前把它歸在「記憶」分類,GitHub 星標 6;從 README 和 package.json 看,它解決的是工作臺佈局,不是跨會話記憶。

需要先說明一點:社區插件目錄(deepseek-harness-plugin.com)是獨立站點,和 DeepSeek / 幻方沒有官方從屬關係,不能當成官方應用商店。下文按目錄詳情頁、GitHub README、package.json 與源碼交叉覈對後整理。

這是什麼

dsh-workbench 是面向 DeepSeek Harness Web GUI 的 Cordis 插件,npm 包名是 @dsh-local/dsh-workbench,當前 package.json 版本爲 0.2.0dsh.client.platform 聲明爲 web。維護者是 Dpf555,許可證爲 MIT。

它要解決的問題很具體:默認客戶端殼沒有「常駐右欄 + 點擊文件切換中間視圖」的公開擴展點。這個插件自己補上 Explorer 槽位,再用 Monaco(VS Code 的編輯器核心,倉庫固定爲 monaco-editor 0.52.2)把中間列變成可編輯的代碼視圖。

佈局可以按 README 裏的示意來理解:

┌─────────┬──────────────────────────┬────────────┐
│ 左側邊欄 │  中間:會話 ⇄ 文件內容     │ 右側:文件樹 │
│ (不變) │  點文件 → Monaco 編輯器    │ Explorer   │
└─────────┴──────────────────────────┴────────────┘

主機半部在 index.js 裏註冊 /wb/* 靜態資源,以及 /wb/api/ 下的文件操作;瀏覽器半部由 client.js 加載 /wb/workbench-client.js。文件讀寫走 DSH 的 ctx.fs,並按當前會話的工作區做圍欄。

核心功能

右側 Explorer

右欄是常駐文件樹,設計參考 microsoft/vscode,圖標用的是 VS Code 官方 seti 字體。倉庫已經提交了 assets/seti.cssseti-map.jsonseti.woff

README 列出的能力包括:

  • 展開 / 摺疊目錄
  • 新建文件、新建文件夾
  • 刷新、全部摺疊
  • 面板可拖寬;寬度範圍在補丁說明裏是 240–420px,默認 300px
  • « 收起;收起後右側留 28px 窄條,點擊即可重新展開

文件樹的根不是整個磁盤,而是當前活躍會話的工作區,對應會話的 header.cwd,也就是該會話自己的沙箱邊界。切換會話時,右欄和編輯器標籤頁會跟着重建。沒有活躍會話時,回退到 sandboxPolicy 的部署根,這個根可以在 profile 的 cordis.patch.yml 裏固定。

中間列:Monaco 編輯器

點擊文件後,中間列從會話視圖切到代碼編輯器。編輯器是 monaco-editor 0.52.2,README 寫明它提供:

  • 多標籤頁
  • 語法高亮
  • minimap
  • Ctrl+S 保存
  • 未保存的髒標記
  • 保存衝突時的「重新加載 / 強制覆蓋」(寫入用版本號 CAS,避免互相覆蓋)

編輯時,下方輸入框和停靠條會自動隱藏,編輯器佔滿整列。切回會話可以用頂部的「對話 / 代碼」標籤,或「返回會話」按鈕。

index.js 把單文件讀取上限設爲 5MB;二進制文件按 FS_NOT_TEXT 拒絕,不會當文本打開。

Markdown 預覽

打開 .md 文件後,標籤行會出現「預覽」按鈕,一鍵切到渲染視圖,並隨編輯即時刷新。渲染器是插件自帶的,不額外拉依賴。

README 寫明它覆蓋 GFM 的一個子集:標題、粗斜體、行內代碼與圍欄代碼、列表與任務清單、引用、表格、鏈接、圖片、分隔線。暫不支持嵌套列表、腳註,以及 HTML 透傳——HTML 一律轉義,避免注入。

安全邊界

文件操作都經過 DSH 的 ctx.fs。主機半部會再做一次路徑圍欄:先解析工作區根,再 fs.contains 檢查目標是否落在根內,越界返回 outside-workspace。寫入帶版本號,遇到 FS_STALE_VERSION 時按衝突處理,而不是直接覆蓋。

客戶端會把當前活躍會話 id 帶到每個 /wb/api/* 請求裏,服務端用 sandboxPolicy.resolve({ session }) 決定柵欄根。index.js 暴露的操作爲:describelistDirreadFilewriteFilecreateFilecreateDirassetText

安裝與啓用

目錄詳情頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行即可:

dsh plugin add github:Dpf555/dsh-workbench

如需可復現安裝,按目錄頁的寫法固定 commit 哈希。倉庫 main 分支截至 2026-08-15 的最新提交是 16f20acf544abcefa9e40b6159fd1b9badd425a6

dsh plugin add github:Dpf555/dsh-workbench#16f20acf544abcefa9e40b6159fd1b9badd425a6

只跑這一條,通常還不夠用出 README 描述的完整三欄界面,原因有兩條。

第一,Monaco 發行版不入庫。assets/vs/ 要靠 npm run setup:assets 下載,大約 13MB;scripts/install-profile.mjs 會檢查 assets/vs/loader.js,沒有就直接退出。倉庫裏現成的是 UI bundle 和 seti 圖標,沒有編輯器核心文件。

第二,三欄佈局依賴對 DSH 檢出的三處補丁。README 寫明:不打補丁時,往往只有浮窗、沒有右欄。補丁基於 DSH 0.1.0-rc.6 生成,直接改檢出裏的客戶端 bundle;DSH 按請求讀取這些文件,並且帶 cache-control: no-cache,硬刷新即可生效,不用再構建。

README 給出的完整步驟如下。前置條件是 Node.js ≥ 18、git,以及能訪問 npm registry 的網絡:

git clone https://github.com/Dpf555/dsh-workbench.git dsh-workbench
cd dsh-workbench

# 1. 下載 monaco 資產並生成 seti 圖標(約 13MB)
npm run setup:assets

# 2. 安裝到 DSH profile(下次 `dsh web` 重啓後加載 /wb 路由與客戶端引導)
node scripts/install-profile.mjs --profile web

# 3. 給當前 DSH 檢出打三欄佈局補丁
node scripts/apply-patches.mjs --checkout <checkout-root>
# 不傳 --checkout 時,腳本會嘗試探測 ~/.npm-cache/_npx 下的檢出

然後重啓 dsh web,並在瀏覽器裏 Ctrl+F5 硬刷新。

檢出根目錄指包含 node_modules/@deepseek-ai/ 的那一層。用 npx 安裝時,常見位置在 ~/.npm-cache/_npx/ 下面。install-profile.mjs 默認把包裝進 ~/.dsh/profiles/web/node_modules/@dsh-local/dsh-workbench/(可用環境變量 DSH_HOME 改根目錄),並在該 profile 的 cordis.patch.yml 裏追加 workbench 這一行。

三處補丁各自做一件事:

  1. ui-layout.patch:AppFrame 增加第 4 條網格軌道 explorer,加上 slot、拖寬手柄和 toggleExplorer
  2. ui-conversation.patch:暴露 window.__DSH_CONV_BRIDGE__[sessionId].setView,點擊文件才能切中間視圖
  3. ui-sidebar.patch:頁面加載時掛上 UI bundle,刷新後也能自愈

DSH 升級之後,如果補丁打不上,需要對照新的 bundle 重新生成,README 建議用 git diff --no-index 對比原始文件和補丁後的文件。

使用方法

按 README 的操作順序:

  1. 硬刷新頁面,右欄應出現文件樹。
  2. 點目錄展開,點文件後,中間列切到 Monaco,輸入框隱藏。
  3. Ctrl+S 保存。頂部「對話 / 代碼」標籤或「返回會話」按鈕可以切回去。
  4. 右欄頭部可以新建文件或文件夾、刷新、全部摺疊、收起面板;左邊緣拖動改寬度。

改完 index.jsclient.js 之後,需要重新啓動 dsh web 再硬刷新。會話級工作區解析依賴主機半部注入 sessions 服務,只刷新前端不夠。

卸載也按 README:

  1. 刪掉 <DSH_HOME>/profiles/web/cordis.patch.yml- insert:workbench 行,重啓 dsh web
  2. 刪除 <DSH_HOME>/profiles/web/node_modules/@dsh-local/dsh-workbench/
  3. 補丁回退:重裝對應 npm 包(npm i @deepseek-ai/dsh-client-ui-{layout,conversation,sidebar}@0.1.0-rc.6 後覆蓋檢出的 lib/client.js),或 git apply -R patches/*.patch

適用場景與注意事項

適合已經在用 dsh web、希望在同一頁裏瀏覽和修改當前會話工作區文件的人。它不是終端 TUI,也不是給 Agent 用的記憶存儲。GitHub 上還有同名或近名的倉庫(例如其他維護者的 workbench / explorer 插件),安裝時認準 Dpf555/dsh-workbench 和目錄頁上的這條命令。

使用前把這幾條限制看清楚:

  • ctx.fs 目前沒有 rename / delete 契約,所以暫不支持重命名和刪除文件
  • 二進制文件不能當文本讀;單文件讀取上限 5MB。
  • 沒有打開會話時,右欄仍可能可見,但點擊文件不會切換中間視圖(視圖環是會話級的),文件樹此時顯示部署根。
  • Markdown 預覽只覆蓋上面列出的 GFM 子集。
  • 補丁針對 0.1.0-rc.6。DSH 還在開發者預覽階段,客戶端 bundle 一變,補丁就可能失效。

插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。目錄頁也寫了同樣的警告:安裝前檢查源代碼倉庫和許可證;需要可復現安裝時,固定 commit 哈希。社區目錄不是官方應用商店,不要只憑分類名稱或星標決定是否安裝。

小結

dsh-workbench 把 DeepSeek Harness 的網頁會話界面,補成「左邊欄不變、中間會話與編輯器切換、右邊文件樹常駐」的工作臺。編輯器用的是 Monaco 0.52.2,Markdown 可以預覽,文件操作限制在當前會話工作區裏。要讓三欄真正出現,除了目錄頁上的 dsh plugin add,還需要按 README 下載 Monaco 資源,並對 DSH 檢出打那三處補丁。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-workbench/

GitHub:https://github.com/Dpf555/dsh-workbench

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

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

小夜