用 dsh-diff-viewer 替換 DeepSeek Harness 默認 Diff 渲染

前言

DeepSeek Harness(簡稱 dsh)是 DeepSeek 開源的 Agent 運行時,核心理念是「一切皆插件」:模型、工具、會話、沙箱、調度和 UI,都可以在配置層替換或擴展,而不必改 Harness 核心源碼。網頁端日常使用時,智能體一旦調用 write / edit 改文件,對話裏就會出現一塊默認的 Diff 卡片(官方組件叫 DiffBlock)。文件不大時還能掃一眼;改動一多,行號錯位、詞級變化看不清、超長上下文把頁面撐滿,審閱成本會明顯上去。

社區維護者 lehhair 做了一款界面增強插件 dsh-diff-viewer,專門接管這兩類工具調用的 diff 渲染。它不改 Harness 核心,裝上之後把展開後的 diff 卡換成 PiUI 風格的查看器,卸掉即還原官方行。下面按目錄頁和 GitHub 倉庫交叉覈實後的信息,說明它是什麼、怎麼裝、怎麼用。

需要先說明兩點背景。第一,DeepSeek Harness 目前仍是開發者預覽版,核心插件和 API 還會變。第二,DeepSeek Harness 插件庫 是獨立的社區目錄,用來檢索和對照安裝命令,與 DeepSeek / 幻方沒有官方從屬關係,不能當成官方應用商店。

這是什麼

dsh-diff-viewer 是一款面向 DSH 網頁界面 的界面增強插件,由 lehhair 維護,倉庫爲 lehhair/dsh-diff-viewer。npm 包名是 @dsh-external/dsh-diff-viewer,當前版本 0.1.0,主要語言是 TypeScript。社區目錄把它歸在「界面增強」,GitHub 倉庫帶有 dsh-plugin topic。截至 2026-08-17,GitHub 顯示 17 個 star;目錄頁上的數字可能滯後,以倉庫頁面爲準。

一句話定位:它通過 ui-tool 的 diff-card 鏈式槽位,替換 write / edit 工具調用裏默認的 DiffBlock,把展開後的差異卡換成 PiUI 風格的 DiffViewer。GitHub 簡介裏的 “Private” 對應的是 package.json"private": true(未發佈到 npm 公共源),倉庫本身是公開的。

它解決的問題很具體:官方工具行的外殼保留,只換中間那張 diff 卡。工具行的摺疊、狀態點、錯誤摘要仍走官方 FileMutationRow 那一套;真正要看的增刪、詞級高亮、上下文摺疊和大文件渲染,交給插件自己的查看器。

工作機制

插件走的是 keyed 接管,不是去改 Harness 源碼。

ui-tool 的 tool.call.toolview 槽是開放的 key 域。同一 key 上,更低的 priority 會陰影掉已註冊的實現(最低優先渲染)。插件在客戶端註冊 editwrite 兩個鍵,priority 設爲 -1,從而接管官方的 FileMutationRow。接管後的行會複用官方 ToolRow 樣式,以及 DisclosureRowStateDot 等平臺組件,只把展開後的 diff 卡換成 PiUI 風格 DiffViewer。

這一點和倉庫源碼對得上:

  • 客戶端入口 src/client/index.tsxtool.call.toolview 注入上述兩個 key。
  • 宿主入口 src/index.tsapply() 是空函數,註釋寫明界面完全在瀏覽器側,宿主沒有額外行爲。
  • package.jsondsh.client.platformweb,並 inject @deepseek-ai/dsh-client-runtime
  • cordis.patch.yml 只是把 @dsh-external/dsh-diff-viewer 插入當前 profile 的層棧,這就是簡介裏說的 host patch:它是 bundle 層的插入,不是給 Harness 打核心補丁。

因此卸載後官方行會回來。源碼註釋還提到這套 keyed slot 出現在 rc.5 一帶;Harness 仍在預覽期,後續槽位語義若有調整,需要再對照倉庫 README。

diff 數據從工具調用的 callView / resultViewcard: 'diff' 意圖提取:執行中用調用時的 diff,完成後用已經應用的 hunks。如果執行出錯、根本沒有 diff 卡,插件不會硬畫一張空圖,而是退回官方行的錯誤摘要和 IN/OUT 卡。

