dsh-whale-widget 0.3.14 → 0.3.16

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
@@ -27,7 +27,7 @@ DeepSeek Harness(DSH)Web 界面右下角的常驻挂件:小鲸鱼气泡图
27
27
  - 🐋 **常驻自启**:随 DSH Web 界面每次打开自动出现(标准 DSH bundle 插件)
28
28
  - 💰 **余额**:60 秒自动刷新 + 点击鲸鱼手动刷新;余额变化时数字**滚动动画**;瞬时网络抖动自动沿用最近余额不报错。**两种取数方式,API key 优先**:① DSH 凭据里的 `DEEPSEEK_API_KEY`;② **DSH 账号登录态** —— 通过「设置 → 账号与余额」登录了 DeepSeek 账号、又没配 API key 时自动使用(**不需要去 platform 建 key**)
29
29
  - 📊 **今日已用(小鲸鱼记账)**:不需要任何令牌。余额**下降**按观测累计为消费,余额**上升**(充值 / 赠金)单独记录、不会冲掉已有消费;检测到余额增加会提示「待核对余额调整」,可在「小鲸鱼记账 → **DeepSeek(内置)→ 设置 → 余额校正**」按实际累计到账金额与非调用扣减校正 —— **「已观测消费」与「余额校正」都是 DeepSeek 账户口径**(由该 API key 的余额观测得出,不含其它厂商;「本机模型费用」才是所有模型的本地估算)(逐轮明细保留 90 天或最多 2 万条、逐日归档保留 365 天,超期数据归档到 `.dshw-usage-archive.json`);金额按 8 位小数记账、显示保留两位
30
- - 💬 **每轮对话消耗**:监听 DSH 本机会话事件,按模型**真实 usage**(input / cache / output / reasoning tokens)换算金额,每轮结束弹出消耗泡泡;可开关、自动关闭秒数可设(0 = 不自动关闭),**泡泡内容可自定义**(模块化,金额用 `{cost}` 引用),入口:菜单 → 每轮消耗提示 → 「自定义提示」
30
+ - 💬 **每轮对话消耗**:监听 DSH 本机会话事件,按模型**真实 usage**(input / cache / output / reasoning tokens)换算金额,每轮结束弹出消耗泡泡;可开关、自动关闭秒数可设(0 = 不自动关闭),**泡泡内容可自定义**(模块化,金额用 `{cost}` 引用),入口:菜单 → 「音效与提示」→ 「全局设置」→ 展开「每轮消耗提示」→「编辑提示内容」
31
31
  - ⛰️ **峰谷定价**:工作日高峰 9:00–12:00、14:00–18:00(北京时间),其余空闲;2026-08-23 起**周末全天谷价**。峰谷模块支持状态文字、倒计时、"梁文峰谷 / !?强强?! / 简洁"等多种样式
32
32
  - 📒 **用量记录窗口**:今日模型消费、近 7 天、全部记录;模型占比条;按日期展开逐条明细(含时间与金额);支持按日期或**模型名搜索**;模型名带友好标注(`deepseek-flash` → `DeepSeek-V4.1-Flash`,旧名标注"同 V4.1 Flash")
33
33
 
@@ -36,7 +36,8 @@ DeepSeek Harness(DSH)Web 界面右下角的常驻挂件:小鲸鱼气泡图
36
36
  - 🖱️ **拖拽 + 吸附**:四边吸附区可自定义(按比例或像素),角落可组合;可关闭吸附自由摆放
37
37
  - 🔄 贴左吸附时整体**水平镜像翻转**(文字同步反向、带动画)
38
38
  - 🧸 **按压 Q 弹**玩偶效果(按压时底部坐标不变)
