# 变更记录 版本号跟 `package.json` 走;每条只写「用户能感知的行为变化」和「会咬人的坑」。 ## 1.0.3 — 2026-10-19 只有清单和文档,代码与 1.0.2 完全一致。 - `package.json` 补上 `peerDependencies`:声明与宿主共享的 `@deepseek-ai/dsh-settings`、 `dsh-credentials`、`dsh-host-webserver`、`dsh-llm-pi-ai` 和 `@deepseek-ai/cordis`, 版本范围覆盖 0.2.0-rc.1 起的 0.2.x(含 0.2.1 的 alpha/rc)。宿主版本对不上时安装阶段 就会明确报错,而不是等到运行时才发现服务缺失 - README 的测试数从 66 改为 68(实际一直是 68,之前写错了) 安装方式、配置、状态文件和接口都没有变化,升上来不需要改任何东西。 ## 1.0.2 — 2026-10-18 修「设置页一直显示连接中…」:关掉设置页再打开时,组件是新的(快照为 `null`), 但 `/state` 的 ETag 缓存还留着,服务端回 304,新组件拿不到任何数据,只能停在 「连接中…」,直到手动点刷新或下一轮内容变化。 - `client/client.js` 的 `fetchState` 除了 ETag 也缓存整份快照,304 时返回上次那份 - 设置页挂载时先用侧边栏徽标已经拉到的快照渲染,不再闪一下「连接中…」 - 补两个回归测试:重新挂载遇到 304 仍显示已连接;徽标已有数据时首帧就是已连接 ## 1.0.1 — 2026-10-18 只有文档:1.0.0 发布到 npm 后,包页面上显示的安装说明还是「本地 link 目录」,对 npm 用户是错的。 - README 安装段改为 `dsh plugin --profile desktop add dsh-workbuddy2api-panel`,本地开发用 link 方式单独说明 - 加 npm 徽章 没有代码变化,行为与 1.0.0 完全一致。 ## 1.0.0 — 2026-10-18 首个稳定版。**与 0.5.1 没有任何行为差异**——功能面到这里定型,之后按语义化版本走: 修 bug 发补丁版,加功能发次版本,真要改 provider 键、状态文件名或已有接口字段才发 2.0。 从 0.5.1 升上来不需要改任何配置:状态文件、`cordis.patch.yml`、provider 键、面板地址都沿用。 ### 1.0 之前的最后一次功能修复 见 0.5.1 与 0.5.0:安全边界(回环 + 同源 + JSON 三道闸)、清除配置真正断开、嗅探后切换地址、 关同步也落盘、`/state` 的 ETag、告警国际化、浮层 Esc/外点关闭。 ## 0.5.1 0.5.0 之后的收尾:不再有安全问题,都是「看得见的粗糙」和性能。 ### 性能 - `/state` 支持 ETag:内容没变回 304,前端带 `if-none-match`。53 个模型的快照约 30KB, 15 秒一轮的轮询里绝大多数时候什么都没变,现在这一轮只是一个空响应。 顺带的好处是「没变化就不重渲染」,原先计划的 `React.memo` 因此不再必要。 ### 国际化 - 告警文案改由服务端给 `titleKey`/`detailKey` + `params`,前端按当前语言渲染; 服务端仍保留中文 `title`/`detail` 作为兜底(老前端、日志、测试都在用)。 - 剩余硬编码中文清掉:相对时间(刚刚 / x 分钟前)、模型分组「其他」、 档位的「(面板默认)」、图片能力标签。 - 仍按原样显示的是**数据**:模型名、账号昵称、面板返回的错误原文——翻译它们反而是错的。 ### 交互与可访问性 - 侧边栏浮层支持 Esc 关闭、点浮层外面关闭,补 `role="dialog"` / `aria-label`; 徽标按钮补 `aria-expanded`。 - 「再点一次确认清除」的红框 5 秒后自动复位(以前会一直挂着,下次误点直接删配置)。 - 档位/窗口 chip 补 `aria-pressed`,去掉一个 `active ? 'transparent' : 'transparent'` 的死三元。 - 「同步被宿主配置事务挡住」现在会在设置页显示一行提示(`syncPending` 以前是死字段)。 ### 修复 - `summarizePackages`:面板把 `expires_at` 给成 `0` 时回落到字符串 `end_time`, 否则这类积分包会被当成永不到期而漏掉告警。 - `reconcileModels`:`removed` 只收有模型定义的 id,不再出现「谁都没见过」的 id。 - 修两处挂错位置的 JSDoc(`lib/panel.js` 的 `probeCandidates`、`lib/index.js` 的 `errorText`)。 - 前端 `requestJson` 抽出公共请求逻辑,`fetchState` 复用,不再两份超时/非 JSON 处理。 - 快照不再返回 `selection`(与 `models[].enabled`/`efforts` 重复)、`packages`、`usageFetchedAt` (前端从未读取)。 ### 测试 - 60 → 66:告警 i18n 中英双语渲染、chip `aria-pressed`、`expires_at: 0` 回落、 `removed` 只收有定义的 id、`computeAlerts` 的 key + 参数,以及**之前漏掉的** `summarizePackages` / `reconcileModels` 边界。三条新的 `lib/panel.js` 用例 在修复前的代码上确认会失败。 ## 0.5.0 一次以「审计 → 修复」为主线的版本,核心是把写接口的安全边界补齐。 ### 安全(P0) - **写接口加同源校验**:所有 POST 现在要同时满足「本机回环 + `Sec-Fetch-Site` 同源/无 + `Origin` 与 `Host` 一致 + `application/json`」。此前任意网页可以 `POST /config` 把面板地址改成攻击者主机, 插件随后会把 `Authorization: Bearer <真 Key>` 发过去,也能直接 `POST /clear` 清空配置。 - 写接口收到非 JSON 的 content-type 直接 415,跨站来源 403。 ### 修复(P0) - **清除配置现在真的断开**:以前只清 `panelUrl`,`activeUrl` 和地址列表还在,下一轮轮询又把模型 拉回来、界面回到「已连接」。现在地址列表、当前地址、面板版本、模型基准、缓存一起清。 - **嗅探到地址后真的切过去**:「用这个」以前只改 `panelUrl`,请求仍然打旧地址;现在同时更新 `activeUrl` 并把新地址补进地址列表。 - **关掉自动同步也会落盘**:`lastModelIds` / `panelVersion` / 下架宽限基准以前只在「开同步」时写, 重启后所有模型都被当成首次导入,新模型策略(不勾选)因此失效。 ### 修复(P1) - 用量窗口的 `?hours=24` 以前被前端 `apiPath` 丢掉,选了 24h 实际拿到 72h 数据;现在保留查询串。 - 勾选模型 / 改策略时,还在路上的 15 秒轮询回来会用旧快照覆盖刚提交的状态(「勾了又弹回去」); 现在带序号,过期响应直接丢弃。 - 用量时段的数字改用函数式更新,不再用闭包里的旧快照做 spread。 - 保存成功的绿色提示以前只写不渲染;现在渲染并在 4 秒后自动消失。 - 模型勾选框在提交期间禁用;关掉某一模型的最后一个思考档,现在真的传「不裁剪」而不是回滚。 - 「全部启用(新模型)」以前会 `bulk(true)` 把所有模型都打开,现在只启用面板新增的那些 (`POST /enable-new`),不动用户手动关掉的(`POST /bulk` 保留原义)。 - 前端接口调用加 15 秒超时,避免请求挂死让「保存中」永远不复位。 - 客户端三块 UI(语言包 / 设置页 / 侧边栏徽标)分别注册,一块失败不再带走其它块。 - 快照字段缺失时补默认值(老插件 + 新前端的方向也不会白屏)。 - 降级版 `Button` / `Checkbox` 透传 `style` / `disabled` / `aria-label`。 ### 其他 - 状态文件改成「内容没变就不写」:轮询每 2 分钟一次,以前每次成功都写盘(一天 720 次)。 - `select` / `bulk` / `enable-new` 之后同步更新「已写入 DSH 的模型数」。 - 所有模型都没勾选时的报错改成「没有勾选任何模型(在设置页至少勾一个)」,不再说「面板没有模型」。 - 写入 DSH 的 `baseURL` 改用运行期的当前地址(多地址时不会再写到连不上的那条)。 - `package.json` 补 `engines` / `repository` / `homepage` / `bugs` / `author`,新增本文件。 - 测试 50 → 57:新增跨站写拒绝、清除后不重连、嗅探切换、关同步落盘、无变化不写盘、 只启用新模型、查询串保留等回归用例,并验证过「修复前必失败」。 ## 0.4.1 - 侧边栏徽标的显示方式改完立刻生效(设置页与徽标是两个 React 根,改为进程内广播)。 ## 0.4.0 - 侧边栏徽标可配置:剩余/总额、分域、仅剩余、不显示。 - 修启动时凭据服务未就绪导致的假「API Key 失效」,冷启动失败只等 15 秒。 ## 0.3.0 - 侧边栏徽标(`sidebar.footer.action`)、多地址与反向代理子路径、发布准备(LICENSE / CI / 去个人化)。 - 改名 `dsh-workbuddy2api-panel`。 ## 0.2.0 - M2:告警、下架宽限、新模型策略、额度耗尽标注、清除配置、mock 面板与 e2e 测试。