dsh-all-usage 1.1.17 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +453 -386
- package/LICENSE +21 -21
- package/README.en.md +270 -0
- package/README.md +145 -273
- package/assets/model-icons/ai2-color.svg +1 -0
- package/assets/model-icons/ai21-brand-color.svg +1 -0
- package/assets/model-icons/aionlabs.svg +1 -0
- package/assets/model-icons/alephalpha.svg +1 -0
- package/assets/model-icons/baai.svg +1 -0
- package/assets/model-icons/baichuan-color.svg +1 -0
- package/assets/model-icons/baidu-color.svg +1 -0
- package/assets/model-icons/bytedance-color.svg +1 -0
- package/assets/model-icons/cohere-color.svg +1 -0
- package/assets/model-icons/hunyuan-color.svg +1 -0
- package/assets/model-icons/ibm.svg +1 -0
- package/assets/model-icons/iflytekcloud-color.svg +1 -0
- package/assets/model-icons/internlm-color.svg +1 -0
- package/assets/model-icons/kling-color.svg +1 -0
- package/assets/model-icons/liquid.svg +1 -0
- package/assets/model-icons/longcat-color.svg +1 -0
- package/assets/model-icons/manifest.json +739 -213
- package/assets/model-icons/microsoft-color.svg +1 -0
- package/assets/model-icons/mistral-color.svg +1 -0
- package/assets/model-icons/nousresearch.svg +1 -0
- package/assets/model-icons/nova-color.svg +1 -0
- package/assets/model-icons/nvidia-color.svg +1 -0
- package/assets/model-icons/perplexity-color.svg +1 -0
- package/assets/model-icons/sensenova-color.svg +1 -0
- package/assets/model-icons/skywork-color.svg +1 -0
- package/assets/model-icons/snowflake-color.svg +1 -0
- package/assets/model-icons/stepfun-color.svg +1 -0
- package/assets/model-icons/tencent-color.svg +1 -0
- package/assets/model-icons/tii-color.svg +1 -0
- package/assets/model-icons/upstage-color.svg +1 -0
- package/assets/model-icons/voyage-color.svg +1 -0
- package/assets/model-icons/xiaomimimo.svg +1 -0
- package/assets/model-icons/yandex.svg +1 -0
- package/assets/readme-architecture-en.svg +95 -0
- package/assets/readme-architecture-zh.svg +95 -0
- package/assets/readme-sync-en.svg +81 -0
- package/assets/readme-sync-zh.svg +81 -0
- package/assets/screenshots/en/01-overview.png +0 -0
- package/assets/screenshots/en/02-heatmap.png +0 -0
- package/assets/screenshots/en/03-model-usage.png +0 -0
- package/assets/screenshots/en/04-request-logs.png +0 -0
- package/assets/screenshots/en/05-cost-settings.png +0 -0
- package/assets/screenshots/zh/01-overview.png +0 -0
- package/assets/screenshots/zh/02-heatmap.png +0 -0
- package/assets/screenshots/zh/03-model-usage.png +0 -0
- package/assets/screenshots/zh/04-request-logs.png +0 -0
- package/assets/screenshots/zh/05-cost-settings.png +0 -0
- package/cordis.patch.yml +5 -5
- package/lib/aggregation.js +1842 -1112
- package/lib/client.js +1 -1
- package/lib/http.js +417 -370
- package/lib/icons.js +40 -0
- package/lib/ledger.js +1000 -531
- package/lib/plugin.js +347 -323
- package/lib/pricing-runtime.js +615 -551
- package/lib/pricing.js +1463 -1412
- package/lib/records-cache.js +113 -0
- package/lib/session-sync.js +976 -841
- package/lib/usage-core.js +33 -10
- package/lib/version-check.js +133 -0
- package/package.json +8 -3
- package/screenshots.json +10 -3
- package/assets/screenshot-1.png +0 -0
- package/assets/screenshot-2.png +0 -0
- package/assets/screenshot-3.png +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,389 +1,456 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- **
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- The
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
- **The
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
- **
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
- **A
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
###
|
|
116
|
-
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
###
|
|
122
|
-
|
|
123
|
-
-
|
|
124
|
-
|
|
125
|
-
##
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
###
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
-
|
|
164
|
-
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
-
|
|
172
|
-
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
-
|
|
195
|
-
|
|
196
|
-
-
|
|
197
|
-
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
-
|
|
220
|
-
-
|
|
221
|
-
|
|
222
|
-
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
-
|
|
226
|
-
-
|
|
227
|
-
|
|
228
|
-
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
-
|
|
233
|
-
|
|
234
|
-
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
-
|
|
238
|
-
|
|
239
|
-
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
245
|
-
-
|
|
246
|
-
-
|
|
247
|
-
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
-
|
|
251
|
-
|
|
3
|
+
## v1.2.0(2026-10-15)
|
|
4
|
+
### 新功能
|
|
5
|
+
- **支持 DSH 0.2.1-alpha.2** —— 声明区间追加精确版本 `0.2.1-alpha.2`;本机 Node 24 严格真实 Cordis smoke 通过(Cordis `4.0.5-alpha.1` / loader `1.0.6-alpha.1` / timer `1.1.7-alpha.1`),CI 已配置 Node 22/24、待执行;仅此精确版本,不代表其他 alpha 版本。
|
|
6
|
+
- **模型图标扩到 43 个品牌** —— 从 lobe-icons 固定 revision 取 32 个新商标;9 个 `currentColor` 烘成固定中性色。manifest 继续钉住上游 commit 与逐文件归属,MIT 许可与商标说明随包发布。
|
|
7
|
+
- **网关 / 云的包裹 id 还原真实品牌** —— 覆盖 `openai-gpt-5.5`、`databricks-claude-*`、`eu.anthropic.claude-*` 等写法,原始 id 仍优先。
|
|
8
|
+
- **状态接口公开内存与账目诊断** —— `/api/all-usage/status` 现在一并给出 `memory`(常驻用量明细行 / 会话记录 / 会话聚合、会话记录缓存占用估算 MiB,`heapUsedMB` / `rssMB` 为整个 Host 进程)、`counters`(诊断操作计数)、`accounting`(当日聚合一致性)与 `mismatch`(首个桶增量不一致样本,无则为 null;样本含内部用量 key 与工作区 ID,不含提示词或回复正文)。
|
|
9
|
+
### 优化
|
|
10
|
+
- **生效起点也按北京时间** —— 该日期现在表示「那天 00:00(北京时间)」,与时段同一时区。内置 DeepSeek 文本表本来就锚定在北京时间零点(存的是前一天 16:00 UTC),改前界面显示成 UTC 日期(差一天),现在显示正确、原样保存不变;英文界面仍按 UTC,留空仍表示全部历史。
|
|
11
|
+
- **成本设置里的时段改用北京时间** —— 峰的时段在宿主里按 UTC 存(DeepSeek 自己的峰时是北京时间 09:00–12:00 / 14:00–18:00),中文界面现在直接按北京时间显示与填写、保存时自动换回 UTC;跨午夜的时段会拆到次日并顺延星期;英文界面仍按 UTC。
|
|
12
|
+
- **热力图可以用键盘操作了** —— 每个日期格子对用户就是一个按钮(读屏也按按钮播报),并带读屏可读的名字(如「2026年10月12日 周一:63 次使用」);整块日历只有**一个 Tab 停靠点**,Tab 落点跟随当前选中 / 获得焦点的日期(初始为今天,今天不在当前跨度内时取最近有使用的一天);方向键按天 / 按周移动、Home / End 到首尾、回车或空格打开当日明细,悬停提示会跟着焦点走;图例对读屏隐藏(纯装饰),说明文字补上了键盘用法。
|
|
13
|
+
- **热力图改成蓝色** —— 方块由 GitHub 绿换成蓝色渐变(同一个强调色按 20/45/70/96% 混进面板底色,明暗主题都保持可读),图例与「今日」光晕同步换色。
|
|
14
|
+
- **热力图入场动画不再拖长尾、也不再无视「减少动态效果」** —— 376 格的错峰延迟从「每格 1.2ms、最长 444ms」改为按 25 格循环(最长 **144ms**):实测挂载 700ms 后仍在跑的动画 **393 → 11**(页面静置后只剩 4 个,其中含「今日」光晕);「今日」呼吸光晕在 `prefers-reduced-motion: reduce` 下不再启动(它写在行内样式里,媒体查询原本覆盖不到)。
|
|
15
|
+
- **趋势图点数封顶 180** —— 半年以内按天,更长先降到 3 天一点再按需扩到周 / 月 / 季 / 年;桶不重叠不丢天,面板标注汇总粒度。实测 1 年 122 点、20 年 120 点。
|
|
16
|
+
- **请求日志内部滚动 + 分页** —— 首屏最近 20 条,滚到底再取 20 条(实测 20 → **40 条**)。
|
|
17
|
+
- **概览卡片行压缩约四分之一** —— 内边距 16→10px、大数字 26→22px 等,整行 **156 → 114px**。
|
|
18
|
+
- **DeepSeek 余额两位小数** —— 主数值 `¥13.8600` → **`¥13.86`**;其它币种仍四位。
|
|
19
|
+
- **筛选下拉不再每次渲染都重建** —— 三个菜单的选项列表改由 useMemo 派生、图标在列表构建时解析一次,菜单本身用 React.memo 包裹;真机同口径(开+关各一帧 × 20 轮)**47.96 → 29.4 ms/轮**。
|
|
20
|
+
- **用量明细按预算常驻** —— 用量明细不再全部常驻内存:每个会话维护一份摘要(足以把它的 token 与成本从聚合里精确扣回来),**已经定稿的行**在扫描结束后交还账本,查看「请求日志 / 当日明细」时再按需从磁盘读回;启动阶段也改为只列账本目录、按会话读单条记录(原来一次性解析全部记录)。真机 6.6 万行实测这一路径:峰值 156 MB、**静置降到 87 MB**(该数值是那次真机账本的实测样本,会随账本规模与内容变化,不代表与历史无关的总体堆占用),降前降后的日志页逐行一致、总额与逐日聚合一分不差。
|
|
21
|
+
- **冷启动再快一倍:小数累加走快路** —— 折叠阶段每加一个成本字段都要做两次 `10n ** k` 幂运算和三次「去尾零」规整,且每条用量的成本在装载与折叠时被**解析两遍**。改为查表取 10 的幂、省掉多余的规整、并把装载时解析出的数直接交给累加缓存后:同一份真机账本(139.3 MB / 1060 条 / 6.6 万行)的**折入 3.83 → 1.80 s**、**加载 2.8 → 2.5 s**,**完整冷启动 ~6.7 → ~4.3 s**(审计基线 8.6 s)。金额逐字校验:离线折叠与线上宿主的总成本完全一致(65,633 次计价)。
|
|
22
|
+
- **账本加载阶段提速约 1.5×** —— 每条用量行原先要跑两遍校验 + 两次成本快照解析(每次 11 个小数域),且「已是最新格式」的记录在装载时还会被再全量解析一遍;两处都消除后,同一份 156.7 MB 真实账本、**只计加载阶段**(读盘 + 归一化 + 展开)从 **4.2 s(审计基线)降到 2.2–3.2 s**(纯加载进程 2.2 s;聚合状态同时存活时因堆压力约 3.2 s)。这组旧基线的**完整冷启动**(含把 6.6 万条折进聚合 cube)为首次 9.8 s / 稳态 7.5 s,其中折入耗时 4.3 s 未变;后续首建扫描优化见下文。
|
|
23
|
+
- **首次建账复用会话观察快照** —— 在提供 `observeSession` 的 runtime 上跳过未使用的投影构建,并在扫描退出时释放观察租约;较旧 runtime 仍兼容 `readSession`。固定 570 会话的隔离对照中,ready 中位数 935.753 → 95.329 秒(−89.8%),两侧均完整读取全部会话日志,18 层原始账目一致。该计时包含独立测试宿主开销,不代表在线 DSH 启动耗时。
|
|
24
|
+
- **冷分页先从会话摘要构建索引** —— 冷查询先用摘要定位、筛选和排序,再按页读取所需明细;摘要不能精确描述范围时仍走完整读取回退。固定 67,328 行账本的隔离对照中,首屏中位数 2.946 → 0.287 秒(−90.2%),遍历 3,367 页为 7.187 → 4.770 秒(−33.6%),行及逐层账目一致。代价是 settled heap 增约 6.05 MiB,warm 后页 p99 中位数增加约 4.14 ms。
|
|
25
|
+
- **定价回填与时段核对合并为一次扫描** —— 价格同步和定价设置更新共用一次用量行遍历,避免对同一账本分别做两轮核对。固定账本隔离回放中,ready 中位数 21.883 → 18.131 秒(−17.1%),原地全量聚合重建 23.445 → 19.793 秒(−15.6%);六层原始账目一致。
|
|
26
|
+
- **定价快照不再每次重算路由清单** —— 价格表要遍历全部用量行(本机 6.5 万条)才能列出用过的模型;该结果改为按「数据 / 定价 revision」缓存,只在两者变化时重算(模型化实测:每次 3.4 ms → 命中约 0 ms)。
|
|
27
|
+
- **按范围的旧查询结果不再滞留** —— 结果键里带 revision,旧条目永远读不到却仍占内存;现在数据或定价一变就清掉(每条约 30–115 KB × 最多 20 条)。
|
|
28
|
+
- **首屏快照只带一份时区日历** —— 面板每次开屏会请求自己那份(本地或 UTC),不再同时传两份(原来两份各占一半);按范围的「会话数」仍来自 /query,口径不变。
|
|
29
|
+
- **每天的会话 id 明细只保留近期** —— 超过 180 天的日子仍带数量与聚合,但不再拖着历史上所有会话 id(面板看旧日期的日志本就按需拉取)。
|
|
30
|
+
- **旧存储文件不再长期占盘** —— 账本改用「一条记录一个文件」后,原来的整单位文件(本机 32 个分片 + 一个遗留大文件,合计约 178 MB)已被逐条播种成新结构;账本现在会在**确认新结构已有记录**后删除这些旧文件并留下一次性的标记,失败则下次启动重试。
|
|
31
|
+
- **账本体积按路由去重** —— 同一条路由(供应商 / 模型)以前在每条用量里都重复一份身份对象;改为每条记录共享一张身份表、用量只存索引。实测本机 1059 条记录 **91.3 → 74.7 MB(−18.2%)**。
|
|
32
|
+
- **账本改写方案已就位(性能数字来自隔离的真实账本副本基准,未测在线写入时延)** —— 会话记录改一条一文件存储,替代「每次更新重写整个分片」:实测单次更新 **273 ms → 中位 4.6 ms**(最大的会话 74 ms),整个分片目录 **13.27 → 11.88 MB**;冷启动在同一份真实数据上从 **8–9 s 降到 3.0 s**(首次含迁移 5.5 s)。
|
|
33
|
+
- **客户端 bundle 缩小约 7.6%** —— 品牌图标改为由宿主按需提供(`GET /api/all-usage/icon?key=`,新增品牌不再增加体积),并清掉一批无人调用的客户端函数和再也渲染不出的样式规则;`lib/client.js` 从 v1.1.18 的 257,854 B 降到 **238,143 B(约 7.6%)**。
|
|
34
|
+
- **渲染不再被无关状态带着重画** —— 趋势 / 热力图(376 格)入参改为稳定引用,图标几何提到模块级;真机实测整页 DOM **6266 → 1719 节点**。
|
|
35
|
+
- **品牌图标规则更省心** —— 图标清单改由 manifest / 目录推导,以后加品牌不用手改清单;没有品牌图标的模型显示插件自己的**层叠标记**(不是空圆点),不指向任何品牌。
|
|
36
|
+
### 修复
|
|
37
|
+
- **修复「谷时段被记成峰时」** —— DSH 可能整场会话只发一次 `request/context`,而插件把这条**会话级**时间戳当成每次请求的计费时刻:实测 20:02 的调用按 14:10 的峰时窗口计价,峰谷**费率**与「峰/谷」标记一起错(本机 6.6 万条里有 1.6 万条受此影响)。现在会话级时间戳只在 30 分钟内有效(超时改用调用自身的时间),对账过程也会把历史里「比调用早 30 分钟以上、且该会话没有与这条记录 turn/step 对应的时间戳」的行按调用时间重新计价一次。逐请求(turn/step)时间戳的语义不变。
|
|
38
|
+
- **同一模型的多个路由合并为一个筛选项** —— 按模型名归并(忽略大小写与 `供应商/` 前缀),宿主同样按模型名匹配。
|
|
39
|
+
- **模型筛选不再显示供应商命名空间** —— 只显示模型名,取值仍是原始 id(实测 25 项里含 `/` 的为 0)。
|
|
40
|
+
- **供应商 / 模型下拉不再无限下延** —— 限高 `min(60vh, 420px)` 内滚,打开时滚到当前选中项。
|
|
41
|
+
### Features
|
|
42
|
+
- **DSH 0.2.1-alpha.2 is supported** — the declared range gains the exact version `0.2.1-alpha.2`; the strict real Cordis smoke passes locally on Node 24 (Cordis `4.0.5-alpha.1` / loader `1.0.6-alpha.1` / timer `1.1.7-alpha.1`), and CI is configured for Node 22/24 pending execution; this exact version only — no other alpha versions implied.
|
|
43
|
+
- **43 model brands** — 32 new marks from the pinned lobe-icons revision; nine had currentColor baked to a fixed neutral. The manifest still pins the upstream commit and its per-file attribution, and the MIT licence and trademark notice ship with the package.
|
|
44
|
+
- **Gateway and cloud ids resolve to the real brand** — covers openai-gpt-5.5, databricks-claude-*, eu.anthropic.claude-*; the raw id still wins.
|
|
45
|
+
- **The status endpoint exposes memory and accounting diagnostics** — `/api/all-usage/status` now also reports `memory` (resident usage detail rows, session records and session aggregates, the estimated session-record cache size in MiB, and `heapUsedMB` / `rssMB` for the whole Host process), `counters` (diagnostic operation counts), `accounting` (today's aggregate consistency) and `mismatch` (the first bucket-delta inconsistency sample, or null; the sample carries the internal usage key and workspace ID, never prompts or reply bodies).
|
|
46
|
+
### Improvements
|
|
47
|
+
- **The effective-from date follows Beijing time too** — the date now means 00:00 Beijing, the same zone as the windows. DeepSeek's built-in text plan already anchors at Beijing midnight (stored as 16:00 UTC the day before) and used to display as the previous calendar day; it reads correctly now and saves back unchanged. English keeps UTC, and an empty field still means the whole history.
|
|
48
|
+
- **Time-of-day pricing is edited in Beijing time** — the host stores peak plans in UTC while DeepSeek's own peak hours are 09:00-12:00 and 14:00-18:00 Beijing time, so Chinese now shows and accepts those times directly and converts back on save (a window crossing midnight moves to the next weekday); English keeps UTC.
|
|
49
|
+
- **The heatmap is keyboard-operable** — every date cell is a button to the user (screen readers announce it as one) and carries a screen-reader name (for example "2026-10-12 Monday: 63 uses"); the calendar has a **single tab stop**, so Tab lands on the selected/focused day (today initially, or the most recent day with usage when today is outside the span); arrows move by a day or a week, Home/End jump to the ends, Enter or Space opens the day's detail, and the tooltip follows focus; the legend is hidden from screen readers because it is decorative, and the note mentions the keyboard.
|
|
50
|
+
- **The heatmap is blue now** — cells switch from GitHub green to a blue ramp (one accent mixed into the panel surface at 20/45/70/96%, so it stays readable in both themes), and the legend and today's glow follow.
|
|
51
|
+
- **The heatmap entrance no longer trails and no longer ignores reduced motion** — the 376-cell stagger went from 1.2 ms per cell (a 444 ms tail) to a 25-cell wrap (144 ms); measured animations still running 700 ms after mount drop from **393 to 11** (four once the page settles, the today pulse among them), and that pulse is skipped under prefers-reduced-motion because an inline style had put it out of the media query's reach.
|
|
52
|
+
- **The trend chart is capped at 180 points** — a span up to half a year stays daily, a longer one drops to three days first and widens on demand; buckets never overlap or drop a day, and the panel names the stride.
|
|
53
|
+
- **The request log scrolls in its own box and pages as you go** — newest 20 rows first, 20 more at the end (20 to 40 measured).
|
|
54
|
+
- **The summary row is about a quarter shorter** — padding 16 to 10px, big numbers 26 to 22px: 156 down to 114px.
|
|
55
|
+
- **The DeepSeek balance reads with two decimals** — ¥13.8600 becomes ¥13.86, while any other currency keeps the four the API reports.
|
|
56
|
+
- **The filter menus stop rebuilding on every render** — their option lists are derived with useMemo (icons resolve once, when the list is built) and the menu itself is wrapped in React.memo; measured in the panel over 20 open/close cycles: **47.96 ms down to 29.4 ms** per cycle.
|
|
57
|
+
- **Usage detail rows follow a residency budget** — usage detail rows are no longer all resident: each session keeps a digest (enough to unwind its tokens and cost from the aggregate exactly), rows whose pricing is final are handed back to the ledger once a scan finishes, and the request log reads them from disk again on demand; a cold start now lists the ledger directory and reads one record per session instead of parsing every record at once. Measured on a real 66k-row ledger for this path: peak 156 MB, **steady state 87 MB** (a measured sample for that ledger that moves with ledger size and content, not a total-heap figure independent of history), with the log pages byte-identical and the totals unchanged.
|
|
58
|
+
- **Cold start halves again: the decimal path takes a fast route** — every accumulated cost field paid for two `10n ** k` powers and three trailing-zero normalizations, and each usage row's cost was parsed twice (once on load, once when folded). A power table, fewer normalizing passes and handing the load-time parse to the accumulator cache took the same real ledger (139.3 MB, 1060 records, 66k rows) from a **3.83 s fold to 1.80 s** and a **2.8 s load to 2.5 s**: a **full cold start of about 4.3 s instead of 6.7 s** (the audit measured 8.6 s). The money is unchanged to the last digit — an offline fold and the live host agree exactly (65,633 priced calls).
|
|
59
|
+
- **The ledger's load phase got about 1.5x faster** — every usage row ran two validation passes plus two cost-snapshot parses (eleven decimal fields each), and a record already in the current format was parsed in full again when it was applied; both are gone. On the same 156.7 MB of real data, the **load phase alone** (read, normalize, expand) went from the audit's **4.2 s to 2.2-3.2 s** (2.2 s in a lean process, about 3.2 s while the aggregation state is live). That earlier **full cold start** (including folding 66k rows into the cubes) measured **9.8 s on the first start and 7.5 s in steady state**, with folding unchanged at 4.3 s; the later first-scan optimization is described below.
|
|
60
|
+
- **First-install scans reuse observed session snapshots** — on runtimes providing `observeSession`, the scan skips unused projection construction and releases the observation lease on exit; older runtimes continue to use `readSession`. In an isolated, fixed 570-session comparison, median ready time fell from 935.753 to 95.329 seconds (−89.8%); both variants still read every session log and matched across all 18 raw accounting layers. The measurement includes the isolated harness and is not an online DSH startup time.
|
|
61
|
+
- **Cold request-log pages index from session digests** — cold queries use digest metadata to locate, filter and order rows, then load page payloads on demand; an incomplete digest still falls back to the full read. In an isolated 67,328-row ledger comparison, median first-page time fell from 2.946 to 0.287 seconds (−90.2%) and all 3,367 pages from 7.187 to 4.770 seconds (−33.6%), with rows and layered totals matching. The trade-off was about 6.05 MiB more settled heap and a 4.14 ms increase in median warm-page p99.
|
|
62
|
+
- **Pricing backfill and temporal reconciliation share one scan** — pricing sync and settings updates visit the usage rows once instead of running separate passes. In an isolated replay of a fixed ledger, median ready time fell from 21.883 to 18.131 seconds (−17.1%) and an in-place full aggregation rebuild from 23.445 to 19.793 seconds (−15.6%); all six raw accounting layers matched.
|
|
63
|
+
- **The pricing snapshot stops rebuilding its route list every time** — listing the models in use walks every usage row (65k here); the result is cached per data/pricing revision now and only rebuilt when either changes (modelled: 3.4 ms per call to about 0 ms when cached).
|
|
64
|
+
- **Superseded scope results no longer linger** — the cache key carries the revision, so an old entry could never be read again while still holding 30-115 KB apiece (up to 20); a data or pricing change clears them now.
|
|
65
|
+
- **The first-paint snapshot carries one timezone calendar** — the panel asks for its own copy (local or UTC) instead of both, which used to split the payload in half; per-range session counts still come from /query, so the numbers are unchanged.
|
|
66
|
+
- **Per-day session ids ride along only for recent history** — a day older than 180 days keeps its counts and aggregates but no longer drags every session id ever recorded (opening an old day's log already fetches it on demand).
|
|
67
|
+
- **The old storage files no longer stay on disk** — after the ledger moved to one document per record, each legacy whole-unit file (32 shards plus a leftover monolith, about 178 MB here) has been seeded into the new tree; the ledger now removes those files once the tree provably holds records, leaves a one-time marker, and retries on the next start if anything fails.
|
|
68
|
+
- **Ledger rows share one identity table per session** — a route (provider / model) used to repeat its identity object on every usage item; rows now carry an index into one shared list. Measured: 1059 records drop from **91.3 to 74.7 MB (−18.2%)**.
|
|
69
|
+
- **The ledger write-amplification fix is ready (benchmarked on an isolated real-ledger copy; online write latency was not measured)** — one file per session record replaces rewriting a whole shard on every update: measured **273 ms to a 4.6 ms median** (74 ms for the largest session), the shard directory drops from **13.27 to 11.88 MB**, and a cold start on the same real data falls from **8-9 s to 3.0 s** (5.5 s for the first one, which migrates).
|
|
70
|
+
- **The client bundle is about 7.6% smaller** — brand marks are now served by the host on demand (GET /api/all-usage/icon?key=, so a new brand no longer grows the bundle), and a batch of client helpers nobody calls plus orphaned style rules no markup can render is gone; `lib/client.js` drops from the 257,854 B of v1.1.18 to **238,143 B (about 7.6%)**.
|
|
71
|
+
- **Unrelated state no longer redraws the charts** — the trend chart and the 376-cell heatmap take stable props now and icon geometry lives at module level; measured: the page DOM drops from **6266 to 1719 nodes**.
|
|
72
|
+
- **Brand icon rules need less care** — the icon list is derived from the manifest and the directory, so a new brand needs no hand-edited list; a model without a bundled brand shows the plugin's own stacked-layers mark (never an empty dot), which implies no brand.
|
|
73
|
+
### Fixes
|
|
74
|
+
- **Fixed calls labelled peak that actually ran off-peak** — DSH can emit `request/context` once per session, and the plugin billed every later call at that session-level instant: a 20:02 call was priced in the 14:10 peak window, so both the peak rate and the badge were wrong (16k of this machine's 66k rows were affected). A session-level stamp now only counts within 30 minutes (past that the call's own time is used), and the reconciliation pass re-prices stored rows whose stamp is more than 30 minutes older than the call and which have no turn/step stamp of their own. Per-request stamps keep their meaning.
|
|
75
|
+
- **Routes of one model share a single filter entry** — grouped by model name (case ignored, vendor namespace dropped), matched the same way on the host.
|
|
76
|
+
- **The model filter no longer shows the vendor namespace** — the model name only, while the value stays the raw id (0 of 25 entries still contain a slash).
|
|
77
|
+
- **The provider and model menus no longer run past the window** — capped at min(60vh, 420px) with their own scroll, and they open on the current selection (scrolled into view).
|
|
78
|
+
|
|
79
|
+
## v1.1.18 (2026-10-07)
|
|
80
|
+
### 新功能
|
|
81
|
+
- **「近 7 天」范围** —— 含今天的 7 个日历日,作用于摘要 / 趋势 / 模型表 / 日志 / 筛选 / CSV。
|
|
82
|
+
- **热力图跨度可切换** —— 30 天 / 90 天 / 12 个月 = 5 / 13 / 53 列,格子随之变大(实测 34px vs 18px);默认仍 12 个月,与时间范围互不影响。
|
|
83
|
+
- **标题旁版本指示** —— 显示运行版本;一致时小字「已是最新」,落后时高亮「最新 vX.Y.Z」,点击开 GitHub 仓库。
|
|
84
|
+
|
|
85
|
+
### Features
|
|
86
|
+
- **A seven-day range** — seven calendar days including today; scopes the summary, trend, model tables, request log, filters and CSV.
|
|
87
|
+
- **A switchable heatmap span** — 30 days / 90 days / 12 months draw 5 / 13 / 53 columns, so shorter spans get larger cells (34px vs 18px measured); twelve months stays the default and the span is independent of the time range.
|
|
88
|
+
- **A version indicator in the header** — the running version, plus “Up to date” in small text or a highlighted “Latest vX.Y.Z”; clicking it opens the GitHub repository.
|
|
89
|
+
|
|
90
|
+
## v1.1.17 (2026-10-01)
|
|
91
|
+
### 修复
|
|
92
|
+
- **桌面端又能保存了** —— 写接口原要求 `Origin` 与 loopback 同源,而 Electron 转发时会删掉它;改为以进程令牌授权,`Origin` 存在时仍校验,`Host` 仍限 loopback。
|
|
93
|
+
- **缺 `usageBacked` 不再误判** —— 旧宿主不发该字段,面板不再渲染成「账本无用量」,改为「用量未知」三态。
|
|
94
|
+
- **令牌轮换自愈** —— 状态轮询带派生 `capabilityId`;写入遇 403 自动重取令牌并重试一次,文案改为「进程令牌已失效」。
|
|
95
|
+
### 新功能
|
|
96
|
+
- `/api/all-usage/status` 增加 `pluginVersion` 与 `capabilityId`,宿主与页面版本不一致时面板会提示重启。
|
|
97
|
+
|
|
98
|
+
### Fixes
|
|
99
|
+
- **The desktop client can save again** — writes required an `Origin` matching the loopback host, which Electron strips when forwarding; they are now authorized by the process capability, a present `Origin` is still validated and `Host` stays loopback-only.
|
|
100
|
+
- **A missing `usageBacked` is no longer a verdict** — an older host omits the field and the panel rendered it as “no ledger usage”; it now degrades to a distinct “usage unknown” state.
|
|
101
|
+
- **A rotated capability heals itself** — the status poll carries a derived `capabilityId`; a write rejected with 403 re-reads the capability and retries once, and the message names a stale capability.
|
|
102
|
+
### Features
|
|
103
|
+
- `/api/all-usage/status` reports `pluginVersion` and `capabilityId`, so a host/page version mismatch can say “restart DSH” instead of staying invisible.
|
|
104
|
+
|
|
105
|
+
## v1.1.16 (2026-09-29)
|
|
106
|
+
### 新功能
|
|
107
|
+
- **支持 DSH 0.2.0-rc.2** —— 真机 Cordis smoke 全过;区间加 `>=0.2.0-rc.2 <0.2.1-0`,已验证增至 6 个运行时,CI 12 个作业。
|
|
108
|
+
|
|
109
|
+
### Features
|
|
110
|
+
- **DSH 0.2.0-rc.2 is supported** — the real Cordis smoke passes; the declared range gains `>=0.2.0-rc.2 <0.2.1-0`, the verified list grows to six runtimes and CI to twelve jobs.
|
|
111
|
+
|
|
112
|
+
## v1.1.15 (2026-09-28)
|
|
113
|
+
### 新功能
|
|
114
|
+
- **中国法定节假日全天谷价** —— 峰谷计划可带显式节假日日期(支持区间写法与一键抓取当年安排);内置 DeepSeek 表自带 2026 年 33 天官方安排,官方直连与已映射行零配置生效,快照记录 `pricingHoliday`。
|
|
115
|
+
### 优化
|
|
116
|
+
- **成本设置合并成一张可编辑价格表** —— 映射列 + 四个价格框 + 上下文档位 / UTC 峰谷编辑器;仅存在于配置的行仍可见、可改、可删。
|
|
117
|
+
- **峰谷计划可按模型编辑** —— 接口返回去重的 `temporalSchedules` 与每行来源标记;改计划按文档口径对账历史,改价格永不改写历史。
|
|
118
|
+
|
|
119
|
+
### Features
|
|
120
|
+
- **Chinese statutory holidays price as a full off-peak day** — a peak plan can carry explicit holiday dates (ranges and a one-click fetch of the year's arrangement); the built-in DeepSeek plan ships the 2026 33-day arrangement, so first-party and mapped rows need no configuration, and snapshots record `pricingHoliday`.
|
|
121
|
+
### Improvements
|
|
122
|
+
- **Cost Settings is one editable price table** — a mapping column, four price boxes and context-band / UTC peak editors; rows that exist only in the configuration stay visible, editable and removable.
|
|
123
|
+
- **Peak plans are editable per model** — the payload carries deduplicated `temporalSchedules` plus per-row provenance; changing a plan reconciles that model's history, while price edits never rewrite history.
|
|
124
|
+
|
|
125
|
+
## v1.1.14 (2026-09-27)
|
|
126
|
+
### 修复
|
|
127
|
+
- **`deepseek-flash` 补进内置峰谷表** —— 峰值时段成本此前被少算约 57%;已带豁免结论落盘的记录一次性迁移。报告者 @baileyh8(#2)。
|
|
128
|
+
|
|
129
|
+
### Fixes
|
|
130
|
+
- **`deepseek-flash` joins the built-in peak table** — peak-hour cost had been under-reported by roughly 57%; records stored with the exempt verdict are migrated once. Reported by @baileyh8 (#2).
|
|
131
|
+
|
|
132
|
+
## v1.1.13 (2026-09-25)
|
|
133
|
+
### 新功能
|
|
134
|
+
- **支持 DSH 0.1.7-rc.2** —— 真机 smoke 全过,进入声明区间与 CI 矩阵(桌面客户端即该运行时线)。
|
|
135
|
+
### 优化
|
|
136
|
+
- smoke 对 0.1.7 的抽象 settings seam 版本感知;`0.1.5-rc.2` 纳入 CI;`check-package` 会拦下「声明已验证却不在 CI 矩阵 / 档位表」的情况。
|
|
137
|
+
|
|
138
|
+
### Features
|
|
139
|
+
- **DSH 0.1.7-rc.2 is supported** — the real smoke passes, and the line joins the declared range and the CI matrix (the desktop client runs on it).
|
|
140
|
+
### Improvements
|
|
141
|
+
- The smoke is aware of 0.1.7's abstract settings seam; `0.1.5-rc.2` joins CI; and `check-package` now fails when a runtime is called verified without appearing in the CI matrix and the profile table.
|
|
142
|
+
|
|
143
|
+
## v1.1.12 (2026-09-25)
|
|
144
|
+
### 修复
|
|
145
|
+
- **runtime smoke 不再手数路由** —— 此前断言 dispose 恰好移除 9 条,v1.1.11 加路由后所有 smoke 作业失败并连带发布失败;期望值改由路由清单推导。
|
|
146
|
+
### 说明
|
|
147
|
+
- v1.1.11 只发了 GitHub Release,**未进 npm**(发布工作流校验 tag,已发布的 tag 不移动),其修复随本版到达 npm。
|
|
148
|
+
|
|
149
|
+
### Fixes
|
|
150
|
+
- **The runtime smoke no longer counts routes by hand** — it asserted that dispose removed exactly nine, so v1.1.11's new route failed every smoke job and its own publication; the expectation is now derived from the route list.
|
|
151
|
+
### Notes
|
|
152
|
+
- v1.1.11 reached GitHub Releases but **never npm** (the publish workflow verifies the tag and a published tag is never moved); its fix reaches npm users with this release.
|
|
153
|
+
|
|
154
|
+
## v1.1.11 (2026-09-25)
|
|
155
|
+
### 修复
|
|
156
|
+
- **桌面端关闭按钮不再被盖** —— 面板改为从 `--dsh-windows-titlebar-height`(40px)之下开始。
|
|
157
|
+
- **预留标题条其实从未生效** —— 未设置的 localStorage 键被读成 `0` 并通过了 `>= 0` 判断,宿主标记 / Overlay / UA 兜底全是死代码。
|
|
158
|
+
### 优化
|
|
159
|
+
- 预留高度来源顺序改为宿主声明 → Overlay 矩形 → UA,localStorage 仍可覆盖。
|
|
160
|
+
- 新增 `GET /api/all-usage/client-env`(并以 `clientEnv` 出现在 status),正是它从桌面应用之外暴露了上面的 bug。
|
|
161
|
+
|
|
162
|
+
### Fixes
|
|
163
|
+
- **The desktop client's close button is no longer covered** — the sheet now starts below `--dsh-windows-titlebar-height` (40px on Windows).
|
|
164
|
+
- **The reserved strip never actually applied** — an unset localStorage key read as `0`, passed the `>= 0` check and returned early, leaving the host marker, the overlay geometry and the user-agent fallback as dead code.
|
|
165
|
+
### Improvements
|
|
166
|
+
- The reserved height now comes from the host declaration, then the overlay rectangle, then the user agent, with localStorage still overriding everything.
|
|
167
|
+
- A new `GET /api/all-usage/client-env` route (surfaced as `clientEnv`) is what exposed that bug from outside the desktop app.
|
|
168
|
+
|
|
169
|
+
## v1.1.10 (2026-09-14)
|
|
170
|
+
### 修复
|
|
171
|
+
- **账本快路径回归** —— 0.1.5 把 `listSnapshots()` 改名 `list()`,修订号拿不到导致每次基线重读全部日志(479 会话 / 431 次读取 / 约 13 分钟);两种拼写都接受后恢复跳过。
|
|
172
|
+
- **基线期间的工作区变更不再丢** —— 扫描结束后立刻重放。
|
|
173
|
+
### 优化
|
|
174
|
+
- 工作区注册表每 30 秒额外轮询一次;status 暴露探针计数(累计,不被基线重置)。
|
|
175
|
+
### 说明
|
|
176
|
+
- 升级后首次启动仍会读一遍全部日志(旧账本没有 `lastRevision`),从下一次启动起才免读。
|
|
177
|
+
|
|
178
|
+
### Fixes
|
|
179
|
+
- **The ledger fast path is back** — DSH 0.1.5 renamed `listSnapshots()` to `list()`, so no revision was available and every baseline re-read every log (479 sessions, 431 reads, about 13 minutes); both spellings are accepted again and unchanged sessions are skipped.
|
|
180
|
+
- **A registry change during a baseline is no longer dropped** — it is remembered and replayed as soon as the scan settles.
|
|
181
|
+
### Improvements
|
|
182
|
+
- The workspace registry is polled every 30 seconds as well, and status exposes the probe counters (cumulative, never reset by a baseline).
|
|
183
|
+
### Notes
|
|
184
|
+
- The first start after upgrading still reads every log once (older records carry no `lastRevision`); re-read avoidance starts from the next start.
|
|
185
|
+
|
|
186
|
+
## v1.1.9 (2026-09-12)
|
|
187
|
+
### 修复
|
|
188
|
+
- **删除工作区不再抹掉历史** —— 探针丢弃其账本行、恢复又跳过 `sourceCwd` 失效的行,两者叠加销毁了已记录的历史。
|
|
189
|
+
### 优化
|
|
190
|
+
- 被移除工作区的用量汇总成一行「已删除」;`retargetSession()` 就地改键,未落账的实时用量也保留。
|
|
191
|
+
- 账本行保留原 workspace id 与 cwd(改键只在内存副本);严格注册边界不变,旧 `unregistered:` 行不复活。
|
|
192
|
+
|
|
193
|
+
### Fixes
|
|
194
|
+
- **Deleting a workspace no longer erases its history** — the probe dropped its ledger rows while recovery skipped rows whose `sourceCwd` no longer mapped, and together they destroyed recorded history.
|
|
195
|
+
### Improvements
|
|
196
|
+
- Usage from removed workspaces is summed into a single **Deleted** row, and `retargetSession()` re-keys live aggregates in place so usage that had not reached the ledger survives too.
|
|
197
|
+
- Ledger rows keep their original workspace id and cwd (re-keying happens on the in-memory copy only), the strict registration boundary is unchanged and legacy `unregistered:` rows are never resurrected.
|
|
198
|
+
|
|
199
|
+
## v1.1.8 (2026-09-11)
|
|
200
|
+
### 修复
|
|
201
|
+
- README 仍引用 0.1.5 之前的兼容声明与停在 0.1.1 的验证矩阵,与 v1.1.6 / v1.1.7 之后的 `package.json` 矛盾;中英已改齐。
|
|
202
|
+
### 优化
|
|
203
|
+
- CI smoke 覆盖 `0.1.5-rc.1`,并按运行时版本选择 cordis / loader / timer 线。
|
|
204
|
+
|
|
205
|
+
### Fixes
|
|
206
|
+
- The README still quoted the pre-0.1.5 compatibility declaration and a matrix that stopped at 0.1.1, contradicting `package.json` after v1.1.6/v1.1.7; both languages now agree.
|
|
207
|
+
### Improvements
|
|
208
|
+
- CI smoke covers `0.1.5-rc.1` and selects the cordis/loader/timer line per runtime version.
|
|
209
|
+
|
|
210
|
+
## v1.1.7 (2026-09-11)
|
|
211
|
+
### 修复
|
|
212
|
+
- 兼容区间改为按元组带预发布分支 —— node-semver 只放行「同 `major.minor.patch` 且自带预发布标签」的比较符,旧的宽区间把目标运行时 `0.1.5-rc.1` 静默判为不支持。
|
|
213
|
+
|
|
214
|
+
### Fixes
|
|
215
|
+
- The compatibility range now carries an explicit prerelease branch per tuple: node-semver only admits a prerelease when a comparator shares its `major.minor.patch` and carries a prerelease tag, so the previous broad range silently rejected the target runtime `0.1.5-rc.1`.
|
|
216
|
+
|
|
217
|
+
## v1.1.6 (2026-09-11)
|
|
218
|
+
### 修复
|
|
219
|
+
- **DSH 0.1.5 兼容** —— 该版本用 `snapshotEvents()` 取代 `events`,实时 flush 会写空账本记录(`lastSeq: -1`);现在优先 `events`、否则退回 `snapshotEvents()`。
|
|
220
|
+
- smoke 断言账本保留被 flush 会话的序号与用量,并覆盖 0.1.5-rc.1。
|
|
221
|
+
### 优化
|
|
222
|
+
- 兼容区间放宽到 `>=0.1.1-rc.1 <0.1.6`,`0.1.5-rc.1` 进入已验证列表。
|
|
223
|
+
|
|
224
|
+
### Fixes
|
|
225
|
+
- **DSH 0.1.5 compatibility** — it replaces `events` with `snapshotEvents()`, so live flushes wrote empty ledger records (`lastSeq: -1`); event access now prefers `events` and falls back to `snapshotEvents()`.
|
|
226
|
+
- The smoke asserts the persisted ledger keeps a flushed session's sequence and usage, and covers 0.1.5-rc.1.
|
|
227
|
+
### Improvements
|
|
228
|
+
- The declared range widens to `>=0.1.1-rc.1 <0.1.6` and `0.1.5-rc.1` joins the verified list.
|
|
229
|
+
|
|
230
|
+
## v1.1.5 (2026-09-07)
|
|
231
|
+
### 新功能
|
|
232
|
+
- **工作区注册表自动探针** —— 监听 `domain/changed`,增量同步(只扫新增、逆折叠移除、未变化零重扫);手动刷新控件 / 路由 / 按钮一并移除。
|
|
233
|
+
### 修复
|
|
234
|
+
- 用量严格限定于已注册工作区;`sourceCwd` 失效的账本行恢复时跳过,并按源路径校验归属。
|
|
235
|
+
|
|
236
|
+
### Features
|
|
237
|
+
- **An automatic workspace-registry probe** — it follows `domain/changed` and syncs incrementally (only new workspaces are scanned, removals are subtracted by inverse folding, unchanged ones are reused); the manual refresh control, route and button are gone.
|
|
238
|
+
### Fixes
|
|
239
|
+
- Usage is strictly limited to registered workspaces; ledger rows whose `sourceCwd` no longer maps are skipped during recovery, and the source path is persisted so ownership can be validated.
|
|
240
|
+
|
|
241
|
+
## v1.1.4 (2026-09-03)
|
|
242
|
+
### 新功能
|
|
243
|
+
- **DeepSeek 峰谷计费成为一等、带版本的「分时价格计划」** —— cost schema v2,快照记录计费时刻、时间来源、UTC 档位与策略 id / 哈希。
|
|
244
|
+
- **内置一线档位表** —— v4-flash / v4-flash-vision-exp / v4-pro,按 UTC 工作日 01:00-04:00 与 06:00-10:00;峰值费率是数据,不是自动折扣。
|
|
245
|
+
- **半开边界且只看 UTC** —— 周末全天谷时,观众时区与夏令时都影响不了结果。
|
|
246
|
+
- **确定性复用** —— 同一 turn/step 的后续样本仅在 identity / 桶 / 档位 / 策略全等时复用,跨峰值边界不继承价格。
|
|
247
|
+
- **受控对账** —— 一线快照按用量时刻重定价,v1 快照迁移到 v2,窗口不覆盖则 fail closed 为 `unsupported`。
|
|
248
|
+
- **路由安全边界** —— 只对一线 deepseek 或显式映射到官方条目的路由生效;中转路由保持静态价并标 `route-not-official`。
|
|
249
|
+
- **尊重官方生效时刻** —— 从 2026-08-16T16:00:00Z 起算(vision-exp 为 08-21),更早的用量 fail closed。
|
|
250
|
+
- **真实厂商品牌图标** —— 请求日志 / 调用详情 / 模型表 / 成本设置表改用 11 个品牌 SVG(构建期内嵌 data URI,运行时不联网)。
|
|
251
|
+
- **图标来源随包发布** —— manifest 钉住上游 commit 与逐文件归属,缺许可或归属即构建失败。
|
|
252
|
+
### 优化
|
|
253
|
+
- 请求上下文归档持久化并参与增量播种;真 LRU + 512 条上限;整折时清理陈旧上下文。
|
|
254
|
+
- 已定价的 v2 快照跨目录刷新仍可审计:policy hash 不含实时费率,只有显式 `repriceTemporal` 才重估。
|
|
255
|
+
- 策略归档支持有序窗口并拒绝跨规则重叠;非法时段配置保持可见并 fail closed。
|
|
256
|
+
- 实时重同步原子化(权威快照重建并持久化账本,失败保留 dirty 状态);权威性改为基于证明,滞后快照只 upsert。
|
|
257
|
+
- 构建期 SVG 守卫(`scripts/svg-guard.mjs`)拒绝外部 `url()` / `image-set()` / `@import`、DOCTYPE / CDATA / 处理指令与外部资源元素。
|
|
258
|
+
### 修复
|
|
259
|
+
- 审计后加固:CDO/CDC 相邻 `@import`、命名空间 `<svg:style>` 内的 `@import`、CSS 转义 `url(`、外部 `image-set()` 全部拒绝;style 属性在原始与实体解码两份文档上检查。
|
|
260
|
+
- CSS 检查只在 style 属性与 `<style>` 体内运行(注释与文本不误报);对抗样本断言的是拒绝原因。
|
|
261
|
+
- 模型筛选下拉也显示品牌图标,三张看板截图刷新。
|
|
262
|
+
|
|
263
|
+
### Features
|
|
264
|
+
- **DeepSeek peak/off-peak billing became a first-class, versioned temporal plan** — cost schema v2 records the billing instant, its time source, the UTC band and the policy id/hash in every snapshot.
|
|
265
|
+
- **A built-in first-party rate table** — v4-flash / v4-flash-vision-exp / v4-pro for the UTC weekday windows 01:00-04:00 and 06:00-10:00; peak rates are data, never an automatic discount.
|
|
266
|
+
- **Half-open boundaries, UTC only** — weekends are off-peak all day and neither the viewer's timezone nor DST can change a result.
|
|
267
|
+
- **Deterministic reuse** — a later sample for the same turn/step reuses a snapshot only when identity, buckets, band and policy all match, so a message crossing a peak boundary never inherits the price.
|
|
268
|
+
- **Controlled reconciliation** — first-party snapshots are re-priced against their usage instant, v1 snapshots migrate to v2, and an uncovered instant fails closed as `unsupported`.
|
|
269
|
+
- **Route safety boundary** — the plan applies only to first-party deepseek routes or routes explicitly mapped to the official entry; reseller routes keep the static price and are labelled `route-not-official`.
|
|
270
|
+
- **The official effective instant is respected** — the plan starts at 2026-08-16T16:00:00Z (08-21 for vision-exp) and earlier usage fails closed.
|
|
271
|
+
- **Real vendor brand icons** — the request log, call details, model table and cost-settings table use eleven brand SVGs (embedded as data URIs at build time; the runtime never touches the network).
|
|
272
|
+
- **Icon provenance ships with the package** — the manifest pins the upstream commit and per-file attribution, and the build fails without the licence or attribution.
|
|
273
|
+
### Improvements
|
|
274
|
+
- The request-context archive is persisted and seeds incremental folds; a real LRU with a 512-entry cap; full folds clear stale contexts.
|
|
275
|
+
- Priced v2 snapshots stay auditable across catalog refreshes: the policy hash excludes live rates and only an explicit `repriceTemporal` re-estimates them.
|
|
276
|
+
- Policy archives support ordered, non-overlapping windows and reject cross-rule overlap; an invalid temporal config stays visible and fails closed.
|
|
277
|
+
- Live resyncs are atomic (an authoritative snapshot rebuilds and persists the ledger record, failures stay dirty) and authority is proof-based: lagging snapshots only upsert.
|
|
278
|
+
- A build-time SVG guard (`scripts/svg-guard.mjs`) rejects external `url()` / `image-set()` / `@import`, DOCTYPE / CDATA / processing instructions and every external-resource element.
|
|
279
|
+
### Fixes
|
|
280
|
+
- Hardened after an independent audit: CDO/CDC-adjacent `@import`, `@import` inside a namespaced `<svg:style>`, CSS-escaped `url(` and external `image-set()` targets are all rejected, and style attributes are checked on both the raw and entity-decoded document.
|
|
281
|
+
- CSS checks run only on style attributes and `<style>` bodies (comments and text cannot false-positive), and the adversarial fixtures assert the rejection reason.
|
|
282
|
+
- The model filter dropdown shows brand icons too, and the three dashboard screenshots were refreshed.
|
|
283
|
+
|
|
284
|
+
## v1.1.3 (2026-09-01)
|
|
285
|
+
### 新功能
|
|
286
|
+
- 成本统计支持上下文档位,可展开官方费率表。
|
|
287
|
+
- 确定性用量不变量 + 脱敏 fixture 回放命令。
|
|
288
|
+
- Node 22/24 CI 矩阵(含包内容检查与 0.1.1-rc.1 / rc.2 真机 smoke)。
|
|
289
|
+
- 三份社区 issue 模板(数据不一致 / 启动失败 / 成本计算)。
|
|
290
|
+
### 优化
|
|
291
|
+
- flush 不再重建干净会话的账本(脏记录合并,退出时 drain)。
|
|
292
|
+
- 派生账本分 32 个稳定哈希分片,只重写受影响的分片。
|
|
293
|
+
- scope query 与 53 周热力图改用 ingest 期 cube + BigInt 精确累加。
|
|
294
|
+
- 热力图指针跟踪与渲染路径隔离(memo + rAF 合并,后台标签节流兜底)。
|
|
295
|
+
- 客户端产物 276 KB → 177 KB(固定版本 Terser)。
|
|
296
|
+
### 修复
|
|
297
|
+
- **账本序号契约贯穿所有读写路径** —— 只接受 `-1` 哨兵或非负安全整数;污染键与非规范数字一律标记重建并持久化原因。
|
|
298
|
+
- **折叠存疑时全量重建** —— 序号不连续、折叠起点之前有非法序号、尾部未前进,都不再尾部折叠。
|
|
299
|
+
- **定价与刷新时序** —— 读写前等待持久化配置;定价 revision 变化优先;只在影响成本时提升 revision;目录哈希排除 `fetchedAt`。
|
|
300
|
+
- **在飞的官方模型搜索彻底失效化** —— 删行、关面板、目录替换都会提升行代际。
|
|
301
|
+
- **服务端 auto-sync 标志是唯一真相** —— 客户端不再用本地状态播种草稿。
|
|
302
|
+
- **时区与时间桶** —— 半小时偏移不丢事件;趋势标签用真实桶边界;DST 回拨的重复小时分别成桶。
|
|
303
|
+
- **工作区身份** —— 以不同 id 重建时强制全量重建;顶层与历史条目不一致的行标为不可用。
|
|
304
|
+
- **HTTP 与激活边界** —— peer 必须是 loopback(含 IPv4-mapped);激活前必须有 `webServer`。
|
|
305
|
+
- **发布与构建守卫** —— 拒绝缺失或未跟踪的生成 bundle;手动 npm 恢复必须校验 tag 与完整 SHA。
|
|
306
|
+
### 文档
|
|
307
|
+
- 记录兼容矩阵、本地可复算与供应商账单的区别、缓存 / Token 示例与 fixture 工作流。
|
|
308
|
+
|
|
309
|
+
### Features
|
|
310
|
+
- Cost statistics became tier-aware with expandable official rate schedules.
|
|
311
|
+
- Deterministic usage invariants plus a redacted fixture replay command.
|
|
312
|
+
- A Node 22/24 CI matrix with package-content checks and required real DSH smoke coverage for 0.1.1-rc.1 and rc.2.
|
|
313
|
+
- Three community issue templates (data inconsistency, startup failure, cost calculation).
|
|
314
|
+
### Improvements
|
|
315
|
+
- A clean session's ledger is no longer rebuilt at flush: dirty records are coalesced and drained on disposal.
|
|
316
|
+
- The ledger is stored in 32 stable-hash shards, so an update rewrites only its own shard.
|
|
317
|
+
- Scoped queries and the heatmap build from ingest-time cubes with exact BigInt accumulators.
|
|
318
|
+
- Heatmap pointer tracking is isolated from the render path (memoized parts, rAF-coalesced coordinates, a throttled fallback for background tabs).
|
|
319
|
+
- The shipped client artifact dropped from about 276 KB to about 177 KB with pinned Terser.
|
|
320
|
+
### Fixes
|
|
321
|
+
- **The ledger sequence contract covers every read and write path** — only the `-1` sentinel or a non-negative safe integer is accepted; polluted keys and non-canonical numbers are flagged for rebuild with the reason persisted.
|
|
322
|
+
- **Any doubt about folding triggers a full rebuild** — broken sequence continuity, an invalid sequence before the fold start, or a tail that did not advance no longer tail-folds.
|
|
323
|
+
- **Pricing and refresh ordering** — reads and writes wait for the persisted configuration, a pricing revision change wins over concurrent data, revisions only bump for cost-affecting changes, and the catalog hash excludes `fetchedAt`.
|
|
324
|
+
- **In-flight official-model searches are invalidated for good** — deleting a row, closing the panel and replacing the catalog all bump the row generation.
|
|
325
|
+
- **The server-persisted auto-sync flag is the single truth** — the client no longer seeds the draft from local state.
|
|
326
|
+
- **Timezones and buckets** — fractional-hour offsets no longer drop events, trend labels use real bucket boundaries, and both repeated hours of a DST fall-back day stay distinct.
|
|
327
|
+
- **Workspace identity** — a workspace recreated with a different id forces a full rebuild, and rows whose top-level workspace disagrees with their items are marked unusable.
|
|
328
|
+
- **HTTP and activation boundaries** — the socket peer must be loopback (IPv4-mapped included) and `webServer` must exist before the Host activates.
|
|
329
|
+
- **Release and build guards** — a missing or untracked generated bundle is rejected, and manual npm recovery must verify the tag and full commit SHA.
|
|
252
330
|
### Documentation
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
262
|
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
-
|
|
270
|
-
-
|
|
271
|
-
-
|
|
272
|
-
|
|
273
|
-
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
###
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
289
|
-
-
|
|
290
|
-
-
|
|
291
|
-
-
|
|
292
|
-
-
|
|
293
|
-
|
|
294
|
-
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
-
|
|
300
|
-
-
|
|
301
|
-
-
|
|
302
|
-
-
|
|
303
|
-
-
|
|
304
|
-
-
|
|
305
|
-
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
###
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
-
|
|
335
|
-
|
|
336
|
-
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
-
|
|
341
|
-
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
###
|
|
346
|
-
|
|
347
|
-
-
|
|
348
|
-
|
|
349
|
-
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
-
|
|
354
|
-
|
|
355
|
-
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
[1.1.5]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.1.5
|
|
380
|
-
[1.1.4]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.1.4
|
|
381
|
-
[1.1.3]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.1.3
|
|
382
|
-
[1.1.2]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.1.2
|
|
383
|
-
[1.1.0]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.1.0
|
|
384
|
-
[1.0.9]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.0.9
|
|
385
|
-
[1.0.8]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.0.8
|
|
386
|
-
[1.0.7]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.0.7
|
|
387
|
-
[1.0.6]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.0.6
|
|
388
|
-
[1.0.5]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.0.5
|
|
389
|
-
[1.0.4]: https://github.com/ParticleLight/dsh-all-usage/releases/tag/v1.0.4
|
|
331
|
+
- Documented the compatibility matrix, the difference between local replayable statistics and provider billing, cache/token examples and the fixture workflow.
|
|
332
|
+
|
|
333
|
+
## v1.1.2 (2026-08-30)
|
|
334
|
+
### 新功能
|
|
335
|
+
- models.dev 价格目录同步(持久缓存、可选 6 小时自动同步、模型映射与手工覆盖)。
|
|
336
|
+
- cc-switch 兼容的四桶成本快照(倍率只作用于总额)。
|
|
337
|
+
- 账本 v3 成本快照、未计价计数、导出成本列与成本设置面板。
|
|
338
|
+
- 可搜索的当前模型选择器与自动官方模型查找。
|
|
339
|
+
- 环形图的 Token / 成本明细;按日期索引的查询与 revision 作用域缓存。
|
|
340
|
+
### 修复
|
|
341
|
+
- 不再把推理 Token 收两次费;已定价历史在目录更新后保持稳定。
|
|
342
|
+
- 已保存映射不再显示空模型字段;会话引导或读取失败不丢首批实时事件;拒绝超大请求体与非法时间戳。
|
|
343
|
+
|
|
344
|
+
### Features
|
|
345
|
+
- models.dev catalog sync with a persisted last-good cache, optional 6-hour auto sync, mappings and manual overrides.
|
|
346
|
+
- cc-switch-compatible four-bucket cost snapshots, with multipliers applied to the total only.
|
|
347
|
+
- Ledger v3 cost snapshots, unpriced counters, cost columns in exports and the cost-settings panel.
|
|
348
|
+
- Searchable current-model selectors and automatic official-model lookup.
|
|
349
|
+
- Token/cost details in the donut legends, date-indexed queries and revision-scoped caches.
|
|
350
|
+
### Fixes
|
|
351
|
+
- Reasoning tokens are no longer charged twice, and priced history stays stable across catalog updates.
|
|
352
|
+
- Saved mappings no longer reopen with an empty model field, first live events survive bootstrap or read failures, and oversized bodies and invalid timestamps are rejected.
|
|
353
|
+
|
|
354
|
+
## v1.1.1 (2026-08-29)
|
|
355
|
+
### 修复
|
|
356
|
+
- 为兼容注册表,以新的修订号重发 v1.1 包。
|
|
357
|
+
|
|
358
|
+
### Fixes
|
|
359
|
+
- The v1.1 package was reissued under a new patch version for registry compatibility.
|
|
360
|
+
|
|
361
|
+
## v1.1.0 (2026-08-29)
|
|
362
|
+
### 新功能
|
|
363
|
+
- 结构化 Provider / requested / actual / display 身份字段(保留旧 `model`)。
|
|
364
|
+
- 向后兼容的账本 v2 适配器。
|
|
365
|
+
- 共享 scope 查询与隐私安全分页接口(`/query`、`/records`),单日 scope 增加小时行。
|
|
366
|
+
- 三个筛选维度互相独立可组合,选项只列当前范围内实际用过的值。
|
|
367
|
+
- 统一筛选贯穿聚合、热力图、趋势与导出。
|
|
368
|
+
- 可选 Token 趋势图(平滑曲线、可切序列、单日用小时桶)。
|
|
369
|
+
- Token 占比环形图(排名图例与悬停明细)。
|
|
370
|
+
- 常驻请求日志标签页(分页表、选中明细、CSV 导出)。
|
|
371
|
+
### 优化
|
|
372
|
+
- records 分页改 revision 排序 + 预计算;聚合加 memo 并只渲染活动标签页。
|
|
373
|
+
### 修复
|
|
374
|
+
- 修复显示标签含 ` / ` 的身份碰撞;检测被截断或替换的日志;三类计数分开定义;趋势与 tooltip 的一系列渲染修复。
|
|
375
|
+
|
|
376
|
+
### Features
|
|
377
|
+
- Structured Provider / requested / actual / display identity fields, keeping the legacy `model`.
|
|
378
|
+
- A backward-compatible ledger v2 adapter.
|
|
379
|
+
- Shared scoped query and privacy-safe paged APIs (`/query`, `/records`), with hourly rows for single-day scopes.
|
|
380
|
+
- Workspace, provider and model filters are independent and combinable, and options list only values used in the selected range.
|
|
381
|
+
- Unified filtering spans aggregates, the heatmap, trends and exports.
|
|
382
|
+
- A selectable Token trend chart (smooth curves, switchable series, hourly buckets for single days).
|
|
383
|
+
- Token-share donut charts with ranked legends and hover details.
|
|
384
|
+
- A persistent Request Logs tab (paged table, selected-row detail, CSV export).
|
|
385
|
+
### Improvements
|
|
386
|
+
- Records pagination uses revision ordering and precomputed values; aggregates are memoized and only the active tab renders.
|
|
387
|
+
### Fixes
|
|
388
|
+
- Fixed identity collisions from display labels containing ` / `, detected truncated or replaced logs, kept the three counters separately defined, and fixed a series of trend/tooltip rendering issues.
|
|
389
|
+
|
|
390
|
+
## v1.0.9 (2026-08-26)
|
|
391
|
+
### 新功能
|
|
392
|
+
- 轻量 `/api/all-usage/status` 契约(实例 ID、单调 revision、扫描进度、同步健康)。
|
|
393
|
+
- 同步健康可见性(跳过 / 读取 / 账本恢复 / 失败 / 快照可用性)。
|
|
394
|
+
- revision 驱动的客户端刷新(只在实例或 revision 变化时取全量)。
|
|
395
|
+
### 修复
|
|
396
|
+
- 失败时保留上一次视图,提供重试与有界退避。
|
|
397
|
+
|
|
398
|
+
### Features
|
|
399
|
+
- A lightweight `/api/all-usage/status` contract (instance id, monotonic revision, scan progress, sync health).
|
|
400
|
+
- Sync-health visibility (skipped, read, ledger-recovered, failed, snapshot availability).
|
|
401
|
+
- Revision-driven client refresh: the full snapshot is fetched only when the instance or revision changes.
|
|
402
|
+
### Fixes
|
|
403
|
+
- The last successful view survives failures, with a retry action and bounded backoff.
|
|
404
|
+
|
|
405
|
+
## v1.0.8 (2026-08-24)
|
|
406
|
+
### 新功能
|
|
407
|
+
- **重启免读游标** —— 用持久化日志修订号作为变更信号,未变更会话直接从账本应用。
|
|
408
|
+
### 修复
|
|
409
|
+
- 重启不再重读每个会话的历史。
|
|
410
|
+
|
|
411
|
+
### Features
|
|
412
|
+
- **A restart read-avoidance cursor** — the persisted log revision is the change signal, so unchanged sessions are applied straight from the ledger.
|
|
413
|
+
### Fixes
|
|
414
|
+
- Restarts no longer re-read every session's history.
|
|
415
|
+
|
|
416
|
+
## v1.0.7 (2026-08-23)
|
|
417
|
+
### 新功能
|
|
418
|
+
- 增量账本游标(未变会话从账本播种,变化会话只折叠新尾部)。
|
|
419
|
+
- 全零用量守卫;`tokenSemantics` 语义声明。
|
|
420
|
+
### 修复
|
|
421
|
+
- 降低长历史的启动扫描成本;防止实时重试重复计数。
|
|
422
|
+
|
|
423
|
+
### Features
|
|
424
|
+
- An incremental ledger cursor: unchanged sessions seed from the ledger and changed ones fold only the new tail.
|
|
425
|
+
- An all-zero usage guard and a machine-readable `tokenSemantics` declaration.
|
|
426
|
+
### Fixes
|
|
427
|
+
- Startup scan cost on long histories is reduced, and live retries no longer double-count.
|
|
428
|
+
|
|
429
|
+
## v1.0.6 (2026-08-23)
|
|
430
|
+
### 新功能
|
|
431
|
+
- 持久化逐会话用量账本(在 `session/flush` 边界写入);日志删除后用量仍在;缺失时自动重建。
|
|
432
|
+
### 修复
|
|
433
|
+
- 防陈旧基线覆盖新账本;重复键规范化与退出期写入守卫;非法存储单元名;Cordis 定时器上下文不再致命。
|
|
434
|
+
|
|
435
|
+
### Features
|
|
436
|
+
- A durable per-session usage ledger written at the `session/flush` boundary; flushed usage survives log deletion and is rebuilt automatically when logs are missing.
|
|
437
|
+
### Fixes
|
|
438
|
+
- Stale baselines no longer overwrite newer ledger records; duplicate keys are normalized and writes are guarded during disposal; invalid storage unit names are fixed; inactive Cordis timer contexts are no longer fatal.
|
|
439
|
+
|
|
440
|
+
## v1.0.5 (2026-08-21)
|
|
441
|
+
### 新功能
|
|
442
|
+
- 自定义起止日期范围;热力图仍固定最近 53 周;有界范围给出独立会话计数。
|
|
443
|
+
### 修复
|
|
444
|
+
- 基线重试带退避;退出或刷新竞争后停止在飞扫描与陈旧轮询。
|
|
445
|
+
|
|
446
|
+
### Features
|
|
447
|
+
- Custom start/end ranges, a heatmap that stays a fixed latest-53-week view, and distinct session counts for bounded ranges.
|
|
448
|
+
### Fixes
|
|
449
|
+
- Baseline retries back off, and in-flight scans and stale polling stop after disposal or refresh races.
|
|
450
|
+
|
|
451
|
+
## v1.0.4 (2026-08-18)
|
|
452
|
+
### 修复
|
|
453
|
+
- 加固 loopback / 同源 / 方法 / 令牌检查;允许省略 `Origin` 的同源余额 GET;英文模式统一 UTC。
|
|
454
|
+
|
|
455
|
+
### Fixes
|
|
456
|
+
- Hardened loopback, same-origin, method and token checks; allowed same-origin balance GETs without `Origin`; and standardised English mode on UTC.
|