@kenz1117/dsh-ui-usage-billing 0.8.2 → 0.9.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.
Files changed (3) hide show
  1. package/README.md +6 -3
  2. package/lib/client.js +513 -284
  3. package/package.json +29 -29
package/README.md CHANGED
@@ -10,7 +10,10 @@ DeepSeek Harness 计费仪表盘插件。从持久化会话日志实时聚合模
10
10
 
11
11
  ## 特性
12
12
 
13
- - **侧边栏入口**:设置按钮上方的玻璃拟态渐变触发卡,显示**当月费用 + 今日费用**,hover 光晕上浮;折叠栏自动切换为渐变徽章图标。
13
+ - **侧边栏入口(0.9.1 重设计)**:设置按钮上方的仪表盘式触发卡——**本月费用**为主数字(等宽字体)+ 右侧**近 7 天 sparkline** 迷你趋势,副行「今日 / 本周」;渐变蓝图标 + 克制冷调,无需点开即可一眼看趋势;折叠栏自动切换为渐变图标钮。
14
+ - **官方 vs 三方分桶(0.9.1)**:明细模型费用列按**官方 DeepSeek 直连 / 第三方中转**分解显示(混合时「官 x / 三 y」),统计 Tab 新增「官方/三方」汇总卡片,快速分辨 token 与费用走官方还是中转。
15
+ - **对话完成提醒(0.9.1)**:会话 `running→completed` 迁移时可选弹一条桌面通知(默认关闭,面板设置开启),同批完成合并为一条、跳过初始基线。
16
+ - **低调科技风视觉(0.9.0 重构)**:面板全面去「AI 味」——移除渐变描边、毛玻璃、径向光晕与渐变文字大数字,改为令牌实底 + 1px 描边 + 明度分层图表的克制冷调;Tab 收敛为下划线 + 单色强调,图表与热力图按明度分层,配色全部走 `--dsw-*` 令牌、深浅主题自适应。
14
17
  - **计费仪表盘(分区 Tab)**:弹窗按 **概览 / 趋势 / 明细 / 统计 / 费率** 五个分区组织——概览(Hero 本月大数字 + 本年 / 今日环比 / **本月预计** + 预算条 + KPI×4 + 用量热力图)、趋势(每日费用趋势图 7/30 天 + 每轮费用)、明细(厂商计费与订阅)、统计(工作区 + 会话明细)、费率(模型单价表)。渐变描边卡片 + 毛玻璃遮罩 + 进入动画,全部用设计令牌派生渐变色,深色/浅色主题自适应。
15
18
  - **即时代费用条**:会话输入框下方常驻一行「本轮 ¥x · 会话 ¥y」,30 秒轮询刷新;同时显示**峰谷当前档位与切换倒计时**(峰时 / 平价 + 距下次切档时间),以及订阅套餐低额度预警 chips(剩余 ≤20% 时浮现,≤10% 变红),无需打开仪表盘。
16
19
  - **峰/谷切换提醒**:距进入下一计费档(北京时间高峰 9-12 / 14-18)不足 2 分钟时系统通知一次(同一切换点只提醒一次,`lastTierSwitchAt` 持久化),文案区分「即将进峰时 ×2 可稍等」/「即将进平价 价格减半」。
@@ -37,7 +40,7 @@ DeepSeek Harness 计费仪表盘插件。从持久化会话日志实时聚合模
37
40
  - **用量热力图**:当月日历热力图(本月 1 号到今天每天一格,周日开头 7 列),按日费用分 5 档色阶,悬停显示日期与金额。概览 Tab 常驻。
38
41
  - **每轮费用与成本突增**:按会话轮次折叠的每轮费用图(最近 40 轮),位于趋势 Tab;每根柱子顶部标注该轮费用数字,相对近 6 轮成本超 2 倍的轮次红色标注并归因(输出增长 / 上下文膨胀 / 缓存命中率下降)。
39
42
  - **工作区统计**:按会话工作目录(cwd 末级)归并的花费 / 调用 / Token 汇总表。
40
- - **双币种显示**:仪表盘右上角 ¥ / $ 切换,美元金额按当前汇率换算显示。
43
+ - **双币种显示 & 多语种联动**:仪表盘右上角 ¥ / $ 切换——美元金额按当前汇率换算显示;面板文案同时随币种切换(USD → 英文、CNY → 中文,仅本插件生效,不影响宿主全局语言)。费率表的单价也按所选币种换算(切 USD 时人民币计价模型换算为 $,不再固定显示 ¥)。
41
44
  - **触发卡 hover 速览**:悬停侧边栏触发卡即浮现速览卡(今日 / 本周 / 当月 + 近 7 天迷你柱),无需点开仪表盘。
42
45
  - **峰谷时段占比**:趋势 Tab 内按每轮起始时刻(北京时间高峰 9-12 / 14-18)精确分摊高峰 / 空闲费用,堆叠条 + 金额百分比图例。
43
46
  - **费用构成(估算)**:统计 Tab 内按角色归因的三段堆叠条(用户输入 / 助手输出 / 工具结果)——输出成本实测计价,输入成本按消息文本长度占比摊分(日志无角色级实测 token,标注估算口径)。
@@ -102,7 +105,7 @@ npm install @kenz1117/dsh-ui-usage-billing
102
105
 
103
106
  ## 计费引擎
104
107
 
105
- 单价表(`src/client/pricing.ts`)采用**原生币种**存储:国内厂商直接录入人民币价格,国外厂商录入美元价格。费用统一以人民币计算与展示——美元模型按**实时汇率**折算,国内模型全程不经过汇率换算。启动时服务端拉取实时汇率与模型价(`src/pricing-fetch.ts`):USD→CNY 优先腾讯财经行情(免 key、国内可达),失败依次降级 open.er-api 与内置默认值;之后每 6 小时后台刷新,单价表弹窗标注「今日汇率」与实时 / 内置徽标。
108
+ 单价表(`src/client/pricing.ts`)采用**原生币种**存储:国内厂商直接录入人民币价格,国外厂商录入美元价格。费用统一以人民币计算与展示——美元模型按**实时汇率**折算,国内模型全程不经过汇率换算。启动时服务端拉取实时汇率与模型价(`src/pricing-fetch.ts`):USD→CNY 优先腾讯财经行情(免 key、国内可达),失败依次降级 open.er-api 与内置默认值;之后每 6 小时后台刷新,单价表弹窗标注「今日汇率」与实时 / 内置徽标。金额与费率表的**展示币种跟随用户所选**:切 ¥ / $ 时把每条每百万 token 单价经 `convertUnitPrice` 按实时汇率换算到目标币种再显示(汇率缺失时回退原生币种)。
106
109
 
