dsh-usage-badge 0.1.10 → 0.1.11

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/README.md CHANGED
@@ -97,7 +97,7 @@ dsh plugin --profile web remove dsh-usage-badge
97
97
 
98
98
  ```sh
99
99
  npm install # 只为测试装 react / react-dom
100
- npm test # 11 个套件 908 条断言:包契约、定价、节假日、官方定价解析、缓存存储、同步分片、同步编排、宿主同步接线、自动触发、WebDAV(Digest)、浏览器半渲染
100
+ npm test # 11 个套件 911 条断言:包契约、定价、节假日、官方定价解析、缓存存储、同步分片、同步编排、宿主同步接线、自动触发、WebDAV(Digest)、浏览器半渲染
101
101
  ```
102
102
 
103
103
  云同步的前五步已经在真实的 `bytemark/webdav` 容器上核对通过。要自己核对一遍:
@@ -53,7 +53,7 @@ dsh plugin --profile web remove dsh-usage-badge
53
53
  - **「今日用量」** 标签
54
54
  - **峰谷圆点**:谷时灰色、峰时橙色;悬停圆点本身会显示 `峰时 ×2` / `谷时 ×1` / `国庆节 · 全天空闲`。橙色用静态色 `--dsw-static-amber-500`,**不要借 `--dsw-alias-brand-primary`** —— 那个 token 在本设计系统里是**前景墨色**(DSH 自己只用它做文字、描边、开关轨道):浅色主题解析成 `--dsw-static-neutral-bluish-1000`(`#0f1115`,近黑),深色主题解析成 near-white。借了它的后果是峰时圆点变成一个看不出含义的深色点,`峰时 ×2` 标签变成白底白字,主按钮(白字填色)在深色主题下文字直接消失 —— 三处都已改成显式颜色(`--dsw-static-amber-500` 与 `--dsw-static-deepseek-500`),并由 `test/client.render.mjs` 里一条「墨色 token 不得作白字填充背景」的断言钉住。
55
55
  - **当日 token 总量**(输入 + 缓存 + 输出)
56
- - **当日估算金额**
56
+ - **当日估算金额**:始终贴右边缘。撑开右边距的是 token 那一段的 `margin-left:auto`,所以**它在没有用量的日子也照旧渲染**(内容为空、宽度为 0,但空的 flex 项照样吃掉自由空间)。少了它,金额就退回贴着标签左对齐,同一行出现两套对齐 —— `test/client.render.mjs` 三条断言钉住,金额自己的 `margin-left` 必须保持固定值(两个 `auto` 会平分自由空间,把 token 数挤到行中间)。
57
57
 
58
58
  整行每 5 秒刷新,悬停显示完整明细(金额 / token / 请求数 / 当前档位)。点击打开两个面板:
59
59
 
@@ -374,7 +374,7 @@ npm test
374
374
  | `test/holidays.verify.mjs` | 节假日日历的行为:工作日节假日全天空闲、**调休周末仍按空闲价**(政策原文说周末全天空闲)、旧配置里的 `holidays.workdays` 被忽略、关闭日历时回到旧的按星期行为、自定义 `extra`、同一个月内不同日子的分类互不干扰,以及**2027 年的单日端午/中秋**(同一天 10:30,节当天 x1、旁边的周三 x2)与 2027-02-14 调休周日 |
375
375
  | `test/official-pricing.verify.mjs` | 解析器对**中英文两个页面快照**的逐字段断言(含旧模型别名、时区识别与换算);页面结构变化时会抛错而不是静默返回错价;`应用` 的合并语义(未知字段存活、已有的 `default` 行不动、没有 `default` 行时按官方第一条补一个并报告 `defaultFrom`、页面第一条确实是最便宜那档);并用**被 stub 掉的 fetch** 跑通两个路由,最后验证应用后的价格真的参与计费(含未列出模型按生成的 default 行计价),以及兜底行的完整生命周期:删除 → 回到内置模板并把 `defaultSource` 报成 `template` → 再次应用从官方第一条生成回来 → 手改过的兜底行不会被应用覆盖 |
