dsh-whale-pig-widget 🐷
DSH(DeepSeek Harness)网页右下角的余额小鲸鱼挂件 —— fork 自 MeteorNOX / dsh-whale-widget 0.4.2,完整保留上游全部功能,并内置一只会吃饭、会睡觉的小猪。
上游只能「换一张角色图」;这一版把「角色三态」做成正式能力,并把小猪素材和三态判定一起打包:装完就有猪,不用手动导图、改 JS。 上游的完整功能说明(余额、泡泡点击序列、逐行样式、音效……)见
README.upstream.md。

与上游的差别(只有这三条)
| # | 内容 | 上游 0.4.2 | 本版 0.5.0 |
|---|---|---|---|
| 1 | 角色三态:待机 → 干活(吃饲料) → 打盹(趴着睡) | 无(一张静态角色图) | 有。宿主新增 GET /dsh-whale/running.json,前端每秒对齐;优先级 干活 > 打盹 > 待机 |
| 2 | 内置小猪 | 需用户自行导入图片 | 首次启动把随包的三态小猪播种进角色目录,角色面板直接多一条「小猪」+ 音效组「猪叫」 |
| 3 | 三个独立开关 | — | 干活形象 / 打盹形象 / 摸一下叫醒,都存 localStorage,互不影响 |
| 4 | 跑完说句话 | — | 一轮跑完叫一声 + 冒一句可编辑的台词(见下节) |
除此之外与上游 0.4.2 逐行一致:余额 / 今日已用 / 峰谷定价、自定义泡泡点击序列(文本·余额·今日·峰谷·图片·随机语句与并列加权)、逐行样式与字体、悬浮快捷编辑、拖拽排版、音效与每轮消耗、自定义角色与音效、吸附与翻转。
三态怎么判定
每 1s: GET /dsh-whale/running.json?role=<当前角色 id>
├─ running=true 且存在 <id>-busy.gif → 播「干活」图(吃饲料)
├─ 空闲 ≥ 60s 且存在 <id>-sleep.gif → 播「打盹」图(趴着睡)
└─ 其余 → 播角色本体图
running由宿主监听session/event的turn/start/turn/end得出;20 分钟无任何事件视为宿主丢了turn/end,自动复位。- 变体图不写进
roles.json:只要<id>-busy.gif/<id>-sleep.gif与角色图同目录即可,换角色、重导入、改 id 自动生效;没有变体就一次图都不请求(不闪 404)。 - 两个开关都关掉时前端完全停止轮询(零开销)。
- 「摸一下叫醒」默认开:点/拖一下立刻回本体并压住睡意 3 分钟;关掉就能一直趴着睡。
内置小猪从哪来
首次启动时 lib/index.js → ensureBuiltinPig():
- 复制
assets/builtin/pig.gif、pig-busy.gif、pig-sleep.gif到$DSH_HOME/whale-roles/; - 往
roles.json追加{ id: "pig", name: "小猪", format: "gif" }; - 复制
assets/builtin/pig-oink.wav到音效目录,追加片段「猪叫」+ 音效组「猪叫」(按下即响)。
播种只做一次,成功写标记 .builtin-pig.v1。之后你删掉这只猪、改名、置顶、换图,插件都不会再塞回来 —— 它和你自己导入的角色完全平等。
换自己的宠物:覆盖 assets/builtin/ 下三个同名 GIF 即可,代码不动。尺寸建议正方形 ≤256×256,背景必须透明(GIF 1-bit alpha;不透明底会在挂件上糊出一个方块)。
更新日志
0.5.1 — 2026-10-26
- 修:气泡整块不冒(含「本轮扣了多少钱」)—— 根因是
.dshw-size.json里bubbleOn被写成false,showCostBubble()首行即返回。现已复位,并在 README 标明开关位置(菜单「气泡全局开关」/「音效/提示泡泡设置 → 每轮消耗提示」)。 - 改:说话气泡不再占角色正上方(那里是思考气泡的地盘,金额要在那显示),改为角色左侧、脚底附近;宽度上限 300→230。
- 加:
GET /dsh-whale/debug-log打点路由,全链路写$DSH_HOME/.dshw-speech.log(tick 对齐 / fire / 建节点 / 定位坐标 /Audio.play()是否被拦),200 KB 自截断。 - 加:菜单「说句话」行内
♪立刻试一句、✎编辑台词(每行一句,留空恢复默认 8 句);两者用可见按钮样式.dshwv-speech-btn。 - 加:小猪三态图(
.gif51/18/20 帧)恢复透明背景,去掉黑色底片。
0.5.0 — 2026-10-26
- 基于 dsh-whale-widget 派生:内置 🐷 小猪三态角色、吃饭/睡觉、猪叫音效组,保留小鲸鱼全部功能。
说句话(跑完喊一声)
一轮任务跑完(宿主 last-turn.json 的 seq 递增)→ 小猪叫一声(内置 pig-oink.wav)并冒一句台词,气泡停在角色上方 5.2 秒后淡出。
- 不做定时喊:只在「跑完」这一刻吭声,没有间隔循环。
- 开关:菜单里「说句话」(
localStorage.dshw-speech,默认开)。关掉后既不出声也不冒泡。 - 台词:点这一行右边的 ✎ 编辑,每行一句,留空保存即恢复默认 8 句(存
dshw-speech-lines)。 - 已播轮次记在
dshw-speech-seq:刷新页面不会为同一轮重复喊。 - 菜单里 ♪ = 立刻试一句(不用等任务跑完就能验气泡/声音);✎ = 编辑台词。
- 实现上是 body 级
position:fixed独立元素(.dshwv-speech,关键样式内联,不依赖挂件样式表能生效)+ 独立 1.5s 轮询,不碰原有泡泡队列;节点不在就整段跳过,非主界面零请求。 - 排障:前端把每一步写进
$DSH_HOME/.dshw-speech.log(路由GET /dsh-whale/debug-log?m=…,200KB 自截断),tick对齐 /fire/ 建节点 / 定位 / 出声是否被浏览器拦,都能从这张日志看出来。
安装
# 1) 先卸掉上游:两者注册同一批 /dsh-whale/* 路由,不能共存
dsh plugin --profile web remove dsh-whale-widget
# 2) 装本版
dsh plugin --profile web add link:/absolute/path/to/dsh-whale-pig-widget
也可以交给 DSH 自己装:plugin_manager → action: install_bundle → target: /absolute/path/to/dsh-whale-pig-widget,返回 application: applied 即生效(刷新页面一次)。
数据兼容:$DSH_HOME/whale-roles、whale-audio、.dshw-*.json 与 localStorage 键(dshw-role、dshw-work-look、dshw-sleep-look、dshw-pet-wake…)全部沿用上游,替换不丢现有角色、音效与面板配置。
目录
dsh-whale-pig-widget/
├── lib/index.js # 宿主:余额/用量/角色/音效路由 + running.json + 内置小猪播种
├── lib/accounting.mjs # 上游用量账本
├── assets/whale-widget.js # 前端:整个挂件(含三态切换与三条开关)
├── assets/builtin/ # fork 新增:pig.gif / pig-busy.gif / pig-sleep.gif / pig-oink.wav
├── assets/* # 上游素材:鲸鱼本体、泡泡图、内置音效
├── cordis.patch.yml # bundle patch
├── icon.png # 插件图标(沿用上游)
├── PROVENANCE.md # 素材来源与许可范围(含 fork 增补)
├── README.upstream.md # 上游 README 原文(功能全量说明)
└── README.md
许可
- 代码:MIT。上游 © 2026 MeteorNOX;fork 修改 © 2026 KIM。
- 美术素材:
assets/不在 MIT 覆盖范围内,按 as-is 随插件分发,详见PROVENANCE.md。assets/builtin/的小猪三态与叫声由 fork 作者提供。
已知边界
- 与上游不可同时启用(同一批路由会重复注册而报错)。
- 「干活」状态来自 turn 事件:插件加载前就在跑的那一轮看不到,下一轮开始即正常。
- 三态是 GIF,体积随帧数走;内置小猪为 256×256 / 255 色 / 1-bit 透明背景(原图 512×512 二进制 alpha,缩放时按预乘 alpha 采样,不产生黑边),三张共约 1.2 MB。
- 上游的
pig-rest(135×84 四态趴睡素材)逻辑保留但互不干扰:它只认 135×84 的图,内置小猪是 256×256,由running.json这套接管。
No comments yet. Be the first to write one.