39
- - 🎚️ **主菜单**:大小滑块、音效开关/音量、峰值文案、泡泡开关、每轮消耗开关 + 「自定义提示」(每轮消耗内容 / 自动关闭秒数 / 任务结束音效)、吸附设置、角色/资源管理、自定义泡泡、余额预警、今日预算
39
+ - 🎚️ **主菜单**:角色、大小滑块、**音效与提示**(这行只剩入口按钮「全局设置」,音效总开关已搬进面板)、气泡全局开关 + 「按压泡泡设置」、避让滚动条、吸附设置、隐藏菜单按钮、资源管理(含余额预警、今日预算、小鲸鱼记账)
40
+ - 🔊 **提示与音效设置**(主菜单 → 「音效与提示」→ 「全局设置」):**四个入口行** —— **按压音效**(音效组、音量)、**每轮消耗提示**(冒泡提示、自动关闭秒数、任务结束音、提示音量)、**提问提示**、**授权提示**。入口行上就是该事件的**总开关**与**当前值摘要**(如 `默认音效组 · 100%`、`自动关 180s · 叮~`),**点一行才展开**该区的设置项(可同时展开多个)。**每个音效都有独立音量**,每行带「试听」;音效行左侧的 `[✓]` 决定该音效**响不响**(不响 = 仍可冒泡)。底栏 `取消 / 恢复默认 / 保存` —— 面板内的改动**只落内存**,点「保存」才生效,点「取消」完整还原(「恢复默认」之后点取消同样能撤销)
40
41
  - 🙈 **可隐藏菜单按钮**:隐藏后,电脑端**右键鲸鱼**、手机端**长按鲸鱼约 1.5 秒**唤出菜单
41
42
  - 📱 **移动端友好**:鲸鱼可触摸拖动(自研触摸接管,不会把页面手势判成滚动导致拖不动);泡泡编辑器支持**长按 0.4 秒进入拖拽排序**;去掉了浏览器默认的点击高亮方块
42
43
 
@@ -49,7 +50,7 @@ DeepSeek Harness(DSH)Web 界面右下角的常驻挂件:小鲸鱼气泡图
49
50
  - **随机语句**(多条句子带权重,每次显示抽 1 条且不连续重复)
50
51
  - **图片/动图**(从泡泡图库选,独占一整行)
51
52
  - **随机图片**(多张图带权重,抽 1 张且不连续重复,同样独占一行)
52
- - 余额数值、今日已用、峰谷时段(内置数值,内容自动获取,可调占位符与样式)
53
+ - 余额数值、今日已用、峰谷时段、**对话名**(内置数值,内容自动获取,可调占位符与样式;对话名可设「**保留长度**」,超出部分显示为 `...`,`0` = 不截断)
53
54
  - 🎨 **逐模块样式**:字体(含自定义字体)、字号、加粗/斜体/下划线、纯色或**跑马灯渐变**配色、底色;文本与随机语句支持悬浮快捷编辑
54
55
  - 🖐️ **拖拽排版**:桌面端原生拖拽、移动端长按拖拽;模块可并入某行首/尾、可拆行、整行可排序;**每行最多 6 个模块、泡泡最多 6 行**,图片类模块独占一行且一个泡泡只允许一个
55
56
  - 📚 **模块库**:把常用模块"另存"进库,之后在任意泡泡里点击或拖入复用
@@ -58,14 +59,17 @@ DeepSeek Harness(DSH)Web 界面右下角的常驻挂件:小鲸鱼气泡图
58
59
 
59
60
  - 🔔 **余额预警**:余额低于设定值时弹提醒,内容可编辑(含图片/随机图片模块)
60
61
  - 💸 **今日预算**:今日已用达到设定金额时弹提醒,内容同样可编辑
61
- - 💬 **每轮消耗提示**:一轮对话结束后弹消耗泡泡,内容同样可编辑(模块化,金额用 `{cost}`);内容、自动关闭秒数与**任务结束音效**都在菜单 → 每轮消耗提示 → 「自定义提示」里设置
62
+ - 💬 **每轮消耗提示**:一轮对话结束后弹消耗泡泡,内容同样可编辑(模块化,金额用 `{cost}`);**开关、自动关闭秒数、提示音量、任务结束音效与内容编辑入口**都在「音效与提示 → 全局设置」面板的「每轮消耗提示」区(主菜单不再单列这一行)
63
+ - ⏳ **等待交互音效**:DSH **需要你回答提问**、或**需要你批准授权**时会响一声并在气泡里提示(默认都是关闭的;打开后与任务结束音共用同一套音效库)。提示内容里的 `{session}` 会替换成**当前对话名**(读不到就显示「当前对话」,超长自动截断为 12 字符 + `...`)。**同一个未回答的提问只响一次**(刷新页面也不会重复响)
62
64
  - 三者都支持自动关闭秒数设置;气泡模式不可用时自动退化为居中卡片(卡片内也会渲染图片模块)
63
65
 
64
66
  ### 音效 / 角色 / 图片
65
67
 
66
68
  - 🔊 **按压 & 松开音效**:内置「小黄鸭」「音效1」两套预置;也可导入音频片段并自由组合成**自定义音效组**(槽位可留空 = 该事件静音)
