dsh-yu-pet

August 26, 2026 · View on GitHub

DSH Web GUI 的悬浮桌宠插件。小雨会站在页面角落陪你干活: 空闲时平静站立、自然眨眼;agent 工作时思考;等待审批时望向你; 向你提问时做出抉择;任务完成跳起来庆祝;出错时沮丧地蹲下。

特性

  • 状态跟随会话活动:插件监听 Harness 活动事件,自动在七种 mood 之间切换
    mood颜色气泡触发
    idle#60A5FA会话空闲
    waiting绿 #34D399正在思考中agent running
    authorizing#FACC15等待你的授权审批请求等待窗口
    questioning#EC4899做出你的抉择ask_user_question 执行期间
    done#22D3EE搞定啦完成后 2.5s transient
    failed#F87171出错了agent/error(粘滞到下个状态)
    disconnected#9CA3AF兜底
  • 逐帧时长精灵动画:8×8 状态图集(192×208/格)+ 2×8 拖拽奔跑图集, 每帧独立时长(idle 眨眼快帧 0.12s、failed 播一次停末帧、wave 两轮挥手), 整行统一显示倍率 + 最近邻渲染(image-rendering: pixelated),像素风不糊边。
  • 交互:拖拽移动(水平位移 ≥2px 切换左右奔跑行,反向立即换向)、空闲双击挥手两轮。
  • 气泡不挤动宠物:固定 2d×2d 视口 + 底部锚定,气泡向上增高,宠物屏幕位置不变。
  • 设置页:显示/隐藏、尺寸 60–200px、状态气泡、状态光晕、回到右下角。

动作图鉴

每个状态对应一组专属动作,各取一帧代表姿势:

poses

动作姿势触发
idle · 平静站立双手插兜站立、循环眨眼会话空闲
waiting · 正在思考中手扶下巴思考agent 工作中
authorizing · 等待授权抬头注视你审批请求等待窗口
questioning · 做出你的抉择歪头、胸前摊开手掌询问ask_user_question 执行期间
done · 搞定啦跳起双手上举庆祝任务完成后 2.5s transient
failed · 出错了蹲坐抱膝沮丧,播一次停末帧agent/error
wave · 挥手举右手挥两轮idle 时双击她
disconnected · 未连接闭眼静止,65% 透明度兜底
drag-right / drag-left · 奔跑左右独立素材行,各 8 帧拖拽水平位移 ≥2px,反向立即换向

安装

# 已全局安装 dsh CLI 的话
dsh plugin --profile web add github:sundusk/dsh-yu-pet

# 或者通过 npx 调用(无需全局安装)
npx @deepseek-ai/dsh plugin --profile web add github:sundusk/dsh-yu-pet

重启 dsh web 后生效,小雨会出现在页面右下角;设置入口在 侧边栏 → 设置 → 「小雨宠物」。仓库已包含可直接加载的 host / browser 两个插件部分,安装时不需要执行任何构建脚本。

插件管理依赖 pnpm(Homebrew 安装:brew install pnpm)。

项目结构

dsh-yu-pet/
├── package.json               # dsh.bundle.patch + dsh.client 声明
├── cordis.patch.yml           # 向 web profile 插件表插入 xiaoyu 行
├── lib/
│   ├── index.js               # Host 半:活动事件 → mood 状态机 + /api/xiaoyu/* 路由
│   └── client.js              # Browser 半:悬浮渲染 + 交互 + 设置页
├── assets/
│   ├── XiaoyuSprites.png      # 8×8 状态图集 1536×1664(源格式备份)
│   ├── XiaoyuDragSprites.png  # 2×8 拖拽奔跑图集 1536×416(源格式备份)
│   ├── XiaoyuSprites.webp     # 无损 WebP(运行时优先,体积约 -30%,像素一致)
│   └── XiaoyuDragSprites.webp
├── docs/poses.png             # 动作图鉴预览图(每状态一帧)
├── LICENSE
└── README.md

Host 半从包内 `assets/$ 目录解析图集(\text{WebP} 优先、\text{PNG} 回退),无任何绝对路径配置。

换皮指南

想替换角色:保持 \text{PNG} 为 \text{RGBA}、固定网格(状态图集 8 \times 8、拖拽图集 2 \times 8、每格 192 \times 208)、 未使用格透明;按 $lib/client.jsANIMS` 的 row / durations / scale / once 协议调整每行动画的帧数与节奏即可,渲染层无需改动。

Credits

License

BSD-3-Clause,见 LICENSE