# 更新日志 / Changelog

`@feiyang666/dsh-usage-plugin` — DeepSeek Harness 用量与消耗插件

本文件按版本记录每一次更新的详细内容（新功能 / 优化 / 修复 / 界面 / 性能）。每次发布到 GitHub 时，请据此填写「版本发布」（GitHub Releases）的更新说明。

> 版本规范：本插件按「语义化版本」递增，`主.次.补丁`。功能新增/界面变化 → 升次版本（x.y.x → x.y+1.0）；仅 bug 修复 → 升补丁。

---

## v1.16.5 (2026-08-29)

### 新增 / New

- **概览页 Hero 主指标卡**：顶部新增「本月已消耗」渐变大数字卡 + 当前计费时段徽章；设置月度预算后同卡显示预算使用进度条（≥80% 黄色提醒，≥100% 红色超支告警并显示超支金额）。
- **核心指标卡片分层**：原 7 张等大统计卡改为「3 大主卡（总消耗 / 调用次数 / 缓存命中率）+ 4 小辅助卡（输入·未命中 / 输出 / 高峰消耗 / 空闲消耗）」，关键指标视觉权重突出。
- **近 30 天消耗趋势图**（canvas 堆叠柱状）：概览页新增按日消耗趋势，高峰（橙）/ 空闲（蓝）堆叠着色，悬停显示当日高峰/空闲/总消耗与调用数。
- **模型消耗占比环形图**：概览页新增各模型消耗占比环形图 + 图例（模型名 + 百分比）。
- **会话消耗排行 Top 10**：概览页新增按会话（sessionId）聚合的消耗排行，显示调用次数与消耗、相对进度条，便于定位「最烧钱」的对话。
- **缓存命中列表关键字搜索**：新增搜索框，按 模型 / 服务商 / 会话ID / 用途 实时过滤，与日期筛选叠加生效。
- **月度预算设置与超支预警**（`lib/index.js` + `lib/client.js`）：价格表页新增「月度预算」区块（输入金额保存 / 清除），持久化到数据目录 `budget.json`；概览页 Hero 显示当月已用/预算进度。新增 `setBudget` API，`list` 附带 `budget` 字段（向后兼容）。
- **说明信息收进可折叠抽屉**：原本首屏固定展示的「本地统计与官方后台的差异 / 高峰·空闲时段说明 / 计价说明」三段说明收进「▸ 帮助与说明」按钮（默认收起），有中断记录时按钮带数量角标；首屏直接展示数据。
- **底部工具条重组**：导出 CSV / JSON / PNG / 打开目录 / 选择文件导入 / 帮助与说明 合并为一行，导出目标目录输入独立一行。

### 修复 / Fixed

- 概览页 Hero 高峰时段徽章颜色修正（高峰 = 橙色）。

### 说明 / Notes

- 所有新 UI 文案均已补充英文词典（`__T_EN`），英文界面即时可用。
- 未引入新 npm 依赖；现有测试 30/30 全部通过。

---

## v1.15.0 (2026-08-29)

### 新增 / New

- **用量日历新增日期范围筛选**（`lib/client.js` CalendarView）：日历视图此前只有月份导航、无法只看指定区间；现在顶部新增与概览一致的筛选栏（今天 / 近7天 / 近30天 / 全部 + 自定义起止日期）。筛选激活时：
  - **每日消耗统计表跨月显示**范围内所有有记录的天（不再局限于当前月），标题显示所选范围；
  - 顶部「本月调用 / 本月消耗」卡片自动切换为「范围内调用 / 范围内消耗」并按范围汇总（含高峰/空闲拆分）；
  - 热力图仅对范围内日期着色，范围外显示为空（`—`）；
  - 空态文案随范围显示「该范围内暂无记录。」；
  - 预设按钮切换时自动清空自定义起止日期，避免残留范围误判。

---

## v1.14.1 (2026-08-29)

### 修复 / Fixed