核心功能

以下能力來自倉庫 README 與 package.json 描述,不是演示環境裏的主觀觀感。

1、unified 單欄是默認佈局。同一條 gutter 並排顯示舊行號和新行號,避免左右欄錯位。也可以切到 split 雙欄(源碼裏的 viewMode)。容器夠寬時會按寬度自動改佈局:源碼以約 800px 爲界,窄欄保持 unified,寬欄切到左右分欄。官方默認約 748px 的消息列會保持單欄;如果同時使用同一維護者的 dsh-home-ui 並把信息流放寬,diff 會跟着變成分欄。純新增或純刪除會強制 unified,避免另一側完全空白。

2、變更條和行背景。新增是實心綠條,刪除是條紋紅條;行背景會延伸到當前最寬的那一行,掃塊狀改動時更清楚。

3、詞級高亮。行內改動疊加綠 / 紅標記,並用 Shiki 做語法着色(README 稱爲 highlightLines)。依賴裏能看到 shiki@shikijs/langsdiff

4、上下文摺疊。連續未變更行會收成「N 行未變更」,可以向上、向下或全部展開,不必把整份文件鋪開。

5、窗口化渲染。固定行高做窗口化,大 diff 不會一次性掛載全部行。展開後的 diff 不限制高度、也不套一層滾動容器,內容直接撐開;橫向滾動條是 sticky 的,懸停時才顯現。

6、複製和頁腳統計。支持複製,頁腳格式爲 └ +A -R · N file(s),用來看新增、刪除行數和涉及文件數。

安裝與啓用

社區目錄頁給出的安裝命令原文是:

dsh plugin add github:lehhair/dsh-diff-viewer

目錄頁同時提示:如需可復現安裝,可寫成 dsh plugin add github:lehhair/dsh-diff-viewer#commit。這條命令反映的是目錄站的通用寫法,不要直接拿來裝這個插件

維護者 README 寫得很明確:GitHub 源碼裏沒有構建產物 lib/(被 .gitignore 忽略),而包入口指向 lib/index.js,用 github:lehhair/dsh-diff-viewer 裝源碼會在啓動時報找不到文件。這和官方文檔《打包與安裝插件》裏「git 安裝拉到的是源碼、不會自動跑 build」是同一類問題。本倉庫也沒有給 git 安裝準備可用的 prepare 構建腳本,開發環境還依賴旁邊一份本地 deepseek-harness checkout,不適合當普通安裝路徑。

推薦:安裝 GitHub Release 的構建產物

README 推薦每次發版後由 GitHub Actions 打好的 tarball。releases/latest 始終指向最新版,當前已發佈的是 v0.1.0(2026-08-15,說明爲 devDeps stripped from tarball)。插件聲明瞭 platform: web,應裝進 web profile:

# 直接用 latest 資產 URL(永遠是最新版):
dsh plugin --profile web add "https://github.com/lehhair/dsh-diff-viewer/releases/latest/download/dsh-external-dsh-diff-viewer.tgz"

# 重啓 dsh web 生效
dsh web

如果希望可復現、不想跟着 latest 浮動,把 URL 換成帶版本號的資產,例如當前的 v0.1.0

dsh plugin --profile web add "https://github.com/lehhair/dsh-diff-viewer/releases/download/v0.1.0/dsh-external-dsh-diff-viewer.tgz"

裝完後可以用下面的命令確認配置層裏已經出現該組合包,再重啓正在運行的 Web 服務。只刷新瀏覽器通常不夠,因爲宿主代碼和瀏覽器代碼都在啓動時加載:

dsh --profile web --dump-config

升級時的緩存

README 有一條實際限制:pnpm 會按 URL 緩存 tarball。一直用同一個 latest 鏈接時,倉庫發了新版本,本地仍可能命中舊包。升級失敗或發現裝到舊版時,按倉庫說明先卸再清緩存後重裝:

dsh plugin --profile web remove @dsh-external/dsh-diff-viewer
pnpm store prune
dsh plugin --profile web add "https://github.com/lehhair/dsh-diff-viewer/releases/latest/download/dsh-external-dsh-diff-viewer.tgz"

