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 +69 -1
- package/lib/client.js +1720 -3
- package/lib/index.js +22 -2
- package/package.json +1 -1
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.
|
|
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
|