- **中断调用兜底记录，使「调用次数」与 DeepSeek 官方后台对齐**（`lib/index.js`）：harness 在流被中断（aborted / error / timeout / 用户停止生成）时不会产出 `usage` chunk（usage 只在收到 `[DONE]` 哨兵后才由 adapter yield），导致这类调用此前完全不被插件记录——而官方后台仍会把该次请求计入「API 请求次数」并按实际 token 计费，于是插件统计的调用次数长期低于官方（如 8 月 27 日 985 vs 1033）。现在无 usage 但确为真实模型调用（通过 `isRealCall`，排除内部 `dsh2shell-*`/`fake`）的流，会在 `observe()` 的 `finally` 里补记一条 **0-token 的「中断调用」**（新增 `interrupted: true` 字段，`finishReason` 如实标记 `aborted`/`error`/`timeout`）。token 与费用均为 0，不会虚增消耗；调用次数与官方口径一致。
- **面板透明展示中断调用**（`lib/client.js`）：
  - 概览「调用次数」卡片新增 `· 中断 N（未计费）` 提示；
  - 缓存命中列表与用量日历当日明细中，中断调用行在模型名旁显示红色「中断」徽标、结束原因红色标注、消耗列显示 `—`；
  - PNG 导出报告同样在模型名旁标注「中断」、消耗列显示 `—`；
  - 结束原因新增 `aborted → 已中断 / Interrupted`、`timeout → 超时 / Timeout` 映射（中英双语）。
  - **用量面板顶部新增「本地统计与官方后台的差异」提示横幅**：说明本面板统计的是插件本地捕获的调用（官方价格 + 峰谷时段），与官方后台（platform.deepseek.com 用量页）相比金额可能更低——① 中断/出错/超时的调用官方仍按实际 token 计费而插件按 0 记录；② 账号下其他 API Key（其它应用/脚本）的调用不经过 DeepSeek Harness，官方包含而插件不包含；③ 精确对账可导出官方月度账单 CSV 对比。检测到中断调用时额外显示「当前记录中有 N 次中断调用（未计费）」红字提示。
- **持久化与 API 透传 `interrupted`**（`lib/index.js`）：`normalizeRecord` / `projectRecord` 均保留该字段，重启恢复、`/usage/api` list 输出、JSON 导出一致。

### 测试 / Tests

- 新增 `test/interrupt.test.js`：验证中断兜底仅记录真实模型调用（DeepSeek 官方 / 第三方真实 provider），内部 `fake`/`dsh*` 占位调用永不兜底记录。
- 全部 30/30 通过。

---

## v1.14.0 (2026-08-27)

### 新增 / New

- **消息底部「本轮 token」弹窗（两层统计）**：多轮完成后，助手消息底部操作行（复制 / 点赞 / 点踩 / 回复 那一排）新增「本轮 token」按钮，点击弹出 `Token 明细`：
  - **对话累计**：整场对话（当前会话）的 总 token / 总消耗 / 耗时 / 缓存命中率；
  - **本轮明细**：本次输出 / 本轮 token / 本轮消耗 / 本轮耗时 / 本轮缓存命中率 / **缓存命中长条图**（命中部分单独绿色渲染 + 百分比）/ **按模型卡片**（每模型：模型名 + 总成本，一行 输入·未命中 / 缓存命中 / 输出（+推理），有费用再一行 峰 / 谷）；
  - 时长统一按「X分Y秒」（英文 `Xm Ys`）显示；本轮窗口取该消息实际产出所在 step 的起止，本轮命中率与对话累计各自独立统计。
- **宿主记录带会话标识**：`llm/stream` 捕获每条记录时新增 `sessionId`（优先 `options.sessionId`，缺失回退当前 agent 会话）；新增 `tokenForMessage` API——按「会话 + 时间窗」返回本轮明细与对话累计两层聚合。
- **内部/工具调用单独分组**：`list` 同时返回 `toolCalls`（`model` 为 fake/unknown/空 或 `dsh*` 内部路由，如 `dsh2shell-*`/`fake`），概览「消耗明细」下方新增可折叠的「工具调用（内部）」分组（默认收起，显示 服务商·模型 / 调用数 / 总消耗），与真实模型调用分开。
- **语言跟随系统设置**：移除「用量与消耗」头部的中英文切换按钮，语言完全跟随宿主「通用设置 → 语言」，切换即时生效（`locale` 服务 `subscribe` + `locale/change`）；不再写 `localStorage`（`dsh-usage-lang`），旧残留值不再覆盖系统语言；「会话 / 设置」标签页名改为按渲染时读取的 thunk，随语言切换实时更新。
- **移动端适配**：表格在 ≤900px 贴合屏宽（`min-width:0 !important`）、不再出现横向滑条；宽表折叠中间列；弹窗统计卡与按模型卡片随宽度自适应；弹窗滚动条外观隐藏（仍可滚轮滚动）。
- **英文适配补全**：「高峰 / 空闲时段说明」整块与 19 个遗漏键（当前 · 工作日/周末时段、工作日高峰卡片提示、用量日历悬停提示、价格表两段长说明等）补上英译。

