dsh-cost-meter 1.5.22 → 1.5.24

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.en.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  Per-conversation cost · daily totals · OpenCode Go subscription quota display · budget with usage percentage · official account balance · custom provider balance · balance progress bar · history · peak/off-peak pricing hours display (peak hours UTC 01:00–04:00, 06:00–10:00) · pre-switch popup & system-notification alerts for peak/off-peak changes (position / lead time / alert type configurable) · one-click price sync from the official docs · Codex-style token usage heat grid · multi-vendor model pricing (built-in 90+ model price catalog with auto-matching) · mainstream Coding Plan quota queries & display (Anthropic / Z.ai / MiniMax / Kimi / OpenRouter / SiliconFlow / SCNet)
8
8
 
9
- [![version](https://img.shields.io/badge/version-1.5.22-4176E6)](https://github.com/Han-1413141/dsh-cost-meter)
9
+ [![version](https://img.shields.io/badge/version-1.5.24-4176E6)](https://github.com/Han-1413141/dsh-cost-meter)
10
10
  [![npm](https://img.shields.io/npm/v/dsh-cost-meter?label=npm)](https://www.npmjs.com/package/dsh-cost-meter)
11
11
  [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE)
12
12
  [![dsh](https://img.shields.io/badge/DeepSeek%20Harness-dsh--plugin-4176E6)](https://github.com/deepseek-ai/deepseek-harness)
@@ -194,22 +194,22 @@ Real captures from an actual DSH sidebar of the period strip and collapsed verti
194
194
  dsh plugin --profile web add dsh-cost-meter
195
195
  ```
196
196
 
197
- **PowerShell one-click script** (copy the whole line, paste, press Enter; pnpm is provisioned automatically, git is auto-detected — no clone needed; the install chain is **pinned to the release tag `v1.5.22`** — review the script before running):
197
+ **PowerShell one-click script** (copy the whole line, paste, press Enter; pnpm is provisioned automatically, git is auto-detected — no clone needed; the install chain is **pinned to the release tag `v1.5.24`** — review the script before running):
198
198
 
199
199
  ```powershell
200
- irm https://raw.githubusercontent.com/Han-1413141/dsh-cost-meter/v1.5.22/install.ps1 | iex
200
+ irm https://raw.githubusercontent.com/Han-1413141/dsh-cost-meter/v1.5.24/install.ps1 | iex
201
201
  ```
202
202
 
203
203
  **Or a plain command line** (the machine must already have pnpm and git; also pinned to the tag):
204
204
 
205
205
  ```sh
206
- dsh plugin --profile web add github:Han-1413141/dsh-cost-meter#v1.5.22
206
+ dsh plugin --profile web add github:Han-1413141/dsh-cost-meter#v1.5.24
207
207
  ```
208
208
 
209
209
  Without git, use the GitHub tag archive:
210
210
 
211
211
  ```sh
212
- dsh plugin --profile web add https://github.com/Han-1413141/dsh-cost-meter/archive/refs/tags/v1.5.22.tar.gz
212
+ dsh plugin --profile web add https://github.com/Han-1413141/dsh-cost-meter/archive/refs/tags/v1.5.24.tar.gz
213
213
  ```
214
214
 
215
215
  After installing, **restart** `dsh web` (plugin rows, the Typert manifest and the client bundle are all scanned at startup):
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  本会话费用 · 当日费用 · OpenCode Go 订阅额度显示 · 预算与已用百分比 · 官方账户余额 · 自定义 Provider 余额查询(可配任意 HTTP 端点) · 余额三段进度条 · 历史记录 · 峰谷计价时段显示(UTC 01:00–04:00、06:00–10:00 为峰时段) · 峰/谷切换前弹窗与系统通知提醒(位置/提前量/提醒类型可配) · 官方价格一键同步 · 类 Codex Token 用量热图 · 多厂商多模型价格计费(内置 90+ 模型价格目录与自动匹配) · 主流 Coding Plan 额度查询与显示(Anthropic / Z.ai / MiniMax / Kimi / OpenRouter / SiliconFlow / SCNet 七家)
8
8
 
9
- [![version](https://img.shields.io/badge/version-1.5.22-4176E6)](https://github.com/Han-1413141/dsh-cost-meter)
9
+ [![version](https://img.shields.io/badge/version-1.5.24-4176E6)](https://github.com/Han-1413141/dsh-cost-meter)
10
10
  [![npm](https://img.shields.io/npm/v/dsh-cost-meter?label=npm)](https://www.npmjs.com/package/dsh-cost-meter)
11
11
  [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE)
12
12
  [![dsh](https://img.shields.io/badge/DeepSeek%20Harness-dsh--plugin-4176E6)](https://github.com/deepseek-ai/deepseek-harness)
@@ -196,22 +196,22 @@
196
196
  dsh plugin --profile web add dsh-cost-meter
197
197
  ```
198
198
 
199
- **PowerShell 一键脚本**(复制整行粘贴回车;自动补齐 pnpm、自动探测 git,无需克隆仓库;安装链**固定到发布 tag `v1.5.22`**,建议先下载审阅再运行):
199
+ **PowerShell 一键脚本**(复制整行粘贴回车;自动补齐 pnpm、自动探测 git,无需克隆仓库;安装链**固定到发布 tag `v1.5.24`**,建议先下载审阅再运行):
200
200
 
201
201
  ```powershell
202
- irm https://raw.githubusercontent.com/Han-1413141/dsh-cost-meter/v1.5.22/install.ps1 | iex
202
+ irm https://raw.githubusercontent.com/Han-1413141/dsh-cost-meter/v1.5.24/install.ps1 | iex
203
203
  ```
204
204
 
205
205
  **或直接命令行**(机器上需已有 pnpm 与 git;同样固定到 tag):
206
206
 
207
207
  ```sh
208
- dsh plugin --profile web add github:Han-1413141/dsh-cost-meter#v1.5.22
208
+ dsh plugin --profile web add github:Han-1413141/dsh-cost-meter#v1.5.24
209
209
  ```
210
210
 
211
211
  没有 git 时可用 GitHub tag 打包直链:
212
212
 
213
213
  ```sh
214
- dsh plugin --profile web add https://github.com/Han-1413141/dsh-cost-meter/archive/refs/tags/v1.5.22.tar.gz
214
+ dsh plugin --profile web add https://github.com/Han-1413141/dsh-cost-meter/archive/refs/tags/v1.5.24.tar.gz
215
215
  ```
216
216
 
217
217
  安装后**重启** `dsh web`(插件行、Typert 清单与客户端 bundle 均在启动时扫描):
package/lib/client.js CHANGED
@@ -71,6 +71,13 @@ window.__ModuleLoader__.load({
71
71
  '.cm-toolbar .cm-field{flex-direction:row;align-items:center;gap:8px}',
72
72
  '.cm-toolbar .cm-field label{margin:0;font-size:12px;color:var(--dsw-alias-label-tertiary)}',
73
73
  '.cm-toolbar .cm-input{min-width:150px;padding:4px 10px}',
74
+ // 设置页标签栏(issue #29):左侧分组标签,右侧常驻自动保存状态。
75
+ '.cm-tabs-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--dsh-alias-border-l1);padding-bottom:10px}',
76
+ '.cm-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}',
77
+ '.cm-tab{font:inherit;font-size:13px;color:var(--dsw-alias-label-secondary);background:transparent;border:none;border-radius:8px;padding:6px 14px;cursor:pointer;white-space:nowrap}',
78
+ '.cm-tab:hover{background:var(--dsw-alias-interactive-bg-hover)}',
79
+ '.cm-tab.active{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted);font-weight:600}',
80
+ '.cm-tabs-row .cm-msg{padding:2px 10px}',
74
81
  '.cm-note{font-size:12px;color:var(--dsw-alias-label-tertiary);margin:0}',
75
82
  '.cm-table{width:100%;border-collapse:collapse;font-size:12px}',
76
83
  '.cm-table th,.cm-table td{text-align:left;padding:7px 10px;border-bottom:1px solid var(--dsw-alias-border-l1);white-space:nowrap}',
@@ -556,6 +563,13 @@ window.__ModuleLoader__.load({
556
563
  usagePositionGeneral: '通用设置',
557
564
  usagePositionSection: '独立分节(用量)',
558
565
  displaySettings: '显示设置',
566
+ // 设置页标签(issue #29)
567
+ tabOverview: '概览',
568
+ tabQuotas: '额度',
569
+ tabUsage: '用量',
570
+ tabPricing: '价格',
571
+ tabDisplay: '显示',
572
+ historyDataTitle: '历史数据',
559
573
  positionLabel: '会话费用显示位置',
560
574
  positionDock: '输入区下方',
561
575
  positionHeader: '会话标题栏',
@@ -880,6 +894,13 @@ window.__ModuleLoader__.load({
880
894
  usagePositionGeneral: 'General settings',
881
895
  usagePositionSection: 'Own section (Usage)',
882
896
  displaySettings: 'Display settings',
897
+ // Settings tabs (issue #29)
898
+ tabOverview: 'Overview',
899
+ tabQuotas: 'Quotas',
900
+ tabUsage: 'Usage',
901
+ tabPricing: 'Pricing',
902
+ tabDisplay: 'Display',
903
+ historyDataTitle: 'History data',
883
904
  positionLabel: 'Session cost display position',
884
905
  positionDock: 'Below the composer',
885
906
  positionHeader: 'Session title bar',
@@ -3892,6 +3913,8 @@ window.__ModuleLoader__.load({
3892
3913
  const [busy, setBusy] = useState(false)
3893
3914
  // 价格表折叠开关(默认收起,保持设置页简洁;三角按钮展开)。
3894
3915
  const [priceOpen, setPriceOpen] = useState(false)
3916
+ // 设置页当前标签(issue #29):概览/额度/用量/价格/显示;仅切可见分区,不拆配置与保存逻辑。
3917
+ const [tab, setTab] = useState('overview')
3895
3918
  // 自动保存状态:idle(无改动) | saving | saved | error。
3896
3919
  const [saveState, setSaveState] = useState({ status: 'idle', at: 0, error: null })
3897
3920
  const savedRef = React.useRef(null)
@@ -4028,39 +4051,34 @@ window.__ModuleLoader__.load({
4028
4051
  isDefault: false, draft, setDraft, t,
4029
4052
  })
4030
4053
  ))
4054
+ // 设置页标签(issue #29):按用途分五组,切换只改可见分区,不拆配置模型与保存逻辑。
4055
+ const tabItems = [
4056
+ ['overview', t('tabOverview')],
4057
+ ['quotas', t('tabQuotas')],
4058
+ ['usage', t('tabUsage')],
4059
+ ['pricing', t('tabPricing')],
4060
+ ['display', t('tabDisplay')],
4061
+ ]
4062
+ // 自动保存状态常驻标签栏右侧:在任意标签页改动配置都能看到保存反馈。
4063
+ const saveBadge = saveState.status === 'saving'
4064
+ ? el('span', { className: 'cm-hint' }, t('saving'))
4065
+ : saveState.status === 'error'
4066
+ ? el('span', { className: 'cm-msg err' }, t('autoSaveFailed', { message: saveState.error ?? '' }))
4067
+ : el('span', { className: 'cm-hint' }, saveState.status === 'saved' ? t('autoSavedAt', { time: new Date(saveState.at).toLocaleTimeString() }) : t('autoSaveHint'))
4031
4068
  return el('div', { className: 'cm-section' },
4032
- // 顶栏:界面语言(打开费用设置即见)
4033
- el('div', { className: 'cm-toolbar' },
4034
- el('div', { className: 'cm-field' },
4035
- el('label', null, t('languageLabel')),
4036
- el('select', {
4037
- className: 'cm-input',
4038
- value: draft?.locale ?? 'auto',
4039
- onChange: event => setField('locale', event.target.value),
4040
- },
4041
- el('option', { value: 'auto' }, t('localeAuto')),
4042
- el('option', { value: 'zh' }, t('localeZh')),
4043
- el('option', { value: 'en' }, t('localeEn'))))),
4044
- // Token 用量统计(费用设置最上方)
4045
- (!USAGE_POSITION_SWITCHABLE || (config.usage?.position ?? 'cost') === 'cost')
4046
- ? el(UsagePanel, { state, t, locale })
4047
- : null,
4048
- // 按模型统计(紧随用量统计;今日/近90天:费用、token、缓存命中率、性价比)
4049
- el(ModelStatsPanel, { state, config: draft ?? config, t }),
4050
- // OpenCode Go 订阅额度(含启用开关,像预算面板一样常驻)
4051
- el(GoQuotaPanel, { state, api, t, draft, setDraft }),
4052
- // Coding Plan 额度(Anthropic / Z.ai·GLM / MiniMax,各家独立开关)
4053
- el(CodingPlansPanel, { state, api, t, draft, setDraft }),
4054
- // 自定义 Provider 余额(可配置 HTTP 查询;与 Coding Plan 同区,可折叠)
4055
- el(CustomBalancePanel, { state, api, t, draft, setDraft }),
4056
- // 预算(紧随其后)
4057
- el(BudgetPanel, { state, draft, setDraft, t }),
4058
- // 峰谷计价与提示(独立面板:启用/提示开关、样式切换、时段条预览)
4059
- el(PeakPanel, { state, draft, setDraft, t }),
4060
- // 官方余额(按显示配置)
4061
- (config.balance?.display === 'settings' || config.balance?.display === 'both')
4062
- ? el(BalancePanel, { state, api, t, draft, setDraft })
4063
- : null,
4069
+ // 标签栏:概览/额度/用量/价格/显示;右侧为全局自动保存状态。
4070
+ el('div', { className: 'cm-tabs-row' },
4071
+ el('div', { className: 'cm-tabs', role: 'tablist' },
4072
+ tabItems.map(([id, label]) => el('button', {
4073
+ key: id, type: 'button', role: 'tab', 'aria-selected': String(tab === id),
4074
+ className: 'cm-tab' + (tab === id ? ' active' : ''),
4075
+ onClick: () => setTab(id),
4076
+ }, label))),
4077
+ saveBadge),
4078
+ // 操作结果提示(价格同步/历史导入/清除):全局展示,不随触发按钮所在标签页。
4079
+ message !== null ? el('div', { className: 'cm-msg ' + message.kind }, message.text) : null,
4080
+ // ── 概览:汇总卡片、今日会话、预算、官方余额 ──
4081
+ tab === 'overview' ? el(Fragment, { key: 'overview' },
4064
4082
  // 汇总卡片
4065
4083
  el('div', { className: 'cm-cards' },
4066
4084
  el(Card, {
@@ -4092,10 +4110,66 @@ window.__ModuleLoader__.load({
4092
4110
  el('div', null,
4093
4111
  el('h3', { className: 'cm-h' }, t('todaySessions')),
4094
4112
  el(TodaySessions, { state, t })),
4113
+ // 预算
4114
+ el(BudgetPanel, { state, draft, setDraft, t }),
4115
+ // 官方余额(按显示配置)
4116
+ (config.balance?.display === 'settings' || config.balance?.display === 'both')
4117
+ ? el(BalancePanel, { state, api, t, draft, setDraft })
4118
+ : null)
4119
+ : null,
4120
+ // ── 额度:OpenCode Go、Coding Plan、自定义 Provider 余额 ──
4121
+ tab === 'quotas' ? el(Fragment, { key: 'quotas' },
4122
+ // OpenCode Go 订阅额度(含启用开关,像预算面板一样常驻)
4123
+ el(GoQuotaPanel, { state, api, t, draft, setDraft }),
4124
+ // Coding Plan 额度(Anthropic / Z.ai·GLM / MiniMax,各家独立开关)
4125
+ el(CodingPlansPanel, { state, api, t, draft, setDraft }),
4126
+ // 自定义 Provider 余额(可配置 HTTP 查询;与 Coding Plan 同区,可折叠)
4127
+ el(CustomBalancePanel, { state, api, t, draft, setDraft }))
4128
+ : null,
4129
+ // ── 用量:热图、按模型统计、历史、按会话统计、历史数据操作 ──
4130
+ tab === 'usage' ? el(Fragment, { key: 'usage' },
4131
+ // Token 用量统计(position=cost 时留在费用分节;移至通用/独立分节后不在此渲染)
4132
+ (!USAGE_POSITION_SWITCHABLE || (config.usage?.position ?? 'cost') === 'cost')
4133
+ ? el(UsagePanel, { state, t, locale })
4134
+ : null,
4135
+ // 按模型统计(今日/近90天:费用、token、缓存命中率、性价比)
4136
+ el(ModelStatsPanel, { state, config: draft ?? config, t }),
4095
4137
  // 历史(三角折叠面板;日期行可再展开会话明细)
4096
4138
  el(HistoryPanel, { state, api }),
4097
4139
  // 按会话统计(全部历史,不分日期;issue #22)
4098
4140
  el(SessionRankPanel, { state, api }),
4141
+ // 历史数据操作(导入安装前历史/清除全部历史;与用量统计同组)
4142
+ el('div', null,
4143
+ el('h3', { className: 'cm-h' }, t('historyDataTitle')),
4144
+ el('div', { className: 'cm-buttons' },
4145
+ confirmImport
4146
+ ? el(Fragment, null,
4147
+ el('span', { className: 'cm-hint' }, t('confirmImportLegacy')),
4148
+ el('button', { className: 'cm-btn', onClick: doImportLegacy, disabled: busy }, t('apply')),
4149
+ el('button', { className: 'cm-btn', onClick: () => setConfirmImport(false) }, t('cancel')))
4150
+ : el('button', { className: 'cm-btn', onClick: () => setConfirmImport(true), disabled: busy }, t('importLegacy')),
4151
+ confirmReset
4152
+ ? el(Fragment, null,
4153
+ el('span', { className: 'cm-hint' }, t('confirmReset')),
4154
+ el('button', { className: 'cm-btn danger', onClick: doReset, disabled: busy }, t('confirmClear')),
4155
+ el('button', { className: 'cm-btn', onClick: () => setConfirmReset(false) }, t('cancel')))
4156
+ : el('button', { className: 'cm-btn danger', onClick: () => setConfirmReset(true), disabled: busy }, t('clearAllHistory'))),
4157
+ el('p', { className: 'cm-note' }, t('legacyImportNote'))))
4158
+ : null,
4159
+ // ── 显示:界面语言、徽章/侧边栏位置、图框开关等 ──
4160
+ tab === 'display' ? el(Fragment, { key: 'display' },
4161
+ // 顶栏:界面语言
4162
+ el('div', { className: 'cm-toolbar' },
4163
+ el('div', { className: 'cm-field' },
4164
+ el('label', null, t('languageLabel')),
4165
+ el('select', {
4166
+ className: 'cm-input',
4167
+ value: draft?.locale ?? 'auto',
4168
+ onChange: event => setField('locale', event.target.value),
4169
+ },
4170
+ el('option', { value: 'auto' }, t('localeAuto')),
4171
+ el('option', { value: 'zh' }, t('localeZh')),
4172
+ el('option', { value: 'en' }, t('localeEn'))))),
4099
4173
  // 显示设置
4100
4174
  el('div', null,
4101
4175
  el('h3', { className: 'cm-h' }, t('displaySettings')),
@@ -4323,7 +4397,12 @@ window.__ModuleLoader__.load({
4323
4397
  },
4324
4398
  }),
4325
4399
  el('span', null, t('budgetDetailLabel'))))),
4326
- el('p', { className: 'cm-note' }, t('badgeNote'))),
4400
+ el('p', { className: 'cm-note' }, t('badgeNote'))))
4401
+ : null,
4402
+ // ── 价格:价格表、模型名匹配、拓展价格表、峰谷计价与提示、官方价格同步 ──
4403
+ tab === 'pricing' ? el(Fragment, { key: 'pricing' },
4404
+ // 峰谷计价与提示(独立面板:启用/提示开关、样式切换、时段条预览)
4405
+ el(PeakPanel, { state, draft, setDraft, t }),
4327
4406
  // 价格表(可折叠,默认收起;priceTableDisplay 按模型门控:未勾选直接显示的模型收入拓展价格表,该开关只决定展示位置)
4328
4407
  el('div', null,
4329
4408
  el('button', { type: 'button', className: 'cm-collapse-h', 'aria-expanded': String(priceOpen), onClick: () => setPriceOpen(!priceOpen) },
@@ -4423,38 +4502,20 @@ window.__ModuleLoader__.load({
4423
4502
  })(),
4424
4503
  // 拓展价格表(厂商/家族分类目录;挂载 ↔ 费用设置价格表)
4425
4504
  el(PriceCatalogPanel, { state, draft, setDraft, t }),
4426
- // 操作
4505
+ // 官方价格同步(与价格表同组;自动保存状态已移至标签栏常驻)
4427
4506
  el('div', null,
4428
4507
  el('h3', { className: 'cm-h' }, t('dataSync')),
4429
4508
  el('div', { className: 'cm-buttons' },
4430
- saveState.status === 'saving'
4431
- ? el('span', { className: 'cm-hint' }, t('saving'))
4432
- : saveState.status === 'error'
4433
- ? el('span', { className: 'cm-msg err' }, t('autoSaveFailed', { message: saveState.error ?? '' }))
4434
- : el('span', { className: 'cm-hint' }, saveState.status === 'saved' ? t('autoSavedAt', { time: new Date(saveState.at).toLocaleTimeString() }) : t('autoSaveHint')),
4435
4509
  confirmFetch
4436
4510
  ? el(Fragment, null,
4437
4511
  el('span', { className: 'cm-hint' }, t('confirmFetch')),
4438
4512
  el('button', { className: 'cm-btn', onClick: doFetch, disabled: busy }, t('apply')),
4439
4513
  el('button', { className: 'cm-btn', onClick: () => setConfirmFetch(false) }, t('cancel')))
4440
- : el('button', { className: 'cm-btn', onClick: () => setConfirmFetch(true), disabled: busy }, t('syncFromDocs')),
4441
- confirmImport
4442
- ? el(Fragment, null,
4443
- el('span', { className: 'cm-hint' }, t('confirmImportLegacy')),
4444
- el('button', { className: 'cm-btn', onClick: doImportLegacy, disabled: busy }, t('apply')),
4445
- el('button', { className: 'cm-btn', onClick: () => setConfirmImport(false) }, t('cancel')))
4446
- : el('button', { className: 'cm-btn', onClick: () => setConfirmImport(true), disabled: busy }, t('importLegacy')),
4447
- confirmReset
4448
- ? el(Fragment, null,
4449
- el('span', { className: 'cm-hint' }, t('confirmReset')),
4450
- el('button', { className: 'cm-btn danger', onClick: doReset, disabled: busy }, t('confirmClear')),
4451
- el('button', { className: 'cm-btn', onClick: () => setConfirmReset(false) }, t('cancel')))
4452
- : el('button', { className: 'cm-btn danger', onClick: () => setConfirmReset(true), disabled: busy }, t('clearAllHistory'))),
4514
+ : el('button', { className: 'cm-btn', onClick: () => setConfirmFetch(true), disabled: busy }, t('syncFromDocs'))),
4453
4515
  el('p', { className: 'cm-note' },
4454
4516
  t('lastSync', { time: config.fetchedAt !== null ? new Date(config.fetchedAt).toLocaleString() : t('neverSynced') })
4455
- + t('source', { source: config.priceSource === 'official' ? t('sourceOfficial') : t('sourceBundled') })),
4456
- el('p', { className: 'cm-note' }, t('legacyImportNote')),
4457
- message !== null ? el('div', { className: 'cm-msg ' + message.kind }, message.text) : null))
4517
+ + t('source', { source: config.priceSource === 'official' ? t('sourceOfficial') : t('sourceBundled') }))))
4518
+ : null)
4458
4519
  }
4459
4520
 
4460
4521
  // ── 插件主体 ────────────────────────────────────────────────────────────
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-cost-meter",
3
- "version": "1.5.22",
3
+ "version": "1.5.24",
4
4
  "description": "DeepSeek Harness 会话费用统计插件:本会话成本、当日费用、历史记录与官方价格同步,支持多厂商多模型价格计费(内置 90+ 模型价格目录与自动匹配)、主流 Coding Plan 订阅额度查询与显示(7 家,含 SCNet Token Plan 本地 Credits 计量)、自定义 Provider 余额查询(可配任意 HTTP 端点)与余额进度条、峰谷计价时段显示与切换前弹窗/系统通知提醒(位置/提前量/类型可配),界面中英双语。Session cost tracking plugin for DeepSeek Harness: per-conversation cost, daily totals, history and official price sync, with multi-vendor model pricing (built-in 90+ model catalog with auto-matching), Coding Plan quota queries & display for 7 vendors (incl. local credits metering for the SCNet Token Plan), custom provider balance lookup (configurable HTTP endpoint) and balance progress bar, plus peak/off-peak pricing display with pre-switch popup & system-notification alerts (position / lead time / type configurable), in a bilingual (Chinese/English) UI.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",