前言¶
DeepSeek Harness(dsh)把模型、工具、會話和界面都做成插件。官方倉庫 deepseek-ai/deepseek-harness 的定位是「Everything is a plugin」,目前仍處於 developer preview,接口還會變。社區裏已經有一批界面增強插件:側邊欄、主題、桌寵、狀態文案輪播。等模型流式輸出、等 Agent 跑完一輪工具調用時,網頁界面右側通常是空的。
dsh-minigames 做的事情很具體:在 Web UI 右緣掛一塊可摺疊的小遊戲面板,內置 18 款純 Canvas 離線遊戲。它不向模型註冊工具,也不訪問網絡。本文按插件目錄頁、GitHub 倉庫 README / package.json 覈對後整理:它是什麼、裝在哪、怎麼玩、開發者如何加新遊戲。
需要先說明來源。DeepSeek Harness 本身由 DeepSeek AI 開源;本文引用的插件目錄 deepseek-harness-plugin.com 是獨立的社區站點,與 DeepSeek、幻方(High-Flyer)沒有從屬或背書關係,不能當成官方應用商店。
這是什麼¶
dsh-minigames 是一款面向 DeepSeek Harness 網頁界面 的界面增強插件,由 GitHub 用戶 lhh010 維護,倉庫爲 lhh010/dsh-minigames。許可證是 BSD-3-Clause,主要語言 TypeScript。npm 包名是 @dsh-external/dsh-minigames,當前 package.json 版本爲 0.3.2。package.json 裏聲明 dsh.client.platform 爲 web,只走瀏覽器端。
目錄頁把它歸在「界面增強」,2026-08-15 收錄。倉庫帶 dsh、dsh-plugin 兩個 topic。2026-08-17 查閱時,GitHub 顯示 20 星;目錄頁當時仍顯示 18 星,星標以倉庫頁面爲準。
它解決的問題可以縮成一句:等回覆、等任務的間隙,在 Web UI 右側打開一款不依賴外網、不搶聊天輸入框的小遊戲。作者在 README 裏把它寫成「摸魚神器」,能力邊界也寫得很清楚:全部離線、零資源文件、Canvas 繪製;最高分只寫 localStorage;鍵盤焦點必須點進遊戲區才生效。
插件清單 dsh.plugin.json 裏 contributes.tools 和 contributes.skills 都是空數組。它不給模型增加工具或技能,只往頁面上掛一塊 UI。
核心功能¶
右側面板:摺疊條與半屏畫布¶
面板有兩種狀態,README 與目錄頁描述一致:
- 摺疊態:瀏覽器右緣一條帶 🎮 的小豎條,幾乎不佔佈局。
- 展開態:點擊後默認佔窗口右半(
50vw),可拖左緣,寬度限制在360px–80vw。
遊戲畫布按面板真實可用空間縮放,工具條、畫布、按鍵提示要一起完整顯示,不出現滾動條。寬高上限 960px。瀏覽器縮放或拖窄面板時會重排。
掛載方式是 document.body 上的 portal,不佔用宿主佈局槽,也不依賴宿主服務。README 寫明 dsh.client.inject 爲空,客戶端運行時不引入 @deepseek-ai 包。佈局改成左欄、右欄或摺疊時,這塊面板按設計不應和主界面搶槽位。
摺疊面板、切換瀏覽器標籤頁時遊戲會自動暫停,回來再繼續。每局最高分寫入 localStorage。鍵盤事件只在點擊遊戲區域後生效,避免把聊天輸入框的按鍵搶走。
18 款內置遊戲¶
倉庫 README 列出的 18 款(v0.3.0 起定爲 18 款,隨後去掉了乒乓)全部離線、無外部資源文件:
- 恐龍跳一跳:Chrome 經典小恐龍,含晝夜切換與雨天視覺。
- 俄羅斯方塊:10×20 標準棋盤,含幽靈落點、暫存和下一個預覽。
- 坦克大戰(帶 AI):2D 坦克,敵軍貪心追蹤 + 視線開火,共 3 波。
- 消消樂:四連通同色消除,目標分過關。
- 華容道:16 格數字華容道(15-puzzle),從已解狀態隨機滑動打亂,保證可解。
- 貪喫蛇:環面地圖,穿邊界從對側出現,撞到自己才結束。
- 2048:滑動合併,合成 2048 計爲達成。
- 掃雷:9×9、10 雷,首次點擊安全,支持雙擊數字展開。
- 記憶翻牌:4×4 共 8 對。
- 五子棋 vs AI:15×15,AI 會連五也會堵。
- 跳一跳:按住蓄力、鬆開起跳。
- 打磚塊:清牆進下一關,球速遞增。
- 打地鼠:30 秒限時,5×5 共 25 洞,最多 5 只同時冒頭。
- 黑白棋 vs AI:8×8 奧賽羅,無棋可下自動讓位。
- Flappy:點擊或空格振翅過柱。
- 數獨:9×9,
D鍵切換簡單 / 普通 / 困難(線索數 45 / 35 / 30)。 - 喫豆人:迷宮喫豆,力量豆可反喫幽靈。
- 跟槍練習:Pointer Lock 第一人稱,鎖定鼠標轉視角,左鍵射擊帶後坐力。
這些規則來自倉庫 README 的「遊戲玩法與細節」,不是演示視頻或第三方評測。若某款遊戲的手感與文檔不一致,以當前構建產物爲準。
可擴展註冊表¶
內置遊戲走 registerGame。新增一款遊戲需要實現 MiniGameDefinition(src/client/games/types.ts):id、title、icon、description、controls,以及 create(host, options)。create 返回的實例由面板驅動生命週期:
- 切換遊戲:先
destroy()舊實例,再create()新實例。 - 摺疊、隱藏標籤頁或用戶暫停:調用
pause()。 - 分數變化時通過
options.onScore?.(score)上報,面板負責顯示和最高分持久化。
README 建議把規則做成不碰 DOM、不定時器的純函數,再用 Vitest 覆蓋。倉庫聲稱當前有 201 個純邏輯單測;開發腳本註釋裏仍寫着 189,以 README 正文與 changelog 的 201 爲準。
安裝與啓用¶
目錄頁給出的安裝命令如下,在已經能運行 dsh 的終端裏執行:
dsh plugin add github:lhh010/dsh-minigames
插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查源碼倉庫和許可證。若需要可復現安裝,按目錄頁說明固定 commit 哈希。當前 main 最新提交爲 a22b3c143839e4ed75e98e64345e41fb02f8d9c0(2026-08-13,文檔雙語提交),寫法是:
dsh plugin add github:lhh010/dsh-minigames#a22b3c143839e4ed75e98e64345e41fb02f8d9c0
之後用 dsh plugins list 確認是否已進入當前配置。GitHub 來源的插件在安裝時可能跑構建腳本,只安裝你審查過的倉庫。
倉庫 README 另外提供了本地開發安裝路徑,前置條件寫的是已構建的 DSH 20260808+ 快照和 pnpm:
git clone https://github.com/lhh010/dsh-minigames.git
cd dsh-minigames
pnpm install
pnpm build
# 裝入當前 web profile(寫入依賴並加入 dsh.profile.bundles)
dsh plugin --profile web add /絕對路徑/to/dsh-minigames
# 可選:確認組合配置裏只有一行
dsh --profile web --dump-config | grep dsh-minigames
插件集合變更要重啓 dsh web 後才生效。卸載:
dsh plugin --profile web remove @dsh-external/dsh-minigames
README 明確寫了:倉庫同時帶 dsh.plugin.json(registry 通道)和 cordis.patch.yml(profile bundle 通道),二選一安裝,不要同時啓用。
兼容性方面,README 稱已在下列基線上做實機 boot 驗證:snapshot0810(snapshots/20260810T155924Z)、snapshot0811(snapshots/20260811T152241Z)、最終快照 snapshot0812(snapshots/20260812T172954Z-final),以及 npm 發版 @deepseek-ai/dsh@0.0.1-rc.5(dist-tag next)和 @deepseek-ai/dsh@0.0.1-rc.2。驗證項包括 window.__DSH_BOOT__ 清單含 @dsh-external/dsh-minigames,以及 /plugins/@dsh-external/dsh-minigames/client.js 返回 200。Harness 仍在 developer preview,後續快照不保證還能直接加載。
典型用法¶
按 README「使用」一節,日常操作是:
- 啓動 Web UI(
dsh web,官方默認地址http://127.0.0.1:3080)。 - 看頁面右緣是否出現 🎮 豎條。
- 點擊豎條,面板展開到窗口右半。
- 點遊戲卡片開始;
P暫停,結算後R重開,點「選遊戲」回到列表。 - 點「收起」折回豎條。遊戲會暫停,當前局進度按 README 會保留;關卡進度是否跨會話保存見下一節。
開發者若要加自定義遊戲,倉庫給出的接口示例如下(摘自 README,路徑以源碼爲準):
import { registerGame, type MiniGameDefinition } from './index.ts'
const myGame: MiniGameDefinition = {
id: 'my-game', // 唯一 id(選中記憶與最高分 key)
title: '我的遊戲',
icon: '🎯',
description: '一句話介紹',
controls: ['空格:跳躍', 'P:暫停'],
create(host, options) {
return {
start() {},
pause() {},
resume() {},
destroy() {},
}
},
}
registerGame(myGame)
本地開發常用命令:
pnpm run typecheck # tsc --noEmit
pnpm run test # vitest 純邏輯單測
pnpm run build # 產出 lib/index.js(node half)與 lib/client.js(瀏覽器 bundle)
lib/index.js 是 node 側 loader 佔位(僅日誌),客戶端掃描依賴這一行存在。lib/client.js 通過 window.__ModuleLoader__.load 註冊,id 必須與 package.json 的 name(@dsh-external/dsh-minigames)一致。
適用場景與注意事項¶
比較適合這些情況:
- 已經在用
dsh web,希望等模型輸出時有一塊不離開頁面的離線小遊戲。 - 需要確認插件只動瀏覽器 UI、不給模型加工具。
- 想按
registerGame自己加一款 Canvas 遊戲,並沿用面板的暫停、最高分和焦點門控。
使用前注意:
- 權限與安全。插件以當前 dsh 進程權限運行,安裝時可能執行代碼。安裝前檢查 GitHub 源碼和 BSD-3-Clause 許可證;生產或共享環境建議固定 commit。社區目錄不是官方商店,收錄不等於背書。
- 只覆蓋 Web UI。
dsh.client.platform爲web。終端 TUI、無頭模式不會出現這塊面板。 - 鍵盤焦點是有意設計。點過聊天輸入框後,必須再點回遊戲區才能繼續用鍵盤。不要把這當成故障。
- 持久化範圍有限。跨會話只保留最高分。消消樂以及方塊 / 坦克的關卡進度不跨會話保存。恐龍的晝夜和雨天是視覺氛圍,不改變碰撞判定。
- AI 強度有限。坦克大戰 AI 是貪心追蹤加視線開火,沒有尋路。五子棋、黑白棋是啓發式,不是完整博弈引擎。
- 清單版本可能落後於包版本。
package.json爲0.3.2,倉庫根目錄dsh.plugin.json裏的version仍是0.1.0,且描述還停留在「恐龍 / 方塊 / 坦克」三款。以package.json和 README 正文爲準。 - 兩條安裝通道不要混用。
dsh.plugin.json與cordis.patch.yml同時啓用可能導致重複掛載。改完插件集合後重啓dsh web。
小結¶
dsh-minigames 把 18 款離線 Canvas 小遊戲掛在 DeepSeek Harness Web UI 右側,摺疊時只留一條 🎮 豎條,展開後在面板裏自選遊戲。它由 lhh010 維護,BSD-3-Clause 開源,不向模型註冊工具,最高分只寫本地 localStorage。
目錄頁安裝命令:
dsh plugin add github:lhh010/dsh-minigames
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-minigames/
GitHub:https://github.com/lhh010/dsh-minigames