### 修复 / Fixes

- **弹窗不可见**：对话树祖先的 transform 会破坏 `position: fixed`，改用 `react-dom` 平台种子的 `createPortal` 把弹窗挂到 `document.body`。
- **整场会话聚合**：按 `messageId` 查找消息完成时间改为读取 `data.finalNode.messageId` / `data.closing.finalNode.messageId`，时间窗正确生效（不再把整场对话圈进来）。
- **语言切换失效**：不再持久化语言选择，宿主设置切回中文即时恢复、无需刷新。
- **表格显示**：宽表 `width:max-content`，列按内容撑开、外层容器横向滚动，数字不再被压到换行/重叠。

### 测试 / Tests

- 周末计费规则回归测试（issue #9）：宿主 `isPeakAt`（新增 `test/period.test.js`）+ 客户端 `isPeakNow` / `periodNow`（`test/client-i18n.test.js`），覆盖 issue 的 5 个时刻向量、生效时间边界、峰段窗口左右端点。
- i18n 测试改为覆盖「跟随宿主语言服务实时切换」「旧 localStorage 值不再覆盖宿主语言」。
- 全部 27/27 通过。

---

## v1.13.0 (2026-08-23)

### 新增 / New

- **英文界面（i18n 层）**（社区贡献，[@ayleen](https://github.com/ayleen)，[PR #7](https://github.com/feiyang-dev/dsh-usage-plugin/pull/7)）：Web 面板全部 UI 文案接入轻量 i18n——以原中文文案为键、内置英译词典；按浏览器语言自动选择（中文浏览器保持中文，其余默认英文），「用量与消耗」头部新增切换按钮，即时生效并保存于 localStorage。余额查询改为语义化字段（host 不再返回中文展示文案），缺失凭据错误不再泄漏内部键；日期 / 星期本地化（中文 `2026年8月22日`，英文 `Aug 22, 2026` 与 Mo–Su 表头）；瞬态提示与客户端校验错误渲染时翻译。
- **百炼（Qwen）Token Plan 配额查询**（社区贡献，[@wuhuqif176](https://github.com/wuhuqif176)，[PR #8](https://github.com/feiyang-dev/dsh-usage-plugin/pull/8)）：「剩余余额查询」新增「百炼 Token Plan」子页签——复用百炼 CLI（`bl`）的控制台 OAuth token（`~/.bailian/config.json`），无需阿里云 AccessKey；展示本周配额已用百分比（进度条 + `已用 xx.x%`）与本周开始 / 结束日期（连续线段，今天节点随日期动态移动）。新增依赖 `undici`。
- **本地改进**：消耗明细表顶部与底部各渲染一份分页条（长列表翻页更顺手）；DeepSeek 系 provider 未单独上报 `cacheWriteTokens` 时，「缓存写入」列改用未命中 token 数（`inputTokens`）兜底显示，避免长期为空。

### 文档 / Docs

- **补全贡献者名单**（`package.json` contributors）：新增 [@ayleen](https://github.com/ayleen)（PR #7 英文界面）与 [@wuhuqif176](https://github.com/wuhuqif176)（PR #8 百炼配额）。
- **新增 `.mailmap`**：把 PR #7 提交作者 `Ruslan R. Musakalimov <gitlab@letsweb.me>` 映射到 GitHub 账号 @ayleen，使仓库 Contributors 图与 git blame 正确归属历史提交。

### 致谢 / Acknowledgements

- **[@ayleen](https://github.com/ayleen)**：实现英文界面与响应式语言切换（PR #7）。
- **[@wuhuqif176](https://github.com/wuhuqif176)**：实现百炼 Token Plan 配额查询（PR #8）。

---

## v1.12.2 (2026-08-23)

### 修复 / Fixed

- **移动端宽表仍会逐字竖排（兜底加固）**（`lib/client.js`）：v1.12.1 的修复依赖运行时向 `document.head` **注入全局样式表**（`.dsh-usage-table{min-width:720px}` + `@media (max-width:540px)` 折叠中间列）。在部分移动端运行环境（如经 mobile-remote 进出的手机页面）下该样式表因加载时序 / CSP 未生效，导致 9–11 列宽表每列被压到约 1 字符宽、标题与单元格逐字竖排、数据无法阅读。本版把 `min-width:720px` **直接写进表格的内联样式**（内联样式必然生效），窄屏时表格保持 720px、外层 `overflow-x` 容器横向滑动，彻底不再依赖样式表注入；原有注入样式表与 ≤540px 折叠逻辑保留，作为进一步优化的增强项。

---

## v1.12.1 (2026-08-23)

### 修复 / Fixed

- **修复移动端「消耗表」「消耗明细」等宽表列标题逐字竖排的问题**（`lib/client.js`）：窄屏下 9–11 列宽表每列被压到极限宽度，`word-break` 把「调用」「API 服务商」「输入·未命中」等表头拆成单字竖排。现为所有用量表格注入响应式 CSS：表格强制 `min-width: 720px`，外层 `overflow-x` 容器正常横向滚动、不再逐字换行；极窄屏（≤ 540px）下对宽表自动隐藏第 4 列至倒数第 2 列，只保留「模型 / 服务商 / 调用 / 总消耗」等主标识列与合计列，价格表等窄表不折叠、保留横向滚动。

---

## v1.12.0 (2026-08-23)

### 新增 / New

- **SSE 实时推送端点**（`lib/index.js`）：新增 `GET /usage/api/events` 事件流端点，数据变化（新调用记录写入 / 导入 / 清除等，即 `persistNow` 落盘成功）时向订阅者推送 `data: {"type":"changed","at":<时间戳>}`。桌面端数据中心等客户端订阅该流即可**即时**感知用量更新（毫秒级），不再依赖轮询。无订阅者时零开销，插件独立使用完全不受影响。

---

## 开源贡献基础：合并 PR #6（@Martin-soaring-dev，2026-08-20）

> 本期（以及后续 v1.9.2 / v1.9.3）建立在社区贡献分支 **`Martin-soaring-dev/prepare_for_contribution`** 之上。该分支由用户上传、经你合并（GitHub Pull Request #6，合并 commit `12a52be`），是插件转向对外开源贡献的形态基础。

### 该分支带来的主要改动
- **多服务商余额查询**（`lib/balance.js` 新增 +205 行，新增余额适配器 `BalanceProviderAdapter`）：将原先仅 DeepSeek 的 `/user/balance` 查询扩展为可对接多个服务商的余额查询框架，新增 DeepSeek / SiliconFlow / DigitalOcean / AMD GPU Cloud 等 Provider 适配器。
- **按服务商展示余额与价格**（`lib/client.js` +258 行）：客户端新增「剩余余额查询」Tab 的多服务商 UI，可分别展示各服务商的「总余额 / 充值 / 赠送」并切换查看。
- **Provider 化计费**（`lib/index.js` +399 行重构）：注入 `settings` 服务用于服务商查找，调用计费改为 provider-aware，支持按不同服务商分别统计与计价。
- **插件装配与测试**：新增余额适配器单测（`test/balance.test.js`，+130 行）、`scripts/wire.js` 手动装配兜底、`cordis.patch.yml` 插件注册条目。

### 致谢
- **[@Martin-soaring-dev](https://github.com/Martin-soaring-dev)**：提交并筹备了上述开源贡献分支（PR #6），是后续公开发布版本的功能与结构基础。

---

## v1.11.1 (2026-08-23)

- **修复：数据加载后页面空白**：加载动画三目分支误用逗号表达式，只返回最后一个表达式值（`null`），导致加载完成后各子视图全部不渲染；改为将四个子视图作为容器 `div` 的并列子元素，加载完成后正常显示。
- **计费说明改为面板级固定显示**：「高峰 / 空闲时段说明」固定在用量面板子页签下方，概览、用量日历、缓存命中列表、价格表四个页面切换时始终可见（含数据加载期间）。
- **当前时段精确显示**：用量面板顶部徽标与价格表页顶部新增「当前 · 工作日高峰时段 / 工作日空闲时段 / 周末空闲时段」动态状态并附说明文字；周末（自 2026-08-23 起）全天按空闲价计费，规则生效前仍按原规则区分。

---

## v1.11.0 (2026-08-23)

- **高峰 / 空闲时段说明**：概览、用量日历、缓存命中列表、价格表四个页面顶部统一新增「高峰 / 空闲时段说明」，清楚区分**工作日高峰**（周一至周五 9:00–12:00、14:00–18:00）、**工作日空闲**（其余时间）与**周末全天空闲**（自 2026-08-23 起按空闲价，此前仍按原规则）。
- **加载动画**：用量面板首次进入、数据仍在加载时显示转圈加载动画与提示文字，避免白屏无反馈；余额查询加载中同步使用加载动画。
- **表格适配**：所有表格改为宽度自适应容器（`width:100%`），单元格内容按需换行，不再因内容超宽出现横向滚动条；极窄窗口下容器保留横向滚动兜底。窗口缩放、不同分辨率下查看更舒适。

---

## v1.10.0 (2026-08-23)

- **新增 DeepSeek 官方模型 `deepseek-v4-flash-vision-exp`（DeepSeek-V4-Flash-Vision-Exp）**：官方价格表、概览「按模型」表、按 API 服务商 × 模型明细、用量日历、缓存命中列表与 PNG 报告均自动按该模型计价；「价格表」页新增该模型一行，`modelKey` 识别优先匹配 `vision`（避免被误归入 `deepseek-v4-flash`）。
- **价格**（元 / 百万 tokens，与官方最新公布一致）：空闲时段 缓存命中 0.05 / 输入未命中 1.5 / 输出 4.5；高峰时段 缓存命中 0.10 / 输入未命中 3.0 / 输出 9.0（与 `deepseek-v4-flash` 同价）。
- **核对确认**：`deepseek-v4-flash` / `deepseek-v4-pro` 的峰谷价与官方最新公布完全一致，无价格变动；发送给该模型的图片按其尺寸换算成 token，与文本 token 一并计费。
- **周末统一按空闲（低谷）价计费（2026-08-23 00:00 起）**：新规则生效后，周末（周六、周日）全天不再区分峰谷时段，统一按空闲价计费；工作日仍按北京时间 9:00–12:00、14:00–18:00 高峰分段。新规则生效前的调用仍按原规则结算。插件的高峰时段判定、面板「当前时段」徽标、概览 / 日历 / 缓存列表的高峰与空闲分列统计、PNG 报告均按新规则自动判断。

---

## v1.9.4 (2026-08-20)

- **持久化不再落到工作目录（修复「数据又进了工作区」的反馈）**：之前插件的落盘走的是模型侧沙箱化的 `fs` 服务，在 `workspace-write` 模式下会被限制只能写工作区；当系统/用户目录因沙箱不可写时，数据会兜底写进 `<工作区>/dsh-usage`，于是切换工作区又出现「数据没了」的现象（即 issue #4 的本质）。
- **改动**：持久化改为由插件**宿主进程自身的 `node:fs`** 直接完成，完全绕过 `workspace-write` 沙箱约束。数据根解析优先级变为 `DSH_USAGE_DATA_DIR` > `%LOCALAPPDATA%\dsh-usage-plugin`（或 `%APPDATA%`）> `~/dsh-usage-data`，**工作区降级为绝对最后的兜底**，正常桌面环境下数据稳定落在 AppData / 用户主目录，与当前工作区无关，切换工作区不再丢失历史。导出、价格表、`.keep` 等写操作同样改为宿主进程 `node:fs`，不再依赖受沙箱子进程。
- **数据迁移**：原有 4558 条历史记录位于 `<工作区>/dsh-usage/usage-records.json`，首次以新版本启动时会被自动去重合并进新的固定数据根（`%LOCALAPPDATA%\dsh-usage-plugin\dsh-usage\usage-records.json`），无需手动处理。

## v1.9.3 (2026-08-20)

- **概览支持日期筛选**：概览 Tab 顶部新增筛选栏，可按「今天 / 近 7 天 / 近 30 天 / 全部」快速切换，或自定义起止日期区间；所有聚合统计（按模型表、服务商 × 模型明细、总计）均按所选范围实时计算，并展示当前范围的记录数与总消耗。
- **文档**：新增「如何更新插件」章节——桌面端 / 命令行 / 手动三种更新方式、版本锁定、已装版本校验，并提示**勿手改 `node_modules` 下文件**（每次更新会被 npm 覆盖）。

## v1.9.2 (2026-08-20)

> 修复 issue #4：持久化路径随会话工作区漂移，导致历史用量数据"消失/统计为 0"，且 UI 显示路径与实际落盘路径不一致。

### 背景（症状与根因）
- **症状**：切换会话工作区、或用不同工作区重开桌面端后，统计页的「历史用量 / 总消耗」变成 0、仿佛数据丢失；同时统计页顶部显示的「数据持久化」路径，与磁盘上真实写入的文件路径对不上。
- **根因**：旧版持久化根按 `agent.session.cwd` / `sandboxPolicy.workspaceRoot` 推导——无会话启动时常解析到用户主目录，插件激活后又切到当前工作区，且不同根之间不会互相合并，于是历史被「切走」到另一个目录而读不到；写盘还会受工作区沙箱策略约束。

### 修复
- **固定专用数据目录**：持久化根不再跟随 `agent.session.cwd` / `sandboxPolicy.workspaceRoot` 漂移。解析顺序为：环境变量 `DSH_USAGE_DATA_DIR` > 系统应用数据目录 `%LOCALAPPDATA%\dsh-usage-plugin`（仅 Windows；macOS/Linux 下该分支不生效，因 `LOCALAPPDATA`/`APPDATA` 未定义）> 用户主目录下专用文件夹 `~/dsh-usage-data`（Windows 为 `%USERPROFILE%\dsh-usage-data`，macOS/Linux 为 `~/dsh-usage-data`）。该目录独立于桌面端安装目录、`~/.dsh` 主目录与任何会话工作区，删除工作区或卸载 APP 都不会丢失数据。
- **启动时合并去重**：首次初始化与会话激活时，自动把散落在用户主目录、`.dsh`、各工作区旧路径里的 `usage-records.json` 按 `time` 去重合并进固定根（复用现有 `normalizeRecord`），不再只读当前根的那一份。
- **UI 路径一致**：统计页顶部显示的「数据持久化」路径恒等于真实落盘路径；写入不再绑定工作区沙箱策略，固定目录可正常写入。
- **数据迁移**：切换根目录时对旧根记录做真正合并（非复制/分裂），重启后自动恢复全部历史。

### 影响
- 旧版本落在 `%USERPROFILE%\dsh-usage`、`.dsh\dsh-usage`、各工作区 `dsh-usage` 下的历史记录，会在首次启动本版本时自动合并到固定目录，无需手动迁移。

---

## v1.9.1 (2026-08-16)

- **文档**: README 改为英文优先（`README.md` 英文 + 新增 `README.zh.md` 中文）；补充「npm 包名已更换」醒目通知（旧包名 `@feiyang666/deepseekharnessdesktop` → 新包名 `@feiyang666/dsh-usage-plugin`），并移除发布教程等无关内容；修正 tarball 测试命令为新包名文件名。

---

## 1.9.0 — 2026-08-16 · 面板宽度自动适配（最终方案）

> 解决「不同窗口/屏幕大小下，宽表最右列与合计列被窗口右缘裁掉、卡片只剩半张」的问题。该问题的根因是：会话视图容器没有宽度约束，面板被宽表格/卡片撑到 max-content 宽度（约 1300px+），超出窗口右缘后被窗口本身裁掉，因此表格内部也不会出现滚动条。

### 新增
- 面板宽度以**视口封顶**：页签容器 `max-width: min(1200px, calc(100vw - 24px))`，任何窗口/屏幕大小下面板都不会超出窗口右缘。
  - 大窗口下仍保持 1200px 水平居中；
  - 窄窗口下跟随视口宽度收缩。
- 宽表在容器内**横向滑动**：表格保持自然宽度（`width: max-content`），容器 `overflow-x: auto` 兜底展示完整列。

### 修复
- 修复「按模型」「按 API 服务商 × 模型」等宽表**最右列（空闲消耗 / 总消耗、合计列）显示不全**的问题——表格超出可视区时出现横向滚动条，不再被窗口裁掉。
- 修复顶部统计卡片行**第 6/7 张卡片只有一半**的问题（卡片网格随面板宽度自动换行）。

### 优化 / 界面
- 撤掉 1.8.0 引入的「整体 CSS zoom 缩放」方案：不再把表格缩到看不清，保持默认可读字号。
- 根容器 / 页签容器增加 `width:100% + max-width:100% + min-width:0 + box-sizing:border-box`，彻底打破 flex 宽度链导致的溢出。
- 设置页保留原有的「底部横向滑动条」交互；工作区「用量与消耗」同样采用滑动条方案。

---

## 1.8.0 — 2026-08-16 · 宽表自适应（中间方案，已被 1.9.0 取代）

> 首次尝试解决宽表被裁问题：引入 `FitTable` 自适应容器，表格超过容器宽度时用 CSS `zoom` 按比例缩小，配合 `ResizeObserver` 监听窗口尺寸。
>
> 该方案在设置页被证明「缩小得太多、字体过小、不便于阅读」，未符合预期，因此在 1.9.0 中被废弃并改为「面板宽度视口封顶 + 宽表容器内横向滚动」。**此版本不建议用于正式发布，仅保留过程记录。**

### 新增
- `FitTable` 组件：测量容器宽度与表格自然宽度，超宽时按比例缩放（下限 0.35），并监听 `ResizeObserver`/窗口 `resize` 自动恢复。
- 所有宽表（概览两表、日历两表、缓存列表、价格两表）套用 FitTable。

### 已知问题
- 设置页在网页缩放后表格显得很小，阅读体验差。

---

## 1.7.0 — 2026-08-16 · 价格表官方标注 + 服务商 × 模型明细钻取

### 新增
- **价格表标注为「DeepSeek 官方 API 价格表」**：明确说明本表为 DeepSeek 官方 API 价格（单位：元 / 百万 tokens），仅涵盖官方模型 `deepseek-v4-flash` 与 `deepseek-v4-pro`，价格按官方公布固定、不可编辑。
- **概览「按 API 服务商」升级为「按 API 服务商 × 模型」钻取明细表**：
  - 每个服务商为一组（灰底加粗组头行），显示该服务商小计：调用数、高峰/空闲次数、各 token 合计、高峰消耗、空闲消耗、总消耗；
  - 组头下逐行列出该服务商**每一个模型**的详细数据（调用、高峰/空闲、输入·未命中、缓存命中、输出、推理、高峰消耗、空闲消耗、总消耗），按消耗从高到低排序；
  - 服务商按消耗降序排列（deepseek-official → opencode-go → deepseek-modlens …）；
  - 表尾为「总费用合计」行。
- **PNG 导出报告**的「按服务商」一节同步升级为「按 API 服务商 × 模型」分组表（组头行 + 缩进模型行 + 总费用合计行）。
- 面板顶部新增**全局计价说明**：各模型与 API 服务商的消耗统一按 DeepSeek 官方 API 价格计费（因各厂商定价数据不完整，不按第三方另行计价；无 DeepSeek 官方价格的模型消耗按 0 统计）。

### 优化 / 界面
- 概览「按模型」表保留并继续分组展示；新增组头行样式（`tdGroup`/`tdGroupR`）。
- 模型名与 API 服务商均以请求参数为准如实显示。

---

## 1.6.0 — 2026-08-16 · 区分 API 服务商 + 总费用合计 + 缓存列表性能优化

### 新增
- **按 API 服务商统计消耗**：概览新增「按 API 服务商」表，显示每个服务商（deepseek-official、opencode-go、deepseek-modlens…）的调用次数、高峰/空闲次数、高峰消耗、空闲消耗、总消耗，按消耗降序；空服务商显示「未知服务商」。
- **总费用合计**：
  - 概览服务商表底部「总费用合计」行（含高峰/空闲/总消耗合计）；
  - 缓存命中列表表尾新增「总费用合计」行：整段筛选范围内的调用数、各 token 合计、命中率、高峰 + 空闲 + 总消耗。
- 用量日历当日明细：每行的模型列下方补充该条调用的 API 服务商小字。
- PNG 报告新增「按 API 服务商」一节。

### 性能（缓存命中列表卡顿优化）
- **分页渲染**：每页 100 条，上一页 / 下一页 + 页码指示，不再一次性渲染上千行 DOM（卡顿主因）。
- **自动刷新 3 秒 → 10 秒**：原每 3 秒全量拉取所有记录并整表重渲染；现仅 10 秒拉取一次并增量显示。
- 切换筛选 / 日期区间 / 清除区间时自动回到第 1 页；汇总与表尾合计仍按整个筛选范围计算，不受分页影响。

### 验证
- 实测 2700+ 条记录 → 28 页；即使接近 10 万条上限仍保持流畅。
- 已校验「各服务商消耗之和 == 总费用合计」「高峰 + 空闲 == 总消耗」恒成立。

---

## 1.5.0 — 2026-08-16 · 真实模型名 + 高峰/空闲分列消耗 + 界面字号自适应

### 新增 / 修复（用量）
- **非 DeepSeek 模型不再显示「未知模型」**：模型名改为以请求参数里的真实模型名为准如实显示（`modelName` 助手）；概览、用量日历、缓存命中列表、PNG 报告均以真实模型名分组。
  - 修复前：kimi-k3、qwen3.6-plus、glm-5.2、grok-4.5、minimax-m3 等全部合并显示为「未知模型」。
  - 修复后：各自成行、如实显示；无 DeepSeek 官方价格的模型消耗按 0 统计。

### 计价（高峰 / 空闲分列）
- 服务端 `buildDays` 每日聚合新增**高峰 / 空闲消耗拆分字段**（按 `base`/`peakValley`/`auto` 三档各记一桶：`basePeakCost`、`pvOffPeakCost`、`autoPeakCost` 等共 6 个），作为单一天数据源；前端有「按记录回退计算」兜底，旧 host 未升级时也能正确显示。
- **概览**：新增「高峰消耗」「空闲消耗」卡片，总消耗卡注明「高峰 + 空闲」；模型表新增高峰/空闲调用次数、高峰消耗、空闲消耗、总消耗列与合计行。
- **用量日历**：月份卡片新增高峰消耗/空闲消耗；每日统计表改为「高峰消耗 | 空闲消耗 | 总消耗(自动)」三列（替换原 消耗(自动/峰谷/基础) 三列，列数更少更不挤）；悬停详情与当日明细都列出高峰/空闲的条数与消耗。
- **缓存命中列表**：汇总行区分「高峰消耗 X · 空闲消耗 Y · 总消耗 Z」；每行消耗金额按峰谷着色（高峰橙 / 空闲蓝）。
- **PNG 报告**：头部与卡片新增高峰价/空闲价消耗；模型消耗表新增高峰消耗 / 空闲消耗 / 总消耗列；模型名用真实名称；底部注明按 DeepSeek 官方价格统一计价。

### 界面（显示大小自适应 + 去拥挤）
- 面板全部字号改为 **em 相对字号**（`fs()` 辅助），随宿主「显示大小」设置的字体基准自动缩放。
- 表格内边距加大（6px → 7px/10px）。
- 模型列允许换行（`tdWrap`），卡片网格加宽防挤压。
- 月份导航文字 / 日期标题同步 em 适配。

---

## 1.4.0 及更早（基线，未逐版本拆分）

> 本项目自本日志撰写时起有记录的版本为 1.4.0。1.0.x–1.3.x 为早期迭代，未保留逐版本改动记录，以下为 1.4.0 时的完整功能基线（也是后续各版本迭代的起点）：

### 插件主体
- **Host 半**（`lib/index.js`）：监听 `llm/stream` 瀑布事件，捕获每次模型调用的 token 用量与缓存命中（输入·未命中 / 缓存命中 / 缓存写入 / 输出 / 推理 / 结束原因），写入 `<会话工作区>/dsh-usage/usage-records.json`，实时落盘、上限 100000 条、重启自动恢复。
- **Client 半**（`lib/client.js`）：在 WebUI「对话」「轨迹」之后提供「用量与消耗」「剩余余额查询」两个 tab；设置页亦有对应入口。

### 计费
- DeepSeek 峰谷 / 基础价格表（`deepseek-v4-flash` / `deepseek-v4-pro`），支持在面板内编辑价格并持久化到 `pricing.json`，可一键恢复默认。
- 峰谷价生效时间：北京时间 2026-08-17 00:00；生效前按基础价，生效后按高峰/空闲时段（高峰 = 北京 9:00–12:00、14:00–18:00）。
- `auto / base / peakValley` 三档计费，导出中每行带三档费用与 `period` 标记。

### 界面
- 概览（总消耗卡片 + 按模型消耗表）；用量日历（月度热力图，按消耗或调用数着色，悬停详情、点击某天看明细 + 每日统计表）；缓存命中列表（今天/近7天/近30天/全部 + 自定义日期区间）；价格表（自动/峰谷/基础三档）。
- 剩余余额查询：用 `DEEPSEEK_API_KEY` 调 `/user/balance` 显示总余额/充值/赠送。

### 数据与导出
- CSV / JSON / PNG 长图导出（最新在前，最多 2000 条，超出提示），支持自定义导出目录（原生目录选择器）与「打开所在目录」。
- JSON / CSV 导入合并，按时间去重。
- Windows / macOS / Linux 跨平台路径与原生操作适配；启动诊断日志 `dsh-usage-boot.log`。
