dsh-pet
PC2005-cloud/dsh-petDSH Web UI 桌面宠物,Windows / macOS / Linux 三端可用:浏览器浮层或透明置顶桌面窗口,106 个透明动画、带挤压与粒子的甩抛反弹物理、随会话事件实时联动的工作状态气泡、碎碎念与带持久记忆的对话、余额展示、表情包配图、多开同屏,并支持直接放入的自定义动画与宠物种类(pet pack)。
DSH 桌宠「深深」:跟随任务状态切换待机/敲键盘/思考/庆祝/失败,支持点击挥手、拖动左右奔跑,并保留 API 余额、本机用量记账、角色、气泡与音效设置。二创自 MeteorNOX/DeepSeek-Balance-Whale-Widget(dsh-whale-widget 0.4.2);请勿与上游同时安装,否则会出现双角色与重复请求。
把「深深」放进 DeepSeek Harness:右下角一只跟随任务状态变化的透明角色,Codex 工作时敲键盘、完成时庆祝、失败时排错、等待你回答时思考,点击挥手、拖动小跳;同时保留上游 dsh-whale-widget 的 API 余额、本机用量、角色、气泡、音效与本地工坊。
本项目是 MeteorNOX/DeepSeek-Balance-Whale-Widget(dsh-whale-widget 0.4.2)的深深角色分支,角色素材与动作状态机来自 proletari/shenshen-codex-companion。
触发条件 · 动作 · 素材 当前没有活跃回合 · 待机 / 眨眼 · shenshen-idle.png(6 帧 APNG) 有活跃回合(activeTurns > 0) · 敲键盘 · shenshen-working.png 有回合在等你确认/回答(waiting) · 思考 · shenshen-thinking.png 回合成功结束 · 庆祝,播完回原状态 · shenshen-celebrate.png 回合以错误结束 · 排错恢复 · shenshen-failed.png 单击角色后松手 · 挥手 · shenshen-wave.png 拖动角色未松手 · 奔跑(8 帧,左右两向) · shenshen-runright.png / shenshen-runleft.png 拖动角色后松手 · 小跳 · shenshen-jump.png
shenshen-orange-codex 的图集)。clip-path;宿主的异步 setupHitTest 不再决定画面裁切,避免工作帧被待机宽度裁掉。waiting 借用上游已实现的 ask_user_question / approval/asked 挂起跟踪;没有该信号的旧宿主上不会出现思考态,不影响其它动作。session/event 的 assistant/message usage 记账,按轮/按天汇总;峰谷计价;不把本机 token 当官方剩余额度。ctx.credentials),路由有回环/同源校验;远端请求默认拒绝写操作。desktop profile 编写说明,Web 用 --profile web)。dsh CLI(桌面版位于 DSH\resources\runtime\cli\bin\dsh.cmd)。package.json,应用运行时会被文件锁挡住。从 GitHub Release 的预构建 tarball 安装(推荐;不需要 npm 账号):
# 先完全退出 DSH
dsh plugin --profile desktop add "https://github.com/proletari/shenshen-dsh-companion/releases/download/dsh-v0.1.1/dsh-shenshen-companion-0.1.1.tgz"
# 然后重新启动 DSH如果 dsh 不在 PATH,用桌面版自带 CLI:
& "<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add "https://github.com/proletari/shenshen-dsh-companion/releases/download/dsh-v0.1.1/dsh-shenshen-companion-0.1.1.tgz"npm 包 dsh-shenshen-companion 尚未发布,请使用上面的 tarball 方式。dsh plugin --profile desktop add "link:<本目录绝对路径>"命令会在 profile 里执行 pnpm add,并把本包自动加入 dsh.profile.bundles(本包声明了 dsh.bundle.patch)。启动后 DSH 会加载 cordis.patch.yml,插件开始工作。
ask_user_question / 审批:角色切到思考。dsh plugin --profile desktop remove dsh-shenshen-companion或直接删掉 profile package.json 里 dsh.profile.bundles 的对应项,再 pnpm remove。
⚠️ 不要同时安装上游dsh-whale-widget:两者会各自注入/dsh-whale/widget.js与状态路由,出现双角色/双请求。若要并存,先卸掉一个。
DSH 页面(Web / Electron 渲染层)
├─ /dsh-whale/widget.js 上游挂件:角色、气泡、菜单、余额/用量面板
├─ /dsh-whale/shenshen-actions.js 本分支新增:动作状态机(sidecar)
└─ .dshwv-img 两者共同操作的角色 <img>
DSH 宿主进程(Cordis 插件 lib/index.js)
├─ ctx.on('session/event') 折叠 turn/start · assistant/message · turn/end
├─ /dsh-whale/shenshen-status.json { activeTurns, waiting, notice }
├─ /dsh-whale/shenshen-image.png 7 个 APNG + 左右奔跑 + 全帧掩膜(白名单文件名)
├─ /dsh-whale/shenshen-actions.js sidecar 脚本
└─ 上游全部路由与逻辑(余额、记账、角色、气泡、音效…)关键点:
.dshwv-img 完成。lib/shenshen-state.mjs 是无依赖的纯函数模块,负责 activeTurns、子代理过滤、15 分钟兜底清理与 notice 去重。ctx.webServer.tapIndex;桌面壳用 webserver/index-inject 的结构化 script 行(桌面壳的 index.html 不经过 tapIndex,这是上游踩过的坑)。registerRoute 包装(Host/Origin 回环校验 + 宿主 connection 栅栏)。shenshen-dsh-companion/
├─ lib/
│ ├─ index.js 宿主插件(上游 0.4.2 + 深深状态/路由/注入)
│ ├─ shenshen-state.mjs 纯状态折叠(本分支新增)
│ └─ accounting.mjs 上游记账
├─ assets/
│ ├─ whale-widget.js 上游前端(仅角色名改为「深深」)
│ ├─ shenshen-actions.js 动作 sidecar(本分支新增)
│ ├─ shenshen-*.png 7 组 APNG
│ └─ … 上游角色/气泡/音效
├─ tests/ 状态、动作、插件集成测试
├─ docs/ 预览图与生成 prompt 记录
├─ cordis.patch.yml
└─ package.jsoncd shenshen-dsh-companion
# 语法
node --check lib/index.js
node --check assets/shenshen-actions.js
node --check assets/whale-widget.js
# 测试(无需安装任何依赖)
node tests/shenshen-state.test.mjs
node tests/shenshen-actions.test.mjs
node tests/shenshen-dom.test.mjs
node tests/plugin-integration.test.mjs四组测试覆盖:
apply(),检查两条注入通道、状态路由、图片/脚本路由、上游路由仍在。素材来自 Codex 版仓库的 assets/shenshen-*.png 与 shenshen-manifest.json。替换时保持:
assets/shenshen-actions.js 顶部的 DURATIONS 一致(思考 1460ms、庆祝 1070ms、失败 1550ms、挥手 1070ms、跳跃 1050ms);生成用的 prompt 记录在 docs/shenshen/。
dsh plugin add);注入、桌面壳行、真实事件字段仍需装后确认。ask_user_question 与 approval/asked 事件不存在时,thinking 不会出现。assets/ 下的前端文件时,刷新页面即可)。~/.codex/pets/shenshen-orange-codex,192×208 单元格放大到 608):与 608 版 APNG 是同一角色但不同生成批次,切换时画风可能略有差异;拖动方向决定使用左跑还是右跑。lostpointercapture 不再误清松手后的待播动作;松手动作有 400ms 兜底;轮询周期性补 flush 自愈;宿主改写角色图后强制重画。新增假 DOM 事件层回归测试(单击/拖动/丢 pointerup/宿主不摘拖拽类/连点)。shenshen-orange-codex 图集里的 8 帧跑步动画,按拖动方向使用左右两向(shenshen-runright.png / shenshen-runleft.png),并生成对应的全帧掩膜;移除原先用 jump 空中帧合成的临时拖拽循环;notice 去重键加入时间戳并持久化,刷新页面不再重播上一轮庆祝;资源 URL 加版本参数避开旧缓存。clip-path;宿主 applyHitClip 优先采用该轮廓,setupHitTest 增加 token 只让最后一次回调生效,修掉工作帧仍被待机轮廓裁切的问题。assets/** 与 icon.png 不在 MIT 范围内,按上游条款 as-is 随插件分发,不授予再许可;深深 APNG 来自 proletari/shenshen-codex-companion,奔跑帧来自用户本机 Codex 自定义宠物 shenshen-orange-codex,生成 prompt 记录在 docs/shenshen/。