dsh-peak-hours 1.10.1 → 1.12.1
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 +52 -0
- package/README.md +48 -5
- package/client.js +510 -25
- package/index.js +70 -5
- package/lib/schedule.js +120 -0
- package/lib/usage.js +386 -0
- package/lib/zstd.js +122 -0
- package/package.json +16 -3
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 更新日志
|
|
2
|
+
|
|
3
|
+
## 1.12.1 — 2026-10-30
|
|
4
|
+
|
|
5
|
+
### 修正
|
|
6
|
+
|
|
7
|
+
- **侧栏角标只剩一行文字、圆点和日程条消失**:根节点上的 `aria-label` 会被 `sidebar.footer.action` 的所有者当成「行文本」投影出来,整个组件子树被替换成一行纯文本。现已移除该属性(无障碍名交给可见文本 + `title`),并在源码里留下注释,避免回归。
|
|
8
|
+
|
|
9
|
+
## 1.12.0 — 2026-10-29
|
|
10
|
+
|
|
11
|
+
### 新增
|
|
12
|
+
|
|
13
|
+
- **设置页「高峰/空闲用量与费用对比」卡片**(`settings.general.item`,排在「性能与用量」之后):把本机会话日志里的每个请求按**发生时刻的北京时间**归到高峰或空闲,按模型价目表折算成钱,给出近 7 天 / 近 30 天 / 全部三个区间的「实际花费、全高峰、全空闲、省下的钱与比例、高峰占比、分模型明细」。想查「我到底因为错峰省了多少」时,不用再手算。
|
|
14
|
+
- **host 半**:`index.js` 注册 `GET /dsh-peak-hours/api/usage`,60 秒 TTL + `?fresh=1` 强制刷新 + in-flight 去重;`lib/zstd.js` 自己按帧切开多帧 zstd 会话日志(`zlib.zstdDecompressSync` 只能解首帧),`lib/usage.js` 增量扫描并按文件大小/修改时间缓存到 `~/.dsh/storages/peak-hours/cache.json`。
|
|
15
|
+
- 新增 10 个用例覆盖 host 半(窗口边界、周末/节假日、模型分类、价格公式、`turn+step` 替换、分桶、费用对比、区间过滤),测试总数 15 → 24。
|
|
16
|
+
|
|
17
|
+
### 修正
|
|
18
|
+
|
|
19
|
+
- 分模型明细里同名模型(如 `deepseek-account/deepseek-flash` 与 `deepseek-official/deepseek-flash`)不再显示成两行一模一样,第二个起会带提供商后缀(`· personal` / `· official`)。
|
|
20
|
+
|
|
21
|
+
## 1.11.0 — 2026-10-29
|
|
22
|
+
|
|
23
|
+
### 修正
|
|
24
|
+
|
|
25
|
+
- **说明文案与实现对齐**:日程条的说明原来写「红色=高峰、绿色=空闲」,但条子实际是琥珀橙 / DeepSeek 蓝,现已改为「橙色=高峰、蓝色=空闲」(英文同步为 `amber` / `blue`)。
|
|
26
|
+
- 节假日说明不再暴露源码里的 `HOLIDAYS` 常量名,改成数据驱动:从已收录年份自动生成「节假日表已收录 2026 年中秋、国庆」。
|
|
27
|
+
- `package.json` 补充 `./package.json` 导出、`engines`、`scripts.test`,发布物更规范。
|
|
28
|
+
|
|
29
|
+
### 新增
|
|
30
|
+
|
|
31
|
+
- **点击复制状态**:点一下角标(或聚焦后按 Enter / 空格)即可把「高峰 ×2 · 3小时11分后转空闲(北京时间)」复制到剪贴板,1.5 秒内显示「已复制」。剪贴板不可用时回退到临时 textarea。
|
|
32
|
+
- **切换前 10 分钟强调**:距峰↔谷切换不足 10 分钟时,倒计时变琥珀色加粗,圆点轻微脉冲(`prefers-reduced-motion` 下自动关闭动画)。
|
|
33
|
+
- **更完整的 tooltip**:新增「明天」预告(明天周末 / 法定节假日 / 工作日),以及点击复制的提示。
|
|
34
|
+
- **可访问性**:角标改为 `role="button"` + `tabIndex`,带 `aria-label`(含状态、倒计时与操作提示),键盘 `:focus-visible` 有可见焦点环。
|
|
35
|
+
- **单元测试与 CI**:`npm test` 用 `node --test` 跑 15 个用例(时段边界 09:00/12:00/14:00/18:00、周末、节假日、跨日倒计时、日程条分段与宽度、游标位置、折叠态、复制、中英文 key 对齐),GitHub Actions 在 22.x 上跑测试与打包检查。
|
|
36
|
+
|
|
37
|
+
## 1.10.1 — 2026-10-28
|
|
38
|
+
|
|
39
|
+
- 修正 bundle patch 里的行名仍然指向改名前的 `@local/dsh-peak-hours`,导致重命名后客户端半不装载、角标消失。
|
|
40
|
+
|
|
41
|
+
## 1.10.0 — 2026-10-28
|
|
42
|
+
|
|
43
|
+
- 收窄空闲色渐变(`#4d6bfe → #6383ff`),让条子底色与侧栏 logo 的品牌蓝一致。
|
|
44
|
+
- 发布物整理:包名改为 `dsh-peak-hours`,补 LICENSE / README / 图标 / 截图 / `screenshots.json`。
|
|
45
|
+
|
|
46
|
+
## 1.9.0 — 2026-10-27
|
|
47
|
+
|
|
48
|
+
- 空闲色从绿色换成 DeepSeek 品牌蓝 `#4d6bfe`;高峰仍为琥珀色 `#f59e0b`。
|
|
49
|
+
|
|
50
|
+
## 1.4.0 — 2026-10-27
|
|
51
|
+
|
|
52
|
+
- 进度条改为「当天 00:00–24:00 的日程条」:红/绿分段 + 白色当前时刻标尺。
|
package/README.md
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
# dsh-peak-hours
|
|
2
2
|
|
|
3
|
-
一个 DeepSeek Harness
|
|
3
|
+
一个 DeepSeek Harness 插件,做两件事:
|
|
4
|
+
|
|
5
|
+
1. **侧栏角标**:现在是不是高峰计价时段;
|
|
6
|
+
2. **设置页卡片**:把你自己的用量按高峰/空闲拆开,并算出「实际花了多少」对比「全在高峰 / 全在空闲要花多少」。
|
|
4
7
|
|
|
5
8
|

