dsh-pet
PC2005-cloud/dsh-petDSH Web UI 桌面宠物,Windows / macOS / Linux 三端可用:浏览器浮层或透明置顶桌面窗口,106 个透明动画、带挤压与粒子的甩抛反弹物理、随会话事件实时联动的工作状态气泡、碎碎念与带持久记忆的对话、余额展示、表情包配图、多开同屏,并支持直接放入的自定义动画与宠物种类(pet pack)。
多宠物桌宠系统:四盏状态灯实时监控所有活跃会话(红待审批/黄运行/绿完成未读/深红错误),点卡片直达对应会话; 四组状态语音随事件播报,字幕与音频时长对齐;外部宠物四来源导入(本地文件夹/zip/Codex 目录/Petdex 在线仓库), 卡片式热切换即时生效,激活守卫自动校验图集与语音完整性;五场景动作绑定、拖拽物理、三档缩放; 内置小狐狸 Foxbell 随包自带,装上即用。
DeepSeek Harness(DSH)Web 网页右下角可拖拽的多宠物桌宠系统:多项目状态监控 + 语音提醒 + 外部宠物体系(商店 / 四来源导入 / 热切换 / 完整性守卫)+ 🦊显隐开关。内置一只 Foxbell 小狐狸随包自带:一键安装即用,其余宠物随时导入、一键热切换。

v2.3.0 适配 dsh 0.2.0-rc.2 桌面端运行时(设置 API 迁移 entry-config;向下兼容 0.1.2-rc.1,见下方兼容表)。 状态卡片色彩语义自 v2.0.0 起为 MAM 口径(红=待审批 / 黄=运行中 / 绿=完成未读 / 深红+⚠=错误断联),与 v1.x(绿运行/黄待批准/红报错/蓝完成)不同,详见 CHANGELOG。
热切换——内置宠物与导入宠物同场管理,点击即换、即时生效:

右键菜单——开关 / 大小 / 五场景动作绑定(实时预览)/ 切换宠物 / 隐藏 / 关于:

四来源导入——本地文件夹 / zip / Codex 宠物目录 / Petdex 在线仓库:

