# Changelog ## v1.3.0 — 2026-10-01 ⚙️ C 档:可配置面 + 预算告警 + 多维度看数(Host 半有改动:重启 DSH,或按 README 换名热更) - ⚙️ **配置文件**(`~/.dsh/token-usage-config.json`,面板「设置」按钮内编辑): `refreshSeconds`(自动刷新间隔 15–3600 秒,前端即时生效)、`budget.daily/monthly`(预算金额)、 `retentionDays`(保留期,0=不清理,>0 会**永久删除**更早的日聚合行)。 **依然零依赖**:不走插件 Config schema(那要 import 宿主包,桌面 asar 形态下得额外装依赖),沿用价目表同款的文件方案 - 💸 **预算告警**:新增 `summary` RPC 给「今日 / 本月」固定口径(与面板区间无关),汇总卡新增 **今日 / 本月**两张卡;配了预算又配了价目表时再出一张 **预算卡**(`¥已花 / ¥预算`),**超支变红** - 🏷️ **按厂商视图**:排行榜与折线图可一键在「按模型 / 按厂商」间切换(纯客户端折叠,不改存储) - 🔀 **按金额排序**:配了价目表时,排行榜可切换「按用量 / 按金额」(未定价的模型排后面) - 🧪 测试:i18n 205 → **257**、smoke 37 → **51**(新增维度折叠、超支变红、设置弹层读写等 14 条断言) - ⛔ **明确不做**(评估后放弃):**时区/日界**与**按项目/按会话下钻**——两者都改变聚合维度、 必须全量重建才生效,而当前存储里有 49 个「日志已不存在」的孤本会话,重建即等于删掉它们 ## v1.2.0 — 2026-10-01 🛡 三条稳健性补丁(Host 半有改动:**需重启 DSH**,或按 README 的换名热更) - 🚨 **「重新统计」二次确认(防呆)**:当存储里有「**日志已不存在**」的会话历史时(用孤儿水位判定), `rebuild` 先返回 `{ needsConfirm: true, orphanSessions: N }`,面板弹确认框,用户点了才真重建—— 那部分历史**无法重建**(事实源已丢),此前一次手滑就永久没了。面板同时常驻一行提示,告知存在这类历史 - ♻️ **回填失败的会话现在会退避重试**(2s → 8s → 30s → 120s,最多 4 次)并去重排队; 此前只在「首次创建缓冲」时排一次扫描——失败后该会话的事件只堆不折,`buffers` 无上限增长 - 🧯 **缓冲上限 2000 条**(超出丢最旧并计数):缓冲只是日志内容的副本,回填会从日志按水位重折叠, 所以丢缓冲不丢数据;`status.buffers` 暴露 `{sessions, events, dropped, failed}` 供诊断 - 🔍 **401/403/405 现在带 JSON 诊断体**:`{error, hint, seen:{host,origin,site,cookie: present|missing}}`(**不回显 cookie 值**), 客户端把它拼进错误文案——前后端鉴权/同源出问题时不必再靠猜 - 🧪 测试:i18n 190 → **205**、smoke 31 → **37**(新增「无确认不重建」「确认后带 confirm:true」 「错误体 hint/seen 透出」等断言) ## v1.1.1 — 2026-10-01 🔎 让"粒度切换"看得见 > 纯 Client 半改动(`client.js`):**硬刷新页面即生效**,不用重启、不用重装。 > 起因:用户实测「点日/周/月,数字没变化」——查证后确认**不是 bug**(汇总卡/排行榜是整段区间的合计, > 与分组粒度无关;且当时只有 3 天数据、全落在同一周,切"周"整张图只剩 1 个点), > 但"看不出变化"确实是体验缺陷,故补三处可见反馈 + 一处行为修正。 - 🔎 **桶数可见**:折线图标题变为「词元用量统计 · 周 · 共 1 个桶」,区间副标题追加「(3 天)」; 汇总卡新增「**桶数**」卡 —— 切粒度时标题、副标题、卡片三处同时变,一眼确认生效 - 🧭 **切粒度不再自动换区间**:原行为会在「近30天 ↔ 近12周 ↔ 近12个月」之间自动跳, 坐标系整体平移,与"粒度变了"混在一起难以分辨;现在**粒度只管分组方式,区间由你手动控制** (鼠标悬停粒度按钮有说明:合计是整段区间的总量,不随粒度变化) - 🧪 测试:i18n 177 → **190**、smoke 26 → **31**(新增桶数卡/标题/区间跨度断言,以及 「切粒度不得改动区间预设」的回归断言) ## v1.1.0 — 2026-10-01 💰 从「花了多少 token」到「花了多少钱」 > 新增:缓存命中率、缓存写/推理两个桶、**成本估算(自带价目表,插件不内置任何价格)**、 > CSV/JSON 导出、可见时自动刷新。Host 半有改动,升级需重启 DSH。 - 💰 **成本估算(可选)**:新 RPC `prices` / `prices.save` + 面板「价目表」编辑器 (路径 `~/.dsh/token-usage-prices.json`,原子写入、写前校验)。单价单位=每百万 token, `cacheRead`/`cacheWrite` 不填则回退 `input` 价;**插件不内置任何价格**,没配就不显示金额, 已定价/未定价模型分别计数(未定价时面板明示"金额只算了有价的部分") - 📊 **补全统计面**:汇总卡新增 缓存写 / 推理 / **缓存命中率**(缓存读 ÷(输入+缓存读+缓存写)); 模型排名条尾部追加金额(同一刻度,不另画第二根轴) - 📤 **导出**:当前区间导出 **CSV**(桶 × 模型逐行 + 模型小计 + 总计,金额按各桶占比摊到行上) 与 **JSON**(服务端原始聚合);弹层内可复制或下载,壳里下载被拦也能复制走 - 🔄 **自动刷新**:页面可见时每 60 秒静默重取(不闪 loading),切回前台立即刷新一次,隐藏时不发请求 - 🧪 **测试从 50 加到 266**:`stats.fixtures.mjs` 50 → **63**(价目表归一化/回退/成本算术/rollup 附成本); 新增 `client.i18n.fixtures.mjs`(**177**:中英键集一致、派发键存在、占位符一致); 新增 `client.smoke.mjs`(**26**:迷你 React 离线跑通渲染 → 汇总卡/双图 → CSV 内容 → 导出弹层 → 价目表读取/模板/保存 → 空态/错误态)。CI 三条全跑 - 🔧 与 v1.0.1 一起(若从 1.0.0 升级):摘要路由取事件自带 provider/model、单桶区间画点、 卸载时最后一拍落盘生效、删「重试也计费」错误承诺、安装命令改默认/desktop profile ## v1.0.1 — 2026-10-01 🔧 口径与稳健性修补 > 无新功能,只修「实测与宣传不符」与三处实现缺陷。升级方式:`remove_bundle` → `install_bundle`(Host 半改动需重启 DSH)。 - 🏷️ **压缩摘要记账归位**:`compaction/summary` 事件自带 `provider`/`model`(0.2.0-rc.2 实测数据里就有), 现在**优先采信事件自带路由**,缺了才回退最近一次 `request/header` —— 修掉「压缩的账记到别的模型头上 / 堆成 `compaction/unknown`」 - 📉 **单桶区间不再空白**:自定义「开始 = 结束」或数据只覆盖一天时,折线退化为一个点、SVG 画不出来 → 现在改画圆点(合计 + 每模型) - 💾 **卸载时最后一拍落盘真正生效**:v1.0.0 的 disposer 先置空 `domain` 再调 `flushBatch()`,撞上 `if (!handle) return` 空转, 「先落盘再 close」的注释与行为相反;现在显式传入域句柄 - 📝 **文档据实**:删除「重试也计费」的错误承诺 —— 0.2.0-rc.2 的 `assistant/attempt` 事件**不携带 usage** (18 个会话 / 17 条 attempt 样本 / 0 命中),重试与失败调用的花费上游不报,插件无源可算; 该分支保留为防御性代码。README 的 GitHub 安装命令由 `--profile web` 改为默认 profile / `--profile desktop` - 🧪 夹具 46 → **50 项**(新增 4 项摘要路由断言);新增 GitHub Actions CI(语法检查 + 夹具) ## v1.0.0 — 2026-09-25 🎉 首发 - 📊 **设置面板新分区「词元用量」**(`settings.section`,零宿主改动) - 📅 **日 / 周 / 月** 三种粒度(周一起始、自然月;只存日桶,切粒度即时生效) - 📈 **趋势折线图**:合计粗线 + 每模型细线 + 悬浮十字线明细 + 图例开关 - 🏆 **模型排名柱状图**:总量横向排名 + 占比 - 🗓️ **时间自定义**:预设(近 7/30 天、近 12 周/月、全部)+ **自定义起止日期** - 🔁 **重新统计**:全量重扫重建(幂等,水位防双计/漏计) - 🔒 本地优先:只读 `~/.dsh/sessions` 会话日志,绝不外发;RPC 三重栅栏(连接鉴权 + 回环 Host + 同源 Origin) - 🧩 零依赖纯插件:宿主源码改动 0,纯 SVG 无图表库,`remove_bundle` 即无痕卸载 - 🛡 统计口径 fail-closed(非法计数跳过)、fork 继承前缀去重