跳过主要内容
D

dsh-lived-pet (dsh-pet-bridge)

deanzhang2026-max/dsh-lived-pet/packages/dsh-pet-bridge

把 harness agent 的实时状态(思考、干活、等待、完成、出错)写入状态文件,配套的 Electron Live2D 桌宠轮询该文件,气泡与表情随 agent 的实际动作变化。

安装

dsh plugin --profile web add github:deanzhang2026-max/dsh-lived-pet

该插件位于仓库的 packages/dsh-pet-bridge 子路径下。

README

DSH Desktop Pet · Live2D 桌宠

一只住在桌面上的透明、置顶、无边框 Live2D 桌宠,用来实时显示 DeepSeek Harness agent 正在做什么 —— 全屏干活时也能看到它是在思考、在忙、还是卡住了。

16 态总览

它能做什么

能力说明
透明置顶Electron 原生窗口,transparent + frame:false + alwaysOnTop,切换全屏应用也看得见
状态实时联动插件监听 harness 的 session/event,气泡显示「正在执行 pwsh …」,Live2D 表情同步切换
16 种状态不只"在忙":读文件 / 写代码 / 跑命令 / 联网搜索 / 派子代理 / 列计划 / 连续顺利 / 反复失败 / 被打断 / 长任务,各有自己的表情与动作
动作有节奏每个长状态配一组语义相容的动作池并轮换(±15% 抖动),不会一直吹泡泡;出错/被打断这类瞬间只演一次
表情不被动作带跑表情与动作独立选择,表情永远不从动作推导 —— 身体在动,脸是稳的
不会混搭素材模型有两套名字很像的泡泡系统(chuipaopao* 泡泡糖 / paopao* 泡泡,而 paopao4/5 其实是蝴蝶结),状态切换时会一起释放,不会出现「晕晕 + 嘴含泡泡」的怪画面
小鲸鱼陪伴头顶那条小鲸鱼默认常驻,16 个状态全程陪着(模型自带的 jingyu
参数不靠猜模型自带 cdi3.json,用中文写明了全部 247 个参数的名字(chuipaopao3=泡泡出现、jingyu=鲸鱼、maoshou2-7=猫手…),改参数前先查它
换装系统悬停气泡浮出四个槽位:头饰 · 眼镜 · 贴纸 · 桌面,共 20 个素材可叠加
装扮自动穿脱「读文件」自动戴眼镜、「写代码」自动贴贴纸;手动选过的槽位不再被状态抢占
44 个表情 + 7 个动作 全部接入18 个表情用作情绪、20 个用作装扮,7 个动作全用上(不切分)
自带验证器electron\electron.exe verify 跑完 16 态、截图、逐参数核对,当前 16/16 通过

实时联动

v1.1 的几个状态

干活中(会吹泡泡糖 + 转动作)读文件(自动戴眼镜)
干活态搜索态
晕晕(圈圈眼,嘴里没有泡泡)反复失败(脸红 + 挤番茄酱)
晕晕态反复失败态

头顶那条小鲸鱼是模型自带的 jingyu 参数,默认常驻,16 个状态全程陪着。

组成

dsh-pet-bridge/     DSH 插件:把 agent 状态写进 pet_state.json
docs/               截图

桌宠本体(Electron + Live2D 模型)在 Releases 里下载。

安装

1. 桌宠本体

下载 Releases 中的 DSH桌宠_Live2D版.zip(约 150 MB,Electron 运行时已内置):

  1. 解压到任意目录
  2. 双击 创建桌面快捷方式.bat(只需一次)
  3. 以后双击桌面的「DSH桌宠」即可

不需要装 Node.js、不需要装浏览器、不需要联网。

2. DSH 插件(状态联动)

dsh plugin --profile web add "file:<解压后的 dsh-pet-bridge 绝对路径>"

然后重启 dsh web

⚠️ file: 安装是复制而非符号链接 —— 改了插件源码后必须重新 add 一次 (或改 package.json 的 version 触发 pnpm 更新),否则改动不生效。

工作原理

agent 思考 / 调工具 / 完成 / 出错
      ↓
[dsh-pet-bridge]  监听 session/event,按工具名细分状态,node:fs 直写
      ↓
pet_state.json    {"bubble":"正在执行 read …","status":"reading"}
      ↓
[Electron 主进程]  读文件 → IPC 推给页面
      ↓
[pet.html]        文字 + 配色 + 进度条 + 换装槽位
      ↓
[Live2D]          呆呆眼+眼镜 / 调皮+贴纸 / 星星眼 / 爱心眼 …

表情为什么不会"串味"

动作曲线和表情写的是不同的参数,但并不完全不相交 —— 比如「番茄酱」 动作会写 ParamCheek21。如果表情在动作之前写,就会被动作覆盖,表现为 上一个状态的表情残留到下一个状态(v1.0 就有的隐藏 bug)。

所以 pet.html 每帧都在 internalModel.update() 返回之后重写一次 表情与装扮参数;切状态时则强制抹掉全部表情参数(而不是只抹上一个表情 用到的那些 —— 各表情的参数列表并不相同)。

这类问题肉眼几乎看不出来,所以仓库里带了一个验证器:

electron\electron.exe verify

它把桌宠跑起来、切到 16 个状态、逐个截图,再直接读模型参数核对 "这个状态是不是只开了它该开的参数";另外还会停在几个长状态上守十几秒, 确认动作真的在轮换而不是重播同一段 —— 当前结果:

STRICT CHECK  (face + auto-outfit params only; motion-driven params ignored)
  passed = 16   failed = 0
  motion scheduler: 5/5 states behave
hard errors = 0

动作调度的一句实测输出:

working  pool=[0,0,2]  fired 5x  seq=[吹泡泡 > 吹泡泡 > 开盖 > 吹泡泡 > 吹泡泡]

表情参数在同一段时间里零漂移 —— 证明"身体在动、脸不动"这条成立。

为什么不用 WPF + WebView2:WPF 的 AllowsTransparency=True 是 layered window, 承载不了 WebView2 的子 HWND —— 结果是 WPF 自绘的阴影正常显示、WebView2 内容永远空白。 Electron 把这三件事一次性解决了。

版权

程序代码 MIT,见 LICENSE

Live2D 模型「DS鲸鱼娘」版权不属于本项目

  • 作者:B站 @氵六青 (uid 11272072)
  • 授权:无偿分享;可商用直播、可自印物料
  • 禁止:任何形式的盗用与出售

转发时请保留此声明,也不要把模型单独提取出来另行分发或售卖。

Live2D Cubism Core 版权归 Live2D Inc. 所有。

相关插件