67
69
  - 🎵 **任务结束音**:一轮回复完成时播放;内置两个预设音效 —— 默认 **Minecraft·经验球**(`assets/minecraft-exp-orb.wav`)与 **A**(`assets/task-end-a.wav`),也可选任意片段或音效组
68
- - ✂️ **音频片段管理**:导入时可视化裁剪、试听;资源管理窗口统一查看/试听/删除
70
+ - ⏳ **提问音 / 授权音**:DSH 需要你回答或批准时播放;与任务结束音共用同一套音效库,**各自可调音量**,音效行左侧的 `[✓]` 决定「响不响」(不响 = 仍会冒泡提示)
71
+ - 🔉 **每个音效独立音量**:按压音效、任务结束音、提问音、授权音各自一条音量滑块(默认 100%),每行都带「试听」
72
+ - ✂️ **音频片段管理**:导入时可视化裁剪、试听;资源管理窗口(菜单 → 资源管理 → 「管理」)按 **图片 / 音频 两个可折叠入口**统一查看/试听/删除 —— 入口行右侧直接显示数量(如 `角色 1 · 泡泡图 2`、`音效组 3 · 片段 4`),点一行才展开明细;「导入片段」在音频那一区里;收起/展开时会顺带停掉正在试听的那一段
69
73
  - 🐳 **自定义角色**:上传自己的鲸鱼图片(图库管理,可回退默认)
70
74
  - 🖼️ **泡泡图库**:内置 `petpet`、`money1` 两张图,也可上传 png/gif,供图片/随机图片模块使用
71
75
 
@@ -126,12 +130,12 @@ dsh-whale-widget/
126
130
  └── whale-widget-prompt.md # 完整规格/维护提示词(面向二次开发)
127
131
  ```
128
132
 
129
- 运行时数据(都放在 `$DSH_HOME`,默认 `~/.dsh`;本机开发环境为 `D:\TestBox\deepseek\`):
133
+ 运行时数据(都放在 `$DSH_HOME`,默认 `~/.dsh`;用环境变量 `DSH_HOME` 可以改到别处):
130
134
 
131
135
  | 文件 / 目录 | 用途 |
132
136
  |---|---|
133
137
  | `.dshw-size.json` | 挂件外观与开关(缩放、音量、音效组、峰值样式、吸附相关等) |
134
- | `.dshw-usage.json` | 记账账本 + 按日余额观测/校正摘要 + 用量设置(任务结束音、余额预警、今日预算、每轮消耗提示内容) |
138
+ | `.dshw-usage.json` | 记账账本 + 按日余额观测/校正摘要 + 用量设置(任务结束音、余额预警、今日预算、每轮消耗提示内容,以及 **`events`**:按压 / 每轮消耗 / 提问 / 授权四个事件的音效选择、独立音量、冒泡配置;**每轮消耗的自动关闭秒数存在 `.dshw-size.json` 的 `turnCostCloseMs`**) |
135
139
  | `.dshw-usage.json.before-recharge-fix.bak` | 旧格式账本备份(0.3.1 首次写入旧账本前自动创建;已存在则不覆盖) |
136
140
  | `.dshw-turn.json` | 每轮消耗的 seq(避免热重载后前端把新轮次当旧轮次) |
137
141
  | `.dshw-bubble.json` | 自定义泡泡配置(点击序列 + 模块库 + 点按角色推进队列开关) |
@@ -162,6 +166,8 @@ error: profile "desktop" is managed exclusively by the Electron application
162
166
 
163
167
  **生效方式(实测)**:新装一个包通常**热生效**(工具返回 `"application":"applied"`);**换版本(升级)需要重启客户端**(返回 `"restart-required"`)。
164
168
 
169
+ > ⚠️ **但"热生效"并不总是够**:有用户实测**新装之后右下角仍然什么都没有,重开一次客户端就出现了**(issue #162)。所以:**装完没看到挂件,先重开客户端**(命令行侧的 `dsh web` 同理:重启 + 浏览器 `Ctrl+F5`),再去按下面两条自检排查。
170
+
165
171
  **装完怎么自检**(两条分别对应宿主半区与客户端半区):
166
172
 
167
173
  - **宿主半区**:`%USERPROFILE%\.dsh\.dshw-turn.json` 存在,且 `seq` 随对话递增;
@@ -306,6 +312,19 @@ MeteorNOX/DeepSeek-Balance-Whale-Widget,或者我本地已经有这个插件
306
312
 
307
313
  > **不需要** `DEEPSEEK_PLATFORM_TOKEN`。早期版本的"实时·令牌"模式已下线,今日已用统一由**小鲸鱼记账**(余额差 + 会话事件)计算,零令牌开箱即用。
308
314
 
315
+ ### 安全边界(0.3.15 起,**请务必一读**)
316
+
317
+ 插件会把凭据交给谁、以及谁能改这件事的规则:
318
+
319
+ 1. **凭据只会发往"该厂商内置模板里写死的端点"**。
320
+ 自定义模型里如果填了一个**不在该厂商模板内**的接口地址(或者模板地址里用 `{base}` 指向你自己填的地址),插件**默认不会把凭据发过去**,而是返回一条明确提示。
321
+ - 自建网关(New API / 自托管 / Ollama 等)确实需要自定义地址:请**在这台机器本机**打开插件面板,对该模型勾选「**允许把凭据发送到自定义地址**」。这是按模型保存的一个显式标志。
322
+ 2. **配置与凭据的改动只能来自本机(回环地址)**。
323
+ 所有写请求(保存模型、写/删凭据、改外观设置等)如果来源不是 `127.0.0.1` / `localhost` / `[::1]`,一律 `403`。
324
+ - 为什么:任意持有 DSH Web 会话的人如果能写模型配置,就等于能决定"凭据被发往哪里" —— 那会把你的 API key 直接送到对方服务器上。**只读接口不受影响**(局域网里照常能看挂件)。
325
+ - 需要远端管理?用环境变量显式声明:`DSHW_ADMIN_HOSTS=192.0.2.10:3080,myhost.lan`(逗号分隔,可带端口;默认空)。
326
+ 3. 接口地址不允许携带用户名/密码(`https://user:pass@host/`),凭据名只允许字母、数字与下划线。
327
+
309
328
  添加自定义模型时,还会按需用到各自厂商的凭据名(都可不配,用到哪个配哪个):
