用 dsh-minigames 給 DeepSeek Harness 網頁界面加一塊離線小遊戲面板

前言

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.2package.json 裏聲明 dsh.client.platformweb,只走瀏覽器端。

目錄頁把它歸在「界面增強」,2026-08-15 收錄。倉庫帶 dshdsh-plugin 兩個 topic。2026-08-17 查閱時,GitHub 顯示 20 星;目錄頁當時仍顯示 18 星,星標以倉庫頁面爲準。

它解決的問題可以縮成一句:等回覆、等任務的間隙,在 Web UI 右側打開一款不依賴外網、不搶聊天輸入框的小遊戲。作者在 README 裏把它寫成「摸魚神器」,能力邊界也寫得很清楚:全部離線、零資源文件、Canvas 繪製;最高分只寫 localStorage;鍵盤焦點必須點進遊戲區才生效。

插件清單 dsh.plugin.jsoncontributes.toolscontributes.skills 都是空數組。它不給模型增加工具或技能,只往頁面上掛一塊 UI。

核心功能

右側面板:摺疊條與半屏畫布

面板有兩種狀態,README 與目錄頁描述一致:

  • 摺疊態:瀏覽器右緣一條帶 🎮 的小豎條,幾乎不佔佈局。
  • 展開態:點擊後默認佔窗口右半(50vw),可拖左緣,寬度限制在 360px80vw

遊戲畫布按面板真實可用空間縮放,工具條、畫布、按鍵提示要一起完整顯示,不出現滾動條。寬高上限 960px。瀏覽器縮放或拖窄面板時會重排。

掛載方式是 document.body 上的 portal,不佔用宿主佈局槽,也不依賴宿主服務。README 寫明 dsh.client.inject 爲空,客戶端運行時不引入 @deepseek-ai 包。佈局改成左欄、右欄或摺疊時,這塊面板按設計不應和主界面搶槽位。

摺疊面板、切換瀏覽器標籤頁時遊戲會自動暫停,回來再繼續。每局最高分寫入 localStorage。鍵盤事件只在點擊遊戲區域後生效,避免把聊天輸入框的按鍵搶走。

18 款內置遊戲

倉庫 README 列出的 18 款(v0.3.0 起定爲 18 款,隨後去掉了乒乓)全部離線、無外部資源文件:

  1. 恐龍跳一跳:Chrome 經典小恐龍,含晝夜切換與雨天視覺。
  2. 俄羅斯方塊:10×20 標準棋盤,含幽靈落點、暫存和下一個預覽。
  3. 坦克大戰(帶 AI):2D 坦克,敵軍貪心追蹤 + 視線開火,共 3 波。
  4. 消消樂:四連通同色消除,目標分過關。
  5. 華容道:16 格數字華容道(15-puzzle),從已解狀態隨機滑動打亂,保證可解。
  6. 貪喫蛇:環面地圖,穿邊界從對側出現,撞到自己才結束。
  7. 2048:滑動合併,合成 2048 計爲達成。
  8. 掃雷:9×9、10 雷,首次點擊安全,支持雙擊數字展開。
  9. 記憶翻牌:4×4 共 8 對。
  10. 五子棋 vs AI:15×15,AI 會連五也會堵。
  11. 跳一跳:按住蓄力、鬆開起跳。
  12. 打磚塊:清牆進下一關,球速遞增。
  13. 打地鼠:30 秒限時,5×5 共 25 洞,最多 5 只同時冒頭。
  14. 黑白棋 vs AI:8×8 奧賽羅,無棋可下自動讓位。
  15. Flappy:點擊或空格振翅過柱。
  16. 數獨:9×9,D 鍵切換簡單 / 普通 / 困難(線索數 45 / 35 / 30)。
  17. 喫豆人:迷宮喫豆,力量豆可反喫幽靈。
  18. 跟槍練習:Pointer Lock 第一人稱,鎖定鼠標轉視角,左鍵射擊帶後坐力。

這些規則來自倉庫 README 的「遊戲玩法與細節」,不是演示視頻或第三方評測。若某款遊戲的手感與文檔不一致,以當前構建產物爲準。

可擴展註冊表

內置遊戲走 registerGame。新增一款遊戲需要實現 MiniGameDefinitionsrc/client/games/types.ts):idtitleicondescriptioncontrols,以及 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「使用」一節,日常操作是:

  1. 啓動 Web UI(dsh web,官方默認地址 http://127.0.0.1:3080)。
  2. 看頁面右緣是否出現 🎮 豎條。
  3. 點擊豎條,面板展開到窗口右半。
  4. 點遊戲卡片開始;P 暫停,結算後 R 重開,點「選遊戲」回到列表。
  5. 點「收起」折回豎條。遊戲會暫停,當前局進度按 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.jsonname@dsh-external/dsh-minigames)一致。

適用場景與注意事項

比較適合這些情況:

  • 已經在用 dsh web,希望等模型輸出時有一塊不離開頁面的離線小遊戲。
  • 需要確認插件只動瀏覽器 UI、不給模型加工具。
  • 想按 registerGame 自己加一款 Canvas 遊戲,並沿用面板的暫停、最高分和焦點門控。

使用前注意:

  1. 權限與安全。插件以當前 dsh 進程權限運行,安裝時可能執行代碼。安裝前檢查 GitHub 源碼和 BSD-3-Clause 許可證;生產或共享環境建議固定 commit。社區目錄不是官方商店,收錄不等於背書。
  2. 只覆蓋 Web UIdsh.client.platformweb。終端 TUI、無頭模式不會出現這塊面板。
  3. 鍵盤焦點是有意設計。點過聊天輸入框後,必須再點回遊戲區才能繼續用鍵盤。不要把這當成故障。
  4. 持久化範圍有限。跨會話只保留最高分。消消樂以及方塊 / 坦克的關卡進度不跨會話保存。恐龍的晝夜和雨天是視覺氛圍,不改變碰撞判定。
  5. AI 強度有限。坦克大戰 AI 是貪心追蹤加視線開火,沒有尋路。五子棋、黑白棋是啓發式,不是完整博弈引擎。
  6. 清單版本可能落後於包版本package.json0.3.2,倉庫根目錄 dsh.plugin.json 裏的 version 仍是 0.1.0,且描述還停留在「恐龍 / 方塊 / 坦克」三款。以 package.json 和 README 正文爲準。
  7. 兩條安裝通道不要混用dsh.plugin.jsoncordis.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

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

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

小夜