dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness 鲸鱼跳跃小游戏 / whale jump plugin

DeepSeek Harness 等回复时的小游戏挂件:对话流下方一行轻量入口,点开是 canvas 跑酷小游戏(跳跃 / 下潜 / 氧气 / 计分 / 最高分),纯本地、零依赖、不联网。
代码部分 MIT 许可(见
LICENSE);assets/美术素材不在 MIT 范围内,来源与权利状态见PROVENANCE.md。
conversation.input.dock 插槽,空状态页和对话中都会渲染,一处注册覆盖两个场景× dt/16.67,60fps 与 144fps 位移误差 <0.01%gap = w×speed + 72,随速度放大,高速时给同样的反应时间ctx.locale 服务(「设置 → 通用 → 语言」),退回 <html lang> 与 navigator.languages,最后落到简体中文Proxy 上读取时才解析语言,入口行订阅 locale 变更事件,切完立即重渲染,不需要重建任何东西dsh.client + exports["./client"]),由 DSH 模块系统在 /plugins/dsh-whale-jump/client.js 下发加载,完全不碰 index.html,绕开桌面端 script-src 注入失败连坐整个 boot 的坑dsh-whale-jump/
├── package.json # dsh.bundle.patch + dsh.client + files 白名单
├── cordis.patch.yml # 挂载声明
├── lib/
│ ├── index.js # 宿主侧:状态路由(GET/POST)+ 立绘路由 + 诊断
│ └── client.js # 客户端侧:入口行组件 + 游戏引擎 + 浮层(无构建步骤)
├── assets/
│ ├── whale-hero.png # 角色立绘(透明底)
│ └── whale-icon.png # 插件列表图标
├── docs/
│ └── miniwhale-source.jpg # 角色原图(来源存档,不参与运行)
├── _study/ # 开发工具:测试套件 / 抠图 / 预览渲染 / 校准
│ ├── test-*.cjs # 8 个测试套件,共 128 项
│ ├── make_assets.py # 由原图生成 assets/(可复现字节一致)
│ └── dino-game-study.md# 恐龙游戏机制的学习笔记
├── .github/workflows/test.yml # CI:语法检查 + 全部测试
├── PROVENANCE.md # 素材来源与许可范围
├── LICENSE # MIT(仅代码)
└── README.md
没有构建步骤:lib/client.js 是手写的、DSH 客户端模块系统可直接消费的格式,仓库里没有打包配置,clone 下来就能用。
同一份代码支持两种官方形态,装法只差 profile 名:
Web(dsh web,浏览器 UI) | 桌面端(Electron 客户端) | |
|---|---|---|
| profile | web | desktop |
| 安装 | dsh plugin --profile web add "<源>" | dsh plugin --profile desktop add "<源>" |
| 启动 | dsh web 后打开它打印的地址 | 直接打开客户端 |
| 前置条件 | dsh 在 PATH 上 | 先完整启动一次桌面客户端,再完全退出 |
桌面端缺少「开机一次」这一步时,
dsh plugin --profile desktop会以这个错误退出:Open DeepSeek Harness Desktop once to initialize its profile, then fully quit it before running dsh plugin --profile desktop.这不是插件的问题,是桌面端的 profile 由客户端首次启动时生成。
Web:
dsh plugin --profile web add dsh-whale-jump
dsh web
桌面端:
dsh plugin --profile desktop add dsh-whale-jump
Web:
dsh plugin --profile web add "github:CharlieChang1216/dsh-whale-jump"
dsh web
桌面端:
dsh plugin --profile desktop add "github:CharlieChang1216/dsh-whale-jump"
固定版本(<tag> 换成 Releases 里的标签,例如 v0.1.1)把源写成 github:CharlieChang1216/dsh-whale-jump#v0.1.1 即可,两种形态同理。
首次从 GitHub 安装要 clone 整个仓库,网络慢时 pnpm 会先报几次 HEAD https://github.com/... ETIMEDOUT 再重试成功(实测约 2 分钟),属正常现象。
dsh plugin --profile web add "link:<你的仓库路径>"
# 或
dsh plugin --profile desktop add "link:<你的仓库路径>"
装完完全退出客户端(含系统托盘)再重新打开;Web 形态则是重启 dsh web。link: 是软链安装,改源码即时生效(宿主侧改动需重启),但不要移动仓库目录,移动后要重新 add 一次。
main 为 lib/index.js,靠 cordis.patch.yml 挂载、exports["./client"] 下发前端,不需要构建。dsh plugin 需要 pnpm 在 PATH 上),请改用桌面端会话里的内置 plugin_manager,来源填 https://github.com/CharlieChang1216/dsh-whale-jump。$DSH_HOME/.dshwj-state.json(最高分、局数),不碰 profile、不碰 node_modules(可能只读)。| 项目 | 要求 | 实测环境 |
|---|---|---|
| DSH | ≥ 0.2.0 | 桌面端 0.2.1-rc.2(同版本 CLI) |
| Node.js | ≥ 20(仅跑测试需要,插件本身零依赖) | 24.19.0 / 24.21.0 |
| pnpm | dsh plugin 内部使用,需在 PATH 上 | 11.28.5 |
| 操作系统 | 无平台特定 API | Windows 11 x64(macOS / Linux 未实测) |
| 浏览器 | 需要 Canvas 2D;backdrop-filter 可选(不支持只是背景不模糊) | Chromium / Edge |
为什么是 DSH ≥ 0.2.0:插件用到了 dsh.client 客户端模块通道(/plugins/<id>/client.js)、conversation.input.dock 插槽、locale 服务与 webServer 服务注册路由。实测环境是 0.2.1-rc.2;0.2.0 系列预期可用,0.1.x 未做验证,不做承诺。
无需 npm install、无需构建、无运行时依赖:lib/client.js 是手写的 DSH 客户端模块格式,lib/index.js 只用 Node 内置模块(node:fs / node:path / node:url / node:os)。
# 1) 插件已登记(桌面端把 web 换成 desktop)
Select-String -Path "$env:USERPROFILE\.dsh\profiles\web\package.json" -Pattern "dsh-whale-jump"
# 2) 宿主路由活着。端口每次启动都可能变——以 `dsh web` 打印的地址或客户端窗口地址栏为准
$port = 52135 # 换成你实际看到的端口
curl "http://127.0.0.1:$port/dsh-whale-jump/diag" # 诊断:版本 / 立绘状态 / 最近错误
curl "http://127.0.0.1:$port/dsh-whale-jump/state" # → {"best":0,"plays":0}
curl -o hero.png "http://127.0.0.1:$port/dsh-whale-jump/hero.png"
# 3) 状态文件
Get-Content "$env:USERPROFILE\.dsh\.dshwj-state.json"
游戏里拿到分后,state 的 best/plays 会变——这是确认「路由 + 前端 + 落盘」整条链路都通的最终证据。
路由返回空的 400
宿主把 handler 抛出的异常吞成了 400 空响应,真实原因记在 /dsh-whale-jump/diag 的 heroError / lastError(该接口仅回环可读)。这个坑实际踩过一次(2026-10 的 /hero.png 恒定 400 就是靠它定位的)。
改了 lib/index.js 但没生效
宿主侧代码不热重载,必须完全退出客户端(含系统托盘)再重开。lib/client.js 是热读的,改完刷新页面即可。
移动/改名了仓库目录,角色变成一只代码画的蓝色小鲸鱼
宿主在加载插件时就把包根路径(PACKAGE_ROOT)固化了,之后读立绘还在用旧路径,于是 /hero.png 返回 404,前端退化成内置的兜底鲸鱼。修法:
# 1) 把软链指向新目录(junction 而不是拷贝,才不会丢实时生效)
Remove-Item "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-whale-jump" -Force
New-Item -ItemType Junction -Target "<新路径>" -Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-whale-jump"
# 2) 改 profile/package.json 里的 link: 路径,否则下次 pnpm install 会指回去
# 3) 完全退出客户端再重开
判断是否已生效:/dsh-whale-jump/diag 的 hero.exists 应该从 false 变 true。
陈旧进程假象
如果宿主进程还在跑旧版 lib/index.js,新加的路由会 404、改过的路由可能返回空 400。这不是代码缺陷,重启即好。第一次部署时 /hero.png 恒定 400 就是这个原因。移动目录不需要重新 add,但一定需要重启:软链改了只解决「包能不能被找到」,包根路径是进程启动时算好的,不重启不会重新计算。
node:fs / node:path / node:vm),不需要 npm install:npm test # 跑全部 8 个套件(128 项)
npm run test:engine
npm run test:oxygen
$DSH_HOME/.dshwj-state.json(最高分、局数)。0.1.x,x 等于已发布的次数——第 1 次发布是 0.1.1,第 2 次是 0.1.2,0.1.0 保留为发布前的初始 tag。每次打 tag 前先改 package.json 的 version,再 git tag v0.1.x && git push --tags。_study/dino-game-study.md。LICENSE)。assets/、docs/)不在 MIT 覆盖范围内,来源与权利状态见 PROVENANCE.md:角色立绘为第三方用户发布的 AI 生成 DeepSeek 鲸鱼形象二创(原发布者声明可自由使用),插件里只做背景抠图与缩放,未做任何重绘。