# Changelog

本文件记录鲸鱼娘桌宠（dsh-whale-pet-plugin）各版本的更新日志。

## [1.0.7-up] - 2026-10-26

### 🧩 修复：两宿主各养一只桌宠（方案 D 遗留）

- **实例隔离**：Mutex 名与窗口标题按 `dataDir` 哈希加后缀（`WhalePetMutex-<hash8>` / `WhalePet-<hash8>`），
  同一台机器上网页端（`~/.dsh`）与客户端（`~/.dsh-jiejie`）可各自拉起一只桌宠，不再争同一个全局 Mutex；
- **杀进程范围收窄**：`killDesktopPet` 由全局 `taskkill`（按窗口标题/脚本名）改为**只杀自己 `run\whale-pet.ps1` 那只**，
  两端互不踢窗；
- **兼容**：`buildPetScript` 新增可选第 6 参数 `tag`；不传时回退旧行为（单实例），旧安装不受影响。

## [1.0.6-up] - 2026-10-20

### 🐛 修复（Issue #2 —— 首条真实用户反馈,感谢 @qiuhenshan 的定位与补丁骨架）

- **余额取 key 多来源**:原只认 `~/.dsh/.credentials.yaml` 里的 `sk-`,用环境变量配 key 的用户余额恒空。
  现按优先级 `credentials` → 环境变量（`DEEPSEEK_API_KEY` / `DEEPSEEK_KEY` / `DS_API_KEY`）→
  `~/.whale-pet/api-key.txt` 取 key,失败原因带 `tried` 路径诊断（木牌不再只有 `no-key` 三个字）。
- **JSON 读取剥 BOM**:`readJsonIfExists` 与酒馆状态读取统一 `.replace(/^\uFEFF/, '')` ——
  修复 PS5.1 / 部分编辑器写出的配置文件（如 `whale-settings.json`）带 BOM 时设置静默失效的问题。
- **门禁**:双机共用冒烟脚本 `whale-issue2-smoke.mjs` **7/7 全绿**;宿主/桌面宠两侧同款代码均已修。

## [1.0.6] - 2026-10-07

### 🐛 修复（发布事故）

- **1.0.5 作废重发**:1.0.5 发布时 `package.json` 被 PowerShell 5.1 写入引入 UTF-8 BOM,导致 dsh 插件 CLI 的
  manifest 严格 `JSON.parse` 崩溃（文件安装正常、插件清单 reconcile 失败）。1.0.6 同内容重发、无 BOM。
  ⚠️ **请勿使用 1.0.5**;已装 1.0.5 的机器改装 1.0.6 即可。

## [1.0.5] - 2026-10-07（⚠️ 发布事故已作废,勿用,见 1.0.6）

### 🐛 修复（2026-10-07 失败/中断/完成通知一窝检查，主人实况上报）

- **失败后误报「任务完成」**:任务失败（如会话请求被服务端风控拒绝、整轮 400）时,`agent/error` 先弹「任务失败」,
  紧接着 `agent/status` 的 busy→idle 又按正常收工宣布「任务完成」——失败与完成连弹。
  修复:按会话记「本轮失败」标记——error 先到则 idle 不再宣布完成;idle 先到（完成仍在 3 秒暂存期）则 error 撤销
  pending;新任务启动清空旧标记。
- **中途停止生成误弹「任务完成」**:用户打断（停止生成）时宿主不报错、只以 `turn/end(reason=interrupted)` 收尾,
  旧逻辑照常走 idle→完成 ⇒ 误报。修复:idle 时回读会话日志最后一条 `turn/end` 的收尾原因——
  `interrupted` / `aborted` / `blocked` 一律静默（不弹完成也不弹失败）;`completed` 正常宣布,`max-tokens` 视为有产出照常。
- **同轮多次 error 重复弹失败**:失败通知原设计「每条都保留」,一轮内重试多次会连弹多条「任务失败」。
  修复:同一忙碌周期只弹第一条失败,后续 error 静默（标记已消费）。
- **maintenance 守卫（初稿）经 review 移除 —— 无行为变更**:初稿试图在 idle 分支按 `phase=maintenance` 挂账,但宿主把 maintenance
  派生为 `idle` 且进出 maintenance 都不发 `agent/status`（只在状态变化时发）⇒ 守卫永不触发
  （妹妹 review 指出、姐姐核实宿主源码确认）。总结流的防提前弹由**既有**的 `llm/stream` 取消兜底定时器 + finally 冲刷覆盖,
  本版未新增任何保护逻辑,仅移除死代码并注释记因。
- **验收（2026-10-07 家机,五场景全绿）**:①正常完成带真实成本;②失败只弹失败、不跟完成（重试不连弹）;
  ③中途停止生成静默（主人双路确认）;④手动 `/compact` 零误弹（自动总结流无法真机构造,如实标注未验,为已知空白）;
  回归 4/4（审批弹 / 子任务弹 / 后台任务失败保留 / 后台任务成功静默）。