310
329
 
311
330
  | 凭据名 | 用途 |
@@ -377,28 +396,34 @@ curl http://127.0.0.1:3080/dsh-whale/audio.json
377
396
  - `/dsh-whale/audio-fragment.wav?id=end_a` → 200 `audio/wav`(内置任务结束音 A)
378
397
  - 浏览器 F5 后右下角出现挂件
379
398
 
380
- > ⚠️ **关于上面这些 `curl`**:全部 21 个 `/dsh-whale/*` 路由现已接入 **DSH 浏览器信任栅栏**(`connection.requestRejection`)。
399
+ > ⚠️ **关于上面这些 `curl`**:全部 **23 个** `/dsh-whale/*` 路由都已接入 **DSH 浏览器信任栅栏**(`connection.requestRejection`)。
381
400
  > 因此**不带会话凭据的裸 `curl` 会返回 401**(伪造 `Host` 头则是 403)—— 这是预期行为,不是接口坏了。
382
401
  > 想验证接口是否存活,看返回 **401/403** 即说明路由已注册且栅栏在工作;在浏览器里访问同一条路径(带会话)才是 200。
402
+ > 另外**自 0.3.15 起,写请求(`POST`/`PUT`/`PATCH`/`DELETE`)还必须是本机来源**(Host 为 `127.0.0.1`/`localhost`/`[::1]`),否则 403 —— 详见上方「安全边界」。
383
403
 
384
404
  ## 常见问题
385
405
 
386
406
  - **挂件不出现**:
387
407
  - **Web(`dsh web`)**:确认安装命令成功;`dsh --profile web --dump-config` 里能看到 `dsh-whale-widget`;重启 `dsh web` 后 F5。