|
|
6
9
|
|
|
10
|
+

|
|
11
|
+
|
|
7
12
|
## 它显示什么
|
|
8
13
|
|
|
9
14
|
挂在侧栏底部动作行(`sidebar.footer.action`,「插件市场」下面),一行搞定三件事:
|
|
@@ -14,7 +19,12 @@
|
|
|
14
19
|
|
|
15
20
|
侧栏折叠成窄轨时自动退化为「圆点 + 一小截进度条」,不占地方。
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
**距切换不到 10 分钟**时,倒计时会变成琥珀色加粗、圆点轻微脉冲,提醒你「要涨价了」或「要降价了」(系统开启减少动态效果时动画自动关闭)。
|
|
23
|
+
|
|
24
|
+
**点一下角标**(或聚焦后按 Enter / 空格)会把当前状态复制到剪贴板,例如
|
|
25
|
+
`DeepSeek 高峰 ×2 · 3小时11分后转空闲(北京时间)`,方便贴给同事。
|
|
26
|
+
|
|
27
|
+
鼠标悬停能看到完整说明:当前段起止时间、明天是工作日还是休息、以及高峰/空闲的价格表。
|
|
18
28
|
|
|
19
29
|
## 计费规则
|
|
20
30
|
|
|
@@ -25,13 +35,31 @@
|
|
|
25
35
|
- **整天空闲**:周六、周日,以及中国的法定节假日
|
|
26
36
|
- 闲时价 = 高峰价的一半
|
|
27
37
|
|
|
28
|
-
节假日表是**内置的,不联网**:目前覆盖 2026 年(中秋 9/25–27、国庆 10/1–7)。2026 年 9/20(周日)和 10/10
|
|
38
|
+
节假日表是**内置的,不联网**:目前覆盖 2026 年(中秋 9/25–27、国庆 10/1–7)。2026 年 9/20(周日)和 10/10(周六)是调休上班日,按规则仍算空闲。表里没有的年份退化成「周末空闲」规则——这是保守选择:宁可把某天当成空闲(少标高峰),也不误报高峰;遇到新的节假日安排需要更新 `client.js` 里的 `HOLIDAYS`,tooltip 里显示的年份由该表自动推导。
|
|
29
39
|
|
|
30
40
|
时间一律按北京时间(UTC+8)算,和你浏览器的时区无关。
|
|
31
41
|
|
|
42
|
+
## 用量与费用对比(设置 → 通用)
|
|
43
|
+
|
|
44
|
+
除了角标,插件还在「设置 → 通用」里加了一行 **高峰/空闲用量与费用对比**(`settings.general.item`,排在「性能与用量」后面)。它读取本机 DeepSeek Harness 的会话日志,把每个请求按它发生的**北京时间**归到高峰或空闲,然后按模型价目表折算成钱:
|
|
45
|
+
|
|
46
|
+
- **三个区间**:近 7 天 / 近 30 天 / 全部
|
|
47
|
+
- **三笔钱**:实际花费(高峰按 ×2、空闲按 ×1)、假如全部落在高峰、假如全部落在空闲
|
|
48
|
+
- **省下的钱与比例**:`¥68.49 · 35.5%` 这样
|
|
49
|
+
- **用量拆分**:高峰 token、空闲 token、合计、高峰占比,配一条橙/蓝比例条
|
|
50
|
+
- **分模型**:前四个模型各自的 token 与费用
|
|
51
|
+
|
|
52
|
+
口径与限制(重要,也是诚实的地方):
|
|
53
|
+
|
|
54
|
+
- 只统计**能对上 DeepSeek 价目表**的模型(`deepseek-flash` 按 flash 价、`deepseek-v4-pro` / reasoner 按 pro 价);其他供应商(claude、gpt、qmodel 等)只计 token、不计入费用,并在说明里单独标注
|
|
55
|
+
- 价目表同样内置在 `lib/schedule.js`(元/百万 tokens,空闲→高峰):flash 命中 0.02→0.04、未命中 1→2、输出 4→8;pro 命中 0.15→0.30、未命中 4.5→9、输出 13.5→27
|
|
56
|
+
- 同一 `turn`+`step` 的多次采样按**最后一次**算(会话流式输出会反复覆盖同一步的用量),不会重复累加
|
|
57
|
+
- 数据来自本机会话日志 `~/.dsh/sessions/<工作区>/<会话>/session.v4.jsonl.zstd`,**只在本地读、不外发**;解析结果按文件大小与修改时间缓存到 `~/.dsh/storages/peak-hours/cache.json`,第二次打开是毫秒级
|
|
58
|
+
- 用量接口也有 60 秒 TTL,卡片上的「刷新」会跳过缓存重新扫一遍
|
|
59
|
+
|
|
32
60
|
## 安装
|
|
33
61
|
|
|
34
|
-
从 npm
|
|
62
|
+
从 npm:
|
|
35
63
|
|
|
36
64
|
```sh
|
|
37
65
|
dsh plugin --profile web add dsh-peak-hours
|
|
@@ -54,9 +82,24 @@ dsh plugin --profile web remove dsh-peak-hours
|
|
|
54
82
|
## 兼容性
|
|
55
83
|
|
|
56
84
|
- 需要带客户端 UI 的 DeepSeek Harness Web GUI(`dsh.client` 声明为 `platform: web`)
|
|
57
|
-
-
|
|
85
|
+
- 客户端 + 一个只读的 host 半:host 半注册一条 `GET /dsh-peak-hours/api/usage`,读取本机会话日志算峰谷账,**不发任何网络请求**;除 `~/.dsh/storages/peak-hours/cache.json` 这一份解析缓存外不写文件,不需要任何配置或凭据
|
|
86
|
+
- 角标部分纯客户端,不依赖 host 半;即使 host 半取数失败,角标照常工作
|
|
58
87
|
- 颜色是固定值(高峰 `#f59e0b`、空闲 `#4d6bfe`,即 DeepSeek 品牌蓝),不跟随主题 `brand-primary`,以免换皮肤后蓝色被改成别的色
|
|
59
88
|
|
|
89
|
+
## 开发
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
npm test # 24 个单元测试(node --test,零依赖)
|
|
93
|
+
npm run verify # npm pack --dry-run,检查发布清单
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
测试分两块,全部零依赖、不用起 GUI:
|
|
97
|
+
|
|
98
|
+
- `test/schedule.test.mjs`:通过 `vm` 加载 `client.js`,用最小的 React / locale / document 替身渲染角标,验证时段边界、日程条分段与宽度、游标位置、折叠态、复制与中英文 key 对齐
|
|
99
|
+
- `test/usage.test.mjs`:直接测 host 半的 `lib/schedule.js` 与 `lib/usage.js`,用合成事件验证窗口判定、节假日、模型分类、价格公式、`turn+step` 替换语义、按日+小时+模型分桶、峰谷费用对比与区间过滤
|
|
100
|
+
|
|
101
|
+
设置页卡片还有一个独立的 headless 渲染检查(真实接口数据 + 最小 hooks 替身),确认取数成功后不会渲染崩溃。
|
|
102
|
+
|
|
60
103
|
## 许可
|
|
61
104
|
|
|
62
105
|
MIT
|