## [1.0.4] - 2026-09-14

### ✨ 新增

- **木牌效率页**:余额 / 用量(本月)/ 效率 三页轮换;效率页含缓存命中率、本会话 tokens、会话统计与一句点评(如「缓存 99%,今天很省」)
- **统一展示/发声调度器**:通知/低余额 > 摸头 > 台词 三档优先级;高打断低、同优先排队、连续摸头替换、摸头撞通知排队补显示
- **低余额三视图(桌面宠)**:余额不足 / 充值档位 / 二维码 三页,「去充值」入口 + 二维码 PNG 落盘供桌面宠读取
- **低余额阈值可配置**:`lowBalanceThreshold`(默认 ¥5),验收与个性化可调
- **音频按内容绑定**:语音按 `sha256(文本)[0:16]` 命名落盘,文字与声音不再错配

### 🐛 修复(双机联动专场,D1–D9)

- **审批只弹一次**:去重规则改「差异化去重表」——审批/失败不再被吞,子任务/工作流跨会话放行,审批判定改 30 秒时间窗
- **后台任务完成误提示**:完成一律静默(失败/中断保留),并吃进宿主 `reported` 判重位
- **酒馆对话误提示**:会话分类器按酒馆自用白名单(cwd/会话)过滤,酒馆 RP 不再弹「任务完成」
- **会话消耗口径**:Tokens 页改本月口径(每月重置);会话账本跟随当前活跃会话;PRICE 表标注待校准
- **通知优先级**:台词/摸头不再抢占通知的展示窗口
- **提问正文截断**:长提问不再糊爆气泡
- **展示队列**:排队项上屏时重算展示时长(不再越排越短);被丢弃的低优先级不占序号
- **关宠后状态延迟**:心跳窗口缩短、「刷新」按钮即时纠正、kill 状态无条件落盘;桌宠关窗主动告知宿主(pet-closing 路由 + cmd 兜底),发声权 ≤1 秒交还;修复「关掉后立刻重拉」时新桌宠被上次关闭宽限连坐判死(关闭宽限 15s→6s 并对齐)
- **充值页被台词盖住**:页面态准入规则——低优先级气泡给用户正在操作的页面让路,通知仍覆盖
- **浏览器独走显示被丢弃台词**:浏览器侧服从宿主仲裁回执——被丢弃的台词不再显示、不再白跑一次 TTS(路由不可达时降级保持旧行为)
- **效率页精简(主人口径)**:只留「会话 tokens 入/出」与「缓存 命中/未命中」两行 + 点评加深;会话统计行(宿主未采集的指标)移除
- **用量归属修正**:流式用量按真实发起者(currentInitiator)记账,交错活动/子代理不再记错户头;补采 cacheWriteTokens、成本公式纳入缓存写(DSH 权威口径)
- **升级残留旧实例**:插件升级后整页不刷新会出现两只浏览器宠/两个桌面宠窗口——挂载前清理残留根节点、拉起前先收旧实例(模式根治,不再靠 FAQ 手动收拾)
- **cordis peer 区间放宽**:`>=4.0.1 <5.0.0-0`,与新宿主实装版本对齐,消除新用户安装警告
- **设置面板兼容(0.1.1 + 0.1.5,双机实锤两层根因)**:①0.1.5 的 `settings.plugin.item` 新契约(keyed+namespace 派发)下,宿主侧向 settingsScope 认领 `dsh-whale-pet` 命名空间(非空 schema、零持久化副作用,设置仍走 whale-settings.json),客户端注册补 `key` 并保留 id/order/label —— 一份注册通吃双宿主;②**设置卡零 React 依赖化**:旧版卡片依赖裸 `require('react')` 且拿不到就静默跳过 —— 0.1.1/0.1.5 的模块表都不保证提供 react(boot 图无 react 行、window.React 无人设置),卡片会无声消失(公司机 9/3 宿主重装后中招、家机 0.1.5 升级后中招)。现改为手造 `Symbol.for('react.element')` 根元素 + ref 回调挂原生 DOM,不再 require React、不用 hooks;③**客户端注册改声明式 `inject:['slots']` + `ctx.slots`**(0.1.5 上裸 `ctx.get('slots')` 会落空、注册根本没跑——三轮复验坐实,此为根治点);宿主侧补 `ctx.root` 兜底认领 + describe 探针两形状修正。v4 双机装包复验通过,设置卡三轮收官
- **发布修正(09-16 补发)**:发布树回流**接线产物**(`lib/index.js` 96d4066cc23e + 新增 `lib/pet-views.js` d8ffcef1f87a)——首发 1.0.4 的桌宠模板缺效率页排版(发布树未合入 pet-views),本次重发与双机验收产物逐字一致;流程铁律:发版前接线产物必须回流发布树再 publish

### 🙏 致谢

