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、状态气泡、状态光晕、回到右下角。
动作图鉴
每个状态对应一组专属动作,各取一帧代表姿势:

| 动作 | 姿势 | 触发 |
|---|---|---|
| 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.js里ANIMS` 的 row / durations / scale / once
协议调整每行动画的帧数与节奏即可,渲染层无需改动。
Credits
- 角色精灵图:sundusk/HarnessDesktop
License
BSD-3-Clause,见 LICENSE。