388
- - **官方桌面端**:先确认装对了 profile —— 桌面端读的是 **`desktop` profile**,**不能**用 `--profile web`(而 `--profile desktop` 会被 CLI 拒绝,这是设计如此)。正确入口见上面「**官方桌面端(Electron 客户端)请先看这一节**」,并用那里的**两条自检**判断是「没装到位」还是「装了但没渲染」。
408
+ - **官方桌面端**:先确认装对了 profile —— 桌面端读的是 **`desktop` profile**,**不能**用 `--profile web`(而 `--profile desktop` 会被 CLI 拒绝,这是设计如此)。正确入口见上面「**官方桌面端(Electron 客户端)请先看这一节**」,并用那里的**两条自检**判断是「没装到位」还是「装了但没渲染」。**新装也建议重开一次客户端**(issue #162:热生效不一定够)。
389
409
  - **本插件所有接口(`/dsh-whale/*`)的访问校验**:默认只接受**回环地址**(`127.0.0.1` / `localhost` / `[::1]`)的请求,并拒绝跨站标记(`Sec-Fetch-Site: cross-site`)与 Origin 和 Host 不同源的请求 —— 这是防「恶意网页读写本机接口」的信任栅栏(issue #92 / #136)。如果你把 `dsh web` 放在**反向代理或局域网地址**后面,请用环境变量声明允许的 Host(逗号分隔,可带端口),否则会被 403:
390
410
  ```bash
391
411
  DSHW_TRUSTED_HOSTS=dsh.example.com,10.0.0.5:3080 dsh web
392
412
  ```
393
413
  - **图片/音效不显示、没声音**:确认插件包内 `assets/` 完整(`DSniang1.png`、`*.mp3`、`minecraft-exp-orb.wav` 等);缺失时相关功能静默降级。
414
+ - **装了 IDM / 迅雷 / Free Download Manager / Motrix 等下载管理器时,每次打开 DSH 都弹"下载确认框",目标 URL 是挂件的音效**(issue #158):这些管理器的浏览器集成会把页面里的音效请求当成下载任务抢走。**推荐做法:把本机地址加入它的站点排除列表**(IDM:`选项 → 文件类型 / 站点排除`,把 `127.0.0.1` 与 `localhost` 加进去;其它管理器同理,关键词是"排除本机地址 / 不监控该站点")。关掉挂件音效开关并不能消除弹窗 —— 音效元素在页面初始化时就会建立。
415
+ - **提问 / 授权时不响、也没泡泡**:这两个事件**默认开着**(默认**只冒泡、不响**)。想听声音就去「菜单 → 音效与提示 → 全局设置」,**点一下「提问提示」/「授权提示」那一行**把它展开,勾上「提问提示音效 / 授权提示音」那一行左侧的 `[✓]`(不勾 = 静音、但照旧冒泡),再在下拉里选一个音效;不需要提示就把该区入口行左边的总开关 `[✓]` 取消。(入口行右侧的摘要会实时显示当前配置。)
394
416
  - **余额报「未配置 DEEPSEEK_API_KEY」**:去 DSH 凭据里配置 API key;**或者**用「设置 → 账号与余额」登录 DeepSeek 账号(较新 DSH 支持)—— 没配 key 时插件会自动走账号态,不需要去 platform 建 key。
395
417
  - **余额拿到了、但提示「账本不可用 / 已停止写入以保护原记录」**:账本文件(`.dshw-usage.json`)被外部改坏或结构异常,插件**拒绝覆盖**它以免丢数据。先把它备份改名让插件重建,再按需用「余额校正」补账。
418
+ - **保存设置报 `403` / 在别的机器上改了配置不生效**:0.3.15 起**写操作只能在运行 DSH 的那台机器上、用 `127.0.0.1`(本机地址)打开界面进行**。从局域网或反向代理访问时,读没问题、写会被拒。需要远端管理就用 `DSHW_ADMIN_HOSTS` 显式授权那台机器(见「凭据 → 安全边界」)。
419
+ - **提示「该地址不是 … 的内置端点,已拒绝把凭据发出去」**:这是 0.3.15 的安全策略 —— **自定义接口地址默认拿不到凭据**。确认那是你自己的网关(New API / 自托管等)后,在**本机**打开面板,对该模型勾选「允许把凭据发送到自定义地址」。
396
420
  - **今日已用显示 `--`**:先等一次成功的余额观测;统计从该观测时刻开始,起点之前的消费不在此区间内。
397
421
  - **今日已用与官网有差异**:先核对同一账户、同一币种与同一统计区间;若有充值或其它余额调整,用「小鲸鱼记账 → DeepSeek(内置)→ 设置 → 余额校正」填写实际到账金额。余额接口只返回余额快照、不提供充值流水,充值与消费发生在同一次刷新间隔时需要实际到账金额才能校正。
398
422
  - **充值后消费数字没变**:这是预期行为——充值不会增加消费;数字上方会出现「待核对余额调整」,提示你补充本统计区间的累计到账金额。
399
- - **每轮消耗不显示**:确认菜单里「每轮对话后自动显示消耗金额」已勾选;一轮对话要完整结束(`turn/end`)才结算。余额变化泡泡与消耗泡泡抢层时,提醒会退化为居中卡片。
400
- - **每轮消耗泡泡的内容**:菜单 → 每轮消耗提示 → 「自定义提示」里编辑(模块化,金额用 `{cost}`);这里同时能设自动关闭秒数与任务结束音效。
401
- - **任务结束音没响**:该开关默认**关闭**(默认已选中内置的 Minecraft·经验球;另有内置预设 **A** 可选);到菜单 → 每轮消耗提示 → 「自定义提示」里打开即可。若自定义片段文件被删,会回退/静音。
423
+ - **每轮消耗不显示**:确认「音效与提示 → 全局设置」里「每轮消耗提示」那一行**左边的 `[✓]`** 是勾上的(入口行右侧摘要会直接显示 `已关闭` 或当前配置);一轮对话要完整结束(`turn/end`)才结算。余额变化泡泡与消耗泡泡抢层时,提醒会退化为居中卡片。
424
+ - **每轮消耗泡泡的内容**:「音效与提示 → 全局设置」→ **展开「每轮消耗提示」** → 「编辑提示内容」(模块化,金额用 `{cost}`);同一区里能设自动关闭秒数、提示音量与任务结束音效。
425
+ - **任务结束音没响**:该开关**默认开着**(默认音是内置 **`A`**,另有内置的 Minecraft·经验球可选);到「音效与提示 → 全局设置」→ **展开「每轮消耗提示」**,确认「任务结束音」那行左侧的 `[✓]` 是勾上的(取消勾选 = 静音)。若自定义片段文件被删,会回退/静音。
426
+ - **换了 / 删了 API key 之后,更早的记账天变成「本地估算 ¥0.00」**:记账按**密钥指纹分本**(一把 key 一本账),换 key 等于换了一本 —— 数据**没丢**,都在 `.dshw-usage.json` 的 `accounting.books` 里。当前版本已让界面把历史本里的日期正常显示(标注「已观测消费 · 历史账户」),并在「小鲸鱼记账」面板顶部提示「检测到 N 个记账本」;**两个本不会被相加**(插件无法判断两次是不是同一个账户),但同一天的明细可以在该面板的「每日与逐条明细」里逐日查看。
402
427
  - **手机上拖不动鲸鱼**:本版本已用触摸事件接管拖拽,请硬刷新页面拿到最新 `whale-widget.js`;仍不行请反馈浏览器型号。
403
428
  - **隐藏了菜单按钮怎么进菜单**:电脑端右键鲸鱼,手机端长按鲸鱼约 1.5 秒。
404
429
  - **改了前端代码不生效**:前端 `assets/whale-widget.js` 由宿主按 mtime 热读取,**硬刷新**(Ctrl+F5)即可;改了宿主 `lib/index.js` 必须**重启 `dsh web`**。
@@ -423,6 +448,7 @@ curl http://127.0.0.1:3080/dsh-whale/audio.json
423
448
 
424
449
  ## 致谢
425
450
 
451
+ - **0.3.15 的凭据安全修复**(写入自定义模型即可让宿主动用真实 API key 去请求任意地址,从而外带凭据)由 **B 站用户「星丶白羽莲」** 负责任地报告:把复现步骤、环境与前置条件一起给出,使这次能在**不打死自建网关这类正当用法**的前提下收紧边界。感谢他的支持。
426
452
  - **DSH 账号登录态读余额**(端点与鉴权头、凭据记录的位置、DSH 自身 `deepseekAccount` 服务的推荐调用方式,以及三个集成坑:账户标识字符集、赠金要计入基准、服务可能不存在)由 GitHub 用户 [@yybai25](https://github.com/yybai25) 在 [#157](https://github.com/MeteorNOX/DeepSeek-Balance-Whale-Widget/issues/157) 中给出完整规格与**已在自己机器上验证过的参考实现**;**0.3.14 据此实现**(只调 DSH 服务、不接触账号令牌)。感谢他的贡献。
427
453
  - 充值记账修复方案(余额上升与下降分开记账、显式余额校正公式、按账户/币种隔离观测窗口、账本原子写入与迁移备份)由 GitHub 用户 [@Yang-huai406](https://github.com/Yang-huai406) 独立设计并实现为可运行的修复分支;**0.3.1 在该方案基础上移植合并**,并保留本项目既有的音效修复。感谢他的支持。
428
454
  - OpenCode Go 订阅额度(多窗口额度 `quota.json.windows`、按窗口展示与紧凑重置倒计时、「订阅额度」模块的窗口选择)由 GitHub 用户 [@ELFsay](https://github.com/ELFsay) 提交([#99](https://github.com/MeteorNOX/DeepSeek-Balance-Whale-Widget/pull/99)),已合入 `main`。感谢他的贡献。