376
376
  | `test/cache.verify.mjs` | 缓存存储层:**两个后端跑同一套契约断言**(会话游标与桶的往返、`hourly` 槽位与逐请求记录、重写会话即替换它的日期集合、`years()` 的年份列表与有界区间读),以及只有跨重启才看得见的行为 —— **删掉会话日志后历史仍在**(新挂载的宿主照旧报出同样的金额)、**没有变化的一轮刷新不写文件**、**超出加载窗口的那天留在库里只是不读进来**(换个更宽的窗口还能取到)、旧 `cache.json` **迁移一次**并把旧文件改名为 `.migrated`(且 `.migrated` 之后**不再被读**)、**读不出来的缓存文件被改名保留并新建一个**、**更新版本的库只读使用且绝不改名**、加载窗口必须大于快照窗口这条不变量,以及 `按年` 路由(三年以前那一年照样读得到、12 个月恒定、`daily` 带节假日标记与 provider 拆分、没有数据的年份是 12 个空月而不是报错、非法年份 400)。 |
377
- | `test/client.render.mjs` | 用替身 Loader 加载浏览器 bundle,检查 slot 注册形状与 `id`,再用 `react-dom/server` 渲染两个面板,断言金额格式、区间页签(含 `按年`:下拉只列出宿主报的那几年、选中的那一年被选中、月份轴恒为 12、点数是 12 × 序列数、四张卡片是那一年的合计、这一档不画热力图、没有年份时不渲染空下拉)、四序列折线的条数与配色、图例开关(单独显示某一条时的折线条数,以及面积填充有没有跟着走)、悬停 tooltip 的装配、provider 页签、热力图的格数(371 − 今天之后的那几天)与分档、官方价格表内容、两个开关(前缀回退与未匹配模型计价:开/关两种状态各自渲染出的说明与动作、default 行的来源标注、以及「哪些模型没价格」的提示)、**覆盖行编辑器**(每行的编辑/删除动作、倍率与峰谷列恒定存在、表单用被编辑行的真实数值预填而不是空模板、自定义规则才展开规则字段、新增行不给删除按钮、**兜底行同样可编辑可删除且不提供那些不生效的字段**、**重名键与「改过的行」会被保存拦下**、**旧宿主不会被说成「兜底行还没有」**、以及「保留未显示字段」与拒绝写 NaN 的源码断言)、节假日徽标与日历区块、展开/收起两种行形态、**弹窗那一段 CSS 里不许出现任何宿主颜色令牌(`--dsw-`),必须自带浅色/深色两套 `--dub-*` 调色板**,以及空数据 / 稀疏 provider 两个边界不崩 |
377
+ | `test/client.render.mjs` | 用替身 Loader 加载浏览器 bundle,检查 slot 注册形状与 `id`,再用 `react-dom/server` 渲染两个面板,断言金额格式、区间页签(含 `按年`:下拉只列出宿主报的那几年、选中的那一年被选中、月份轴恒为 12、点数是 12 × 序列数、四张卡片是那一年的合计、这一档不画热力图、没有年份时不渲染空下拉)、四序列折线的条数与配色、图例开关(单独显示某一条时的折线条数,以及面积填充有没有跟着走)、悬停 tooltip 的装配、provider 页签、热力图的格数(371 − 今天之后的那几天)与分档、官方价格表内容、两个开关(前缀回退与未匹配模型计价:开/关两种状态各自渲染出的说明与动作、default 行的来源标注、以及「哪些模型没价格」的提示)、**覆盖行编辑器**(每行的编辑/删除动作、倍率与峰谷列恒定存在、表单用被编辑行的真实数值预填而不是空模板、自定义规则才展开规则字段、新增行不给删除按钮、**兜底行同样可编辑可删除且不提供那些不生效的字段**、**重名键与「改过的行」会被保存拦下**、**旧宿主不会被说成「兜底行还没有」**、以及「保留未显示字段」与拒绝写 NaN 的源码断言)、节假日徽标与日历区块、展开/收起两种行形态、**没有用量的那天金额仍贴右**(token 槽位渲染但为空)、**弹窗那一段 CSS 里不许出现任何宿主颜色令牌(`--dsw-`),必须自带浅色/深色两套 `--dub-*` 调色板**,以及空数据 / 稀疏 provider 两个边界不崩 |
378
378
  | `test/smoke.mjs` | 对着**本机真实**的 `$DSH_HOME` 跑一遍,打印徽标金额、今日 token 构成、当前峰谷档位、节假日日历状态、最近 7 天,以及滚动热力图那 371 天的分档分布(有用量的天数与四档各多少天,都挤在一档说明这张图会显得很平) |
