deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
由 DSH 真实会话事件驱动的多宠物网页桌宠:桌宠实时跟随 DeepSeek Harness 的任务进展,以贴纸动画 + 状态气泡呈现。
兼容 DeepSeek Harness(含其分支)的 web profile;桌面悬浮模式默认关闭,可按需开启。桌面模式要求 DSH
>= 0.1.2-alpha.1,以提供带 token 的认证根 URL。
| 能力 | 说明 |
|---|---|
| 状态来源 | DSH session/event 真实事件,非 DOM 抓取 |
| 状态机 | PetReducer 纯函数(含 mood 映射,可单测) |
| 消息协议 | 类型化协议(protocol.js) |
| 配置 | schemastery 持久化 + 设置页卡片 |
| 多 Session 优先级 | 审批 > 计划审核 > 等待回答 > 完成提醒 > 等待/错误 > 当前会话 > 状态优先级 > 更新时间。同级仅稳定前两名,第三名及以后仍随更新时间轮转 |
| 实时推送 | SSE 流(断线自动重连 + 轮询兜底) |
| 状态气泡 | 页面内与桌面悬浮均使用自适应两层牌叠:顶层状态卡 + 带 +N 的汇总背板;message + detail(项目 · 已完成 x/y · 阶段) |
| 会话操作 | 网页与桌面一致:点卡片 / ? / ! 打开对应会话,✓ 允许一次;无网页客户端在线时点卡片/图标用系统浏览器打开 DSH 页面 |
| 完成提醒 | 后台完成后保留绿点直至处理;仅前台可见的标签页中的当前会话会自动消除(即便此刻正开着桌面悬浮窗),后台标签页不抢清除;桌面悬浮窗只展示提醒,点开该会话(网页内跳转、浏览器打开,或点击桌面完成卡)同样消除。当前已打开会话不显示未读绿点(仅当前 Host 生命周期) |
| 出错提醒 | 后台回合失败(模型调用失败等)保留粉圈直至打开该对话;当前会话失败不进提醒。点气泡跳转或侧边栏点进该对话后提醒消失。审批/提问不受影响 |
| 余额 | 状态与用量都开启时,点气泡左侧圆点或在气泡上滚轮切换余额页(60s 自动刷新、数字滚动动画、网络抖动沿用最近余额);停在当前页,不自动回落 |
| 今日已用 | 双模式任选:小鲸鱼记账(免令牌,余额差值累计)/ 实时·令牌(平台费用接口直接返回真实金额,精确) |
| 桌面悬浮 | 随包 Electron 透明置顶窗口(可选,默认关) |
| 多宠物 | 设置 → 宠物管理(注册表 + 切换当前宠物) |
| 版本更新 | 内置检查 + 一键增量更新 |
| 贴纸 | 展示 | 触发场景 |
|---|---|---|
| 01 绘制中 | ![]() |
THINKING + streaming:流式输出(正在写回复)、双击画画 |
| 02 摸鱼中 | ![]() |
WORKING / ERROR:调用工具(查找/编辑/测试/命令) |
| 03 得意中 | ![]() |
PULSE SUCCESS:回合完成、绘制完成、点击互动 |
| 04 思考中 | ![]() |
THINKING:回合/步骤开始、推理、结果整理 |
| 05 等待中 | ![]() |
WAITING:提问回答、审批等待、计划待审、回合挂起(blocked) |
| 06 待机中 | ![]() |
IDLE / DISCONNECTED:空闲、回合结束之后 |
多 Session 同时运行时按 审批 > 计划审核 > 等待回答 > 完成提醒 > 等待/错误 > 当前会话 > 状态优先级 > 更新时间 选择顶层任务;其余会话由可点击的 +N 汇总背板表示。子 Agent 默认忽略(可在设置开启)。
assets/pets/<id>/01.gif 绘制中(输出/画画)
assets/pets/<id>/02.gif 摸鱼中(工具/错误)
assets/pets/<id>/03.gif 得意中(完成/互动)
assets/pets/<id>/04.gif 思考中
assets/pets/<id>/05.gif 等待中
assets/pets/<id>/06.gif 待机中
可选扩展(不影响完整性校验):
assets/pets/<id>/07.gif 额外贴纸槽位
assets/pets/<id>/pet-manifest.json 每贴纸对齐偏移 + 作品图数量
assets/pets/<id>/pics/<n>.png 作品图(双击宠物随机弹出,n 从 1 起)
id 只能含字母、数字、下划线、连字符。内置宠物:蕾米埃尔(remielle,素材版权见 NOTICE)。
适用于 DSH / DeepSeek Harness(含 Fairy 等基于 DSH 的分支)的 web profile。
# 方式一:npm 注册表(推荐,可一键增量更新)
dsh plugin --profile web add dsh-pet-remielle
# 方式二:GitHub 仓库(构建安装,无版本校验)
dsh plugin --profile web add github:Gin-7/dsh-pet-remielle
# 方式三:本地目录(开发调试,link 安装)
dsh plugin --profile web add D:\path\to\dsh-pet-remielle
# 方式四:GitHub Release tgz
dsh plugin --profile web add "C:\Users\you\Downloads\dsh-pet-remielle-<version>.tgz"
插件行 id:dsh-pet-remielle。卸载即复原,无残留。
插件内置「宠物管理 → 更新」页 + 右下角更新气泡:检查 GitHub 最新版本,发现新版可一键更新。
| 安装形态 | 版本 | 更新方式 |
|---|---|---|
| 本地链接(link) | ≥ 0.3.0 | 一键 git pull(增量) |
| npm 注册表(registry) | ≥ 0.3.0 | 一键 pnpm update dsh-pet-remielle(增量) |
| 任意形态 | < 0.3.0 | 不支持自动更新:0.3.0 起包名已变更,需彻底卸载旧版本后重新安装 |
说明:0.3.0 之前存在包名/行 id 变更(0.2.0 之前为
@dsh-external/dsh-client-ui-pet-remielle,0.2.0–0.3.0 为dsh-pet-remielle)。直接git pull/pnpm update无法跨过该变更,所以低于 0.3.0 必须先卸载旧版再重装新版(否则会出现loaded without registering … via __ModuleLoader__.load之类的加载报错)。命令如下:
# 按实际安装的旧行 id 卸载(以下两条按需执行)
dsh plugin --profile web remove @dsh-external/dsh-client-ui-pet-remielle # 0.2.0 及之前
dsh plugin --profile web remove dsh-pet-remielle # 0.2.0 之后
# 重新安装最新版(npm 或 GitHub 均可)
dsh plugin --profile web add dsh-pet-remielle
# 或: dsh plugin --profile web add github:Gin-7/dsh-pet-remielle
在「设置 → 宠物管理 → 更新」中,低于 0.3.0 的版本点击「一键更新」也会给出同样的卸载/重装指引,不会直接覆盖升级。
desktopMode 默认关闭。开启后使用 Electron 运行时拉起透明、置顶、无边框的独立窗口显示宠物。
✓ 仍执行「允许一次」。%APPDATA%\dsh-pet-remielle,macOS / Linux 落在各自的应用数据目录),不放临时目录——%TEMP% 会被系统磁盘清理连缓存一起删掉。同一时刻只允许一个桌面窗持有它:检测到另一个存活实例(宿主刚重启、旧窗口还没退完)时自动退避到带 pid 的兄弟目录,两者不共用同一份 Chromium 缓存。Electron 运行时来源(按顺序探测):DSH_PET_ELECTRON 环境变量 → vendor/electron-<platform>-<arch>/(本目录不进 Git,按当前系统自动下载对应平台包)→ 系统已安装的 Electron → 均无则仅页面内展示。
首次运行:若开启桌面悬浮模式但本机找不到 Electron 运行时,会提示下载并安装(需你确认,因 Electron 运行时约 100–220MB,Windows 最大);下载失败则自动回落页面内展示,不会影响其他功能。也可手动把任一对应平台的 Electron 发行包解压到
vendor/electron-<platform>-<arch>/,或设置DSH_PET_ELECTRON指向现有 electron 可执行文件(Windows:electron.exe;macOS:Electron.app/Contents/MacOS/Electron;Linux:electron)。
| 平台 | 桌面悬浮窗 | 页面内桌宠 |
|---|---|---|
| Windows x64 | ✓(Electron 透明置顶窗口) | 桌面模式下自动隐藏 |
| macOS(arm64 / x64) | ✓(自动下载对应 darwin Electron) | 桌面模式下自动隐藏 |
| Linux x64 | ✓(自动下载对应 linux Electron) | 桌面模式下自动隐藏 |
127.0.0.1 / localhost / https)才精确,纯 http 局域网地址退回首帧;取消暂停会让 GIF 从第 0 帧重播(浏览器重设 src 的固有行为,<img> 无法定位到指定帧)。body[data-ds-dark-theme])上报给宿主,桌面窗据此着色;没有网页在线(或上报过期)时桌面窗回落系统深浅色,独立窗口跟系统仍是合理默认。条目、顺序、几何参数同样逐项一致(开关行的勾选符不改变行高),两端色值另有跨文件断言钉住。状态与用量都开启时,点气泡左侧圆点或在气泡上滚轮即可查看 DeepSeek 账户余额与今日消耗(气泡显示「DeepSeek 余额 ¥X」+「今日已用 ¥X · 空闲/高峰时段」,时段用颜色标识:空闲绿、高峰红)。只开用量时气泡直接显示余额页。停在当前页,不会自动回到状态。
api.deepseek.com/user/balance(凭据 DEEPSEEK_API_KEY)。60 秒自动刷新;切到余额页时会拉一次;余额变化时有数字滚动动画;网络瞬时抖动自动沿用最近余额不报错。$DSH_HOME/.dshp-usage.json,跨天自动归零归档。无需额外令牌,但属于估算——DSH 关闭期间的消耗会漏记。DEEPSEEK_PLATFORM_TOKEN 后,直连平台费用接口(platform.deepseek.com/api/v0/usage/by_api_key/cost),直接取平台按小时统计的真实金额——无需本地定价表,DeepSeek 调价自动跟随:$DSH_HOME/.dshp-holidays-<年份>.json),仅在首次/过期时发一次只含年份的请求切换用量模式:设置 → 宠物管理 → 行为 →「用量模式」(小鲸鱼记账 / 实时·令牌)。这是配置项而非即时调优,只用设置页入口。
DEEPSEEK_PLATFORM_TOKEN获取方式:登录 platform.deepseek.com → F12 开发者工具 → Network → 打开「用量」页面 → 复制api/v0/usage/...请求的Authorization请求头值 → 配置到 DSH 凭据服务。
| 字段 | 默认 | 说明 |
|---|---|---|
| enabled | true | 启用桌宠(禁用立即隐藏,重新启用恢复) |
其余外观/行为项(角色大小、透明度、镜像、锁定、气泡、用量模式、桌面悬浮、暂停、隐藏……)统一放在「设置 → 宠物管理」,不再重复展示在插件配置卡片里;其中即时可见且高频的那几项同时出现在右键菜单(清单见「使用」一节)——两端菜单同骨架同名,改一端必须同步另一端。
宠物注册表独立标签页,与外观 / 行为 / 桌面悬浮 / 关于并列为五个标签页。
npm install
node scripts/build-client.mjs # 构建 lib/client.js(版本号从 package.json 注入)
npm test # node --test 单测
npm run check # 语法检查
src/
├── index.js # 宿主:配置、事件接线、config/state/balance/pets/assets/desktop 端点、自更新路由
├── balance.js # 余额服务:余额拉取(重试/缓存/抖动容错)、今日已用双模式(记账/平台费用接口)
├── holidays.js # 节假日日历:峰谷时段判定(周末/法定节假日全天空闲),内置表 + 远程刷新 + 磁盘缓存
├── self-update.js # 版本检查 + 一键更新(GitHub 直连 + HTTP 代理回退;git pull / pnpm update)
├── pet-reducer.js # 纯状态机:会话事件 → state/pulse/task(可单测)
├── protocol.js # 类型化协议:PetState / PetMood / PetMessageKind
├── pets.js # 宠物注册表:目录发现/合并/校验(可单测)
├── status-copy.js # 蕾米埃尔风格状态文案(可整体替换)
├── turn-watchdog.js # 回合挂起看门狗:兜底「强杀会话后卡在分析阶段」
├── desktop-window.js # 桌面模式:Electron 发现 + 窗口进程管理(可单测)
├── electron-fetch.mjs # 按当前平台/架构下载并解压 Electron 运行时
├── pet-window.cjs # 桌面模式:Electron main(透明置顶窗口 + 屏幕右上角作品窗)
├── pet-window-paths.cjs # 桌宠窗 userData 目录决策(与宿主 Electron 隔离)
├── pet-preload.cjs # 桌宠窗 preload:页面 ↔ 主进程桥(点击穿透、拖拽、命中矩形、菜单展开)
├── pet-view.html # 桌面模式:宠物窗口页面(GIF + 气泡 + SSE + 画画 + 余额气泡)
├── balance-widget.js # 余额控制器(客户端):取数/滚动动画,渲染进宠物自带气泡
└── client.core.js # 浏览器端:宠物 UI + 设置(构建时包装)
# 两端共用的 .cjs(包是 "type":"module",宿主经 createRequire 取导出)。
# 网页端由 scripts/build-client.mjs 拼在 client.core.js 之前,桌面端由宿主注册
# 路由提供 <script src>——同一份实现,避免两端文案/几何漂移。
├── session-order.cjs # 牌叠排序(审批 > 计划待审 > 等待回答 > 完成卡 > attention …)
├── pet-tip.cjs # 翻页圆点悬停文案、tip 视口钳位、气泡缩放口径
├── gif-frame.cjs # 取动图「此刻那一帧」(右键暂停用,canvas 只画首帧)
├── bubble-title.cjs # 气泡会话卡呈现层:标题节流、宽度测量、审批/待审/完成的文案与类名
└── markdown.cjs # release 说明的 markdown 渲染(先转义再变换,链接只放行 http(s)/mailto)
lib/client.js # 构建产物(版本号注入,安装即用)
assets/pets/remielle/ # 蕾米埃尔素材(GIF + 作品图)
scripts/build-client.mjs
test/ # node --test
.cjs后缀是为了让宿主 ESM 能createRequire拿到导出;对外 URL 仍是.js(浏览器 script 不认.cjs扩展语义)。新增两端共用模块时记得同时补进scripts/build-client.mjs的拼接列表和宿主的路由注册。用test/host-transport.test.js验证真实路由返回脚本,再由test/desktop-window-ui.test.js检查页面的 script src 与共享模块调用。
npm login
pnpm version patch # 升版本
pnpm pack --dry-run # 检查发布内容(不含 node_modules / vendor)
pnpm publish
发布内容由
files字段限定:src/、lib/client.js、assets/、scripts/、test/、cordis.patch.yml、NOTICE、README.md。vendor/(Electron 运行时)不发布,桌面模式按需下载。
代码以 MIT 许可分发;蕾米埃尔形象与 GIF/作品素材版权归米哈游(HoYoverse)所有,
禁止商业使用与再分发素材。详见 NOTICE。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。