107
110
  ```
108
111
  cost(CNY)= (missInput × p_input + cacheHit × p_cacheHit + output × p_output) / 10⁶
package/lib/client.js CHANGED
@@ -24,7 +24,7 @@ window.__ModuleLoader__.load({
24
24
  }
25
25
  //#endregion
26
26
  //#region \0dsh-css:/Users/ken/deepseek-harness/packages/client/ui-usage-billing/src/client/UsageBilling.module.css.mjs
27
- const css = ".VWh0dG_railButton{border:1px solid color-mix(in srgb, var(--dsw-static-blue-500) 28%, var(--dsw-alias-border-l2));background:linear-gradient(135deg, color-mix(in srgb, var(--dsw-static-blue-500) 14%, var(--dsw-alias-bg-layer-1)), var(--dsw-alias-bg-layer-1));width:36px;height:36px;color:var(--dsw-static-blue-500);cursor:pointer;border-radius:10px;flex:none;justify-content:center;align-items:center;padding:0;transition:border-color .16s,box-shadow .16s,transform .16s,color .16s;display:flex}.VWh0dG_railButton:hover,.VWh0dG_railButton:focus-visible{border-color:color-mix(in srgb, var(--dsw-static-blue-500) 48%, var(--dsw-alias-border-l2));box-shadow:0 4px 14px -6px color-mix(in srgb, var(--dsw-static-blue-500) 55%, transparent);color:var(--dsw-static-blue-400);outline:none;transform:translateY(-1px)}.VWh0dG_railButton svg{stroke-width:2px;width:18px;height:18px}.VWh0dG_trigger{border:1px solid color-mix(in srgb, var(--dsw-static-blue-500) 20%, var(--dsw-alias-border-l1));background:radial-gradient(130% 180% at 0% 0%, color-mix(in srgb, var(--dsw-static-blue-500) 12%, transparent), transparent 55%), radial-gradient(150% 200% at 100% 110%, color-mix(in srgb, var(--dsw-static-blue-400) 9%, transparent), transparent 60%), var(--dsw-alias-bg-layer-1);width:100%;min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:12px;align-items:center;gap:12px;padding:10px 14px;transition:border-color .16s,box-shadow .16s,transform .16s;display:flex;position:relative;overflow:hidden}@supports (backdrop-filter:blur(1px)){.VWh0dG_trigger{background:radial-gradient(130% 180% at 0% 0%, color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent), transparent 55%), radial-gradient(150% 200% at 100% 110%, color-mix(in srgb, var(--dsw-static-blue-400) 10%, transparent), transparent 60%), color-mix(in srgb, var(--dsw-alias-bg-layer-1) 72%, transparent);backdrop-filter:blur(12px)}}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:color-mix(in srgb, var(--dsw-static-blue-500) 42%, var(--dsw-alias-border-l1));box-shadow:0 8px 24px -10px color-mix(in srgb, var(--dsw-static-blue-500) 45%, transparent);outline:none;transform:translateY(-1px)}.VWh0dG_triggerIcon{background:linear-gradient(135deg, var(--dsw-static-blue-500), var(--dsw-static-blue-400));width:28px;height:28px;color:var(--dsw-static-neutral-bluish-00);box-shadow:0 2px 8px -2px color-mix(in srgb, var(--dsw-static-blue-500) 60%, transparent);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.VWh0dG_triggerIcon svg{stroke-width:1.8px;width:15px;height:15px}.VWh0dG_triggerToday,.VWh0dG_triggerMonth{align-items:baseline;gap:4px;min-width:0;display:flex}.VWh0dG_triggerDivider{background:var(--dsw-alias-border-l1);align-self:stretch;width:1px}.VWh0dG_triggerAmount{color:var(--dsw-alias-label-primary);letter-spacing:-.01em;font-variant-numeric:tabular-nums;white-space:nowrap;font-size:18px;font-weight:600;line-height:22px}.VWh0dG_triggerAmountSub{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:13px;font-weight:600;line-height:18px}.VWh0dG_triggerMeta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10.5px;line-height:14px}.VWh0dG_triggerWrap{flex:auto;width:100%;min-width:0;display:block;position:relative}.VWh0dG_triggerPop{border:1px solid color-mix(in srgb, var(--dsw-static-blue-500) 22%, var(--dsw-alias-border-l1));background:radial-gradient(130% 180% at 0% 0%, color-mix(in srgb, var(--dsw-static-blue-500) 12%, transparent), transparent 55%), var(--dsw-alias-bg-layer-2);box-shadow:0 12px 32px -12px color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);opacity:0;pointer-events:none;z-index:10;border-radius:12px;flex-direction:column;gap:6px;padding:12px 14px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;transform:translateY(4px)}@supports (backdrop-filter:blur(1px)){.VWh0dG_triggerPop{background:radial-gradient(130% 180% at 0% 0%, color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent), transparent 55%), color-mix(in srgb, var(--dsw-alias-bg-layer-2) 82%, transparent);backdrop-filter:blur(14px)}}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_triggerPopRow{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_triggerPopValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:13px;font-weight:600;line-height:18px}.VWh0dG_triggerPopBars{border-top:1px solid var(--dsw-alias-border-l1);align-items:flex-end;gap:4px;height:22px;margin-top:4px;padding-top:8px;display:flex}.VWh0dG_triggerPopBar{background:linear-gradient(180deg, var(--dsw-static-blue-400), var(--dsw-static-blue-500));border-radius:2px;flex:1;transition:height .2s}.VWh0dG_dashboardModal{background:linear-gradient(var(--dsw-alias-bg-layer-2), var(--dsw-alias-bg-layer-2)) padding-box, linear-gradient(135deg, color-mix(in srgb, var(--dsw-static-blue-500) 55%, transparent), color-mix(in srgb, var(--dsw-static-blue-400) 22%, transparent) 45%, color-mix(in srgb, var(--dsw-static-blue-500) 38%, transparent)) border-box;width:min(760px,100vw - 48px);max-height:min(760px,88vh);box-shadow:var(--dsw-shadow-lv3), 0 24px 80px -24px color-mix(in srgb, var(--dsw-static-blue-500) 35%, transparent);border:1px solid #0000;animation:.18s ease-out VWh0dG_dashboardIn}@keyframes VWh0dG_dashboardIn{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:none}}div[role=presentation]:has(>.dsh-billing-modal)>div[aria-hidden=true]:first-child{backdrop-filter:blur(8px)saturate(1.25)}.VWh0dG_dashboard{flex-direction:column;width:100%;max-height:min(760px,88vh);display:flex}.VWh0dG_dashboardHead{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:flex-start;gap:12px;padding:20px 24px 14px;display:flex}.VWh0dG_dashboardTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:17px;font-weight:600;line-height:24px}.VWh0dG_dashboardSubtitle{color:var(--dsw-alias-label-caption);margin:3px 0 0;font-size:12px;line-height:17px}.VWh0dG_closeButton{width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex:none;justify-content:center;align-items:center;transition:background-color .14s;display:inline-flex}.VWh0dG_closeButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.VWh0dG_closeButton svg{stroke-width:2px;width:16px;height:16px}.VWh0dG_dashboardBody{flex-direction:column;gap:14px;padding:16px 24px 24px;display:flex;overflow-y:auto}.VWh0dG_tabNav{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:4px;padding:10px 24px;display:flex}.VWh0dG_tabButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;padding:5px 14px;font-size:12.5px;font-weight:500;line-height:18px;transition:background-color .16s,color .16s,box-shadow .16s}.VWh0dG_tabButton:hover,.VWh0dG_tabButton:focus-visible{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover);outline:none}.VWh0dG_tabButtonActive,.VWh0dG_tabButtonActive:hover,.VWh0dG_tabButtonActive:focus-visible{background:linear-gradient(135deg, var(--dsw-static-blue-500), color-mix(in srgb, var(--dsw-static-blue-500) 72%, var(--dsw-static-blue-400)));color:var(--dsw-static-neutral-bluish-00);box-shadow:0 2px 10px -3px color-mix(in srgb, var(--dsw-static-blue-500) 55%, transparent);font-weight:600}.VWh0dG_tabPanel{flex-direction:column;gap:14px;animation:.14s ease-out VWh0dG_tabPanelIn;display:flex}@keyframes VWh0dG_tabPanelIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.VWh0dG_hero{border:1px solid color-mix(in srgb, var(--dsw-static-blue-500) 16%, var(--dsw-alias-border-l1));background:radial-gradient(90% 150% at 6% 0%, color-mix(in srgb, var(--dsw-static-blue-500) 10%, transparent), transparent 60%), radial-gradient(70% 130% at 96% 100%, color-mix(in srgb, var(--dsw-static-blue-400) 8%, transparent), transparent 55%), var(--dsw-alias-bg-layer-1);border-radius:16px;justify-content:space-between;align-items:center;gap:24px;padding:20px 24px;display:flex;position:relative;overflow:hidden}.VWh0dG_heroMain{flex-direction:column;gap:4px;min-width:0;display:flex}.VWh0dG_heroLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px;line-height:17px}.VWh0dG_heroValue{letter-spacing:-.02em;font-variant-numeric:tabular-nums;white-space:nowrap;background:linear-gradient(120deg, var(--dsw-alias-label-primary) 25%, color-mix(in srgb, var(--dsw-static-blue-500) 85%, var(--dsw-alias-label-primary)));color:#0000;-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:44px;font-weight:600;line-height:52px}.VWh0dG_heroMeta{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:12px;line-height:17px}.VWh0dG_heroGauge{flex:none;width:108px;height:108px;position:relative}.VWh0dG_heroGaugeSvg{width:100%;height:100%;display:block;transform:rotate(-90deg)}.VWh0dG_heroGaugeTrack{fill:none;stroke:var(--dsw-alias-bg-module-platform);stroke-width:10px}.VWh0dG_heroGaugeArc{fill:none;stroke:url(#heroGaugeGradient);stroke-width:10px;stroke-linecap:round;transition:stroke-dasharray .26s}.VWh0dG_heroGaugeArcOver{stroke:var(--dsw-static-red-500)}.VWh0dG_heroGaugeCenter{flex-direction:column;justify-content:center;align-items:center;gap:1px;display:flex;position:absolute;inset:0}.VWh0dG_heroGaugePct{letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);font-size:22px;font-weight:700;line-height:26px}.VWh0dG_heroGaugePctOver{color:var(--dsw-static-red-500)}.VWh0dG_heroGaugeLabel{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:14px}.VWh0dG_heroSide{border-left:1px solid var(--dsw-alias-border-l1);flex-direction:column;flex:none;gap:8px;padding-left:24px;display:flex}.VWh0dG_heroSideItem{flex-direction:column;gap:2px;display:flex}.VWh0dG_heroSideLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px;line-height:15px}.VWh0dG_heroSideValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;white-space:nowrap;align-items:baseline;gap:6px;font-size:17px;font-weight:600;line-height:23px;display:inline-flex}.VWh0dG_delta{align-items:center;gap:2px;margin-left:4px;font-size:11px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_deltaUp{color:var(--dsw-static-green-500)}.VWh0dG_deltaDown{color:var(--dsw-static-red-500)}.VWh0dG_kpiGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.VWh0dG_kpiTile{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;flex-direction:column;gap:3px;padding:14px 15px;transition:border-color .16s,background-color .16s,transform .16s,box-shadow .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_kpiTile:before{content:\"\";background:linear-gradient(90deg, color-mix(in srgb, var(--dsw-static-blue-500) 70%, transparent), transparent);opacity:.7;height:2px;position:absolute;inset:0 0 auto}.VWh0dG_kpiTile:has(.VWh0dG_kpiGreen):before{background:linear-gradient(90deg, color-mix(in srgb, var(--dsw-static-green-500) 70%, transparent), transparent)}.VWh0dG_kpiTile:hover{border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-interactive-bg-hover);box-shadow:0 6px 16px -8px color-mix(in srgb, var(--dsw-alias-label-primary) 35%, transparent);transform:translateY(-1px)}.VWh0dG_kpiLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:15px}.VWh0dG_kpiValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:22px;font-weight:600;line-height:28px}.VWh0dG_kpiGreen{color:var(--dsw-static-green-500)}.VWh0dG_kpiDetail{color:var(--dsw-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;font-size:11px;line-height:15px;overflow:hidden}.VWh0dG_panel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:10px;padding:16px 18px;transition:border-color .16s;display:flex}.VWh0dG_panelHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_panelTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:600;line-height:20px}.VWh0dG_panelHint{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_rangeToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.VWh0dG_rangeButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:11px;line-height:16px;transition:background-color .14s,color .14s}.VWh0dG_rangeButtonActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_exportBar{justify-content:flex-end;align-items:center;gap:8px;display:flex}.VWh0dG_exportLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:16px}.VWh0dG_exportButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:999px;padding:4px 12px;font-size:11.5px;line-height:16px;transition:border-color .16s,color .16s,background-color .16s}.VWh0dG_exportButton:hover,.VWh0dG_exportButton:focus-visible{border-color:color-mix(in srgb, var(--dsw-static-blue-500) 40%, var(--dsw-alias-border-l1));color:var(--dsw-static-blue-500);outline:none}.VWh0dG_shareTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:10px;display:flex;overflow:hidden}.VWh0dG_shareSeg{height:100%;transition:width .2s}.VWh0dG_shareSegPeak{background:linear-gradient(90deg, var(--dsw-static-blue-500), var(--dsw-static-blue-400))}.VWh0dG_shareSegOff{background:color-mix(in srgb, var(--dsw-static-blue-500) 30%, var(--dsw-alias-bg-module-platform))}.VWh0dG_shareSegUser{background:linear-gradient(90deg, var(--dsw-static-blue-500), var(--dsw-static-blue-400))}.VWh0dG_shareSegAssistant{background:linear-gradient(90deg, var(--dsw-static-green-500), color-mix(in srgb, var(--dsw-static-green-500) 70%, var(--dsw-static-blue-400)))}.VWh0dG_shareSegTool{background:color-mix(in srgb, var(--dsw-static-amber-500) 80%, var(--dsw-alias-bg-module-platform))}.VWh0dG_shareLegend{align-items:center;gap:16px;display:flex}.VWh0dG_shareItem{color:var(--dsw-alias-label-secondary);align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_shareDot{border-radius:50%;flex:none;align-self:center;width:8px;height:8px}.VWh0dG_shareValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_budget{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;flex-direction:column;gap:8px;padding:12px 16px;display:flex}.VWh0dG_budgetHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_budgetLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}.VWh0dG_budgetValue{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:17px}.VWh0dG_budgetControls{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_budgetInputWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;align-items:center;gap:2px;padding:2px 6px;display:inline-flex}.VWh0dG_budgetInputWrap:focus-within{border-color:var(--dsw-alias-border-l3)}.VWh0dG_budgetUnit{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_budgetInput{width:64px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:right;background:0 0;border:none;padding:0;font-size:12px;line-height:16px}.VWh0dG_budgetInput:focus-visible{outline:none}.VWh0dG_switch{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);cursor:pointer;border-radius:999px;flex:none;width:30px;height:17px;padding:0;transition:background-color .16s,border-color .16s;position:relative}.VWh0dG_switchOn{border-color:var(--dsw-static-blue-500);background:var(--dsw-static-blue-500)}.VWh0dG_switchKnob{background:var(--dsw-static-neutral-bluish-00);border-radius:50%;width:11px;height:11px;transition:transform .16s;position:absolute;top:2px;left:2px}.VWh0dG_switchOn .VWh0dG_switchKnob{transform:translate(13px)}.VWh0dG_budgetTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:6px;overflow:hidden}.VWh0dG_budgetFill{background:var(--dsw-static-blue-500);border-radius:999px;height:100%;transition:width .2s}.VWh0dG_budgetFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_budgetFillOver{background:var(--dsw-static-red-500);animation:1.6s ease-in-out infinite VWh0dG_budgetOverPulse}@keyframes VWh0dG_budgetOverPulse{50%{opacity:.55}}.VWh0dG_chartWrap{width:100%;position:relative}.VWh0dG_chartSvg{width:100%;height:auto;display:block}.VWh0dG_chartEmpty{height:140px;color:var(--dsw-alias-label-caption);justify-content:center;align-items:center;font-size:13px;display:flex}.VWh0dG_emptyRow{text-align:center;color:var(--dsw-alias-label-caption);padding:28px 0;font-size:13px}.VWh0dG_chartGrid{stroke:var(--dsw-alias-border-l1);stroke-width:1px}.VWh0dG_chartAxisLabel{fill:var(--dsw-alias-label-tertiary);font-size:10px}.VWh0dG_chartBar{fill:var(--dsw-static-blue-500);opacity:.35}.VWh0dG_chartBar:hover{opacity:.6}.VWh0dG_chartStack{stroke:var(--dsw-alias-bg-layer-1);stroke-width:.75px}.VWh0dG_chartStack:hover{opacity:.85}.VWh0dG_chartLine{stroke:var(--dsw-static-blue-500);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.VWh0dG_chartCrosshair{stroke:var(--dsw-alias-label-dimmed);stroke-width:1px;stroke-dasharray:3 3}.VWh0dG_chartDot{fill:var(--dsw-static-neutral-bluish-00);stroke:var(--dsw-static-blue-500);stroke-width:2.5px}.VWh0dG_chartTooltip{pointer-events:none;z-index:2;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);box-shadow:var(--dsw-shadow-lv2);white-space:nowrap;border-radius:10px;padding:8px 10px;position:absolute;transform:translate(-50%,calc(-100% - 10px))}.VWh0dG_chartTooltipDate{color:var(--dsw-alias-label-primary);margin-bottom:3px;font-size:11px;font-weight:600}.VWh0dG_chartTooltipRow{color:var(--dsw-alias-label-secondary);align-items:center;gap:5px;font-size:11px;line-height:17px;display:flex}.VWh0dG_chartTooltipRow strong{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_chartLegendLine{background:var(--dsw-static-blue-500);border-radius:2px;width:10px;height:3px;display:inline-block}.VWh0dG_chartLegendBar{background:var(--dsw-static-blue-500);opacity:.5;border-radius:2px;width:7px;height:7px;display:inline-block}.VWh0dG_chartTooltipSwatch{border-radius:3px;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_chartLegend{color:var(--dsw-alias-label-tertiary);justify-content:flex-end;gap:14px;margin-top:2px;font-size:11px;display:flex}.VWh0dG_chartLegend span{align-items:center;gap:5px;display:inline-flex}.VWh0dG_tableScroll{border:1px solid var(--dsw-alias-border-l1);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;overflow:auto}.VWh0dG_modelTable,.VWh0dG_pricingTable{border-collapse:collapse;width:100%;font-size:12.5px}.VWh0dG_modelTable th,.VWh0dG_modelTable td,.VWh0dG_pricingTable th,.VWh0dG_pricingTable td{border-bottom:1px solid var(--dsw-alias-border-l1);text-align:left;white-space:nowrap;padding:9px 12px}.VWh0dG_modelTable tbody tr:last-child td,.VWh0dG_pricingTable tbody tr:last-child td{border-bottom:0}.VWh0dG_modelTable thead th,.VWh0dG_pricingTable thead th{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-module-platform);font-size:11px;font-weight:500}.VWh0dG_modelTable tbody tr,.VWh0dG_pricingTable tbody tr{transition:background-color .12s}.VWh0dG_modelTable tbody tr:hover,.VWh0dG_pricingTable tbody tr:hover{background:var(--dsw-alias-interactive-bg-hover)}.VWh0dG_numCol{text-align:right;font-variant-numeric:tabular-nums}.VWh0dG_costCol{color:var(--dsw-static-blue-500);font-weight:600}.VWh0dG_na{color:var(--dsw-alias-label-dimmed)}.VWh0dG_modelCell{align-items:center;gap:8px;display:inline-flex}.VWh0dG_modelDot{width:9px;height:9px;box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-bg-layer-1) 60%, transparent);border-radius:50%;flex:none}.VWh0dG_modelName{color:var(--dsw-alias-label-primary);font-weight:500;line-height:16px;display:block}.VWh0dG_modelProvider{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px;display:block}.VWh0dG_pricingToggle{cursor:pointer;text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:0;display:flex}.VWh0dG_pricingToggle:hover .VWh0dG_panelTitle,.VWh0dG_pricingToggle:focus-visible .VWh0dG_panelTitle{color:var(--dsw-static-blue-500)}.VWh0dG_rateBadge{vertical-align:1px;white-space:nowrap;border-radius:999px;align-items:center;margin-left:6px;padding:1px 6px;font-size:10px;font-weight:500;line-height:14px;display:inline-flex}.VWh0dG_rateBadgeLive{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 10%, transparent)}.VWh0dG_rateBadgeBuiltin{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-module-platform)}.VWh0dG_pricingToggleText{align-items:baseline;gap:10px;min-width:0;display:flex}.VWh0dG_pricingChevron{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.VWh0dG_pricingChevronOpen{transform:rotate(180deg)}.VWh0dG_bandPrice{align-items:baseline;gap:6px;display:inline-flex}.VWh0dG_bandPriceOff{color:var(--dsw-alias-label-caption)}.VWh0dG_bandPriceOff:before{content:\"/\";color:var(--dsw-alias-label-dimmed);margin-right:4px}.VWh0dG_bandTag{color:var(--dsw-alias-label-secondary);flex-direction:column;gap:1px;font-size:10.5px;line-height:14px;display:inline-flex}.VWh0dG_bandTagOff{color:var(--dsw-static-green-500);font-weight:600}.VWh0dG_bandTag>span:first-child{color:var(--dsw-alias-label-primary);font-weight:500}.VWh0dG_flatTag{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px}.VWh0dG_healthDot{border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_healthOk{background:var(--dsw-static-green-500);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-static-green-500) 18%, transparent)}.VWh0dG_healthBad{background:var(--dsw-static-red-500);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-static-red-500) 18%, transparent)}.VWh0dG_healthIdle{background:var(--dsw-static-neutral-bluish-400)}.VWh0dG_dashboardRight{align-items:center;gap:8px;min-width:0;display:flex}.VWh0dG_healthBadge{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_healthBadgeOk{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 10%, transparent)}.VWh0dG_healthBadgeBad{color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 10%, transparent)}.VWh0dG_planTag{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 12%, transparent);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_uncataloguedTag{vertical-align:1px;color:var(--dsw-static-amber-500);background:color-mix(in srgb, var(--dsw-static-amber-500) 12%, transparent);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_estimatedTag{vertical-align:1px;color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 12%, transparent);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_liveCostBar{color:var(--dsw-static-neutral-400);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_liveCostItem{white-space:nowrap}.VWh0dG_liveCostSep{color:var(--dsw-static-neutral-300)}.VWh0dG_liveTierPeak{color:var(--dsw-static-blue-500);font-weight:600}.VWh0dG_liveTierOff{color:var(--dsw-static-green-500);font-weight:600}.VWh0dG_liveQuotaWarn{color:var(--dsw-static-amber-500);font-weight:600}.VWh0dG_liveQuotaCrit{color:var(--dsw-static-red-500);font-weight:600}.VWh0dG_balanceCell{flex-direction:column;align-items:flex-end;gap:2px;display:inline-flex}.VWh0dG_balanceDays{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:10.5px;line-height:14px}.VWh0dG_balanceDaysLow{color:var(--dsw-static-red-500);font-weight:600}body[data-zine-mode] .VWh0dG_trigger,body[data-zine-mode] .VWh0dG_triggerPop,body[data-zine-mode] .VWh0dG_railButton{display:none}body[data-zine-mode] .VWh0dG_dashboardHead{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_headTitleRow{align-items:center;gap:8px;margin-top:4px;display:flex}body[data-zine-mode] .VWh0dG_dashboardTitle{color:#e8ff00;letter-spacing:.04em;text-transform:uppercase;text-shadow:0 0 8px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_dashboardSubtitle{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px}body[data-zine-mode] .VWh0dG_closeButton{color:#0a0a05;background:#ff2d95;border:1.5px solid #ff2d95;border-radius:0;box-shadow:0 0 10px #ff2d9573}body[data-zine-mode] .VWh0dG_hero{background:#000;border:2.5px solid #e8ff00;border-radius:0;position:relative;box-shadow:0 0 0 1px #0009,0 0 24px #e8ff002e}body[data-zine-mode] .VWh0dG_heroLabel{color:#c9d98a;letter-spacing:.12em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroValue{color:#e8ff00;letter-spacing:-.02em;text-shadow:0 0 12px #e8ff0073;-webkit-text-fill-color:#e8ff00;background:0 0;font-size:38px;font-weight:900}body[data-zine-mode] .VWh0dG_heroMeta{color:#c9d98a;letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}body[data-zine-mode] .VWh0dG_heroSideLabel{color:#c9d98a;letter-spacing:.1em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroSideValue{color:#e8ff00;text-shadow:0 0 6px #e8ff0059}body[data-zine-mode] .VWh0dG_delta{font-weight:900}body[data-zine-mode] .VWh0dG_deltaUp{color:#ff2d95}body[data-zine-mode] .VWh0dG_deltaDown{color:#c9d98a}body[data-zine-mode] .VWh0dG_tabNav{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_tabButton{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;border-radius:0;font-size:10.5px;font-weight:900}body[data-zine-mode] .VWh0dG_tabButton:hover,body[data-zine-mode] .VWh0dG_tabButton:focus-visible{color:#e8ff00;background:#e8ff001f}body[data-zine-mode] .VWh0dG_tabButtonActive,body[data-zine-mode] .VWh0dG_tabButtonActive:hover,body[data-zine-mode] .VWh0dG_tabButtonActive:focus-visible{color:#0a0a05;background:#e8ff00;box-shadow:0 0 10px #e8ff0073}body[data-zine-mode] .VWh0dG_panel{background:#000;border:2px solid #e8ff00;border-radius:0}body[data-zine-mode] .VWh0dG_trendPanel{position:relative}body[data-zine-mode] .VWh0dG_panelTitle{color:#e8ff00;letter-spacing:.06em;text-transform:uppercase;text-shadow:0 0 6px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_panelHint{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_modelTableScroll{background:#000;border:1.5px solid #e8ff0080;border-radius:0}.VWh0dG_currencyToggle{border:1px solid var(--dsw-alias-border-muted,#3a4250);background:var(--dsw-alias-bg-layer-2,#232a33);border-radius:6px;align-items:center;gap:2px;margin-right:8px;padding:2px;display:inline-flex}.VWh0dG_currencyButton{color:var(--dsw-alias-text-secondary,#9aa5b1);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:4px 7px;font-size:11px;font-weight:700;line-height:1}.VWh0dG_currencyButtonActive{background:var(--dsw-alias-accent-muted,#2f6fed);color:#fff}.VWh0dG_subscriptionGrid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;margin-top:10px;display:grid}.VWh0dG_subscriptionCard{border:1px solid var(--dsw-alias-border-muted,#3a4250);background:var(--dsw-alias-bg-layer-2,#232a33);border-radius:10px;padding:12px 14px}.VWh0dG_subscriptionHead{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.VWh0dG_subscriptionName{font-size:13px;font-weight:700}.VWh0dG_subscriptionPlan{color:var(--dsw-alias-text-secondary,#9aa5b1);font-size:11px}.VWh0dG_subscriptionPlan[data-kind=code],.VWh0dG_subscriptionPlan[data-kind=token]{color:var(--dsw-alias-label-secondary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 12%, transparent);border-radius:999px;padding:1px 8px;font-weight:500}.VWh0dG_subscriptionStatus{color:var(--dsw-alias-warning,#e0a63c);margin-bottom:6px;font-size:11px}.VWh0dG_subscriptionWindow{align-items:center;gap:8px;margin-top:6px;font-size:11px;display:flex}.VWh0dG_subscriptionWindowLabel{color:var(--dsw-alias-text-secondary,#9aa5b1);flex:0 0 44px}.VWh0dG_subscriptionTrack{background:var(--dsw-alias-bg-layer-3,#1a2028);border-radius:3px;flex:1;height:5px;overflow:hidden}.VWh0dG_subscriptionFill{background:var(--dsw-alias-accent,#3b82f6);border-radius:3px;height:100%;transition:width .2s;display:block}.VWh0dG_subscriptionFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_subscriptionFillOver{background:var(--dsw-static-red-500)}.VWh0dG_subscriptionPct{text-align:right;font-variant-numeric:tabular-nums;flex:none;min-width:52px}.VWh0dG_subscriptionExhausted{color:var(--dsw-static-red-500);min-width:52px;font-weight:600}.VWh0dG_subscriptionReset{color:var(--dsw-alias-text-secondary,#9aa5b1);flex:none}.VWh0dG_providerGroupList{flex-direction:column;gap:10px;display:flex}.VWh0dG_providerGroup{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;padding:12px 14px}.VWh0dG_providerGroupHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_providerGroupTitle{align-items:center;gap:7px;min-width:0;display:inline-flex}.VWh0dG_providerGroupName{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600;line-height:18px}.VWh0dG_providerGroupMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_providerGroupBadge{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 12%, transparent);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalance{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalanceLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:17px}.VWh0dG_roundsFlagBadge{color:#fff;background:#ef4444;border-radius:999px;margin-left:8px;padding:1px 7px;font-size:10px;font-weight:800}.VWh0dG_rounds{margin-top:10px}.VWh0dG_roundsBars{align-items:flex-end;gap:3px;height:110px;padding:4px 2px 0;display:flex;overflow-x:auto}.VWh0dG_roundsBarCol{flex-direction:column;flex:1 0 28px;justify-content:flex-end;align-items:stretch;height:100%;display:flex}.VWh0dG_roundsBarLabel{text-align:center;color:var(--dsw-alias-text-secondary,#9aa5b1);white-space:nowrap;text-overflow:ellipsis;max-width:100%;margin-bottom:2px;font-size:8px;line-height:1;overflow:hidden}.VWh0dG_roundsBarWrap{flex:1;align-items:flex-end;min-height:0;display:flex}.VWh0dG_roundsBar{background:var(--dsw-alias-accent,#3b82f6);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.VWh0dG_roundsBarFlagged{outline-offset:1px;background:#ef4444;border-radius:2px 2px 0 0;outline:1.5px solid #ef4444;width:100%;min-height:2px;position:relative}.VWh0dG_roundsFlagMark{background:#ef4444;border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-3px;box-shadow:0 0 4px #ef4444}.VWh0dG_roundsAxis{color:var(--dsw-alias-text-secondary,#9aa5b1);justify-content:space-between;margin-top:6px;font-size:10px;display:flex}.VWh0dG_roundsEmpty{color:var(--dsw-alias-text-secondary,#9aa5b1);margin-top:10px;font-size:12px}.VWh0dG_heatmap{margin-top:10px}.VWh0dG_heatmapGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;display:grid}.VWh0dG_heatmapCellEmpty{background:var(--dsw-alias-bg-layer-1);height:30px;color:var(--dsw-alias-label-dimmed,#6b7480);font-variant-numeric:tabular-nums;border-radius:8px;justify-content:center;align-items:center;font-size:11px;display:flex}.VWh0dG_heatmapCell{font-variant-numeric:tabular-nums;cursor:pointer;border:0;border-radius:8px;justify-content:center;align-items:center;height:30px;padding:0;font-size:11px;display:flex}.VWh0dG_heatmapCell[data-level=\"0\"],.VWh0dG_heatmapCell[data-level=\"1\"],.VWh0dG_heatmapCell[data-level=\"2\"]{color:var(--dsw-alias-label-primary)}.VWh0dG_heatmapCell[data-level=\"3\"],.VWh0dG_heatmapCell[data-level=\"4\"]{color:var(--dsw-static-neutral-bluish-00,#fff)}.VWh0dG_heatmapFooter{color:var(--dsw-alias-text-secondary,#9aa5b1);align-items:center;gap:8px;margin-top:10px;font-size:10px;display:flex}.VWh0dG_heatmapLegend{gap:3px;display:inline-flex}.VWh0dG_heatmapLegend i{border-radius:4px;width:14px;height:14px;display:block}.VWh0dG_heatmapHover{font-variant-numeric:tabular-nums;margin-left:auto}@media (width<=640px){.VWh0dG_kpiGrid{grid-template-columns:repeat(2,minmax(0,1fr))}.VWh0dG_hero{flex-direction:column;align-items:flex-start;gap:14px}.VWh0dG_heroGauge{width:96px;height:96px;position:absolute;top:20px;right:24px}.VWh0dG_heroMain{padding-right:112px}.VWh0dG_heroSide{border-left:none;border-top:1px solid var(--dsw-alias-border-l1);flex-direction:row;align-self:stretch;gap:20px;padding-top:14px;padding-left:0}.VWh0dG_heroSideItem{flex-direction:row;align-items:baseline;gap:8px}}";
27
+ const css = ".VWh0dG_railButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:36px;height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:8px;flex:none;justify-content:center;align-items:center;padding:0;transition:border-color .16s,color .16s;display:flex}.VWh0dG_railButton:hover,.VWh0dG_railButton:focus-visible{border-color:var(--dsw-static-blue-500);color:var(--dsw-static-blue-500);outline:none}.VWh0dG_railButton svg{stroke-width:2px;width:18px;height:18px}.VWh0dG_trigger{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:100%;min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:12px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .16s,background-color .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:var(--dsw-static-blue-500);outline:none}.VWh0dG_triggerIcon{background:linear-gradient(135deg, var(--dsw-static-blue-500), var(--dsw-static-blue-400));width:30px;height:30px;color:var(--dsw-static-neutral-bluish-00);box-shadow:0 2px 8px -2px color-mix(in srgb, var(--dsw-static-blue-500) 55%, transparent);border-radius:10px;flex:none;justify-content:center;align-items:center;display:inline-flex}.VWh0dG_triggerIcon svg{stroke-width:2px;width:16px;height:16px}.VWh0dG_triggerBody{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.VWh0dG_triggerRow{align-items:baseline;gap:5px;min-width:0;display:inline-flex}.VWh0dG_triggerAmount{color:var(--dsw-alias-label-primary);letter-spacing:-.02em;font-variant-numeric:tabular-nums;white-space:nowrap;font-size:16px;font-weight:700;line-height:20px}.VWh0dG_triggerSub{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10px;line-height:14px;overflow:hidden}.VWh0dG_triggerMeta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;letter-spacing:.02em;text-transform:uppercase;font-size:9.5px;font-weight:600;line-height:12px}.VWh0dG_triggerSpark{flex:none;align-items:flex-end;gap:2px;height:20px;display:flex}.VWh0dG_triggerSparkBar,.VWh0dG_triggerSparkHot{background:var(--dsw-static-blue-500);opacity:.6;border-radius:1px 1px 0 0;width:3px}.VWh0dG_triggerSparkHot{opacity:1}.VWh0dG_triggerWrap{flex:auto;width:100%;min-width:0;display:block;position:relative}.VWh0dG_triggerPop{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-shadow-lv2);opacity:0;pointer-events:none;z-index:10;border-radius:10px;flex-direction:column;gap:6px;padding:12px 14px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;transform:translateY(4px)}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_triggerPopRow{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_triggerPopValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:13px;font-weight:600;line-height:18px}.VWh0dG_triggerPopBars{border-top:1px solid var(--dsw-alias-border-l1);align-items:flex-end;gap:4px;height:22px;margin-top:4px;padding-top:8px;display:flex}.VWh0dG_triggerPopBar{background:var(--dsw-static-blue-500);border-radius:2px;flex:1;transition:height .2s}.VWh0dG_dashboardModal{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:min(760px,100vw - 48px);max-height:min(760px,88vh);box-shadow:var(--dsw-shadow-lv3);animation:.18s ease-out VWh0dG_dashboardIn}@keyframes VWh0dG_dashboardIn{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:none}}div[role=presentation]:has(>.dsh-billing-modal)>div[aria-hidden=true]:first-child{backdrop-filter:blur(8px)saturate(1.25)}.VWh0dG_dashboard{flex-direction:column;width:100%;max-height:min(760px,88vh);display:flex}.VWh0dG_dashboardHead{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:flex-start;gap:12px;padding:20px 24px 14px;display:flex}.VWh0dG_dashboardTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:17px;font-weight:600;line-height:24px}.VWh0dG_dashboardSubtitle{color:var(--dsw-alias-label-caption);margin:3px 0 0;font-size:12px;line-height:17px}.VWh0dG_closeButton{width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex:none;justify-content:center;align-items:center;transition:background-color .14s;display:inline-flex}.VWh0dG_closeButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.VWh0dG_closeButton svg{stroke-width:2px;width:16px;height:16px}.VWh0dG_dashboardBody{flex-direction:column;gap:14px;padding:16px 24px 24px;display:flex;overflow-y:auto}.VWh0dG_tabNav{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:4px;padding:10px 24px;display:flex}.VWh0dG_tabButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;padding:5px 14px;font-size:12.5px;font-weight:500;line-height:18px;transition:background-color .16s,color .16s,box-shadow .16s}.VWh0dG_tabButton:hover,.VWh0dG_tabButton:focus-visible{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover);outline:none}.VWh0dG_tabButtonActive,.VWh0dG_tabButtonActive:hover,.VWh0dG_tabButtonActive:focus-visible{background:var(--dsw-static-blue-500);color:var(--dsw-static-neutral-bluish-00);font-weight:600}.VWh0dG_tabPanel{flex-direction:column;gap:14px;animation:.14s ease-out VWh0dG_tabPanelIn;display:flex}@keyframes VWh0dG_tabPanelIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.VWh0dG_hero{border:1px solid var(--dsw-alias-border-l1);background:linear-gradient(180deg, var(--dsw-alias-bg-layer-2), var(--dsw-alias-bg-layer-1));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-static-neutral-bluish-00) 30%, transparent);border-radius:16px;flex-direction:column;gap:18px;padding:22px 24px;display:flex;position:relative;overflow:hidden}.VWh0dG_heroTop{justify-content:space-between;align-items:center;gap:24px;display:flex}.VWh0dG_heroMain{flex-direction:column;gap:2px;min-width:0;display:flex}.VWh0dG_heroLabel{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.08em;white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_heroReadout{align-items:baseline;gap:4px;display:flex}.VWh0dG_heroCurrency{letter-spacing:-.01em;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:20px;font-weight:600;line-height:30px}.VWh0dG_heroValue{letter-spacing:-.03em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);font-size:56px;font-weight:700;line-height:64px}.VWh0dG_heroMeta{color:var(--dsw-alias-label-caption);white-space:nowrap;margin-top:4px;font-size:12px;line-height:17px}.VWh0dG_heroGauge{flex:none;width:96px;height:96px;position:relative}.VWh0dG_heroGaugeSvg{width:100%;height:100%;display:block;transform:rotate(-90deg)}.VWh0dG_heroGaugeTrack{fill:none;stroke:var(--dsw-alias-bg-module-platform);stroke-width:9px}.VWh0dG_heroGaugeArc{fill:none;stroke:var(--dsw-static-blue-500);stroke-width:9px;stroke-linecap:round;transition:stroke-dasharray .26s}.VWh0dG_heroGaugeArcOver{stroke:var(--dsw-static-red-500)}.VWh0dG_heroGaugeCenter{flex-direction:column;justify-content:center;align-items:center;gap:1px;display:flex;position:absolute;inset:0}.VWh0dG_heroGaugePct{letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);font-size:18px;font-weight:700;line-height:22px}.VWh0dG_heroGaugePctOver{color:var(--dsw-static-red-500)}.VWh0dG_heroGaugeLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.VWh0dG_heroSide{border-top:1px solid var(--dsw-alias-border-l1);align-items:stretch;padding-top:14px;display:flex}.VWh0dG_heroSideItem{flex-direction:column;flex:1;gap:3px;min-width:0;padding-left:16px;display:flex}.VWh0dG_heroSideItem:first-child{padding-left:0}.VWh0dG_heroSideLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px;line-height:15px}.VWh0dG_heroSideValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;white-space:nowrap;align-items:baseline;gap:6px;font-size:18px;font-weight:600;line-height:24px;display:inline-flex}.VWh0dG_heroSideSpacer{flex:1;display:block}.VWh0dG_delta{align-items:center;gap:2px;margin-left:4px;font-size:11px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_deltaUp{color:var(--dsw-static-green-500)}.VWh0dG_deltaDown{color:var(--dsw-static-red-500)}.VWh0dG_kpiGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.VWh0dG_kpiTile{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;flex-direction:column;gap:3px;padding:14px 15px;transition:border-color .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_kpiTile:hover{border-color:var(--dsw-alias-border-l2)}.VWh0dG_kpiLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:15px}.VWh0dG_kpiValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:22px;font-weight:600;line-height:28px}.VWh0dG_kpiGreen{color:var(--dsw-static-green-500)}.VWh0dG_kpiDetail{color:var(--dsw-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;font-size:11px;line-height:15px;overflow:hidden}.VWh0dG_panel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:10px;padding:16px 18px;transition:border-color .16s;display:flex}.VWh0dG_panelHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_panelTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:600;line-height:20px}.VWh0dG_panelHint{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_rangeToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.VWh0dG_rangeButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:11px;line-height:16px;transition:background-color .14s,color .14s}.VWh0dG_rangeButtonActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_exportBar{justify-content:flex-end;align-items:center;gap:8px;display:flex}.VWh0dG_exportLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:16px}.VWh0dG_exportButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:999px;padding:4px 12px;font-size:11.5px;line-height:16px;transition:border-color .16s,color .16s,background-color .16s}.VWh0dG_exportButton:hover,.VWh0dG_exportButton:focus-visible{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);outline:none}.VWh0dG_shareTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:10px;display:flex;overflow:hidden}.VWh0dG_shareSeg{height:100%;transition:width .2s}.VWh0dG_shareSegPeak{background:var(--dsw-static-blue-500)}.VWh0dG_shareSegOff{background:color-mix(in srgb, var(--dsw-static-blue-500) 25%, var(--dsw-alias-bg-module-platform))}.VWh0dG_shareSegUser{background:var(--dsw-static-blue-500)}.VWh0dG_shareSegAssistant{background:var(--dsw-static-green-500)}.VWh0dG_shareSegTool{background:var(--dsw-static-amber-500)}.VWh0dG_shareLegend{align-items:center;gap:16px;display:flex}.VWh0dG_shareItem{color:var(--dsw-alias-label-secondary);align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_bucketCost{align-items:baseline;gap:3px;display:inline-flex}.VWh0dG_bucketOfficial{color:var(--dsw-static-blue-500);font-weight:600}.VWh0dG_bucketSep{color:var(--dsw-alias-label-dimmed)}.VWh0dG_bucketThird{color:var(--dsw-alias-label-secondary)}.VWh0dG_bucketSummary{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.VWh0dG_bucketStat{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:4px;padding:12px 14px;display:flex}.VWh0dG_bucketStatLabel{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.05em;font-size:11px;line-height:15px}.VWh0dG_bucketStatValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:20px;font-weight:700;line-height:26px}.VWh0dG_bucketStatSub{color:var(--dsw-alias-label-caption);font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.VWh0dG_shareDot{border-radius:50%;flex:none;align-self:center;width:8px;height:8px}.VWh0dG_shareValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_budget{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;flex-direction:column;gap:8px;padding:12px 16px;display:flex}.VWh0dG_budgetHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_budgetLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}.VWh0dG_budgetValue{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:17px}.VWh0dG_budgetControls{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_budgetInputWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;align-items:center;gap:2px;padding:2px 6px;display:inline-flex}.VWh0dG_budgetInputWrap:focus-within{border-color:var(--dsw-alias-border-l3)}.VWh0dG_budgetUnit{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_budgetInput{width:64px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:right;background:0 0;border:none;padding:0;font-size:12px;line-height:16px}.VWh0dG_budgetInput:focus-visible{outline:none}.VWh0dG_switch{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);cursor:pointer;border-radius:999px;flex:none;width:30px;height:17px;padding:0;transition:background-color .16s,border-color .16s;position:relative}.VWh0dG_switchOn{border-color:var(--dsw-alias-border-l1);background:var(--dsw-alias-label-primary)}.VWh0dG_switchKnob{background:var(--dsw-static-neutral-bluish-00);border-radius:50%;width:11px;height:11px;transition:transform .16s;position:absolute;top:2px;left:2px}.VWh0dG_switchOn .VWh0dG_switchKnob{transform:translate(13px)}.VWh0dG_budgetTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:6px;overflow:hidden}.VWh0dG_budgetFill{background:var(--dsw-static-blue-500);border-radius:999px;height:100%;transition:width .2s}.VWh0dG_budgetFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_budgetFillOver{background:var(--dsw-static-red-500);animation:1.6s ease-in-out infinite VWh0dG_budgetOverPulse}@keyframes VWh0dG_budgetOverPulse{50%{opacity:.55}}.VWh0dG_chartWrap{width:100%;position:relative}.VWh0dG_chartSvg{width:100%;height:auto;display:block}.VWh0dG_chartEmpty{height:140px;color:var(--dsw-alias-label-caption);justify-content:center;align-items:center;font-size:13px;display:flex}.VWh0dG_emptyRow{text-align:center;color:var(--dsw-alias-label-caption);padding:28px 0;font-size:13px}.VWh0dG_chartGrid{stroke:var(--dsw-alias-border-l1);stroke-width:1px}.VWh0dG_chartAxisLabel{fill:var(--dsw-alias-label-tertiary);font-size:10px}.VWh0dG_chartBar{fill:var(--dsw-static-blue-500);opacity:.7}.VWh0dG_chartBar:hover{opacity:1}.VWh0dG_chartStack{stroke:var(--dsw-alias-bg-layer-1);stroke-width:.75px}.VWh0dG_chartStack:hover{opacity:.9}.VWh0dG_chartLine{stroke:var(--dsw-static-blue-500);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.VWh0dG_chartCrosshair{stroke:var(--dsw-alias-label-dimmed);stroke-width:1px;stroke-dasharray:3 3}.VWh0dG_chartDot{fill:var(--dsw-static-neutral-bluish-00);stroke:var(--dsw-static-blue-500);stroke-width:2px}.VWh0dG_chartTooltip{pointer-events:none;z-index:2;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);box-shadow:none;white-space:nowrap;border-radius:8px;padding:8px 10px;position:absolute;transform:translate(-50%,calc(-100% - 10px))}.VWh0dG_chartTooltipDate{color:var(--dsw-alias-label-primary);margin-bottom:3px;font-size:11px;font-weight:600}.VWh0dG_chartTooltipRow{color:var(--dsw-alias-label-secondary);align-items:center;gap:5px;font-size:11px;line-height:17px;display:flex}.VWh0dG_chartTooltipRow strong{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_chartLegendLine{background:var(--dsw-static-blue-500);border-radius:2px;width:10px;height:3px;display:inline-block}.VWh0dG_chartLegendBar{background:var(--dsw-static-blue-500);opacity:.5;border-radius:2px;width:7px;height:7px;display:inline-block}.VWh0dG_chartTooltipSwatch{border-radius:3px;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_chartLegend{color:var(--dsw-alias-label-tertiary);justify-content:flex-end;gap:14px;margin-top:2px;font-size:11px;display:flex}.VWh0dG_chartLegend span{align-items:center;gap:5px;display:inline-flex}.VWh0dG_tableScroll{border:1px solid var(--dsw-alias-border-l1);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;overflow:auto}.VWh0dG_modelTable,.VWh0dG_pricingTable{border-collapse:collapse;width:100%;font-size:12.5px}.VWh0dG_modelTable th,.VWh0dG_modelTable td,.VWh0dG_pricingTable th,.VWh0dG_pricingTable td{border-bottom:1px solid var(--dsw-alias-border-l1);text-align:left;white-space:nowrap;padding:9px 12px}.VWh0dG_modelTable tbody tr:last-child td,.VWh0dG_pricingTable tbody tr:last-child td{border-bottom:0}.VWh0dG_modelTable thead th,.VWh0dG_pricingTable thead th{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.05em;background:0 0;font-size:11px;font-weight:600}.VWh0dG_modelTable tbody tr,.VWh0dG_pricingTable tbody tr{transition:background-color .12s}.VWh0dG_modelTable tbody tr:hover,.VWh0dG_pricingTable tbody tr:hover{background:0 0}.VWh0dG_numCol{text-align:right;font-variant-numeric:tabular-nums}.VWh0dG_costCol{color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_na{color:var(--dsw-alias-label-dimmed)}.VWh0dG_modelCell{align-items:center;gap:8px;display:inline-flex}.VWh0dG_modelDot{border-radius:50%;flex:none;width:9px;height:9px}.VWh0dG_modelName{color:var(--dsw-alias-label-primary);font-weight:500;line-height:16px;display:block}.VWh0dG_modelProvider{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px;display:block}.VWh0dG_pricingToggle{cursor:pointer;text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:0;display:flex}.VWh0dG_pricingToggle:hover .VWh0dG_panelTitle,.VWh0dG_pricingToggle:focus-visible .VWh0dG_panelTitle{color:var(--dsw-alias-label-primary)}.VWh0dG_rateBadge{vertical-align:1px;white-space:nowrap;border-radius:999px;align-items:center;margin-left:6px;padding:1px 6px;font-size:10px;font-weight:500;line-height:14px;display:inline-flex}.VWh0dG_rateBadgeLive{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_rateBadgeBuiltin{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_pricingToggleText{align-items:baseline;gap:10px;min-width:0;display:flex}.VWh0dG_pricingChevron{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.VWh0dG_pricingChevronOpen{transform:rotate(180deg)}.VWh0dG_bandPrice{align-items:baseline;gap:6px;display:inline-flex}.VWh0dG_bandPriceOff{color:var(--dsw-alias-label-caption)}.VWh0dG_bandPriceOff:before{content:\"/\";color:var(--dsw-alias-label-dimmed);margin-right:4px}.VWh0dG_bandTag{color:var(--dsw-alias-label-secondary);flex-direction:column;gap:1px;font-size:10.5px;line-height:14px;display:inline-flex}.VWh0dG_bandTagOff{color:var(--dsw-static-green-500);font-weight:600}.VWh0dG_bandTag>span:first-child{color:var(--dsw-alias-label-primary);font-weight:500}.VWh0dG_flatTag{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px}.VWh0dG_healthDot{border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_healthOk{background:var(--dsw-static-green-500)}.VWh0dG_healthBad{background:var(--dsw-static-red-500)}.VWh0dG_healthIdle{background:var(--dsw-static-neutral-bluish-400)}.VWh0dG_dashboardRight{align-items:center;gap:8px;min-width:0;display:flex}.VWh0dG_healthBadge{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_healthBadgeOk{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_healthBadgeBad{color:var(--dsw-static-red-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_planTag{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_uncataloguedTag{vertical-align:1px;color:var(--dsw-static-amber-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_estimatedTag{vertical-align:1px;color:var(--dsw-static-blue-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_liveCostBar{color:var(--dsw-static-neutral-400);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_liveCostItem{white-space:nowrap}.VWh0dG_liveCostSep{color:var(--dsw-static-neutral-300)}.VWh0dG_liveTierPeak{color:var(--dsw-static-blue-500);font-weight:600}.VWh0dG_liveTierOff{color:var(--dsw-static-green-500);font-weight:600}.VWh0dG_liveQuotaWarn{color:var(--dsw-static-amber-500);font-weight:600}.VWh0dG_liveQuotaCrit{color:var(--dsw-static-red-500);font-weight:600}.VWh0dG_balanceCell{flex-direction:column;align-items:flex-end;gap:2px;display:inline-flex}.VWh0dG_balanceDays{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:10.5px;line-height:14px}.VWh0dG_balanceDaysLow{color:var(--dsw-static-red-500);font-weight:600}body[data-zine-mode] .VWh0dG_trigger,body[data-zine-mode] .VWh0dG_triggerPop,body[data-zine-mode] .VWh0dG_railButton{display:none}body[data-zine-mode] .VWh0dG_dashboardHead{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_headTitleRow{align-items:center;gap:8px;margin-top:4px;display:flex}body[data-zine-mode] .VWh0dG_dashboardTitle{color:#e8ff00;letter-spacing:.04em;text-transform:uppercase;text-shadow:0 0 8px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_dashboardSubtitle{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px}body[data-zine-mode] .VWh0dG_closeButton{color:#0a0a05;background:#ff2d95;border:1.5px solid #ff2d95;border-radius:0;box-shadow:0 0 10px #ff2d9573}body[data-zine-mode] .VWh0dG_hero{background:#000;border:2.5px solid #e8ff00;border-radius:0;position:relative;box-shadow:0 0 0 1px #0009,0 0 24px #e8ff002e}body[data-zine-mode] .VWh0dG_heroLabel{color:#c9d98a;letter-spacing:.12em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroValue{color:#e8ff00;letter-spacing:-.02em;text-shadow:0 0 12px #e8ff0073;-webkit-text-fill-color:#e8ff00;background:0 0;font-size:38px;font-weight:900}body[data-zine-mode] .VWh0dG_heroMeta{color:#c9d98a;letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}body[data-zine-mode] .VWh0dG_heroSideLabel{color:#c9d98a;letter-spacing:.1em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroSideValue{color:#e8ff00;text-shadow:0 0 6px #e8ff0059}body[data-zine-mode] .VWh0dG_delta{font-weight:900}body[data-zine-mode] .VWh0dG_deltaUp{color:#ff2d95}body[data-zine-mode] .VWh0dG_deltaDown{color:#c9d98a}body[data-zine-mode] .VWh0dG_tabNav{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_tabButton{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;border-radius:0;font-size:10.5px;font-weight:900}body[data-zine-mode] .VWh0dG_tabButton:hover,body[data-zine-mode] .VWh0dG_tabButton:focus-visible{color:#e8ff00;background:#e8ff001f}body[data-zine-mode] .VWh0dG_tabButtonActive,body[data-zine-mode] .VWh0dG_tabButtonActive:hover,body[data-zine-mode] .VWh0dG_tabButtonActive:focus-visible{color:#0a0a05;background:#e8ff00;box-shadow:0 0 10px #e8ff0073}body[data-zine-mode] .VWh0dG_panel{background:#000;border:2px solid #e8ff00;border-radius:0}body[data-zine-mode] .VWh0dG_trendPanel{position:relative}body[data-zine-mode] .VWh0dG_panelTitle{color:#e8ff00;letter-spacing:.06em;text-transform:uppercase;text-shadow:0 0 6px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_panelHint{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_modelTableScroll{background:#000;border:1.5px solid #e8ff0080;border-radius:0}.VWh0dG_currencyToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:6px;align-items:center;gap:2px;margin-right:8px;padding:2px;display:inline-flex}.VWh0dG_currencyButton{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:4px 7px;font-size:11px;font-weight:700;line-height:1}.VWh0dG_currencyButtonActive{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary)}.VWh0dG_subscriptionGrid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;margin-top:10px;display:grid}.VWh0dG_subscriptionCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:10px;padding:12px 14px}.VWh0dG_subscriptionHead{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.VWh0dG_subscriptionName{font-size:13px;font-weight:700}.VWh0dG_subscriptionPlan{color:var(--dsw-alias-label-secondary);font-size:11px}.VWh0dG_subscriptionPlan[data-kind=code],.VWh0dG_subscriptionPlan[data-kind=token]{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);border-radius:999px;padding:1px 8px;font-weight:500}.VWh0dG_subscriptionStatus{color:var(--dsw-alias-label-secondary);margin-bottom:6px;font-size:11px}.VWh0dG_subscriptionWindow{align-items:center;gap:8px;margin-top:6px;font-size:11px;display:flex}.VWh0dG_subscriptionWindowLabel{color:var(--dsw-alias-label-secondary);flex:0 0 44px}.VWh0dG_subscriptionTrack{background:var(--dsw-alias-bg-layer-3);border-radius:3px;flex:1;height:5px;overflow:hidden}.VWh0dG_subscriptionFill{background:var(--dsw-static-blue-500);border-radius:3px;height:100%;transition:width .2s;display:block}.VWh0dG_subscriptionFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_subscriptionFillOver{background:var(--dsw-static-red-500)}.VWh0dG_subscriptionPct{text-align:right;font-variant-numeric:tabular-nums;flex:none;min-width:52px}.VWh0dG_subscriptionExhausted{color:var(--dsw-static-red-500);min-width:52px;font-weight:600}.VWh0dG_subscriptionReset{color:var(--dsw-alias-label-secondary);flex:none}.VWh0dG_providerGroupList{flex-direction:column;gap:10px;display:flex}.VWh0dG_providerGroup{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;padding:12px 14px}.VWh0dG_providerGroupHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_providerGroupTitle{align-items:center;gap:7px;min-width:0;display:inline-flex}.VWh0dG_providerGroupName{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600;line-height:18px}.VWh0dG_providerGroupMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_providerGroupBadge{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalance{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalanceLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:17px}.VWh0dG_roundsFlagBadge{color:var(--dsw-static-neutral-bluish-00);background:var(--dsw-static-red-500);border-radius:999px;margin-left:8px;padding:1px 7px;font-size:10px;font-weight:800}.VWh0dG_rounds{margin-top:10px}.VWh0dG_roundsBars{align-items:flex-end;gap:3px;height:110px;padding:4px 2px 0;display:flex;overflow-x:auto}.VWh0dG_roundsBarCol{flex-direction:column;flex:1 0 28px;justify-content:flex-end;align-items:stretch;height:100%;display:flex}.VWh0dG_roundsBarLabel{text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;max-width:100%;margin-bottom:2px;font-size:8px;line-height:1;overflow:hidden}.VWh0dG_roundsBarWrap{flex:1;align-items:flex-end;min-height:0;display:flex}.VWh0dG_roundsBar{background:var(--dsw-static-blue-500);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.VWh0dG_roundsBarFlagged{background:var(--dsw-static-red-500);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.VWh0dG_roundsFlagMark{background:var(--dsw-static-red-500);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-3px}.VWh0dG_roundsAxis{color:var(--dsw-alias-label-secondary);justify-content:space-between;margin-top:6px;font-size:10px;display:flex}.VWh0dG_roundsEmpty{color:var(--dsw-alias-label-secondary);margin-top:10px;font-size:12px}.VWh0dG_heatmap{margin-top:10px}.VWh0dG_heatmapGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;display:grid}.VWh0dG_heatmapCellEmpty{background:var(--dsw-alias-bg-layer-1);height:30px;color:var(--dsw-alias-label-dimmed);font-variant-numeric:tabular-nums;border-radius:8px;justify-content:center;align-items:center;font-size:11px;display:flex}.VWh0dG_heatmapCell{font-variant-numeric:tabular-nums;cursor:pointer;border:0;border-radius:8px;justify-content:center;align-items:center;height:30px;padding:0;font-size:11px;display:flex}.VWh0dG_heatmapCell[data-level=\"0\"],.VWh0dG_heatmapCell[data-level=\"1\"],.VWh0dG_heatmapCell[data-level=\"2\"]{color:var(--dsw-alias-label-primary)}.VWh0dG_heatmapCell[data-level=\"3\"],.VWh0dG_heatmapCell[data-level=\"4\"]{color:var(--dsw-static-neutral-bluish-00)}.VWh0dG_heatmapFooter{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin-top:10px;font-size:10px;display:flex}.VWh0dG_heatmapLegend{gap:3px;display:inline-flex}.VWh0dG_heatmapLegend i{border-radius:4px;width:14px;height:14px;display:block}.VWh0dG_heatmapHover{font-variant-numeric:tabular-nums;margin-left:auto}@media (width<=640px){.VWh0dG_kpiGrid{grid-template-columns:repeat(2,minmax(0,1fr))}.VWh0dG_hero{gap:14px}.VWh0dG_heroTop{flex-direction:column;align-items:flex-start;gap:12px}.VWh0dG_heroGauge{width:72px;height:72px}.VWh0dG_heroSide{gap:12px}.VWh0dG_heroSideSpacer{display:none}}";
28
28
  const tagId = "@kenz1117/dsh-ui-usage-billing/UsageBilling.module.css";
29
29
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
30
30
  const tag = document.createElement("style");
@@ -34,208 +34,223 @@ window.__ModuleLoader__.load({
34
34
  document.head.appendChild(tag);
35
35
  }
36
36
  var UsageBilling_module_css_default = {
37
- "modelDot": "VWh0dG_modelDot",
38
- "bandPrice": "VWh0dG_bandPrice",
39
- "kpiTile": "VWh0dG_kpiTile",
37
+ "dashboardTitle": "VWh0dG_dashboardTitle",
38
+ "triggerSparkHot": "VWh0dG_triggerSparkHot",
40
39
  "shareTrack": "VWh0dG_shareTrack",
41
- "bandTag": "VWh0dG_bandTag",
42
- "healthBadge": "VWh0dG_healthBadge",
43
- "healthBadgeBad": "VWh0dG_healthBadgeBad",
44
- "planTag": "VWh0dG_planTag",
45
- "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
46
- "liveTierOff": "VWh0dG_liveTierOff",
47
- "budgetTrack": "VWh0dG_budgetTrack",
48
- "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
49
- "providerGroupList": "VWh0dG_providerGroupList",
50
- "providerGroupName": "VWh0dG_providerGroupName",
51
- "subscriptionStatus": "VWh0dG_subscriptionStatus",
52
- "subscriptionWindow": "VWh0dG_subscriptionWindow",
53
- "switchKnob": "VWh0dG_switchKnob",
54
- "modelName": "VWh0dG_modelName",
55
- "providerGroupBadge": "VWh0dG_providerGroupBadge",
56
- "heroGaugeArc": "VWh0dG_heroGaugeArc",
57
- "chartAxisLabel": "VWh0dG_chartAxisLabel",
40
+ "budgetInputWrap": "VWh0dG_budgetInputWrap",
58
41
  "chartLegendBar": "VWh0dG_chartLegendBar",
59
42
  "numCol": "VWh0dG_numCol",
60
- "providerGroupTitle": "VWh0dG_providerGroupTitle",
61
- "triggerToday": "VWh0dG_triggerToday",
62
- "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
63
- "heatmapLegend": "VWh0dG_heatmapLegend",
64
- "triggerPop": "VWh0dG_triggerPop",
65
- "rangeButtonActive": "VWh0dG_rangeButtonActive",
43
+ "balanceCell": "VWh0dG_balanceCell",
44
+ "triggerMeta": "VWh0dG_triggerMeta",
45
+ "triggerWrap": "VWh0dG_triggerWrap",
46
+ "triggerPopRow": "VWh0dG_triggerPopRow",
66
47
  "heroGaugePct": "VWh0dG_heroGaugePct",
67
- "railButton": "VWh0dG_railButton",
68
- "kpiGreen": "VWh0dG_kpiGreen",
69
- "tabPanelIn": "VWh0dG_tabPanelIn",
70
- "pricingToggleText": "VWh0dG_pricingToggleText",
71
- "heroSide": "VWh0dG_heroSide",
48
+ "shareSegAssistant": "VWh0dG_shareSegAssistant",
72
49
  "shareLegend": "VWh0dG_shareLegend",
73
- "flatTag": "VWh0dG_flatTag",
74
- "dashboardRight": "VWh0dG_dashboardRight",
75
- "roundsBar": "VWh0dG_roundsBar",
76
- "estimatedTag": "VWh0dG_estimatedTag",
77
- "tabButton": "VWh0dG_tabButton",
78
- "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
79
- "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
80
- "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
81
- "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
82
- "subscriptionPct": "VWh0dG_subscriptionPct",
83
- "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
84
- "chartStack": "VWh0dG_chartStack",
85
- "budgetInputWrap": "VWh0dG_budgetInputWrap",
86
- "roundsBars": "VWh0dG_roundsBars",
87
- "roundsAxis": "VWh0dG_roundsAxis",
88
- "triggerDivider": "VWh0dG_triggerDivider",
89
- "kpiGrid": "VWh0dG_kpiGrid",
90
- "triggerPopRow": "VWh0dG_triggerPopRow",
91
- "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
92
- "budgetFillOver": "VWh0dG_budgetFillOver",
93
- "chartTooltip": "VWh0dG_chartTooltip",
94
- "exportBar": "VWh0dG_exportBar",
95
- "triggerAmount": "VWh0dG_triggerAmount",
96
- "tabNav": "VWh0dG_tabNav",
97
- "shareItem": "VWh0dG_shareItem",
98
- "shareValue": "VWh0dG_shareValue",
99
- "healthBadgeOk": "VWh0dG_healthBadgeOk",
100
- "liveCostSep": "VWh0dG_liveCostSep",
101
- "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
102
- "balanceCell": "VWh0dG_balanceCell",
103
- "currencyToggle": "VWh0dG_currencyToggle",
104
- "subscriptionGrid": "VWh0dG_subscriptionGrid",
50
+ "healthDot": "VWh0dG_healthDot",
51
+ "subscriptionReset": "VWh0dG_subscriptionReset",
52
+ "healthBad": "VWh0dG_healthBad",
105
53
  "roundsBarLabel": "VWh0dG_roundsBarLabel",
106
- "heatmapCell": "VWh0dG_heatmapCell",
107
- "delta": "VWh0dG_delta",
108
- "pricingTable": "VWh0dG_pricingTable",
54
+ "chartLegendLine": "VWh0dG_chartLegendLine",
109
55
  "balanceDaysLow": "VWh0dG_balanceDaysLow",
110
- "roundsBarWrap": "VWh0dG_roundsBarWrap",
111
- "rangeToggle": "VWh0dG_rangeToggle",
112
- "closeButton": "VWh0dG_closeButton",
113
- "heroSideLabel": "VWh0dG_heroSideLabel",
114
- "dashboardHead": "VWh0dG_dashboardHead",
115
- "providerGroupMeta": "VWh0dG_providerGroupMeta",
116
- "budgetUnit": "VWh0dG_budgetUnit",
117
- "uncataloguedTag": "VWh0dG_uncataloguedTag",
118
- "chartGrid": "VWh0dG_chartGrid",
119
- "heroValue": "VWh0dG_heroValue",
56
+ "kpiDetail": "VWh0dG_kpiDetail",
57
+ "roundsBarCol": "VWh0dG_roundsBarCol",
58
+ "heroSideItem": "VWh0dG_heroSideItem",
59
+ "triggerSpark": "VWh0dG_triggerSpark",
60
+ "shareSegUser": "VWh0dG_shareSegUser",
61
+ "exportBar": "VWh0dG_exportBar",
120
62
  "healthIdle": "VWh0dG_healthIdle",
121
- "trendPanel": "VWh0dG_trendPanel",
122
- "shareSeg": "VWh0dG_shareSeg",
123
- "budgetInput": "VWh0dG_budgetInput",
124
- "rounds": "VWh0dG_rounds",
125
- "roundsEmpty": "VWh0dG_roundsEmpty",
126
- "heatmap": "VWh0dG_heatmap",
127
- "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
128
- "heatmapFooter": "VWh0dG_heatmapFooter",
129
- "na": "VWh0dG_na",
63
+ "estimatedTag": "VWh0dG_estimatedTag",
64
+ "subscriptionGrid": "VWh0dG_subscriptionGrid",
130
65
  "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
131
- "emptyRow": "VWh0dG_emptyRow",
132
- "kpiValue": "VWh0dG_kpiValue",
133
- "pricingToggle": "VWh0dG_pricingToggle",
134
- "triggerMeta": "VWh0dG_triggerMeta",
135
- "heroGauge": "VWh0dG_heroGauge",
136
- "triggerIcon": "VWh0dG_triggerIcon",
137
- "chartEmpty": "VWh0dG_chartEmpty",
138
- "budgetControls": "VWh0dG_budgetControls",
139
- "roundsFlagMark": "VWh0dG_roundsFlagMark",
140
- "heroSideValue": "VWh0dG_heroSideValue",
141
- "modelProvider": "VWh0dG_modelProvider",
142
- "roundsBarCol": "VWh0dG_roundsBarCol",
143
- "exportButton": "VWh0dG_exportButton",
144
- "subscriptionPlan": "VWh0dG_subscriptionPlan",
145
- "healthDot": "VWh0dG_healthDot",
66
+ "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
67
+ "chartTooltipRow": "VWh0dG_chartTooltipRow",
68
+ "heatmapGrid": "VWh0dG_heatmapGrid",
69
+ "heroMeta": "VWh0dG_heroMeta",
70
+ "bucketStatValue": "VWh0dG_bucketStatValue",
71
+ "budgetUnit": "VWh0dG_budgetUnit",
146
72
  "chartLegend": "VWh0dG_chartLegend",
147
- "kpiDetail": "VWh0dG_kpiDetail",
73
+ "providerGroupBadge": "VWh0dG_providerGroupBadge",
74
+ "modelCell": "VWh0dG_modelCell",
75
+ "dashboardIn": "VWh0dG_dashboardIn",
76
+ "railButton": "VWh0dG_railButton",
77
+ "shareItem": "VWh0dG_shareItem",
78
+ "pricingChevron": "VWh0dG_pricingChevron",
79
+ "bucketStatSub": "VWh0dG_bucketStatSub",
80
+ "budgetTrack": "VWh0dG_budgetTrack",
81
+ "liveCostBar": "VWh0dG_liveCostBar",
82
+ "exportLabel": "VWh0dG_exportLabel",
83
+ "providerGroupList": "VWh0dG_providerGroupList",
84
+ "providerGroupBalance": "VWh0dG_providerGroupBalance",
85
+ "na": "VWh0dG_na",
86
+ "tabPanelIn": "VWh0dG_tabPanelIn",
87
+ "triggerAmount": "VWh0dG_triggerAmount",
88
+ "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
89
+ "dashboard": "VWh0dG_dashboard",
90
+ "kpiGrid": "VWh0dG_kpiGrid",
148
91
  "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
149
- "chartLegendLine": "VWh0dG_chartLegendLine",
150
- "subscriptionFill": "VWh0dG_subscriptionFill",
151
- "subscriptionReset": "VWh0dG_subscriptionReset",
92
+ "shareValue": "VWh0dG_shareValue",
93
+ "kpiValue": "VWh0dG_kpiValue",
94
+ "bucketCost": "VWh0dG_bucketCost",
95
+ "triggerRow": "VWh0dG_triggerRow",
96
+ "chartTooltip": "VWh0dG_chartTooltip",
97
+ "modelName": "VWh0dG_modelName",
98
+ "panelHead": "VWh0dG_panelHead",
152
99
  "chartWrap": "VWh0dG_chartWrap",
153
- "exportLabel": "VWh0dG_exportLabel",
154
- "kpiLabel": "VWh0dG_kpiLabel",
155
- "providerGroupHead": "VWh0dG_providerGroupHead",
156
- "heatmapGrid": "VWh0dG_heatmapGrid",
157
- "heroSideItem": "VWh0dG_heroSideItem",
158
- "rateBadgeLive": "VWh0dG_rateBadgeLive",
159
- "bandPriceOff": "VWh0dG_bandPriceOff",
160
- "liveCostBar": "VWh0dG_liveCostBar",
161
- "dashboardIn": "VWh0dG_dashboardIn",
162
- "currencyButtonActive": "VWh0dG_currencyButtonActive",
163
- "triggerAmountSub": "VWh0dG_triggerAmountSub",
164
- "shareSegUser": "VWh0dG_shareSegUser",
165
- "heroMain": "VWh0dG_heroMain",
166
- "switchOn": "VWh0dG_switchOn",
167
- "liveTierPeak": "VWh0dG_liveTierPeak",
168
- "heatmapHover": "VWh0dG_heatmapHover",
169
- "triggerPopLabel": "VWh0dG_triggerPopLabel",
170
- "tabPanel": "VWh0dG_tabPanel",
100
+ "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
101
+ "roundsBar": "VWh0dG_roundsBar",
171
102
  "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
172
- "dashboardBody": "VWh0dG_dashboardBody",
103
+ "heroSideLabel": "VWh0dG_heroSideLabel",
104
+ "pricingTable": "VWh0dG_pricingTable",
105
+ "dashboardRight": "VWh0dG_dashboardRight",
106
+ "roundsFlagMark": "VWh0dG_roundsFlagMark",
107
+ "roundsBarWrap": "VWh0dG_roundsBarWrap",
108
+ "chartBar": "VWh0dG_chartBar",
109
+ "providerGroupMeta": "VWh0dG_providerGroupMeta",
110
+ "heroMain": "VWh0dG_heroMain",
111
+ "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
173
112
  "panel": "VWh0dG_panel",
174
- "triggerPopBars": "VWh0dG_triggerPopBars",
175
- "budgetFill": "VWh0dG_budgetFill",
176
- "rangeButton": "VWh0dG_rangeButton",
177
- "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
178
- "dashboard": "VWh0dG_dashboard",
179
- "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
180
- "pricingChevron": "VWh0dG_pricingChevron",
181
- "bandTagOff": "VWh0dG_bandTagOff",
182
- "headTitleRow": "VWh0dG_headTitleRow",
183
- "providerGroup": "VWh0dG_providerGroup",
184
- "dashboardTitle": "VWh0dG_dashboardTitle",
113
+ "budgetValue": "VWh0dG_budgetValue",
114
+ "roundsEmpty": "VWh0dG_roundsEmpty",
115
+ "heatmapCell": "VWh0dG_heatmapCell",
116
+ "heroGaugeArc": "VWh0dG_heroGaugeArc",
117
+ "kpiGreen": "VWh0dG_kpiGreen",
118
+ "exportButton": "VWh0dG_exportButton",
119
+ "healthOk": "VWh0dG_healthOk",
120
+ "healthBadge": "VWh0dG_healthBadge",
185
121
  "liveCostItem": "VWh0dG_liveCostItem",
186
- "triggerPopBar": "VWh0dG_triggerPopBar",
187
- "modelTableScroll": "VWh0dG_modelTableScroll",
188
- "chartBar": "VWh0dG_chartBar",
189
- "heroLabel": "VWh0dG_heroLabel",
190
122
  "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
191
123
  "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
192
- "balanceDays": "VWh0dG_balanceDays",
193
- "subscriptionCard": "VWh0dG_subscriptionCard",
194
- "budgetValue": "VWh0dG_budgetValue",
195
- "panelTitle": "VWh0dG_panelTitle",
196
- "budgetFillWarn": "VWh0dG_budgetFillWarn",
124
+ "heatmapHover": "VWh0dG_heatmapHover",
125
+ "kpiTile": "VWh0dG_kpiTile",
126
+ "chartAxisLabel": "VWh0dG_chartAxisLabel",
127
+ "providerGroupHead": "VWh0dG_providerGroupHead",
128
+ "switch": "VWh0dG_switch",
129
+ "switchKnob": "VWh0dG_switchKnob",
130
+ "pricingToggle": "VWh0dG_pricingToggle",
131
+ "heroLabel": "VWh0dG_heroLabel",
132
+ "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
133
+ "heroReadout": "VWh0dG_heroReadout",
134
+ "budgetFillOver": "VWh0dG_budgetFillOver",
135
+ "rangeButton": "VWh0dG_rangeButton",
136
+ "bucketOfficial": "VWh0dG_bucketOfficial",
137
+ "budgetOverPulse": "VWh0dG_budgetOverPulse",
138
+ "bucketStatLabel": "VWh0dG_bucketStatLabel",
139
+ "subscriptionHead": "VWh0dG_subscriptionHead",
140
+ "headTitleRow": "VWh0dG_headTitleRow",
141
+ "triggerSparkBar": "VWh0dG_triggerSparkBar",
142
+ "subscriptionFill": "VWh0dG_subscriptionFill",
143
+ "triggerPopBars": "VWh0dG_triggerPopBars",
197
144
  "panelHint": "VWh0dG_panelHint",
198
- "shareSegPeak": "VWh0dG_shareSegPeak",
199
- "chartTooltipRow": "VWh0dG_chartTooltipRow",
200
145
  "deltaUp": "VWh0dG_deltaUp",
146
+ "bandTag": "VWh0dG_bandTag",
147
+ "shareDot": "VWh0dG_shareDot",
148
+ "budgetControls": "VWh0dG_budgetControls",
149
+ "bucketStat": "VWh0dG_bucketStat",
150
+ "triggerPopLabel": "VWh0dG_triggerPopLabel",
151
+ "delta": "VWh0dG_delta",
152
+ "rangeButtonActive": "VWh0dG_rangeButtonActive",
153
+ "triggerBody": "VWh0dG_triggerBody",
154
+ "liveTierOff": "VWh0dG_liveTierOff",
155
+ "bucketSep": "VWh0dG_bucketSep",
156
+ "heroValue": "VWh0dG_heroValue",
157
+ "tabButton": "VWh0dG_tabButton",
158
+ "planTag": "VWh0dG_planTag",
159
+ "healthBadgeBad": "VWh0dG_healthBadgeBad",
160
+ "currencyButtonActive": "VWh0dG_currencyButtonActive",
161
+ "tabPanel": "VWh0dG_tabPanel",
162
+ "triggerPopValue": "VWh0dG_triggerPopValue",
163
+ "closeButton": "VWh0dG_closeButton",
164
+ "subscriptionTrack": "VWh0dG_subscriptionTrack",
165
+ "dashboardModal": "VWh0dG_dashboardModal",
166
+ "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
167
+ "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
168
+ "switchOn": "VWh0dG_switchOn",
169
+ "chartGrid": "VWh0dG_chartGrid",
170
+ "triggerIcon": "VWh0dG_triggerIcon",
171
+ "modelTable": "VWh0dG_modelTable",
172
+ "flatTag": "VWh0dG_flatTag",
173
+ "rounds": "VWh0dG_rounds",
174
+ "budget": "VWh0dG_budget",
175
+ "roundsBars": "VWh0dG_roundsBars",
176
+ "heatmap": "VWh0dG_heatmap",
177
+ "heroTop": "VWh0dG_heroTop",
178
+ "triggerPop": "VWh0dG_triggerPop",
179
+ "bucketSummary": "VWh0dG_bucketSummary",
180
+ "shareSegPeak": "VWh0dG_shareSegPeak",
181
+ "chartEmpty": "VWh0dG_chartEmpty",
182
+ "chartCrosshair": "VWh0dG_chartCrosshair",
183
+ "healthBadgeOk": "VWh0dG_healthBadgeOk",
184
+ "currencyButton": "VWh0dG_currencyButton",
185
+ "bandTagOff": "VWh0dG_bandTagOff",
186
+ "subscriptionStatus": "VWh0dG_subscriptionStatus",
187
+ "heatmapFooter": "VWh0dG_heatmapFooter",
201
188
  "chartTooltipDate": "VWh0dG_chartTooltipDate",
189
+ "deltaDown": "VWh0dG_deltaDown",
190
+ "tableScroll": "VWh0dG_tableScroll",
202
191
  "costCol": "VWh0dG_costCol",
203
- "healthBad": "VWh0dG_healthBad",
204
- "shareSegOff": "VWh0dG_shareSegOff",
192
+ "modelTableScroll": "VWh0dG_modelTableScroll",
193
+ "budgetInput": "VWh0dG_budgetInput",
205
194
  "subscriptionName": "VWh0dG_subscriptionName",
206
- "chartCrosshair": "VWh0dG_chartCrosshair",
207
- "providerGroupBalance": "VWh0dG_providerGroupBalance",
208
- "modelCell": "VWh0dG_modelCell",
209
- "chartDot": "VWh0dG_chartDot",
210
- "tableScroll": "VWh0dG_tableScroll",
211
- "shareSegAssistant": "VWh0dG_shareSegAssistant",
212
- "dashboardModal": "VWh0dG_dashboardModal",
213
- "currencyButton": "VWh0dG_currencyButton",
214
- "heroMeta": "VWh0dG_heroMeta",
215
- "tabButtonActive": "VWh0dG_tabButtonActive",
216
- "panelHead": "VWh0dG_panelHead",
217
- "rateBadge": "VWh0dG_rateBadge",
195
+ "budgetFill": "VWh0dG_budgetFill",
196
+ "providerGroupTitle": "VWh0dG_providerGroupTitle",
197
+ "providerGroupName": "VWh0dG_providerGroupName",
198
+ "heroSideSpacer": "VWh0dG_heroSideSpacer",
199
+ "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
200
+ "roundsAxis": "VWh0dG_roundsAxis",
201
+ "modelDot": "VWh0dG_modelDot",
218
202
  "trigger": "VWh0dG_trigger",
219
- "switch": "VWh0dG_switch",
220
- "hero": "VWh0dG_hero",
221
- "budgetLabel": "VWh0dG_budgetLabel",
222
- "subscriptionHead": "VWh0dG_subscriptionHead",
203
+ "budgetFillWarn": "VWh0dG_budgetFillWarn",
204
+ "bandPrice": "VWh0dG_bandPrice",
205
+ "currencyToggle": "VWh0dG_currencyToggle",
223
206
  "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
224
- "budget": "VWh0dG_budget",
225
- "triggerWrap": "VWh0dG_triggerWrap",
226
- "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
227
- "budgetOverPulse": "VWh0dG_budgetOverPulse",
207
+ "panelTitle": "VWh0dG_panelTitle",
208
+ "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
209
+ "providerGroup": "VWh0dG_providerGroup",
210
+ "rateBadgeLive": "VWh0dG_rateBadgeLive",
211
+ "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
212
+ "trendPanel": "VWh0dG_trendPanel",
213
+ "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
214
+ "modelProvider": "VWh0dG_modelProvider",
215
+ "rateBadge": "VWh0dG_rateBadge",
216
+ "pricingToggleText": "VWh0dG_pricingToggleText",
217
+ "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
218
+ "liveTierPeak": "VWh0dG_liveTierPeak",
219
+ "triggerPopBar": "VWh0dG_triggerPopBar",
220
+ "emptyRow": "VWh0dG_emptyRow",
221
+ "bandPriceOff": "VWh0dG_bandPriceOff",
222
+ "heroGauge": "VWh0dG_heroGauge",
223
+ "hero": "VWh0dG_hero",
228
224
  "chartSvg": "VWh0dG_chartSvg",
229
- "subscriptionTrack": "VWh0dG_subscriptionTrack",
230
- "chartLine": "VWh0dG_chartLine",
231
- "triggerMonth": "VWh0dG_triggerMonth",
232
- "modelTable": "VWh0dG_modelTable",
233
- "healthOk": "VWh0dG_healthOk",
234
- "deltaDown": "VWh0dG_deltaDown",
225
+ "subscriptionPct": "VWh0dG_subscriptionPct",
226
+ "heatmapLegend": "VWh0dG_heatmapLegend",
227
+ "dashboardBody": "VWh0dG_dashboardBody",
228
+ "tabNav": "VWh0dG_tabNav",
229
+ "kpiLabel": "VWh0dG_kpiLabel",
230
+ "liveCostSep": "VWh0dG_liveCostSep",
231
+ "triggerSub": "VWh0dG_triggerSub",
232
+ "dashboardHead": "VWh0dG_dashboardHead",
233
+ "heroSide": "VWh0dG_heroSide",
234
+ "shareSeg": "VWh0dG_shareSeg",
235
+ "chartDot": "VWh0dG_chartDot",
236
+ "subscriptionCard": "VWh0dG_subscriptionCard",
237
+ "subscriptionPlan": "VWh0dG_subscriptionPlan",
238
+ "heroSideValue": "VWh0dG_heroSideValue",
235
239
  "shareSegTool": "VWh0dG_shareSegTool",
240
+ "subscriptionWindow": "VWh0dG_subscriptionWindow",
241
+ "uncataloguedTag": "VWh0dG_uncataloguedTag",
242
+ "bucketThird": "VWh0dG_bucketThird",
243
+ "tabButtonActive": "VWh0dG_tabButtonActive",
244
+ "heroCurrency": "VWh0dG_heroCurrency",
245
+ "shareSegOff": "VWh0dG_shareSegOff",
246
+ "rangeToggle": "VWh0dG_rangeToggle",
247
+ "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
236
248
  "budgetHead": "VWh0dG_budgetHead",
237
- "shareDot": "VWh0dG_shareDot",
238
- "triggerPopValue": "VWh0dG_triggerPopValue"
249
+ "chartStack": "VWh0dG_chartStack",
250
+ "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
251
+ "chartLine": "VWh0dG_chartLine",
252
+ "budgetLabel": "VWh0dG_budgetLabel",
253
+ "balanceDays": "VWh0dG_balanceDays"
239
254
  };
240
255
  //#endregion
241
256
  //#region src/client/plan-knowledge.ts
@@ -1499,10 +1514,10 @@ window.__ModuleLoader__.load({
1499
1514
  */
1500
1515
  const LEVEL_COLORS = [
1501
1516
  "var(--dsw-alias-bg-layer-2)",
1502
- "color-mix(in srgb, #10b981 22%, var(--dsw-alias-bg-layer-2))",
1503
- "color-mix(in srgb, #10b981 45%, var(--dsw-alias-bg-layer-2))",
1504
- "color-mix(in srgb, #10b981 70%, var(--dsw-alias-bg-layer-2))",
1505
- "#10b981"
1517
+ "color-mix(in srgb, var(--dsw-static-green-500) 22%, var(--dsw-alias-bg-layer-2))",
1518
+ "color-mix(in srgb, var(--dsw-static-green-500) 45%, var(--dsw-alias-bg-layer-2))",
1519
+ "color-mix(in srgb, var(--dsw-static-green-500) 70%, var(--dsw-alias-bg-layer-2))",
1520
+ "var(--dsw-static-green-500)"
1506
1521
  ];
1507
1522
  /** Local-time `YYYY-MM-DD` stamp (matches the dashboard's day keys). */
1508
1523
  function dayStamp(date) {
@@ -1894,7 +1909,11 @@ window.__ModuleLoader__.load({
1894
1909
  "billing.triggerToday": "今日",
1895
1910
  "billing.triggerMonth": "当月",
1896
1911
  "billing.subscriptionIncluded": "订阅包含",
1897
- "billing.free": "免费"
1912
+ "billing.free": "免费",
1913
+ "billing.official": "官方",
1914
+ "billing.thirdParty": "三方",
1915
+ "billing.officialCost": "官方费用",
1916
+ "billing.thirdPartyCost": "三方费用"
1898
1917
  };
1899
1918
  const en = {
1900
1919
  "billing.title": "Usage",
@@ -2012,8 +2031,47 @@ window.__ModuleLoader__.load({
2012
2031
  "billing.triggerToday": "Today",
2013
2032
  "billing.triggerMonth": "This month",
2014
2033
  "billing.subscriptionIncluded": "Included",
2015
- "billing.free": "Free"
2034
+ "billing.free": "Free",
2035
+ "billing.official": "Official",
2036
+ "billing.thirdParty": "Third-party",
2037
+ "billing.officialCost": "Official cost",
2038
+ "billing.thirdPartyCost": "Third-party cost"
2039
+ };
2040
+ //#endregion
2041
+ //#region src/client/provider-display.ts
2042
+ /** 中文厂商显示名 → 英文显示名;未收录的中文名不在表内,原样返回。 */
2043
+ const PROVIDER_NAMES_EN = {
2044
+ "智谱 AI": "Zhipu AI",
2045
+ "阿里通义": "Alibaba Qwen",
2046
+ "字节豆包": "ByteDance Doubao",
2047
+ "月之暗面": "Moonshot AI",
2048
+ "小米": "Xiaomi",
2049
+ "百度文心": "Baidu ERNIE",
2050
+ "腾讯混元": "Tencent Hunyuan",
2051
+ "零一万物": "01.AI",
2052
+ "阶跃星辰": "StepFun",
2053
+ "科大讯飞": "iFlytek Spark",
2054
+ "商汤": "SenseNova",
2055
+ "百川智能": "Baichuan",
2056
+ "小米 Token Plan(海外)": "Xiaomi Token Plan (Global)",
2057
+ "小米 Token Plan(国内)": "Xiaomi Token Plan (CN)",
2058
+ "小米 Token Plan(新加坡)": "Xiaomi Token Plan (SG)",
2059
+ "火山引擎 Token Plan": "Volcengine Token Plan",
2060
+ "火山方舟 Token Plan": "Volcengine Ark Token Plan",
2061
+ "豆包 Token Plan": "Doubao Token Plan",
2062
+ "百度文心 Plan": "Baidu ERNIE Plan"
2016
2063
  };
2064
+ /**
2065
+ * 把厂商显示名按界面语言本地化:中文名映射成英文,其余(已是英文 / 未收录 /
2066
+ * 未知)原样返回。仅在渲染层调用,不影响数据层的中文 key 匹配。
2067
+ * @param name - 数据层返回的厂商显示名(多为中文)。
2068
+ * @param lang - 当前界面语言(跟随币种)。
2069
+ * @returns 本地化后的显示名。
2070
+ */
2071
+ function localizeProviderName(name, lang) {
2072
+ if (lang === "en") return PROVIDER_NAMES_EN[name] ?? name;
2073
+ return name;
2074
+ }
2017
2075
  //#endregion
2018
2076
  //#region src/client/UsageBilling.tsx
2019
2077
  /**
@@ -2452,21 +2510,9 @@ window.__ModuleLoader__.load({
2452
2510
  stroke: "currentColor",
2453
2511
  "aria-hidden": "true",
2454
2512
  children: [
2455
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
2456
- x: "2.5",
2457
- y: "5",
2458
- width: "19",
2459
- height: "14",
2460
- rx: "2.5"
2461
- }),
2462
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M2.5 9.5h19" }),
2463
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
2464
- x: "6",
2465
- y: "12",
2466
- width: "4",
2467
- height: "3.5",
2468
- rx: "0.75"
2469
- })
2513
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M4 7h16v11H4z" }),
2514
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M4 10h16" }),
2515
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 14h3" })
2470
2516
  ]
2471
2517
  });
2472
2518
  if (!wide) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -2477,6 +2523,8 @@ window.__ModuleLoader__.load({
2477
2523
  title: `${t("billing.title")} · ${formatMoney(monthCost)}`,
2478
2524
  children: cardIcon
2479
2525
  });
2526
+ const sparkMax = Math.max(...days.map((d) => d.cost), 0);
2527
+ const sparkHeights = days.map((d) => sparkMax > 0 ? 4 + d.cost / sparkMax * 12 : 4);
2480
2528
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2481
2529
  className: UsageBilling_module_css_default.triggerWrap,
2482
2530
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
@@ -2484,7 +2532,7 @@ window.__ModuleLoader__.load({
2484
2532
  className: UsageBilling_module_css_default.trigger,
2485
2533
  "data-testid": "billing-trigger",
2486
2534
  onClick: onOpen,
2487
- title: `${t("billing.title")} · ${t("billing.triggerMonth")} ${formatMoney(monthCost)}`,
2535
+ title: `${t("billing.title")} · ${formatMoney(monthCost)}`,
2488
2536
  children: [
2489
2537
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2490
2538
  className: UsageBilling_module_css_default.triggerIcon,
@@ -2492,27 +2540,36 @@ window.__ModuleLoader__.load({
2492
2540
  children: cardIcon
2493
2541
  }),
2494
2542
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2495
- className: UsageBilling_module_css_default.triggerToday,
2496
- "data-testid": "billing-trigger-today",
2497
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2498
- className: UsageBilling_module_css_default.triggerMeta,
2499
- children: t("billing.triggerToday")
2500
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2501
- className: UsageBilling_module_css_default.triggerAmount,
2502
- children: formatMoney(todayCost)
2543
+ className: UsageBilling_module_css_default.triggerBody,
2544
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2545
+ className: UsageBilling_module_css_default.triggerRow,
2546
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2547
+ className: UsageBilling_module_css_default.triggerMeta,
2548
+ children: t("billing.triggerMonth")
2549
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2550
+ className: UsageBilling_module_css_default.triggerAmount,
2551
+ children: formatMoney(monthCost)
2552
+ })]
2553
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2554
+ className: UsageBilling_module_css_default.triggerSub,
2555
+ "data-testid": "billing-trigger-today",
2556
+ children: [
2557
+ t("billing.triggerToday"),
2558
+ " ",
2559
+ formatMoney(todayCost),
2560
+ " · ",
2561
+ weekCost > 0 ? `${t("billing.weekCost")} ${formatMoney(weekCost)}` : ""
2562
+ ]
2503
2563
  })]
2504
2564
  }),
2505
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.triggerDivider }),
2506
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2507
- className: UsageBilling_module_css_default.triggerMonth,
2508
- "data-testid": "billing-trigger-month",
2509
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2510
- className: UsageBilling_module_css_default.triggerMeta,
2511
- children: t("billing.triggerMonth")
2512
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2513
- className: UsageBilling_module_css_default.triggerAmountSub,
2514
- children: formatMoney(monthCost)
2515
- })]
2565
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2566
+ className: UsageBilling_module_css_default.triggerSpark,
2567
+ "data-testid": "billing-trigger-spark",
2568
+ "aria-hidden": "true",
2569
+ children: sparkHeights.map((h, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2570
+ className: index === sparkHeights.length - 1 ? UsageBilling_module_css_default.triggerSparkHot : UsageBilling_module_css_default.triggerSparkBar,
2571
+ style: { height: `${h}px` }
2572
+ }, days[index]?.date ?? String(index)))
2516
2573
  })
2517
2574
  ]
2518
2575
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -2552,13 +2609,10 @@ window.__ModuleLoader__.load({
2552
2609
  }),
2553
2610
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2554
2611
  className: UsageBilling_module_css_default.triggerPopBars,
2555
- children: (() => {
2556
- const max = Math.max(...days.map((d) => d.cost), 0);
2557
- return days.map((d) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2558
- className: UsageBilling_module_css_default.triggerPopBar,
2559
- style: { height: `${max > 0 ? 4 + d.cost / max * 18 : 4}px` }
2560
- }, d.date));
2561
- })()
2612
+ children: sparkHeights.map((h, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2613
+ className: UsageBilling_module_css_default.triggerPopBar,
2614
+ style: { height: `${sparkMax > 0 ? 4 + days[index].cost / sparkMax * 18 : 4}px` }
2615
+ }, days[index]?.date ?? String(index)))
2562
2616
  })
2563
2617
  ]
2564
2618
  })]
@@ -2574,6 +2628,8 @@ window.__ModuleLoader__.load({
2574
2628
  const [trendDays, setTrendDays] = (0, react.useState)(7);
2575
2629
  const rateInfo = getRateInfo();
2576
2630
  const money = (cny) => formatMoney(currency === "usd" ? cnyToUsd(cny) : cny, currency);
2631
+ const lang = currency === "usd" ? "en" : "zh";
2632
+ const providerName = (name) => localizeProviderName(name, lang);
2577
2633
  const unitMoney = (price, native) => price === 0 ? t("billing.free") : formatUnitPrice(convertUnitPrice(price, native, currency, rateInfo.rate), currency === "usd" ? "USD" : "CNY");
2578
2634
  const roundFlags = (0, react.useMemo)(() => flagAnomalies([...turns].reverse()), [turns]);
2579
2635
  const peakShare = (0, react.useMemo)(() => peakOffpeakCost(turns), [turns]);
@@ -2715,12 +2771,34 @@ window.__ModuleLoader__.load({
2715
2771
  plan: data.plan === true,
2716
2772
  ...data.cost > 0 ? { actual: data.cost } : {},
2717
2773
  uncatalogued,
2718
- estimatedPricing: entry.estimated === true
2774
+ estimatedPricing: entry.estimated === true,
2775
+ officialCalls: data.officialCalls ?? 0,
2776
+ officialCost: data.officialCost ?? 0
2719
2777
  };
2720
2778
  }).sort((a, b) => (b.actual ?? b.estimated) - (a.actual ?? a.estimated)).map((row, index) => ({
2721
2779
  ...row,
2722
2780
  color: CHART_PALETTE[index % CHART_PALETTE.length] ?? "#8b95a3"
2723
2781
  })), [byModel]);
2782
+ const bucketSummary = (0, react.useMemo)(() => {
2783
+ let officialCost = 0;
2784
+ let officialCalls = 0;
2785
+ let thirdCalls = 0;
2786
+ for (const row of modelRows) {
2787
+ const official = row.officialCost;
2788
+ row.actual;
2789
+ if (official > 0) officialCost += official;
2790
+ officialCalls += row.officialCalls;
2791
+ thirdCalls += Math.max(0, row.calls - row.officialCalls);
2792
+ }
2793
+ const thirdCost = Math.max(0, modelRows.reduce((sum, r) => sum + (r.actual ?? 0), 0) - officialCost);
2794
+ if (officialCost <= 0 && thirdCost <= 0 && officialCalls <= 0 && thirdCalls <= 0) return void 0;
2795
+ return {
2796
+ officialCost,
2797
+ officialCalls,
2798
+ thirdCost,
2799
+ thirdCalls
2800
+ };
2801
+ }, [modelRows]);
2724
2802
  const providerGroups = (0, react.useMemo)(() => {
2725
2803
  const subscriptionsByVendor = /* @__PURE__ */ new Map();
2726
2804
  for (const quota of quotas) {
@@ -2882,70 +2960,62 @@ window.__ModuleLoader__.load({
2882
2960
  children: [
2883
2961
  renderSlot("billing.dashboard.decor", { position: "hero" }),
2884
2962
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2885
- className: UsageBilling_module_css_default.heroMain,
2886
- children: [
2887
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2888
- className: UsageBilling_module_css_default.heroLabel,
2889
- children: t("billing.monthCost")
2890
- }),
2891
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2892
- className: UsageBilling_module_css_default.heroValue,
2893
- children: money(monthCost)
2894
- }),
2895
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2896
- className: UsageBilling_module_css_default.heroMeta,
2897
- children: [
2898
- monthCalls.toLocaleString(),
2899
- " ",
2900
- t("billing.calls")
2901
- ]
2902
- })
2903
- ]
2904
- }),
2905
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2906
- className: UsageBilling_module_css_default.heroGauge,
2907
- "data-testid": "billing-hero-gauge",
2908
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
2909
- className: UsageBilling_module_css_default.heroGaugeSvg,
2910
- viewBox: "0 0 120 120",
2911
- "aria-hidden": "true",
2963
+ className: UsageBilling_module_css_default.heroTop,
2964
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2965
+ className: UsageBilling_module_css_default.heroMain,
2912
2966
  children: [
2913
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("defs", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("linearGradient", {
2914
- id: "heroGaugeGradient",
2915
- x1: "0%",
2916
- y1: "0%",
2917
- x2: "100%",
2918
- y2: "100%",
2919
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("stop", {
2920
- offset: "0%",
2921
- stopColor: "var(--dsw-static-blue-500)"
2922
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("stop", {
2923
- offset: "100%",
2924
- stopColor: "var(--dsw-static-blue-400)"
2967
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2968
+ className: UsageBilling_module_css_default.heroLabel,
2969
+ children: t("billing.monthCost")
2970
+ }),
2971
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2972
+ className: UsageBilling_module_css_default.heroReadout,
2973
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2974
+ className: UsageBilling_module_css_default.heroCurrency,
2975
+ "aria-hidden": "true",
2976
+ children: currency === "usd" ? "$" : "¥"
2977
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2978
+ className: UsageBilling_module_css_default.heroValue,
2979
+ children: money(monthCost).slice(1)
2925
2980
  })]
2926
- }) }),
2927
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
2981
+ }),
2982
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2983
+ className: UsageBilling_module_css_default.heroMeta,
2984
+ children: [
2985
+ monthCalls.toLocaleString(),
2986
+ " ",
2987
+ t("billing.calls")
2988
+ ]
2989
+ })
2990
+ ]
2991
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2992
+ className: UsageBilling_module_css_default.heroGauge,
2993
+ "data-testid": "billing-hero-gauge",
2994
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
2995
+ className: UsageBilling_module_css_default.heroGaugeSvg,
2996
+ viewBox: "0 0 120 120",
2997
+ "aria-hidden": "true",
2998
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
2928
2999
  className: UsageBilling_module_css_default.heroGaugeTrack,
2929
3000
  cx: "60",
2930
3001
  cy: "60",
2931
3002
  r: "52"
2932
- }),
2933
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
3003
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
2934
3004
  className: clsx(UsageBilling_module_css_default.heroGaugeArc, heroGauge.over && UsageBilling_module_css_default.heroGaugeArcOver),
2935
3005
  cx: "60",
2936
3006
  cy: "60",
2937
3007
  r: "52",
2938
3008
  style: { strokeDasharray: `${heroGauge.pct / 100 * 326.7} 326.7` }
2939
- })
2940
- ]
2941
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2942
- className: UsageBilling_module_css_default.heroGaugeCenter,
2943
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2944
- className: clsx(UsageBilling_module_css_default.heroGaugePct, heroGauge.over && UsageBilling_module_css_default.heroGaugePctOver),
2945
- children: [heroGauge.pct.toFixed(0), "%"]
2946
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2947
- className: UsageBilling_module_css_default.heroGaugeLabel,
2948
- children: heroGauge.label
3009
+ })]
3010
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3011
+ className: UsageBilling_module_css_default.heroGaugeCenter,
3012
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3013
+ className: clsx(UsageBilling_module_css_default.heroGaugePct, heroGauge.over && UsageBilling_module_css_default.heroGaugePctOver),
3014
+ children: [heroGauge.pct.toFixed(0), "%"]
3015
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3016
+ className: UsageBilling_module_css_default.heroGaugeLabel,
3017
+ children: heroGauge.label
3018
+ })]
2949
3019
  })]
2950
3020
  })]
2951
3021
  }),
@@ -2989,6 +3059,10 @@ window.__ModuleLoader__.load({
2989
3059
  className: UsageBilling_module_css_default.heroSideValue,
2990
3060
  children: money(monthCostProjected)
2991
3061
  })]
3062
+ }),
3063
+ monthCostProjected <= 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3064
+ className: UsageBilling_module_css_default.heroSideSpacer,
3065
+ "aria-hidden": "true"
2992
3066
  })
2993
3067
  ]
2994
3068
  })
@@ -3358,7 +3432,7 @@ window.__ModuleLoader__.load({
3358
3432
  "aria-hidden": "true"
3359
3433
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3360
3434
  className: UsageBilling_module_css_default.providerGroupName,
3361
- children: group.name
3435
+ children: providerName(group.name)
3362
3436
  })]
3363
3437
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3364
3438
  className: UsageBilling_module_css_default.providerGroupMeta,
@@ -3423,7 +3497,7 @@ window.__ModuleLoader__.load({
3423
3497
  ]
3424
3498
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3425
3499
  className: UsageBilling_module_css_default.modelProvider,
3426
- children: row.provider
3500
+ children: providerName(row.provider)
3427
3501
  })] })
3428
3502
  }) }),
3429
3503
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
@@ -3447,7 +3521,28 @@ window.__ModuleLoader__.load({
3447
3521
  children: row.plan ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3448
3522
  className: UsageBilling_module_css_default.planTag,
3449
3523
  children: t("billing.subscriptionIncluded")
3450
- }) : row.actual !== void 0 ? money(row.actual) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3524
+ }) : row.actual !== void 0 ? (() => {
3525
+ const official = row.officialCost;
3526
+ const third = row.actual - official;
3527
+ if (official > 0 && third > 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3528
+ className: UsageBilling_module_css_default.bucketCost,
3529
+ children: [
3530
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3531
+ className: UsageBilling_module_css_default.bucketOfficial,
3532
+ children: money(official)
3533
+ }),
3534
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3535
+ className: UsageBilling_module_css_default.bucketSep,
3536
+ children: "/"
3537
+ }),
3538
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3539
+ className: UsageBilling_module_css_default.bucketThird,
3540
+ children: money(third)
3541
+ })
3542
+ ]
3543
+ });
3544
+ return money(row.actual);
3545
+ })() : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3451
3546
  className: UsageBilling_module_css_default.na,
3452
3547
  children: "—"
3453
3548
  })
@@ -3469,7 +3564,7 @@ window.__ModuleLoader__.load({
3469
3564
  children: [
3470
3565
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3471
3566
  className: UsageBilling_module_css_default.subscriptionName,
3472
- children: quota.displayName
3567
+ children: providerName(quota.displayName)
3473
3568
  }),
3474
3569
  quota.planType === "code" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3475
3570
  className: UsageBilling_module_css_default.subscriptionPlan,
@@ -3619,6 +3714,64 @@ window.__ModuleLoader__.load({
3619
3714
  })
3620
3715
  ]
3621
3716
  }),
3717
+ bucketSummary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3718
+ className: UsageBilling_module_css_default.panel,
3719
+ "data-testid": "billing-panel-buckets",
3720
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3721
+ className: UsageBilling_module_css_default.panelHead,
3722
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", {
3723
+ className: UsageBilling_module_css_default.panelTitle,
3724
+ children: [
3725
+ t("billing.official"),
3726
+ " / ",
3727
+ t("billing.thirdParty")
3728
+ ]
3729
+ })
3730
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3731
+ className: UsageBilling_module_css_default.bucketSummary,
3732
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3733
+ className: UsageBilling_module_css_default.bucketStat,
3734
+ children: [
3735
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3736
+ className: UsageBilling_module_css_default.bucketStatLabel,
3737
+ children: t("billing.official")
3738
+ }),
3739
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3740
+ className: UsageBilling_module_css_default.bucketStatValue,
3741
+ children: money(bucketSummary.officialCost)
3742
+ }),
3743
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3744
+ className: UsageBilling_module_css_default.bucketStatSub,
3745
+ children: [
3746
+ bucketSummary.officialCalls,
3747
+ " ",
3748
+ t("billing.calls")
3749
+ ]
3750
+ })
3751
+ ]
3752
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3753
+ className: UsageBilling_module_css_default.bucketStat,
3754
+ children: [
3755
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3756
+ className: UsageBilling_module_css_default.bucketStatLabel,
3757
+ children: t("billing.thirdParty")
3758
+ }),
3759
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3760
+ className: UsageBilling_module_css_default.bucketStatValue,
3761
+ children: money(bucketSummary.thirdCost)
3762
+ }),
3763
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3764
+ className: UsageBilling_module_css_default.bucketStatSub,
3765
+ children: [
3766
+ bucketSummary.thirdCalls,
3767
+ " ",
3768
+ t("billing.calls")
3769
+ ]
3770
+ })
3771
+ ]
3772
+ })]
3773
+ })]
3774
+ }),
3622
3775
  stats.byWorkspace !== void 0 && stats.byWorkspace.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3623
3776
  className: UsageBilling_module_css_default.panel,
3624
3777
  "data-testid": "billing-panel-workspaces",
@@ -3805,7 +3958,7 @@ window.__ModuleLoader__.load({
3805
3958
  })]
3806
3959
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3807
3960
  className: UsageBilling_module_css_default.modelProvider,
3808
- children: entry.provider
3961
+ children: providerName(entry.provider)
3809
3962
  })] })]
3810
3963
  }) }),
3811
3964
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
@@ -4357,12 +4510,85 @@ window.__ModuleLoader__.load({
4357
4510
  });
4358
4511
  }
4359
4512
  //#endregion
4513
+ //#region src/client/completion-notify.ts
4514
+ /** 配置持久化 key:开启/关闭 + 提醒持续模式(0=常驻,其余=秒后自动关)。 */
4515
+ const COMPLETION_NOTIFY_KEY = "dsh-billing-completion-notify-v1";
4516
+ const DEFAULT_CONFIG = {
4517
+ enabled: false,
4518
+ timeout: 0
4519
+ };
4520
+ /** 读取本地配置(缺失/损坏时回退默认)。 */
4521
+ function loadNotifyConfig() {
4522
+ try {
4523
+ const raw = localStorage.getItem(COMPLETION_NOTIFY_KEY);
4524
+ if (raw === null) return { ...DEFAULT_CONFIG };
4525
+ const parsed = JSON.parse(raw);
4526
+ return {
4527
+ enabled: parsed.enabled === true,
4528
+ timeout: typeof parsed.timeout === "number" ? parsed.timeout : 0
4529
+ };
4530
+ } catch {
4531
+ return { ...DEFAULT_CONFIG };
4532
+ }
4533
+ }
4534
+ /** 判断一个会话是否「完成」:completed 标志为真,或已不再 running。 */
4535
+ function isFinished(summary) {
4536
+ if (summary.completed === true) return true;
4537
+ return summary.running === false;
4538
+ }
4539
+ /**
4540
+ * 安装对话完成提醒:订阅 sessions.list 快照,用 `previousFinished` 记住每条
4541
+ * 会话上次是运行中还是已完成;只有「之前运行中 → 现在已完成」的迁移才提醒,
4542
+ * 首次快照只建立基线、不提醒。返回清理函数(dispose 时释放订阅)。
4543
+ * @param list - `ctx.sessions.list`(宿主注入的会话列表快照源)。
4544
+ */
4545
+ function installCompletionNotifier(list, getConfig) {
4546
+ const previousFinished = /* @__PURE__ */ new Set();
4547
+ let queuedTitle;
4548
+ const snapshot = list.getSnapshot();
4549
+ for (const id of snapshot.ids) {
4550
+ const summary = snapshot.byId[id];
4551
+ if (summary !== void 0 && isFinished(summary)) previousFinished.add(String(id));
4552
+ }
4553
+ const notify = (title) => {
4554
+ const { enabled, timeout } = getConfig();
4555
+ if (!enabled) return;
4556
+ if (typeof Notification === "undefined") return;
4557
+ if (Notification.permission !== "granted") return;
4558
+ try {
4559
+ new Notification(title, {
4560
+ body: title,
4561
+ tag: "dsh-billing-completion",
4562
+ requireInteraction: timeout === 0
4563
+ });
4564
+ } catch {}
4565
+ };
4566
+ return list.subscribe(() => {
4567
+ const state = list.getSnapshot();
4568
+ const finishedTitles = [];
4569
+ for (const id of state.ids) {
4570
+ const summary = state.byId[id];
4571
+ if (summary === void 0) continue;
4572
+ const key = String(id);
4573
+ const finished = isFinished(summary);
4574
+ if (finished && !previousFinished.has(key)) finishedTitles.push(summary.title ?? summary.id ?? key);
4575
+ if (finished) previousFinished.add(key);
4576
+ else previousFinished.delete(key);
4577
+ }
4578
+ if (finishedTitles.length > 0) {
4579
+ queuedTitle = finishedTitles.length === 1 ? finishedTitles[0] : `${finishedTitles.length} 个会话已完成`;
4580
+ notify(queuedTitle);
4581
+ }
4582
+ });
4583
+ }
4584
+ //#endregion
4360
4585
  //#region src/client/apply.ts
4361
4586
  /** Required services for the usage billing surface. */
4362
4587
  const inject = [
4363
4588
  "slots",
4364
4589
  "locale",
4365
- "connection"
4590
+ "connection",
4591
+ "sessions"
4366
4592
  ];
4367
4593
  /**
4368
4594
  * Client plugin body: the UsageBilling entry in the sidebar footer.
@@ -4436,6 +4662,9 @@ window.__ModuleLoader__.load({
4436
4662
  order: 0,
4437
4663
  locale: NS
4438
4664
  }, LiveCostBar));
4665
+ ctx.effect(() => {
4666
+ return installCompletionNotifier(ctx.sessions.list, loadNotifyConfig);
4667
+ }, "ui-usage-billing: completion notifier");
4439
4668
  }
4440
4669
  //#endregion
4441
4670
  exports.UsageBilling = UsageBilling;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kenz1117/dsh-ui-usage-billing",
3
3
  "description": "Usage billing dashboard for DeepSeek Harness: sidebar cost metrics plus a full dashboard modal, priced from a current multi-provider catalog with real usage aggregated from session logs.",
4
- "version": "0.8.2",
4
+ "version": "0.9.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -47,42 +47,42 @@
47
47
  },
48
48
  "license": "MIT",
49
49
  "peerDependencies": {
50
- "@deepseek-ai/dsh-api-remotes": "*",
51
- "@deepseek-ai/dsh-atomic-write": "*",
52
- "@deepseek-ai/dsh-client-connection": "*",
53
- "@deepseek-ai/dsh-host-webserver": "*",
54
- "@deepseek-ai/dsh-client-locale": "*",
55
- "@deepseek-ai/dsh-client-runtime": "*",
56
- "@deepseek-ai/dsh-client-ui-conversation": "*",
57
- "@deepseek-ai/dsh-client-ui-sidebar": "*",
58
- "@deepseek-ai/dsh-client-ui-primitives": "*",
59
- "@deepseek-ai/dsh-client-ui-slots": "*",
60
- "@deepseek-ai/dsh-credentials": "*",
61
- "@deepseek-ai/dsh-invariants": "*",
62
- "@deepseek-ai/dsh-llm": "*",
63
- "@deepseek-ai/dsh-session": "*",
64
- "@deepseek-ai/dsh-session-persistence": "*",
65
- "@deepseek-ai/dsh-settings": "*",
66
- "@deepseek-ai/dsh-tools": "*",
67
- "@deepseek-ai/schemastery": "*",
68
- "@deepseek-ai/cordis": "*",
50
+ "@deepseek-ai/dsh-api-remotes": "workspace:^",
51
+ "@deepseek-ai/dsh-atomic-write": "workspace:^",
52
+ "@deepseek-ai/dsh-client-connection": "workspace:^",
53
+ "@deepseek-ai/dsh-host-webserver": "workspace:^",
54
+ "@deepseek-ai/dsh-client-locale": "workspace:^",
55
+ "@deepseek-ai/dsh-client-runtime": "workspace:^",
56
+ "@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
57
+ "@deepseek-ai/dsh-client-ui-sidebar": "workspace:^",
58
+ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
59
+ "@deepseek-ai/dsh-client-ui-slots": "workspace:^",
60
+ "@deepseek-ai/dsh-credentials": "workspace:^",
61
+ "@deepseek-ai/dsh-invariants": "workspace:^",
62
+ "@deepseek-ai/dsh-llm": "workspace:^",
63
+ "@deepseek-ai/dsh-session": "workspace:^",
64
+ "@deepseek-ai/dsh-session-persistence": "workspace:^",
65
+ "@deepseek-ai/dsh-settings": "workspace:^",
66
+ "@deepseek-ai/dsh-tools": "workspace:^",
67
+ "@deepseek-ai/schemastery": "workspace:^",
68
+ "@deepseek-ai/cordis": "workspace:^",
69
69
  "react": "^18.2.0"
70
70
  },
71
71
  "dependencies": {
72
72
  "clsx": "^2.1.1"
73
73
  },
74
74
  "devDependencies": {
75
- "@deepseek-ai/dsh-client-locale": "*",
76
- "@deepseek-ai/dsh-client-runtime": "*",
77
- "@deepseek-ai/dsh-client-test-runtime": "*",
78
- "@deepseek-ai/dsh-client-ui-conversation": "*",
79
- "@deepseek-ai/dsh-client-ui-primitives": "*",
80
- "@deepseek-ai/dsh-client-ui-slots": "*",
81
- "@deepseek-ai/dsh-client-web-react": "*",
82
- "@deepseek-ai/dsh-invariants": "*",
75
+ "@deepseek-ai/dsh-client-locale": "workspace:^",
76
+ "@deepseek-ai/dsh-client-runtime": "workspace:^",
77
+ "@deepseek-ai/dsh-client-test-runtime": "workspace:^",
78
+ "@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
79
+ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
80
+ "@deepseek-ai/dsh-client-ui-slots": "workspace:^",
81
+ "@deepseek-ai/dsh-client-web-react": "workspace:^",
82
+ "@deepseek-ai/dsh-invariants": "workspace:^",
83
83
  "@testing-library/react": "^16.1.0",
84
84
  "@types/react": "~18.3.1",
85
- "@deepseek-ai/cordis": "*",
85
+ "@deepseek-ai/cordis": "workspace:^",
86
86
  "react": "^18.2.0",
87
87
  "react-dom": "^18.2.0"
88
88
  },