379
379
  | `test/official-pricing.live.mjs` | **联网**核对:抓真实页面并与 `test/fixtures/` 的快照逐字段比对,确认官方页面仍能解析、价格未变 |
380
380
 
package/lib/client.js CHANGED
@@ -75,6 +75,10 @@ window.__ModuleLoader__.load({
75
75
  peak chip into white on white. */
76
76
  .dub-dot{flex:none;width:6px;height:6px;border-radius:3px;background:var(--dsw-alias-label-tertiary,#999)}
77
77
  .dub-dot-peak{background:var(--dsw-static-amber-500,#f59e0b)}
78
+ /* This span owns the auto margin that pushes the amount to the right edge, so it is
79
+ rendered even when the day has no token text (an empty flex item still absorbs the
80
+ free space). Keep the amount's own margin a fixed gap, never auto: two auto margins
81
+ would split the free space and park the token text in the middle of the row. */
78
82
  .dub-pill-tokens{margin-left:auto;flex:none;color:var(--dsw-alias-label-tertiary,#999);font-size:11px;font-variant-numeric:tabular-nums}
79
83
  .dub-pill-amount{flex:none;margin-left:6px;color:var(--dsw-alias-label-primary,#111);font-variant-numeric:tabular-nums;font-weight:500}
80
84
  /* ── 弹窗自带一套样式,不读宿主的颜色令牌 ─────────────────────────────────────────────────────
@@ -2817,7 +2821,10 @@ html[data-theme="dark"] .dub-mask{
2817
2821
  // The marker is compact, so it carries the band text as its own tooltip:
2818
2822
  // hovering the dot alone explains 峰时 ×2 / 谷时 ×1 / 节假日.
2819
2823
  chip ? h('span', { className: `dub-dot${chip.peak ? ' dub-dot-peak' : ''}`, title: chip.text }) : null,
2820
- tokenTotal > 0 ? h('span', { className: 'dub-pill-tokens' }, `${tokens(tokenTotal)} tokens`) : null,
2824
+ // Always rendered, even when a day has no tokens: this span owns the row's
2825
+ // `margin-left:auto`, so dropping it on an idle day pulled the amount left and
2826
+ // sat it right beside the label — two different alignments for one row.
2827
+ h('span', { className: 'dub-pill-tokens' }, tokenTotal > 0 ? `${tokens(tokenTotal)} tokens` : ''),
2821
2828
  h('span', { className: 'dub-pill-amount' }, text),
2822
2829
  ),
2823
2830
  open && snapshot
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-usage-badge",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "DeepSeek Harness 的用量徽标插件:侧边栏底部一行显示当天的 token 总量与估算费用,点开可看 24 小时 / 近 7 日 / 近 30 日 / 近 12 个月 / 按年用量,按 provider 筛选,并按 DeepSeek 官方定价与中国法定节假日计价。A usage badge plugin for DeepSeek Harness: today's tokens and estimated spend in the sidebar, with 24h / 7d / 30d / 12-month and per-year charts, official DeepSeek pricing and Chinese public holidays.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",