pnpm store prune 作用在本機 pnpm store。Windows 上 README 還提到可以刪 %LOCALAPPDATA%\pnpm\store 裏對應緩存,Linux / macOS 則以本機 pnpm store 路徑爲準。

卸載

dsh plugin --profile web remove @dsh-external/dsh-diff-viewer

卸掉之後重新啓動 web profile,write / edit 的工具行會回到官方 DiffBlock。

開發環境(從源碼)

只在本地改插件時才走源碼。README 要求 devDependencieslink: 指向旁邊的 deepseek-harness checkout,然後:

pnpm install && pnpm run check    # typecheck + test + build
dsh plugin --profile web add /path/to/dsh-diff-viewer

Windows 上 dsh plugin add <本地目錄> 可能碰到 pnpm link: 的 junction 問題,README 建議先 npm packdsh plugin add *.tgz。普通使用不必走這條路徑。

典型用法

裝好並重啓 dsh web 之後,沒有額外的配置項要填。在網頁對話裏讓智能體修改或寫入某個文件,展開對應的 write / edit 工具行,默認 DiffBlock 應被 PiUI 風格的 DiffViewer 替換。

可以按下面的順序自檢:

  1. 讓智能體對一個小文件做一次行內修改(例如只改函數名或字符串)。展開工具行後,應能看到詞級紅綠標記,而不是整行一塊色。
  2. 讓它改一個更長的文件,中間夾着大段未變更代碼。未變更區應摺疊成「N 行未變更」,可以按需展開。
  3. 把瀏覽器窗口或信息流拉寬(或搭配 dsh-home-ui 的寬屏模式)。容器夠寬時,同一份 diff 會從 unified 切到 split;縮回去則回到單欄。
  4. 故意製造一次會失敗的編輯(例如路徑不存在)。沒有 diff 卡時,應仍顯示官方錯誤摘要,而不是插件自己的空查看器。

同一維護者在 dsh-home-ui 的說明裏,把「dsh-home-ui 開寬屏 + dsh-diff-viewer」寫成桌面寬屏的推薦組合:信息流放寬後,diff 按容器寬度自動分欄。這是可選搭配,不是本插件的安裝前提。

適用場景與注意事項

適合誰:已經在用 DeepSeek Harness 網頁界面、需要經常審閱智能體 write / edit 結果的人。尤其是改動文件較大、只關心詞級差異,或希望寬屏下左右對比的場景。

不覆蓋什麼:

  • 它只接管 edit / write 這兩個會產出 diff 卡的工具鍵,不是通用的 Git diff 瀏覽器,也不替代終端裏的 git diff
  • dsh.client.platformweb,headless / 純終端 profile 裝了也不會出現這塊界面。
  • dsh.plugin.jsonengines.dsh 寫的是 >=0.0.1,範圍很寬,並不等於已經在每一版預覽構建上驗證過。Harness 仍在開發者預覽,槽位和官方 FileMutationRow 若有變化,插件可能需要跟着升級。

安裝前務必自己看源碼和許可證。插件以當前 dsh 進程的權限運行,安裝時也可能執行代碼,不在 agent 沙箱裏。倉庫 package.json 將許可證聲明爲 BSD-3-Clause;GitHub 倉庫頁面目前沒有單獨的 LICENSE 文件,API 的 license 字段爲空,不能只憑目錄頁「社區開源、可免費安裝」四個字跳過覈對。

另外,package.json"private": true 表示作者沒有把它發到 npm 公共源,所以不要去跑 dsh plugin add @dsh-external/dsh-diff-viewer 指望從 registry 拉包。按 README 用 Release tarball 即可。

小結

dsh-diff-viewer 做的事情很收束:在 DSH 網頁界面裏,用 PiUI 風格的 DiffViewer 替換 write / edit 的默認 DiffBlock,保留官方工具行外殼,補上單欄 / 雙欄、詞級高亮、上下文摺疊和窗口化渲染。它是社區插件,不是 DeepSeek 官方組件;社區目錄可以當檢索入口,真正能用的安裝方式以倉庫 README 爲準——裝 Release 構建產物,不要直接 github: 拉源碼。

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

GitHub:https://github.com/lehhair/dsh-diff-viewer

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

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

小夜