approval 等待审批(红)running 正在运行(黄)done 已完成未读(绿,点击即确认消失)error 本轮报错 / 断联(深红 + ⚠ 标识,与待审批红明确区分)sessions.open)并标记已读;错误/完成卡片点进去即消失,再次出现会重新亮起。done 组、待审批播 approval 组(10s 限流)、报错播 error 组;字幕=语音文件名,与音频时长对齐。~/.dsh/foxbell-pet/pets/<id>/;清单 v2(原子写 + .bak 备份);~/.codex/pets/ / Petdex 在线仓库(petdex.dev,列表与下载均由宿主代理:域名 allowlist、体积上限、8s 超时);foxbell/查重/Windows 保留设备名,前后端双重校验)、显示名/描述、字幕开关、语音分组编辑(并行时长探测;1s<时长<20s 且 ≤10MB;四组齐全判定「有语音」);~/.dsh/foxbell-pet/.trash/,不物理删除)、查看目录路径;编辑激活中宠物自动闪切保护;~/.dsh/settings.yaml)。{code, params, detail} JSON,客户端按插件内部 zh/en 字典映射文案、内联呈现于对话框(浏览器语言自动选择,不依赖 harness locale)。v1.4.0 效率看板一期整体移植到 v2 架构:宿主聚合、随 /state 快照下发,零新增常驻 UI(迷你条仅悬停期间存在);用量一律纯 token 口径,不折算金额,按五口径呈现——请求输入 / 缓存命中 / 命中率 / 产出 / 你的输入(估)。v2.4.0 起「含子代理」为真实口径:子代理会话与已收尾会话经 sessionQuery 全语料并入除迷你条「本会话」行(最近主会话)外的全部 token 统计(活会话内存折叠、冷会话一次性重放缓存)。
dayLimitTokens 达 80% / 100% 各举牌一次「今日已消耗 X」,里程碑过 milestoneUnit 整数关口气泡一句话;警报音效自 v2.2.0 起走 MAM 四组机制 + 默认音效:宠物语音四组配齐时播 general 组,否则播内置合成提示音(三轮换);TTS 不参与看板警报(ttsEnabled 仅用于台词朗读)。boardTtlSec 自动消失,✕ / 点外部 / ESC 均可关;右键「📊 查看最近总结」随时唤回。两个小增强:标题闪烁——审批等待 ≥N 分钟(approvalFlickerMin 可配)且页面不可见时,标签页标题轮换「🦊 审批等待中…」,批准或回到页面即恢复;年龄标注——状态卡动态行尾灰色「×s/×m」,分清「刚发生」还是「已挂 5 分钟」。另有右键「🗂 会话一览」列出全部会话(状态色点 + 点击直达)。
以上共 12 项新配置(paceEnabled / usageEnabled / summaryEnabled / ttsEnabled / dayLimitTokens / milestoneUnit / paceIntenseEvents / paceLongrunMin / paceLoafStartMin / approvalFlickerMin / summaryEntrySec / boardTtlSec),设置卡草稿 + 统一保存(编辑先入草稿,保存/放弃统一生效,保存自动收起)。
| 点击 / 操作目标 | 唯一行为 |
|---|---|
| 状态卡(单击) | 智能跳转:有待审批 → 审批锚点;否则 → 会话 + 已读 |
| 📖 总结限时入口 | 展开小黑板,入口随即消失 |
| 右键菜单新子项 | 今日用量 → 手动开迷你条;查看最近总结 → 展开黑板;会话一览项 → 智能跳转 |
| 悬停 ≈0.5s | 浮现迷你条(唯一可点元素=「详情 »」钻取按钮,移开即消失) |
| 拖拽 | 纯物理动画,不承载命令(期间迷你条隐藏、悬停检测挂起) |
| 滚轮 | 宠物本体与迷你条不劫持、穿透回页面;黑板 / 菜单内部正常滚动 |
| 右键 | 仅宠物本体弹菜单(状态卡与各浮层右键无自定义行为) |
| ESC | 一次剥一层最上层浮层(手动迷你条 → 黑板 → 菜单) |
| 黑板 vs 迷你条 | 互斥顶替:黑板开着时迷你条消失,黑板关闭后迷你条恢复 |
一个数据核、三级呈现,越点越深:L1 迷你条 → L2 小黑板 → L3 主列大看板(另有右键「📈 用量看板」直达)。宿主一次聚合(会话事件 usage 按日/小时/路由/工具折叠),随 /state 快照与按需路由下发;纯 token 口径,无任何金额字段;性能上按「末事件指纹」增量缓存 + /state 短路 + 页面不可见降频,空闲开销近乎为零。
provider/model 路由记账(同槽替换冲回、跨日不污染);聚合结果已与会话官方 tokenUsage totals 四口径逐字节对账。{range} {tokens} {hitPct} {models});「复制文本」为同数据纯文本摘要。general 组语音,否则播内置合成提示音(/sounds/ 路由)。| 组件 | 要求 |
|---|---|
| DeepSeek Harness(DSH) | ≥ 0.1.2-rc.1(含 0.2.0-rc.2 桌面端;Web profile dsh web / 桌面 profile 均可) |
| 0.2.x(0.2.0-rc.2) | ✅ v2.3.0 适配:设置迁移到 entry-config 模型(Config volatile 根即表单,配置按 Loader entry id 寻址);客户端 settingsScope 服务与 settings.plugin.item 槽位已删除 → 改为 settings/describe+update RPC 适配器 + settings.section 整节注册 |
| 0.1.x(0.1.2-rc.1+,含 0.1.5-rc.2) | ✅ 兼容层自动回退:ctx.settings.installSection 命名空间注册(B2)、settings.plugin.item 卡片槽、settingsScope.bind 语义由 RPC 适配器同形替代 |
| v1.x(rc.7/rc.8 时代) | 不支持(旧 session.events / installSettingsSection / dsh-client-runtime 在 rc.1 已删除;请使用本插件 v1.3.0) |
依赖结构(v2.3 根因修复):
@deepseek-ai/dsh-settings不在dependencies中—— settings 服务一律由宿主运行时提供。插件自带副本会以 hoisted 依赖遮蔽运行时内置的 settings 插件行,导致 0.2 桌面端兼容性禁用与启动崩溃(详见 CHANGELOG [2.3.0] C2)。
内置素材随包自带,无需额外下载;外部宠物素材由用户导入。
dsh plugin --profile web add github:jarvislee90s-dot/dsh-foxbell-pet#release
#release 是稳定版通道(仓库 release 分支,只在版本发布时更新)。想尝鲜开发中的
最新改动,可改用 github:jarvislee90s-dot/dsh-foxbell-pet#main(跟随 main,不保证稳定)。
桌面端/网页端粘贴 GitHub 仓库首页链接安装也可以:仓库的 GitHub 默认分支已设为
release,不带分支后缀的地址(如https://github.com/jarvislee90s-dot/dsh-foxbell-pet) 解析到的就是稳定版通道。
插件的
lib/构建产物随仓库提交,安装即用、无需本地构建;只有从源码开发时才需要npm run build(见「开发」节)。
然后重启 dsh web 并硬刷新浏览器(Cmd/Ctrl+Shift+R)。右下角即出现桌宠,设置旁有 🦊 开关,设置页出现「foxbell-pet」配置卡。
桌宠运行时从插件包自带目录
assets/读取内置精灵图/语音;外部宠物商店在~/.dsh/foxbell-pet/(插件专属目录,首次启动自动创建)。
想在本地改代码并立即在 dsh 里测试时,把源码目录以 link 方式装进 profile——安装的是“活”的源码目录,改完重新构建、刷新页面即生效:
# 1) 获取源码并构建(需要 Node ≥ 20 与 pnpm)
git clone https://github.com/jarvislee90s-dot/dsh-foxbell-pet.git
cd dsh-foxbell-pet && pnpm install
npm run build # 产出 lib/(dsh 实际加载 lib/,不是 src/)
# 2) 以 link 方式装进 web profile(自动写入启动清单;在插件目录执行)
dsh plugin --profile web add .
# 3) 启动/重启 dsh web,打开网页即见(重装/更新后建议硬刷新 Cmd/Ctrl+Shift+R)
日常开发热更:
npm run build:watch # 常驻监视 src/,改动即重建 lib/
src/client/**):刷新网页即生效;src/host/**):需重启 dsh web;dsh plugin --profile web remove dsh-foxbell-pet。本地源码版 harness(
deepseek-harness仓库)跑pnpm dsh web同样适用以上 link 安装; 若 profiles 里曾装过旧版,add .会覆盖为本地 link。
本地源码版 harness 没有图形启停入口,dsh web 通常跑在后台终端里。两种重启方式:
# 方式一:自带脚本(在 deepseek-harness 仓库根目录,自动停旧进程→重启→打印新链接)
./dsh-web-restart.sh
# 方式二:手动(杀掉占用 3080 的进程后再起)
lsof -nP -iTCP:3080 -sTCP:LISTEN -t | xargs kill # 停(若有)
cd <deepseek-harness 目录> && pnpm dsh web # 前台起(Ctrl+C 停)
启动成功的标志是终端打出 dsh web: http://127.0.0.1:3080/?token=…;日志在 /tmp/dsh-web.log。
重启后记得硬刷新浏览器(Cmd/Ctrl+Shift+R)。
| 交互 | 效果 |
|---|---|
| 拖动 | 任意移动桌宠(方向动画:左跑/右跑/上拎跳) |
| 拖拽后松手 | 重力坠落 / 抛掷惯性 / 落地压扁回弹 + 补跳(可关「物理坠落」) |
| 右键桌宠 | 菜单:开关 / 大小 / 五场景动作绑定(实时预览)/ 切换宠物 / 隐藏 / 关于 |
| 单击形象 | 固定挥手(不出声) |
| 双击形象 | 随机说一句 + 「双击动作」(字幕=语音文件名) |
| 点项目卡片 | 切换会话 + 标记已读(绿卡点击即确认消失) |
| 🦊 按钮(侧栏底部) | 显示 / 隐藏桌宠 |
| 设置卡「宠物管理」 | 切换 / 导入 / 管理宠物、Petdex 画廊入口 |
状态灯(MAM 口径):红 待审批 · 黄 运行中 · 绿 完成未读 · 深红+⚠ 报错/断联。
voice/ 按状态分 4 个固定分组(内置素材在包内 assets/voice/,外部宠物在
~/.dsh/foxbell-pet/pets/<id>/voice/),文件名即字幕文字:
| 文件夹 | 触发时机 | 说明 |
|---|---|---|
general/ | 双击形象 | 闲聊(随机、组内不连续重复) |
approval/ | 出现待审批(红灯) | 撒娇催促,10s 限频防刷屏 |
error/ | 任务报错(深红灯) | 委屈/傲娇台词 |
done/ | 任务完成(绿灯) | 求夸/元气台词 |
运行(黄)不播语音。空组静默跳过;四组齐全才判定宠物「有语音」能力。
spritesheet.webp(8 列;11 行 1536×2288 = v2,9 行 1536×1872 = v1,运行时自适应),见 docs/SPRITESHEET-CONTRACT.md;语音 .m4a/.mp3/.wav/.ogg/.opus/.flac/.aac,单条 1–20s 且 ≤10MB。npm install
npm run build # esbuild:src/host → lib/index.js(ESM),src/client → lib/client.js(单文件 iife)
npm run validate # 静态校验(既有检查 + 产物纯度 / 声明一致 / 路由前缀 / 版本 / 错误码表 / 内置清单)
npm run typecheck # tsc --noEmit(客户端 TSX)
npm test # vitest(纯逻辑 + 真实临时目录管线 + mock fetch)
dsh-foxbell-pet/
├── assets/ 内置 foxbell 素材(精灵图 + 31 条语音 + v2 清单 pet.json)
├── lib/ 发布产物(main 与 ./client 入口;esbuild 生成,随包提交)
├── src/host/ 宿主半源码(纯 JS:状态聚合/商店/导入/守卫/路由族)
├── src/client/ 客户端半源码(TSX:本体/菜单/设置卡/对话框/错误码字典)
├── test/ vitest 套件(含真实临时目录与 mock fetch)
├── scripts/ 构建 + 校验 + 发版 + 内置清单生成
├── docs/ 图集规格 / QA 清单 / 截图 / 历史设计文档
├── demo/ 独立离线预览页
├── package.json dsh.plugin.json cordis.patch.yml
├── IMPLEMENTATION_NOTES.md 决策记录 / MAM 对齐索引表 / 前向风险评估
└── README.md README.en.md LICENSE CHANGELOG.md
本机开发安装:dsh plugin --profile web add <仓库路径> 装的是 symlink;改完 src/ 后
npm run build,重启 dsh web 并硬刷新浏览器即生效。
main 是开发分支,随时合并新代码;对外用户的稳定版 = release 分支,只在发版时快进,
外部安装命令固定指向 #release(见「安装」节)。
发版:在 CHANGELOG.md 写好 [x.y.z] 条目后执行
npm run release -- x.y.z # 加 --dry-run 只校验不执行
脚本会:校验(在 main、工作区干净、与远端同步、CHANGELOG 条目齐全)→ 同步
package.json / dsh.plugin.json 版本号 → build + validate + test → 提交并打
vX.Y.Z tag → 推送 → 把 release 分支快进到该提交并推送。