dsh-consumption-badge 1.1.0 → 1.2.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/README.md CHANGED
@@ -15,6 +15,58 @@ next to every assistant message, and opens a detail panel with the session's spe
15
15
  DeepSeek account balance, and a **per-turn dual-axis line chart**
16
16
  (left axis: tokens, right axis: ¥) with a hover tooltip showing the model,
17
17
  input-hit / input-miss / output tokens, and the turn's peak/valley flag.
18
+ - **Settings page · 消耗** (`settings.section`, id `balance-dsh-consumption`, order 26):
19
+ a top row of four cards — **累计 Token** (with hit/miss/output split, all-history totals),
20
+ **估算金额**, **当前时段** (peak/idle) and **账户余额** (reusing the badge's cached balance) —
21
+ then **all-session history** as one line chart, filterable by time range
22
+ (today / last 7 days / last 30 days / last 12 months), by workspace
23
+ (全部工作区 + every registered workspace + 未归属工作区), and by an explicit
24
+ calendar range that overrides the dropdown. Bucket size follows the range:
25
+ **hourly for today and any single-day calendar range**, daily for multi-day ranges, and
26
+ monthly for the last 12 months. Left axis (tokens) is hidden until you
27
+ toggle it in the legend; the right axis (¥) is always on. Hovering a point shows its
28
+ total, its peak/valley split and the models involved; the footer sums the current
29
+ selection. No data in range → a plain “该范围内暂无消耗记录” note instead of an empty chart.
30
+ The cards are **all-history** totals (independent of the filters); the footer is the
31
+ filtered total, so the two numbers differ by design.
32
+ - **Personalization integration** (auto-detected, no configuration): when
33
+ [`dsh-plugin-personalization`](https://www.npmjs.com/package/dsh-plugin-personalization) is
34
+ installed alongside this plugin, a **消耗弹窗** block is appended to its settings page —
35
+ same `pp-block` / `pp-field` / `pp-modes` layout and the same `Pill` primitive as the shipped
36
+ personalization rows — offering four backgrounds for the consumption modal:
37
+ **默认 / 毛玻璃 / 自定义背景 / 纯色**.
38
+ - **默认** keeps the themed surface; **毛玻璃** is real `backdrop-filter` glass — both the veil behind
39
+ the modal and the panel itself are theme-derived (`--dsw-alias-bg-base`), so light themes get a light
40
+ haze and dark themes a dark one instead of the panel painting a dark slab over the page;
41
+ **自定义背景** takes an image URL *or* a local image plus an **不透明度** slider (0–100 %, default
42
+ 85 %) that sets the background layer's own `opacity` — the same semantic as the other
43
+ personalization background rows, so lowering it fades the image over the themed panel instead of
44
+ dimming it; **纯色** takes a hex colour and derives a light/dark ink palette so the
45
+ cards, chart and tooltips stay readable (the palette also overrides the tooltip surface).
46
+ - A **毛玻璃** switch appears for 自定义背景 and 纯色, so glass composites with them:
47
+ on an image it blurs the image itself (frosted photo), on a solid it makes the colour
48
+ translucent over a blurred page. A **毛玻璃强度** slider (0–48 px, default 22 px) sets the
49
+ blur radius for both the panel and the veil behind it.
50
+ - **清除** wipes the image, the URL field and the file picker in one go. The image row shows a
51
+ **thumbnail** plus the live save state
52
+ (正在保存 / 已保存到本机 / `error: …`), and failures are logged with a
53
+ `[consumption-badge]` tag instead of failing silently. The picker is a button
54
+ (“选择图片… / 更换图片…”), not a raw file input, so saving never leaves a misleading
55
+ “未选择文件” label behind.
56
+ - Local images are **stored on this machine with no size limit**: the picked file is written as a
57
+ Blob into IndexedDB (`dsh-consumption-assets` → `images`), and the preference only keeps a small
58
+ key — so a 20 MB wallpaper no longer blows the `localStorage` quota. On startup the blob is read
59
+ back into a `blob:` URL for the modal; **清除** deletes the stored record as well.
60
+ If IndexedDB is unavailable the file is read as a data URL instead, and the row says so.
61
+ - The choice is a local preference (`dsh-consumption:modal-style`) and is applied to the open
62
+ modal immediately. Nothing about the conversation or sidebar backgrounds is touched.
63
+ - **Update notice** (same shape as `dsh-plugin-personalization`'s): ~2.5 s after the page loads the
64
+ plugin asks `https://registry.npmjs.org/dsh-consumption-badge/latest` for the newest version
65
+ (24 h cache, 5 s timeout, fails silently). If the installed version is older — and that version
66
+ was not ignored — a non-blocking card appears in the bottom-right corner with
67
+ **current → latest**, the exact `dsh plugin --profile web update dsh-consumption-badge` command,
68
+ and three actions: **复制更新命令**, **忽略此版本** (remembered on this machine) and
69
+ **稍后提醒** (this page load only). It never blocks the conversation and never covers controls.
18
70
 
19
71
  Everything is an **estimate** for reference only — this plugin is not a billing system of record.
20
72
 
@@ -82,6 +134,14 @@ Turn records are also mirrored into browser `localStorage` under
82
134
  `dsh-consumption:<sessionId>:<turn>` so the chart survives reloads. Persistence writes are
83
135
  scheduled off the render path (`requestIdleCallback`), and the aggregation is O(turns).
84
136
 
137
+ The settings page reads **those same records** (no second store, no new field): workspace
138
+ attribution is resolved at read time from DSH's own accounting ledger
139
+ (`WorkspaceView.sessionIds` from `useWorkspaces`), so historical records are attributed without
140
+ any backfill. Records whose session no longer exists land in the 未归属工作区 bucket.
141
+ Above 5000 records the aggregation runs in a Web Worker (built from the pure aggregator's own
142
+ source, so both paths are the same code); if the browser refuses the Worker it silently falls
143
+ back to the main thread, where 6000 records aggregate in ~6 ms.
144
+
85
145
  ## Pricing model
86
146
 
87
147
  Off-peak prices in **CNY per 1M tokens**; peak multiplies everything by **2**.
@@ -141,7 +201,15 @@ Install the DSH plugin "dsh-consumption-badge" into my web profile and prove it
141
201
  5. Open any session and confirm the `⛽ <tokens> | ≈¥<cost> | peak|valley` pill in the assistant
142
202
  action row; click it and confirm the modal shows the four cards, the dual-axis chart, the
143
203
  balance, and that Esc closes it.
144
- 6. Report which step failed and paste the boot log lines that mention `consumption-badge`.
204
+ 6. Open Settings → 消耗: confirm the history chart renders, then
205
+ switch the time range (今天 / 近一周 / 近一月 / 近一年), switch the workspace
206
+ (全部工作区 → a specific workspace → 未归属工作区), set the calendar range and confirm both
207
+ the chart and the footer totals update, and that the Token axis only appears after clicking
208
+ its legend chip.
209
+ 7. If `dsh-plugin-personalization` is installed, open Settings → 个性化 and confirm a 消耗弹窗
210
+ block appears at the bottom; switch it to 毛玻璃 / 纯色 / 自定义背景 and confirm the ⛽ modal
211
+ (click a badge) re-renders with that background.
212
+ 8. Report which step failed and paste the boot log lines that mention `consumption-badge`.
145
213
 
146
214
  Rules while doing this: never write to the DSH credentials file yourself (ask me for
147
215
  DEEPSEEK_API_KEY), never bind a second server to the same port, and do not try to persist the