# 更新记录

每个**已发布**版本的改动都记在这里；本文件随包一起发布（`files` 里已包含），
发版流程见 [README → 发版](./README.md#发版)。最上面一条就是 npm 上的当前版本。

约定：正式版发到 `latest`，`-rc.N` 只发 `next`（不动 `latest`）；括号里的短哈希是那次改动的提交。

## 1.4.2 — 2026-09-27

> **兼容性**：仍是 DSH `0.1.7-rc.2` 起（区间未变，见 1.4.0 那条）。本版有一处**行为变更**：
> `notifyEnabled` 默认值从 `false` 改为 `true` —— 升级后默认就订阅通知；不想收的把「系统通知」
> 开关关掉即可，无需任何配置迁移。该改动在**宿主半**（schema 默认值），**重启 Harness 后生效**；
> 浏览器半 `Ctrl+F5` 刷新即可。

### 变更

- **系统通知默认开启，并在首次交互时自动请求授权**（`db2fa91`）
  `notifyEnabled` 默认改为 `true`。打开页面后，借用户的**第一次点击 / 按键**自动请求一次浏览器
  通知授权 —— 浏览器不允许没有用户手势的请求（MDN：Firefox 72 起、Safari 更早直接拒绝），页面
  自己弹不出来，这是能做到的最"自动"的形态。频率：每次打开页面最多问一次、**不落任何持久标记**：
  在授权窗里选「允许」/「阻止」后不再打扰；只点 × / Esc（什么也没选）不算做选择，下次刷新会再
  问一次，直到做出选择或把开关关掉。

### 修复

- **任何配置项改完都要等一会儿才生效**（`db2fa91`）
  与 1.4.0 里音量、颜色那两条同源，这次把设置区**全字段**统一到一张当帧回显草稿表：官方
  `Switch` 是 fully controlled（只认 `props.checked`）、音效下拉只认受控 `value`、滑杆与取色器
  的受控 `value` 也会被旧快照拽回，而每笔写都要重写整份 profile 补丁并热重载插件条目
  （实测约 1s/笔）—— 只读快照的控件在回显到达前一直显示旧值。现在写入当帧先画、快照追平后
  交还；滑杆 / 取色器仍按手势合并（首笔立即 + 静默 150ms 补最后一笔）。

- **连点几次开关后，最后落在开启上却「自己关掉」**（`db2fa91`）
  回显草稿是 React state，设置区随热重载重建就丢；写被拒时又会把画面摔回旧快照；排队中的尾笔
  写也可能随实例一起没掉。现在照官方「代码工作工具」那一行（`DeveloperToolsRow`）的写法：一笔
  写在途就把开关 `disabled`（原生 `<button disabled>`，浏览器不派发点击 → 连点只产生一笔写），
  写被拒时行内 `role="alert"` 报「保存失败，请重试」并回滚画面；同时删掉上一版的后台重推
  （它会和用户下一次点击抢着写）。「最后一次操作」另提到模块级，组件重建时不闪回更早的宿主值。

### 新增

- **通知权限状态 chip**（`db2fa91`）
  「系统通知」开关**正下方**常驻短状态，长解释交给官方 `Tooltip`（hover 与 focus 都触发，键盘
  可达）：未授权 =「未授权 · 授权」可点（点了重新弹授权窗）；已拒绝 = 叹号 +「已被拒绝」+
  恢复路径（浏览器不会二次弹窗，网页也无权打开站点设置页）；不支持 = 一行小字（多为非安全
  上下文，例如用局域网 IP 打开）；已授权 = 不显示。权限态用 Permissions API 的 `onchange` +
  `focus` / `visibilitychange` 实时刷新；授权成功当场弹一条「通知已开启」确认。

## 1.4.0 — 2026-09-27

> **兼容性**：要求 DSH `0.1.7-rc.2` 起 —— 0.1.x 线内放行，跨到 0.2 线（含其预发布）须重新
> 验证后再放行（声明原文 `>=0.1.7-rc.2 <0.2.0-0`）。设置表单改用 0.1.7 的
> `runtime.Config` 派生，**宿主 0.1.6 及更早请继续用 1.3.1**。

### 修复

- **浅色系统上标签页状态灯永远不显色**（`981e8cd`）
  宿主 `index.html` 挂了两枚 `<link rel="icon">`（`favicon-dark.svg` / `favicon.svg`，
  靠 `media="(prefers-color-scheme: …)"` 区分），浏览器按系统主题只渲染其中一枚；旧代码
  `querySelector("link[rel~=icon]")` 只拿到第一枚，而浅色主题下渲染的恰恰是第二枚 ——
  琥珀、绿、默认色全画在没人用的那枚上，标签页看着一直是默认图标。现在改**全部** icon，
  逐枚记住各自原始 `href`（还原时对号入座），页面上一枚都没有时自建一枚再上色。

- **音量滑杆「改了没反应、还回弹」**（`2cfc6b4`）
  每笔 `set` 都要重写整份 profile 的 `cordis.patch.yml` 并热重载插件条目（实测约 1s/笔），
  而原生滑杆每挪一格就发一次 `input`，一次拖动几十笔全排进写队列，回显被拖到几秒之后，
  受控滑杆又被旧快照拽回 —— 表现为「点一下固定差 5%，右滑也是下降」。现在按**手势合并写**：
  首笔立即写（点一下就生效），拖动中只攒最新值，静默 150ms 后补最后一笔（一次手势 1–2 笔），
  同时当帧画回显草稿，写入最终没落盘才回滚。

- **点「↺ 恢复默认」/ 取色后，预览鲸鱼要等一会儿才变色**（`c49231d`）
  与上一条同源：预览和取色器都只读快照。现在颜色也有当帧草稿，写入落定后交还快照、失败回滚；
  取色同样按手势合并（原生取色器拖动时会连发 `input`）；复位是整笔覆盖，先丢掉排队中的取色值
  再立即 `unset`。

### 变更

- 设置页迁移到 DSH 0.1.7 的设置 API：改读 `ctx.configForms.get("notice-center")`，`loading`
  不渲染，`unavailable` / 只读时给一行说明；宿主半只声明 Config schema，旧 `settings.yaml`
  由 `dsh-settings` 按同名条目 id 迁移。
- 宿主半每个字段补 `.volatile()`（`volatileForm` 只投影「最近的可变祖先」下的字段，漏标一个
  那项就会在设置页整条消失），`schemastery` 升到 `^3.18.4`；保留 `/notice-center-sounds`
  音效路由。
- 修正图标名：`…Outline14` → `…OutlineRegular`。宿主静态模块表里没有 `…14` 那套导出，
  `jsx(undefined)` 会被插槽错误边界吞掉，整个设置页会变成空白（配置项一条都不显示）。
- 导航图标换成自定义铃铛（`viewBox 0 0 1024 1024`）：铃身 + 底座合并成一条 `currentColor`
  路径跟随主题，高光保留 `#3399FF`；官方回退齿轮的 path 不够用时只追加克隆节点（不删 React
  管的节点），幂等跳过避免 rAF 死循环。
- `engines` / `peerDependencies` 收到 `0.1.7-rc.2` 起（上限锁在 0.2 线之前，声明原文
  `>=0.1.7-rc.2 <0.2.0-0`）。

### 测试与工程

- 新增 `test/compat-range.smoke.mjs`：0.1.4 ~ 0.2.0 宿主兼容区间，`npm test` 一并跑。
- `primitives` 桩改成导出白名单（名单外的名字直接抛错，原来的 Proxy 对任何名字都造得出假组件）；
  `rAF` 桩改为入队 + 手动 flush，对齐真浏览器时序；新增导航图标 9 条断言。
- 浏览器半冒烟补：两枚 favicon 都换色 / 各自还原 / 一枚都没有时自建一枚；音量手势合并写与
  回显草稿；颜色当帧回显与合并写（第 17–19 节）。

## 1.3.1 — 2026-09-24

- fix: 「自动隐藏」的提示文案只讲了关闭侧，改为两侧都写清楚（`92b0dae`）
- feat: 设置页页脚（插件名 + 版本号，点击开仓库）（`ce8109e`）
- test: 补「同一会话连续完成两次 → 弹两次」回归用例，把去重语义写精确 —— 管的是
  「同一次完成」，不是「同一会话」（`d44ae93`、`cd8f2f2`）
- docs: README 重构为「使用 / 开发」两部分并加目录导航，补齐中英文主图与真实设置页截图

## 1.3.0 — 2026-09-19

- fix: 状态灯改为**待处理优先**，与官方 `sessionStatuses` 一致（`735007f`）
- feat: 完成通知附本轮总用时；待处理通知按交互类型细化；新增「前台提醒」开关；调完音量试听
  完成提示音；设置页分组行整行可点（不必去够最右边的箭头）
- test: 新增设置页渲染测试（记录型桩，零新依赖）（`ed7acd6`）
- docs: 新增英文 README（`README.en.md`）

## 1.3.0-rc.1 — 2026-09-19

- ci: 新增 tag 触发的 OIDC 发布工作流（npm Trusted Publishing，无令牌 + 自动 provenance），
  并加幂等保护：该版本已在 registry 上就跳过（`a8a2f38`、`de49005`）
- 首次实测 OIDC 发布链路

## 1.2.0 — 2026-09-19

- feat: 提示音可选 —— 45 个 opencode 内置音效，下拉里悬浮即试听（`40521ef`）
- docs: README 重写（功能 / 使用 / 截图）

## 1.1.0 — 2026-09-18

- test: 补浏览器半冒烟测试并接入 CI（`d388890`）
- feat: 通知标题改为会话名、正文改为通知类型（`9a541e9`）；新增「自动隐藏」开关，关闭则常驻
- fix: 通知去掉 `tag`、前台判定纳入窗口焦点 —— 修「同一对话只有第一条会弹」（`8b75353`）

## 0.2.2 — 2026-08-22

- 设置页与「选中会话」信号灯的修复版（`f278787`）

## 0.1.0 — 2026-08-16

- 首个正式版：标签页鲸鱼状态灯 + 浏览器系统通知（`83a2860`）

---

> 0.1.0 – 1.1.0 是改名 / 独立收敛之前的产物；npm 上的 `dsh-notice-center` 从 1.2.0 开始。