本版本由公司机与家机双机联动开发并逐轮真机验收,特别感谢帮忙开测、亲眼看亲耳听的每一位。

## [1.0.3] - 2026-08-31

### 🐛 修复

- **充值二维码不显示**:180×180 的二维码 PNG 实际只有 480 字节,而 topup-qr 路由用「<500 字节即失败」防垃圾响应,把自己的合法二维码误杀了(1.0.2 必然触发)。改为按 PNG 魔数校验,并给二维码视图加加载失败兜底文案
- **桌面宠拖动残影**:透明分层窗口用 `DragMove()` 拖动时 DWM 重绘跟不上,旧帧残留成叠影。改为手动拖拽(按 DPI 换算光标坐标逐帧更新窗口位置,松开清理画面);按下只标记 pending、真正移动才捕获鼠标,按钮普通点击不受影响
- **子任务完成误弹通用「任务完成」**:subagent 代理也会触发 agent/status 的 busy→idle,与「子任务完成」通知撞车。恢复**多会话感知**(并行任务各自完成各自通知,标题带会话名),改按代理类型过滤 subagent 代理;忙状态/待宣布/用量快照全部按会话记录;completed 90s 去重仅对同会话生效
- **总结流 >3s 时提前弹「任务完成」**:llm/stream 开始时没有取消 3s 兜底定时器,总结流较长时定时器先触发,通知打断总结(旧版已修过的 bug 回归)。流开始即取消全部兜底定时器,统一等流结束宣布
- **余额查询失败时木牌永远显示「加载中…」**:balanceError 从未赋值。失败路径现在正确写入错误信息,成功时清零
- **子任务/工作流成本差可能恒为 0**:用量 checkpoint 键改用 runId/workflowId 优先(原实现不读这些字段)
- **同轮多个不同问题只弹第一条**:needs_help 去重规则加「标题不同不抑制」例外

## [1.0.2] - 2026-08-29

### ✨ 新增

- **设置面板**(设置 → 插件 → 鲸鱼娘桌宠):随机台词开关、台词频率(安静/标准/活泼)、语音朗读开关、浏览器宠大小(60%~120%)、自动拉起桌面宠、低余额提醒、免打扰时段(支持跨午夜,审批与「需要协助」白名单)
- 桌面宠通知视图补「消耗金额」与 token 明细行(输入/输出/缓存)
- 充值二维码流程打通(选金额 → 展示真实二维码)
- 浏览器通知语音三变体随机播放
- 通知状态着色(失败红 / 中断·协助橙)

### 🐛 修复

- 木牌只显示余额:恢复完整用量/成本数据层(会话消耗、本月真实账单、消耗差值、Token 用量),数据跨重启持久化
- 桌面宠按钮中文乱码(UTF-8 BOM)+ 按钮补全(看用量/刷新/X + 右上角矢量眼睛)
- 木牌布局逐参数对齐宣传图(白卡片蓝边框、两栏式行、卡片边距)
- 台词/通知重复朗读(PowerShell 作用域修复 + 台词限流 + 播放去重叠)
- 通知提示音消失(补传语音目录 + 三变体随机)
- 摸头贴纸/爱心重复弹(元素稳定化,动画只播一次)
- 桌面宠退出后浏览器变哑巴(心跳检测自动交还发声权)
- 会话期间语音延迟(状态写入防抖)
- 「拉起桌宠」按钮行为错乱(单向拉起 + 启动/关闭宽限期)
- 任务完成通知消耗显示 0(任务用量快照差值计算真实成本)
- 通知停留时间 12s→6s,与浏览器一致
- 重启后会话消耗消失(成本账本跨重启连续 + 0 兜底常显)
- 桌面宠透明模式完整鼠标穿透(WS_EX_TRANSPARENT + 眼睛悬停解除 + 按钮禁用)
- 大量旧动态插件时期的修复移植(通知去重、完成延迟、标题解析、队列持久化、needs_help 提问识别、subagent/workflow/jobs 通知、多 key 解析兼容等,详见仓库审计报告)

### 📝 其它

- README 全面重写:5 张真实截图、安装、使用、设置项、常见问题
- 发布到 awesome-dsh-plugin 市场(fun 分类)

## [1.0.1] - 2026-08-29

### 🐛 修复

- 三处命名统一为 npm 包名 dsh-whale-pet-plugin(cordis.patch.yml name / lib export name / client ModuleLoader id),修复插件树加载失败
- package.json exports 增加 `./index.js`,修复 `ERR_PACKAGE_PATH_NOT_EXPORTED`

## [1.0.0] - 2026-08-29

### ✨ 首个发布版

- 浏览器悬浮鲸鱼娘 + Windows 桌面宠,双形态共享数据
- 余额木牌、任务通知、摸头互动、19 句预合成带情感台词、低余额提醒
- 发布到 npm(dsh-whale-pet-plugin)
