@kenz1117/dsh-ui-usage-billing 0.9.11 → 0.9.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -91,7 +91,7 @@ Browser Server (Node)
91
91
  └─ renders the dashboard
92
92
  ```
93
93
 
94
- - **Server** (`src/index.ts`): injects `webServer`, `sessionPersistence` and `credentials`, and registers `GET /api/billing/usage-stats`, `/api/billing/pricing`, `/api/billing/balance`, `/api/billing/subscriptions`, `/api/billing/relay-quotas`. The aggregator caches folded results per session: each LLM call is attributed to the model of its preceding `request/header`, tokens split into cache-hit / cache-miss buckets, dates bucketed by the local timezone; a log file with unchanged mtime+size reuses its cached fold, only written sessions are re-folded, and the whole document has a 5s TTL to coalesce heavy polling. Aggregation logic lives in `src/aggregate.ts`.
94
+ - **Server** (`src/index.ts`): injects `webServer`, `sessionPersistence` and `credentials`, and registers `GET /api/billing/usage-stats`, `/api/billing/pricing`, `/api/billing/balance`, `/api/billing/subscriptions`, `/api/billing/relay-quotas`. The aggregator caches folded results per session: each LLM call is attributed to the model of its preceding `request/header`, tokens split into cache-hit / cache-miss buckets, dates bucketed by the local timezone; a log file with unchanged mtime+size reuses its cached fold, only written sessions are re-folded, and the whole document has a 5s TTL to coalesce heavy polling. Every successfully folded session is also atomically written to an independent durable usage ledger, so permanently deleting a session no longer removes its historical cost or tokens. Aggregation logic lives in `src/aggregate.ts`.
95
95
  - **Browser** (`src/client/`): requests the endpoints above to render the dashboard and probes each provider connection via `llm.models`. Until real data arrives it shows an all-zero empty snapshot, never fabricated samples.
96
96
 
97
97
  ## Theme collaboration
@@ -146,6 +146,7 @@ The public HTTP endpoints and field definitions are documented in source: `GET /
146
146
  | Field | Default | Description |
147
147
  | ----------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
148
148
  | `statsPath` | unset | Absolute path to a fallback `.dsh-usage-stats.json` (used when `sessionPersistence` is unavailable) |
149
+ | `ledgerPath` | `~/.dsh/.dsh-usage-ledger.json` | Independent durable ledger path; stores folded metrics only (no message bodies or session titles), so deletion does not erase recorded usage |
149
150
  | `balanceApiKeyEnv` | `DEEPSEEK_API_KEY` | Credential ref for the DeepSeek balance query; only used as a fallback when llm-pi-ai has no `apiKeyEnv` for deepseek |
150
151
  | `subscriptionProviders` | `kimi-coding`, `xiaomi-token-plan-cn` | Subscription (coding / token plan) provider id list — tokens counted, cost 0 |
151
152
  | `monthlyBudget` | unset | Default monthly budget (CNY); sent with usage-stats as the budget bar's initial amount (user UI settings take precedence and persist locally) |
@@ -183,7 +184,7 @@ None. This plugin is a pure UI surface: it registers no tools, injects no system
183
184
  - **Overspend notifications rely on the browser Notification API**: when permission is denied or the platform lacks support, only the in-UI red-pulse fallback remains — no host-level notification channel; notifications are capped at once per day.
184
185
  - **Session rows are not navigable**: clicking a session row does not open that session (cross-plugin navigation needs a host session-selection channel); sessions are capped at 100 rows and the panel shows the top 20.
185
186
  - **Cost is a catalog estimate**: models without published per-token pricing (iFlytek, SenseTime, Xiaomi) use estimates (feature-list footnote ¹); official billing is authoritative.
186
- - **The 30-day trend is bounded by log retention**: dates outside the persisted log retention window are shown as zeros in the window, not backfilled.
187
+ - **The ledger starts at its first successful aggregation**: sessions permanently deleted before the upgrade and absent from the old snapshot cannot be recovered. Manually deleting `.dsh-usage-ledger.json` and its `.bak` clears independently retained history. Only calls successfully observed by this plugin are retained.
187
188
 
188
189
  ## Contributors
189
190
 
package/README.md CHANGED
@@ -93,7 +93,7 @@ npm install @kenz1117/dsh-ui-usage-billing
93
93
  └─ 渲染仪表盘
94
94
  ```
95
95
 
96
- - **服务端**(`src/index.ts`):注入 `webServer`、`sessionPersistence` 与 `credentials`,注册 `GET /api/billing/usage-stats`、`/api/billing/pricing`、`/api/billing/balance`、`/api/billing/subscriptions`、`/api/billing/relay-quotas`。聚合器按会话缓存折叠结果:一次 LLM 调用归属到其前置 `request/header` 记录的模型,token 拆分到缓存命中 / 未命中桶,日期按本机时区归天;日志文件 mtime+size 不变则直接复用缓存,只有写过的会话重新折叠,整份文档另有 5 秒 TTL 合并密集轮询。聚合逻辑见 `src/aggregate.ts`。
96
+ - **服务端**(`src/index.ts`):注入 `webServer`、`sessionPersistence` 与 `credentials`,注册 `GET /api/billing/usage-stats`、`/api/billing/pricing`、`/api/billing/balance`、`/api/billing/subscriptions`、`/api/billing/relay-quotas`。聚合器按会话缓存折叠结果:一次 LLM 调用归属到其前置 `request/header` 记录的模型,token 拆分到缓存命中 / 未命中桶,日期按本机时区归天;日志文件 mtime+size 不变则直接复用缓存,只有写过的会话重新折叠,整份文档另有 5 秒 TTL 合并密集轮询。每个成功折叠的会话同时原子写入独立的持久用量账本,永久删除会话后历史费用与 token 仍保留。聚合逻辑见 `src/aggregate.ts`。
97
97
  - **浏览器端**(`src/client/`):请求上述接口渲染仪表盘,通过 `llm.models` 探测各厂商连接状态。真实数据到达前显示全零空快照,不展示伪造样本。
98
98
 
99
99
  ## 主题协作
@@ -148,6 +148,7 @@ cost(CNY)= (missInput × p_input + cacheHit × p_cacheHit + output × p_outp
148
148
  | 字段 | 默认 | 说明 |
149
149
  | ----------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
150
150
  | `statsPath` | 未设置 | 回退统计文件 `.dsh-usage-stats.json` 的绝对路径(`sessionPersistence` 不可用时生效) |
151
+ | `ledgerPath` | `~/.dsh/.dsh-usage-ledger.json` | 独立持久用量账本的绝对路径;只保存折叠后的统计(不保存消息正文或会话标题),永久删除会话不会删除已记录的费用与 token |
151
152
  | `balanceApiKeyEnv` | `DEEPSEEK_API_KEY` | DeepSeek 余额查询的凭据引用;仅在 llm-pi-ai 未配置 deepseek 的 `apiKeyEnv` 时兜底使用 |
152
153
  | `subscriptionProviders` | `kimi-coding`、`xiaomi-token-plan-cn` | 订阅制(coding / token 套餐)provider id 列表,照常统计 token、费用记 0 |
153
154
  | `monthlyBudget` | 未设置 | 月度预算默认金额(人民币元);随 usage-stats 下发,作为仪表盘预算条的初始金额(用户在界面上的设置优先并本地持久化) |
@@ -185,7 +186,7 @@ npm publish --access public
185
186
  - **超支通知依赖浏览器 Notification**:权限被拒绝或平台不支持时只有界面红色脉冲兜底,没有宿主级通知通道;通知上限为每天一次。
186
187
  - **会话明细不可跳转**:点击会话行不会打开对应会话(跨插件导航需要宿主会话选择通道);会话数封顶 100 行、面板只显示前 20 行。
187
188
  - **费用为目录价估算**:讯飞 / 商汤 / 小米等未公布按量单价的模型使用估算价(特性表脚注 ¹),正式定价以厂商账单为准。
188
- - **30 天趋势受日志保留范围约束**:超出持久化日志保留期的日期在窗口内补零显示,不回溯历史。
189
+ - **账本从首次成功聚合开始生效**:升级前已经永久删除且不在旧快照中的会话无法恢复;手动删除 `.dsh-usage-ledger.json` 及其 `.bak` 会清空独立保留的历史。账本只保留本插件已经成功观测过的调用。
189
190
 
190
191
  ## Contributors
191
192
 
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 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 color-mix(in srgb, var(--dsw-alias-border-l1) 82%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 78%, transparent);-webkit-backdrop-filter:blur(10px)saturate(1.2);width:100%;min-width:0;box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 7%, transparent);color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:14px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .16s,transform .16s,box-shadow .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:var(--dsw-static-blue-500);box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 10%, transparent), 0 6px 18px -6px 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:30px;height:30px;color:var(--dsw-static-neutral-bluish-00);box-shadow:0 3px 10px -3px color-mix(in srgb, var(--dsw-static-blue-500) 60%, transparent), inset 0 1px 0 color-mix(in srgb, var(--dsw-static-neutral-bluish-00) 22%, 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:17px;font-weight:700;line-height:21px}.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 color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 72%, transparent);-webkit-backdrop-filter:blur(14px)saturate(1.3);box-shadow:0 12px 32px #00000029, inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);opacity:0;pointer-events:none;z-index:10;border-radius:14px;flex-direction:column;gap:5px;padding:10px 12px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;overflow:hidden;transform:translateY(4px)}.VWh0dG_triggerPop:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:4s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_triggerPopRow{white-space:nowrap;justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{letter-spacing:.01em;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10.5px;line-height:16px}.VWh0dG_triggerPopValue{min-width:0;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;justify-content:flex-end;align-items:baseline;gap:8px;font-size:12.5px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_triggerPopName{text-overflow:ellipsis;white-space:nowrap;max-width:110px;color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;overflow:hidden}.VWh0dG_triggerPopTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;align-items:baseline;gap:8px;font-size:12px;font-weight:700;display:flex}.VWh0dG_triggerPopTitleMonth{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500}.VWh0dG_triggerPopStrong{color:var(--dsw-alias-label-primary);margin-left:8px;font-size:12.5px;font-weight:700}.VWh0dG_triggerPopAlert{color:var(--dsw-static-red-500);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_triggerPopValueStack{flex-direction:column;align-items:flex-end;gap:2px;display:flex}.VWh0dG_triggerPopMuted{color:var(--dsw-alias-label-tertiary);font-weight:500}.VWh0dG_triggerPopHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_triggerPopUpdated{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetrics{grid-template-columns:1fr 1fr;gap:7px 12px;display:grid}.VWh0dG_triggerPopMetric{flex-direction:column;align-items:flex-start;gap:1px;display:flex}.VWh0dG_triggerPopMetricLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetricValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopMetricHighlight{color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFoot{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);flex-direction:column;gap:4px;padding-top:6px;display:flex}.VWh0dG_triggerPopFootTitle{text-align:center;letter-spacing:.05em;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);padding-bottom:4px;font-size:10px;font-weight:600}.VWh0dG_triggerPopFootNotes{flex-direction:column;gap:1px;min-width:0;display:flex}.VWh0dG_triggerPopFootNote{align-items:baseline;gap:4px;min-width:0;display:flex}.VWh0dG_triggerPopFootName{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.VWh0dG_triggerPopBadge{white-space:nowrap;border-radius:5px;flex:none;padding:1px 6px;font-size:9.5px;font-weight:600;line-height:14px}.VWh0dG_triggerPopBadgeDirect{background:color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent);color:var(--dsw-alias-label-primary)}.VWh0dG_triggerPopBadgeSub{background:color-mix(in srgb, var(--dsw-static-amber-500) 18%, transparent);color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFootStrong{color:var(--dsw-alias-label-secondary);font-weight:600}.VWh0dG_triggerPopFootStatus{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopFootStatusLow{color:var(--dsw-static-red-500)}.VWh0dG_triggerPopOpenBtn{pointer-events:auto;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 70%, transparent);cursor:pointer;border-radius:999px;flex:none;padding:5px 11px;font-size:11px;font-weight:600;transition:border-color .16s,background-color .16s}.VWh0dG_triggerPopOpenBtn:hover{border-color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 12%, var(--dsw-alias-bg-layer-3))}.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_unpricedHint{border:1px solid color-mix(in srgb, var(--dsw-static-amber-500) 30%, transparent);background:color-mix(in srgb, var(--dsw-static-amber-500) 8%, transparent);color:var(--dsw-static-amber-500);border-radius:8px;align-items:center;padding:8px 12px;font-size:11.5px;font-weight:500;line-height:17px;display:flex}.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_pricingTip{color:var(--dsw-alias-label-caption);margin:0 0 2px;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_chartBarPlaceholder{fill:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.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_siteRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:10px;justify-content:space-between;align-items:center;gap:12px;padding:8px 10px;display:flex}.VWh0dG_siteRowName{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_siteKindTag{white-space:nowrap;border-radius:999px;flex:none;align-items:center;padding:1px 7px;font-size:10.5px;font-weight:600;line-height:16px;display:inline-flex}.VWh0dG_siteKindSite{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent)}.VWh0dG_siteKindDirect{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 14%, transparent)}.VWh0dG_siteKindUnknown{color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 14%, transparent)}.VWh0dG_siteRowTitle{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.VWh0dG_siteRowMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_siteRowCost{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:12.5px;font-weight:700;line-height:18px}.VWh0dG_siteRowCalls{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:11.5px;line-height:17px}.VWh0dG_siteRowCallsLow{color:var(--dsw-static-red-500)}.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{align-items:center;gap:6px;display:inline-flex;position:relative}.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}.VWh0dG_balanceDaysBadge{border:1px solid var(--dsw-alias-label-caption);background:color-mix(in srgb, var(--dsw-alias-label-caption) 10%, transparent);min-width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:12px;justify-content:center;align-items:center;padding:0 6px;font-size:10.5px;font-weight:600;line-height:1;display:inline-flex}.VWh0dG_balanceDaysBadge:hover{border-color:var(--dsw-alias-label-secondary);background:color-mix(in srgb, var(--dsw-alias-label-caption) 18%, transparent)}.VWh0dG_balanceDaysBadgeLow{color:var(--dsw-static-red-500);border-color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 10%, transparent)}.VWh0dG_balanceDetailPop{z-index:20;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-label-caption);white-space:nowrap;border-radius:8px;flex-direction:column;gap:6px;min-width:180px;padding:8px 10px;display:inline-flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 6px 20px #0000002e}.VWh0dG_balanceDetailHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.VWh0dG_balanceDetailTitle{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600}.VWh0dG_balanceDetailClose{cursor:pointer;color:var(--dsw-alias-label-caption);background:0 0;border:none;font-size:14px;line-height:1}.VWh0dG_balanceDetailClose:hover{color:var(--dsw-alias-label-primary)}.VWh0dG_balanceDetailGrid{flex-direction:column;gap:4px;display:inline-flex}.VWh0dG_balanceDetailRow{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;gap:16px;font-size:11px;line-height:15px;display:flex}.VWh0dG_balanceDetailLabel{color:var(--dsw-alias-label-caption)}.VWh0dG_balanceDetailValue{color:var(--dsw-alias-label-primary);font-weight:500}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 color-mix(in srgb, var(--dsw-alias-border-l1) 75%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);-webkit-backdrop-filter:blur(12px)saturate(1.3);border-radius:12px;padding:12px 14px;transition:border-color .2s,box-shadow .2s;position:relative;overflow:hidden;box-shadow:0 8px 24px #0000001a}.VWh0dG_subscriptionCard:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:3.6s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}@keyframes VWh0dG_subscriptionGoldFlow{0%{background-position:200% 0}to{background-position:-200% 0}}.VWh0dG_subscriptionCard:hover{border-color:color-mix(in srgb, var(--dsw-static-amber-500) 55%, var(--dsw-alias-border-l1));box-shadow:0 10px 30px #00000029}.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_subscriptionTier{color:var(--dsw-alias-label-secondary);margin-left:6px}.VWh0dG_subscriptionAuto{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, var(--dsw-alias-bg-layer-2));border-radius:999px;margin-left:6px;padding:1px 6px;font-size:10px}.VWh0dG_subscriptionStatus{color:var(--dsw-alias-label-secondary);margin-bottom:6px;font-size:11px}.VWh0dG_subscriptionWindow{align-items:center;gap:10px;margin-top:8px;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:6px;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_subscriptionMeta{flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.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-caption);white-space:nowrap;flex:none;font-size:10px}.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:124px;padding:16px 2px 0;display:flex;overflow-x:auto}.VWh0dG_roundsBarCol{border-radius:5px 5px 0 0;flex-direction:column;flex:1 0 28px;justify-content:flex-end;align-items:stretch;height:100%;display:flex;position:relative}.VWh0dG_roundsBarColPeak{background:color-mix(in srgb, var(--dsw-static-amber-500) 16%, transparent)}.VWh0dG_roundsBarColOff{background:var(--dsw-alias-bg-module-platform)}.VWh0dG_roundsBarLabel{text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:9px;line-height:1.2;position:absolute;bottom:0;left:0;right:0;overflow:hidden;transform:translateY(-100%)}.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}.VWh0dG_heatmapYearScroll{padding-bottom:2px;overflow-x:auto}.VWh0dG_heatmapYearGrid{grid-template-rows:repeat(7,11px);grid-auto-flow:column;gap:3px;min-width:max-content;display:grid}.VWh0dG_heatmapYearCell{cursor:pointer;border:0;border-radius:2px;width:11px;height:11px;padding:0}.VWh0dG_pluginInfo{flex-direction:column;gap:8px;margin-top:10px;display:flex}.VWh0dG_pluginInfoRow{align-items:baseline;gap:12px;font-size:12px;display:flex}.VWh0dG_pluginInfoLabel{color:var(--dsw-alias-label-secondary);flex:0 0 72px}.VWh0dG_pluginInfoValue{color:var(--dsw-alias-label-primary);word-break:break-all}.VWh0dG_pluginInfoLink{color:var(--dsw-static-blue-500);word-break:break-all;text-decoration:none}.VWh0dG_pluginInfoLink:hover{text-decoration:underline}.VWh0dG_tokenPanel{flex-direction:column;gap:14px;display:flex}.VWh0dG_tokenModelBar{background:var(--dsw-alias-bg-layer-2);border-radius:999px;height:8px;overflow:hidden}.VWh0dG_tokenModelParts{height:100%;display:flex}.VWh0dG_tokenModelPartIn{background:var(--dsw-static-blue-500)}.VWh0dG_tokenModelPartOut{background:var(--dsw-static-amber-500)}.VWh0dG_tokenModelShareRow{align-items:center;gap:6px;display:inline-flex}@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}}.VWh0dG_peakAlert{z-index:2000;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;align-items:center;gap:12px;min-width:300px;max-width:460px;padding:10px 12px;animation:.2s VWh0dG_peakAlertIn;display:flex;position:fixed;box-shadow:0 4px 16px #00000014}.VWh0dG_peakAlertCorner{bottom:18px;right:18px}.VWh0dG_peakAlertCenter{top:20%;left:50%;transform:translate(-50%)}.VWh0dG_peakAlertTag{letter-spacing:.01em;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:6px;padding:3px 9px;font-size:11px;font-weight:650;display:inline-flex}.VWh0dG_peakAlertTag:before{content:\"\";background:currentColor;border-radius:50%;width:6px;height:6px}.VWh0dG_peakAlertPeak .VWh0dG_peakAlertTag{color:var(--dsw-static-amber-500)}.VWh0dG_peakAlertOff .VWh0dG_peakAlertTag{color:var(--dsw-static-blue-500)}.VWh0dG_peakAlertCountdown{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);flex:none;font-size:18px;font-weight:700;line-height:1}.VWh0dG_peakAlertText{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;line-height:18px}.VWh0dG_peakAlertClose{width:20px;height:20px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;font-size:15px;line-height:1;transition:background-color .14s,color .14s;display:inline-flex}.VWh0dG_peakAlertClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}@keyframes VWh0dG_peakAlertIn{0%{opacity:0}to{opacity:1}}.VWh0dG_peakAlertPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:10px;padding:14px 16px;display:flex}.VWh0dG_peakAlertPanelHead{justify-content:space-between;align-items:center;gap:10px;display:flex}.VWh0dG_peakAlertPanelLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.VWh0dG_peakAlertPanelBody{flex-wrap:wrap;align-items:center;gap:12px 16px;display:flex}.VWh0dG_peakAlertField{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertNum{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:56px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;border-radius:6px;padding:4px 6px}.VWh0dG_peakAlertSelect{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border-radius:6px;padding:4px 6px;font-size:12px}.VWh0dG_peakAlertCheck{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertPreview{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;padding:5px 10px;font-size:12px}.VWh0dG_peakAlertPreview:hover{background:var(--dsw-alias-bg-layer-3)}.VWh0dG_settingsHead{flex-direction:column;gap:4px;margin-bottom:2px;display:flex}.VWh0dG_settingsTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:650;line-height:22px}.VWh0dG_settingsHint{color:var(--dsw-alias-label-caption);margin:0;font-size:11px;line-height:16px}.VWh0dG_budgetHint,.VWh0dG_peakAlertHint{color:var(--dsw-alias-label-caption);margin:6px 0 0;font-size:11px;line-height:16px}";
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 color-mix(in srgb, var(--dsw-alias-border-l1) 82%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 78%, transparent);-webkit-backdrop-filter:blur(10px)saturate(1.2);width:100%;min-width:0;box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 7%, transparent);color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:14px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .16s,transform .16s,box-shadow .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:var(--dsw-static-blue-500);box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 10%, transparent), 0 6px 18px -6px 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:30px;height:30px;color:var(--dsw-static-neutral-bluish-00);box-shadow:0 3px 10px -3px color-mix(in srgb, var(--dsw-static-blue-500) 60%, transparent), inset 0 1px 0 color-mix(in srgb, var(--dsw-static-neutral-bluish-00) 22%, 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;text-overflow:ellipsis;min-width:0;font-size:17px;font-weight:700;line-height:21px;overflow:hidden}.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;text-overflow:ellipsis;min-width:0;font-size:9.5px;font-weight:600;line-height:12px;overflow:hidden}.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;container:VWh0dG_billing-trigger/inline-size}@container VWh0dG_billing-trigger (width<=300px){.VWh0dG_trigger{gap:6px;padding:8px 10px}.VWh0dG_triggerSpark{display:none}}@container VWh0dG_billing-trigger (width<=230px){.VWh0dG_triggerSub{display:none}.VWh0dG_triggerMeta{letter-spacing:0}}@container VWh0dG_billing-trigger (width<=120px){.VWh0dG_triggerIcon,.VWh0dG_triggerSpark,.VWh0dG_triggerSub,.VWh0dG_triggerMeta{display:none}.VWh0dG_trigger{justify-content:center;padding:8px 6px}}.VWh0dG_triggerPop{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 72%, transparent);-webkit-backdrop-filter:blur(14px)saturate(1.3);box-shadow:0 12px 32px #00000029, inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);opacity:0;pointer-events:none;z-index:10;border-radius:14px;flex-direction:column;gap:5px;padding:10px 12px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;overflow:hidden;transform:translateY(4px)}.VWh0dG_triggerPop:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:4s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_triggerPopRow{white-space:nowrap;justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{letter-spacing:.01em;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10.5px;line-height:16px}.VWh0dG_triggerPopValue{min-width:0;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;justify-content:flex-end;align-items:baseline;gap:8px;font-size:12.5px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_triggerPopName{text-overflow:ellipsis;white-space:nowrap;max-width:110px;color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;overflow:hidden}.VWh0dG_triggerPopTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;align-items:baseline;gap:8px;font-size:12px;font-weight:700;display:flex}.VWh0dG_triggerPopTitleMonth{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500}.VWh0dG_triggerPopStrong{color:var(--dsw-alias-label-primary);margin-left:8px;font-size:12.5px;font-weight:700}.VWh0dG_triggerPopAlert{color:var(--dsw-static-red-500);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_triggerPopValueStack{flex-direction:column;align-items:flex-end;gap:2px;display:flex}.VWh0dG_triggerPopMuted{color:var(--dsw-alias-label-tertiary);font-weight:500}.VWh0dG_triggerPopHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_triggerPopUpdated{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetrics{grid-template-columns:1fr 1fr;gap:7px 12px;display:grid}.VWh0dG_triggerPopMetric{flex-direction:column;align-items:flex-start;gap:1px;display:flex}.VWh0dG_triggerPopMetricLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetricValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopMetricHighlight{color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFoot{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);flex-direction:column;gap:4px;padding-top:6px;display:flex}.VWh0dG_triggerPopFootTitle{text-align:center;letter-spacing:.05em;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);padding-bottom:4px;font-size:10px;font-weight:600}.VWh0dG_triggerPopFootNotes{flex-direction:column;gap:1px;min-width:0;display:flex}.VWh0dG_triggerPopFootNote{align-items:baseline;gap:4px;min-width:0;display:flex}.VWh0dG_triggerPopFootName{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.VWh0dG_triggerPopBadge{white-space:nowrap;border-radius:5px;flex:none;padding:1px 6px;font-size:9.5px;font-weight:600;line-height:14px}.VWh0dG_triggerPopBadgeDirect{background:color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent);color:var(--dsw-alias-label-primary)}.VWh0dG_triggerPopBadgeSub{background:color-mix(in srgb, var(--dsw-static-amber-500) 18%, transparent);color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFootStrong{color:var(--dsw-alias-label-secondary);font-weight:600}.VWh0dG_triggerPopFootStatus{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopFootStatusLow{color:var(--dsw-static-red-500)}.VWh0dG_triggerPopOpenBtn{pointer-events:auto;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 70%, transparent);cursor:pointer;border-radius:999px;flex:none;padding:5px 11px;font-size:11px;font-weight:600;transition:border-color .16s,background-color .16s}.VWh0dG_triggerPopOpenBtn:hover{border-color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 12%, var(--dsw-alias-bg-layer-3))}.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_unpricedHint{border:1px solid color-mix(in srgb, var(--dsw-static-amber-500) 30%, transparent);background:color-mix(in srgb, var(--dsw-static-amber-500) 8%, transparent);color:var(--dsw-static-amber-500);border-radius:8px;align-items:center;padding:8px 12px;font-size:11.5px;font-weight:500;line-height:17px;display:flex}.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_pricingTip{color:var(--dsw-alias-label-caption);margin:0 0 2px;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_chartBarPlaceholder{fill:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.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_siteRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:10px;justify-content:space-between;align-items:center;gap:12px;padding:8px 10px;display:flex}.VWh0dG_siteRowName{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_siteKindTag{white-space:nowrap;border-radius:999px;flex:none;align-items:center;padding:1px 7px;font-size:10.5px;font-weight:600;line-height:16px;display:inline-flex}.VWh0dG_siteKindSite{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent)}.VWh0dG_siteKindDirect{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 14%, transparent)}.VWh0dG_siteKindUnknown{color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 14%, transparent)}.VWh0dG_siteRowTitle{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.VWh0dG_siteRowMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_siteRowCost{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:12.5px;font-weight:700;line-height:18px}.VWh0dG_siteRowCalls{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:11.5px;line-height:17px}.VWh0dG_siteRowCallsLow{color:var(--dsw-static-red-500)}.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{align-items:center;gap:6px;display:inline-flex;position:relative}.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}.VWh0dG_balanceDaysBadge{border:1px solid var(--dsw-alias-label-caption);background:color-mix(in srgb, var(--dsw-alias-label-caption) 10%, transparent);min-width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:12px;justify-content:center;align-items:center;padding:0 6px;font-size:10.5px;font-weight:600;line-height:1;display:inline-flex}.VWh0dG_balanceDaysBadge:hover{border-color:var(--dsw-alias-label-secondary);background:color-mix(in srgb, var(--dsw-alias-label-caption) 18%, transparent)}.VWh0dG_balanceDaysBadgeLow{color:var(--dsw-static-red-500);border-color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 10%, transparent)}.VWh0dG_balanceDetailPop{z-index:20;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-label-caption);white-space:nowrap;border-radius:8px;flex-direction:column;gap:6px;min-width:180px;padding:8px 10px;display:inline-flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 6px 20px #0000002e}.VWh0dG_balanceDetailHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.VWh0dG_balanceDetailTitle{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600}.VWh0dG_balanceDetailClose{cursor:pointer;color:var(--dsw-alias-label-caption);background:0 0;border:none;font-size:14px;line-height:1}.VWh0dG_balanceDetailClose:hover{color:var(--dsw-alias-label-primary)}.VWh0dG_balanceDetailGrid{flex-direction:column;gap:4px;display:inline-flex}.VWh0dG_balanceDetailRow{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;gap:16px;font-size:11px;line-height:15px;display:flex}.VWh0dG_balanceDetailLabel{color:var(--dsw-alias-label-caption)}.VWh0dG_balanceDetailValue{color:var(--dsw-alias-label-primary);font-weight:500}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 color-mix(in srgb, var(--dsw-alias-border-l1) 75%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);-webkit-backdrop-filter:blur(12px)saturate(1.3);border-radius:12px;padding:12px 14px;transition:border-color .2s,box-shadow .2s;position:relative;overflow:hidden;box-shadow:0 8px 24px #0000001a}.VWh0dG_subscriptionCard:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:3.6s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}@keyframes VWh0dG_subscriptionGoldFlow{0%{background-position:200% 0}to{background-position:-200% 0}}.VWh0dG_subscriptionCard:hover{border-color:color-mix(in srgb, var(--dsw-static-amber-500) 55%, var(--dsw-alias-border-l1));box-shadow:0 10px 30px #00000029}.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_subscriptionTier{color:var(--dsw-alias-label-secondary);margin-left:6px}.VWh0dG_subscriptionAuto{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, var(--dsw-alias-bg-layer-2));border-radius:999px;margin-left:6px;padding:1px 6px;font-size:10px}.VWh0dG_subscriptionStatus{color:var(--dsw-alias-label-secondary);margin-bottom:6px;font-size:11px}.VWh0dG_subscriptionWindow{align-items:center;gap:10px;margin-top:8px;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:6px;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_subscriptionMeta{flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.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-caption);white-space:nowrap;flex:none;font-size:10px}.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:124px;padding:16px 2px 0;display:flex;overflow-x:auto}.VWh0dG_roundsBarCol{border-radius:5px 5px 0 0;flex-direction:column;flex:1 0 28px;justify-content:flex-end;align-items:stretch;height:100%;display:flex;position:relative}.VWh0dG_roundsBarColPeak{background:color-mix(in srgb, var(--dsw-static-amber-500) 16%, transparent)}.VWh0dG_roundsBarColOff{background:var(--dsw-alias-bg-module-platform)}.VWh0dG_roundsBarLabel{text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:9px;line-height:1.2;position:absolute;bottom:0;left:0;right:0;overflow:hidden;transform:translateY(-100%)}.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}.VWh0dG_heatmapYearScroll{padding-bottom:2px;overflow-x:auto}.VWh0dG_heatmapYearGrid{grid-template-rows:repeat(7,11px);grid-auto-flow:column;gap:3px;min-width:max-content;display:grid}.VWh0dG_heatmapYearCell{cursor:pointer;border:0;border-radius:2px;width:11px;height:11px;padding:0}.VWh0dG_pluginInfo{flex-direction:column;gap:8px;margin-top:10px;display:flex}.VWh0dG_pluginInfoRow{align-items:baseline;gap:12px;font-size:12px;display:flex}.VWh0dG_pluginInfoLabel{color:var(--dsw-alias-label-secondary);flex:0 0 72px}.VWh0dG_pluginInfoValue{color:var(--dsw-alias-label-primary);word-break:break-all}.VWh0dG_pluginInfoLink{color:var(--dsw-static-blue-500);word-break:break-all;text-decoration:none}.VWh0dG_pluginInfoLink:hover{text-decoration:underline}.VWh0dG_tokenPanel{flex-direction:column;gap:14px;display:flex}.VWh0dG_tokenModelBar{background:var(--dsw-alias-bg-layer-2);border-radius:999px;height:8px;overflow:hidden}.VWh0dG_tokenModelParts{height:100%;display:flex}.VWh0dG_tokenModelPartIn{background:var(--dsw-static-blue-500)}.VWh0dG_tokenModelPartOut{background:var(--dsw-static-amber-500)}.VWh0dG_tokenModelShareRow{align-items:center;gap:6px;display:inline-flex}@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}}.VWh0dG_peakAlert{z-index:2000;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;align-items:center;gap:12px;min-width:300px;max-width:460px;padding:10px 12px;animation:.2s VWh0dG_peakAlertIn;display:flex;position:fixed;box-shadow:0 4px 16px #00000014}.VWh0dG_peakAlertCorner{bottom:18px;right:18px}.VWh0dG_peakAlertCenter{top:20%;left:50%;transform:translate(-50%)}.VWh0dG_peakAlertTag{letter-spacing:.01em;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:6px;padding:3px 9px;font-size:11px;font-weight:650;display:inline-flex}.VWh0dG_peakAlertTag:before{content:\"\";background:currentColor;border-radius:50%;width:6px;height:6px}.VWh0dG_peakAlertPeak .VWh0dG_peakAlertTag{color:var(--dsw-static-amber-500)}.VWh0dG_peakAlertOff .VWh0dG_peakAlertTag{color:var(--dsw-static-blue-500)}.VWh0dG_peakAlertCountdown{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);flex:none;font-size:18px;font-weight:700;line-height:1}.VWh0dG_peakAlertText{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;line-height:18px}.VWh0dG_peakAlertClose{width:20px;height:20px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;font-size:15px;line-height:1;transition:background-color .14s,color .14s;display:inline-flex}.VWh0dG_peakAlertClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}@keyframes VWh0dG_peakAlertIn{0%{opacity:0}to{opacity:1}}.VWh0dG_peakAlertPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:10px;padding:14px 16px;display:flex}.VWh0dG_peakAlertPanelHead{justify-content:space-between;align-items:center;gap:10px;display:flex}.VWh0dG_peakAlertPanelLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.VWh0dG_peakAlertPanelBody{flex-wrap:wrap;align-items:center;gap:12px 16px;display:flex}.VWh0dG_peakAlertField{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertNum{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:56px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;border-radius:6px;padding:4px 6px}.VWh0dG_peakAlertSelect{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border-radius:6px;padding:4px 6px;font-size:12px}.VWh0dG_peakAlertCheck{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertPreview{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;padding:5px 10px;font-size:12px}.VWh0dG_peakAlertPreview:hover{background:var(--dsw-alias-bg-layer-3)}.VWh0dG_settingsHead{flex-direction:column;gap:4px;margin-bottom:2px;display:flex}.VWh0dG_settingsTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:650;line-height:22px}.VWh0dG_settingsHint{color:var(--dsw-alias-label-caption);margin:0;font-size:11px;line-height:16px}.VWh0dG_budgetHint,.VWh0dG_peakAlertHint{color:var(--dsw-alias-label-caption);margin:6px 0 0;font-size:11px;line-height:16px}";
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,317 +34,318 @@ window.__ModuleLoader__.load({
34
34
  document.head.appendChild(tag);
35
35
  }
36
36
  var UsageBilling_module_css_default = {
37
- "siteRowCost": "VWh0dG_siteRowCost",
38
- "balanceDetailLabel": "VWh0dG_balanceDetailLabel",
39
- "peakAlertCountdown": "VWh0dG_peakAlertCountdown",
40
- "pricingChevron": "VWh0dG_pricingChevron",
41
- "peakAlert": "VWh0dG_peakAlert",
42
- "settingsHead": "VWh0dG_settingsHead",
43
- "triggerRow": "VWh0dG_triggerRow",
44
- "shareLegend": "VWh0dG_shareLegend",
45
- "dashboardHead": "VWh0dG_dashboardHead",
46
- "heroReadout": "VWh0dG_heroReadout",
47
- "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
48
- "triggerSpark": "VWh0dG_triggerSpark",
49
- "heroSideLabel": "VWh0dG_heroSideLabel",
50
- "kpiDetail": "VWh0dG_kpiDetail",
51
- "tableScroll": "VWh0dG_tableScroll",
52
- "balanceDaysBadge": "VWh0dG_balanceDaysBadge",
53
- "kpiGreen": "VWh0dG_kpiGreen",
54
- "shareSegPeak": "VWh0dG_shareSegPeak",
55
- "triggerPopLabel": "VWh0dG_triggerPopLabel",
56
- "shareSegUser": "VWh0dG_shareSegUser",
57
- "heatmapYearGrid": "VWh0dG_heatmapYearGrid",
58
- "triggerPopUpdated": "VWh0dG_triggerPopUpdated",
59
- "dashboardIn": "VWh0dG_dashboardIn",
60
- "shareSegOff": "VWh0dG_shareSegOff",
61
- "modelProvider": "VWh0dG_modelProvider",
62
- "siteKindTag": "VWh0dG_siteKindTag",
63
- "peakAlertPreview": "VWh0dG_peakAlertPreview",
64
- "shareSegAssistant": "VWh0dG_shareSegAssistant",
65
- "heroSideItem": "VWh0dG_heroSideItem",
66
- "budgetFillWarn": "VWh0dG_budgetFillWarn",
67
- "rangeToggle": "VWh0dG_rangeToggle",
68
- "siteKindSite": "VWh0dG_siteKindSite",
69
- "healthOk": "VWh0dG_healthOk",
70
- "healthBadge": "VWh0dG_healthBadge",
71
- "bandTag": "VWh0dG_bandTag",
72
- "subscriptionName": "VWh0dG_subscriptionName",
73
- "providerGroupTitle": "VWh0dG_providerGroupTitle",
74
- "roundsAxis": "VWh0dG_roundsAxis",
75
- "modelDot": "VWh0dG_modelDot",
76
- "heatmapLegend": "VWh0dG_heatmapLegend",
77
- "heatmapCell": "VWh0dG_heatmapCell",
78
- "pluginInfoLink": "VWh0dG_pluginInfoLink",
79
- "triggerPopRow": "VWh0dG_triggerPopRow",
80
- "currencyButton": "VWh0dG_currencyButton",
81
- "trigger": "VWh0dG_trigger",
82
- "currencyToggle": "VWh0dG_currencyToggle",
83
- "peakAlertCenter": "VWh0dG_peakAlertCenter",
84
- "liveCostItem": "VWh0dG_liveCostItem",
85
- "balanceDetailRow": "VWh0dG_balanceDetailRow",
86
- "roundsBarWrap": "VWh0dG_roundsBarWrap",
87
- "balanceDetailHead": "VWh0dG_balanceDetailHead",
88
- "subscriptionReset": "VWh0dG_subscriptionReset",
89
- "kpiTile": "VWh0dG_kpiTile",
90
- "emptyRow": "VWh0dG_emptyRow",
91
- "triggerPopTitle": "VWh0dG_triggerPopTitle",
92
- "heatmapFooter": "VWh0dG_heatmapFooter",
93
- "heroValue": "VWh0dG_heroValue",
94
- "dashboard": "VWh0dG_dashboard",
95
- "heroSide": "VWh0dG_heroSide",
96
- "triggerMeta": "VWh0dG_triggerMeta",
97
- "triggerPopName": "VWh0dG_triggerPopName",
98
- "dashboardModal": "VWh0dG_dashboardModal",
99
- "pricingToggle": "VWh0dG_pricingToggle",
100
- "tabButton": "VWh0dG_tabButton",
101
- "rateBadgeLive": "VWh0dG_rateBadgeLive",
102
- "healthBad": "VWh0dG_healthBad",
103
- "rounds": "VWh0dG_rounds",
104
- "chartCrosshair": "VWh0dG_chartCrosshair",
105
- "budgetUnit": "VWh0dG_budgetUnit",
106
- "switch": "VWh0dG_switch",
107
- "bandPrice": "VWh0dG_bandPrice",
108
- "chartSvg": "VWh0dG_chartSvg",
109
- "currencyButtonActive": "VWh0dG_currencyButtonActive",
110
- "heatmapHover": "VWh0dG_heatmapHover",
111
- "bandPriceOff": "VWh0dG_bandPriceOff",
112
- "estimatedTag": "VWh0dG_estimatedTag",
113
- "heatmapGrid": "VWh0dG_heatmapGrid",
114
37
  "heatmapYearScroll": "VWh0dG_heatmapYearScroll",
115
- "chartWrap": "VWh0dG_chartWrap",
116
- "balanceDays": "VWh0dG_balanceDays",
117
- "unpricedHint": "VWh0dG_unpricedHint",
118
- "triggerPopMetric": "VWh0dG_triggerPopMetric",
119
- "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
120
- "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
121
- "subscriptionPct": "VWh0dG_subscriptionPct",
122
- "budgetHint": "VWh0dG_budgetHint",
123
- "triggerPopBadge": "VWh0dG_triggerPopBadge",
124
- "triggerAmount": "VWh0dG_triggerAmount",
38
+ "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
39
+ "balanceDetailClose": "VWh0dG_balanceDetailClose",
40
+ "closeButton": "VWh0dG_closeButton",
41
+ "exportLabel": "VWh0dG_exportLabel",
42
+ "chartAxisLabel": "VWh0dG_chartAxisLabel",
43
+ "chartLegend": "VWh0dG_chartLegend",
125
44
  "modelTable": "VWh0dG_modelTable",
126
- "triggerPopFootNote": "VWh0dG_triggerPopFootNote",
127
- "siteKindUnknown": "VWh0dG_siteKindUnknown",
128
- "healthBadgeOk": "VWh0dG_healthBadgeOk",
129
- "healthBadgeBad": "VWh0dG_healthBadgeBad",
130
- "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
131
- "peakAlertSelect": "VWh0dG_peakAlertSelect",
45
+ "modelDot": "VWh0dG_modelDot",
46
+ "tabPanelIn": "VWh0dG_tabPanelIn",
132
47
  "chartTooltipDate": "VWh0dG_chartTooltipDate",
133
- "providerGroupBalance": "VWh0dG_providerGroupBalance",
134
- "chartEmpty": "VWh0dG_chartEmpty",
48
+ "siteRowCost": "VWh0dG_siteRowCost",
49
+ "roundsEmpty": "VWh0dG_roundsEmpty",
50
+ "chartCrosshair": "VWh0dG_chartCrosshair",
51
+ "pricingToggleText": "VWh0dG_pricingToggleText",
52
+ "heatmapCell": "VWh0dG_heatmapCell",
53
+ "headTitleRow": "VWh0dG_headTitleRow",
135
54
  "tabNav": "VWh0dG_tabNav",
136
- "panelHead": "VWh0dG_panelHead",
137
- "pricingTable": "VWh0dG_pricingTable",
138
- "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
139
- "liveTierOff": "VWh0dG_liveTierOff",
55
+ "triggerSub": "VWh0dG_triggerSub",
56
+ "switch": "VWh0dG_switch",
140
57
  "triggerPopMuted": "VWh0dG_triggerPopMuted",
58
+ "uncataloguedTag": "VWh0dG_uncataloguedTag",
59
+ "emptyRow": "VWh0dG_emptyRow",
60
+ "bucketStatSub": "VWh0dG_bucketStatSub",
61
+ "chartDot": "VWh0dG_chartDot",
141
62
  "siteRowCalls": "VWh0dG_siteRowCalls",
142
63
  "triggerPopHead": "VWh0dG_triggerPopHead",
143
- "heroGaugeArc": "VWh0dG_heroGaugeArc",
144
- "shareDot": "VWh0dG_shareDot",
145
- "subscriptionWindow": "VWh0dG_subscriptionWindow",
146
- "tokenModelPartOut": "VWh0dG_tokenModelPartOut",
147
- "triggerPopFootNotes": "VWh0dG_triggerPopFootNotes",
148
- "budgetFillOver": "VWh0dG_budgetFillOver",
149
- "chartBar": "VWh0dG_chartBar",
150
- "heroMain": "VWh0dG_heroMain",
151
- "pricingTip": "VWh0dG_pricingTip",
64
+ "panelHead": "VWh0dG_panelHead",
65
+ "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
66
+ "estimatedTag": "VWh0dG_estimatedTag",
67
+ "shareSegTool": "VWh0dG_shareSegTool",
68
+ "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
69
+ "roundsFlagMark": "VWh0dG_roundsFlagMark",
70
+ "budgetControls": "VWh0dG_budgetControls",
71
+ "heroGaugePct": "VWh0dG_heroGaugePct",
72
+ "triggerBody": "VWh0dG_triggerBody",
73
+ "kpiTile": "VWh0dG_kpiTile",
74
+ "triggerPopValue": "VWh0dG_triggerPopValue",
75
+ "bucketSep": "VWh0dG_bucketSep",
152
76
  "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
153
- "panelTitle": "VWh0dG_panelTitle",
154
- "triggerPopFootTitle": "VWh0dG_triggerPopFootTitle",
155
- "triggerPopBadgeDirect": "VWh0dG_triggerPopBadgeDirect",
156
- "deltaUp": "VWh0dG_deltaUp",
157
- "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
158
- "tabPanelIn": "VWh0dG_tabPanelIn",
159
- "chartTooltip": "VWh0dG_chartTooltip",
160
- "subscriptionFill": "VWh0dG_subscriptionFill",
161
- "uncataloguedTag": "VWh0dG_uncataloguedTag",
77
+ "heroGaugeArc": "VWh0dG_heroGaugeArc",
78
+ "switchKnob": "VWh0dG_switchKnob",
79
+ "peakAlertPeak": "VWh0dG_peakAlertPeak",
80
+ "peakAlertPanel": "VWh0dG_peakAlertPanel",
81
+ "hero": "VWh0dG_hero",
82
+ "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
83
+ "dashboardModal": "VWh0dG_dashboardModal",
84
+ "costCol": "VWh0dG_costCol",
85
+ "providerGroupBalance": "VWh0dG_providerGroupBalance",
86
+ "settingsTitle": "VWh0dG_settingsTitle",
87
+ "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
88
+ "dashboardTitle": "VWh0dG_dashboardTitle",
89
+ "heatmapFooter": "VWh0dG_heatmapFooter",
90
+ "triggerPopFootNote": "VWh0dG_triggerPopFootNote",
91
+ "kpiLabel": "VWh0dG_kpiLabel",
92
+ "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
93
+ "triggerPopFoot": "VWh0dG_triggerPopFoot",
94
+ "liveTierPeak": "VWh0dG_liveTierPeak",
95
+ "heatmapGrid": "VWh0dG_heatmapGrid",
96
+ "budget": "VWh0dG_budget",
97
+ "kpiGrid": "VWh0dG_kpiGrid",
98
+ "balanceDaysBadge": "VWh0dG_balanceDaysBadge",
99
+ "deltaDown": "VWh0dG_deltaDown",
100
+ "roundsBarWrap": "VWh0dG_roundsBarWrap",
101
+ "pricingTable": "VWh0dG_pricingTable",
102
+ "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
103
+ "peakAlertOff": "VWh0dG_peakAlertOff",
104
+ "planTag": "VWh0dG_planTag",
105
+ "pluginInfoRow": "VWh0dG_pluginInfoRow",
106
+ "triggerPopFootStatusLow": "VWh0dG_triggerPopFootStatusLow",
107
+ "peakAlertCheck": "VWh0dG_peakAlertCheck",
108
+ "triggerSparkHot": "VWh0dG_triggerSparkHot",
109
+ "healthIdle": "VWh0dG_healthIdle",
110
+ "budgetValue": "VWh0dG_budgetValue",
111
+ "railButton": "VWh0dG_railButton",
112
+ "providerGroupName": "VWh0dG_providerGroupName",
162
113
  "peakAlertClose": "VWh0dG_peakAlertClose",
163
- "peakAlertField": "VWh0dG_peakAlertField",
164
- "subscriptionCard": "VWh0dG_subscriptionCard",
114
+ "tokenModelParts": "VWh0dG_tokenModelParts",
115
+ "triggerPopMetrics": "VWh0dG_triggerPopMetrics",
116
+ "bucketOfficial": "VWh0dG_bucketOfficial",
117
+ "heroSideSpacer": "VWh0dG_heroSideSpacer",
118
+ "flatTag": "VWh0dG_flatTag",
119
+ "chartSvg": "VWh0dG_chartSvg",
120
+ "providerGroupTitle": "VWh0dG_providerGroupTitle",
121
+ "siteRowTitle": "VWh0dG_siteRowTitle",
122
+ "peakAlertCenter": "VWh0dG_peakAlertCenter",
123
+ "tokenModelPartOut": "VWh0dG_tokenModelPartOut",
124
+ "shareValue": "VWh0dG_shareValue",
125
+ "modelCell": "VWh0dG_modelCell",
165
126
  "triggerPopMetricLabel": "VWh0dG_triggerPopMetricLabel",
166
- "siteRowMeta": "VWh0dG_siteRowMeta",
167
- "roundsBarCol": "VWh0dG_roundsBarCol",
127
+ "switchOn": "VWh0dG_switchOn",
128
+ "chartLegendLine": "VWh0dG_chartLegendLine",
129
+ "triggerPopStrong": "VWh0dG_triggerPopStrong",
130
+ "triggerSpark": "VWh0dG_triggerSpark",
131
+ "budgetLabel": "VWh0dG_budgetLabel",
132
+ "chartLine": "VWh0dG_chartLine",
133
+ "chartTooltip": "VWh0dG_chartTooltip",
134
+ "triggerWrap": "VWh0dG_triggerWrap",
135
+ "heroMain": "VWh0dG_heroMain",
136
+ "shareSegOff": "VWh0dG_shareSegOff",
137
+ "siteRowCallsLow": "VWh0dG_siteRowCallsLow",
138
+ "chartBarPlaceholder": "VWh0dG_chartBarPlaceholder",
139
+ "bucketStatLabel": "VWh0dG_bucketStatLabel",
140
+ "balanceDetailRow": "VWh0dG_balanceDetailRow",
141
+ "providerGroup": "VWh0dG_providerGroup",
142
+ "providerGroupHead": "VWh0dG_providerGroupHead",
143
+ "pluginInfoLink": "VWh0dG_pluginInfoLink",
144
+ "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
145
+ "kpiGreen": "VWh0dG_kpiGreen",
168
146
  "chartStack": "VWh0dG_chartStack",
169
- "exportButton": "VWh0dG_exportButton",
170
- "hero": "VWh0dG_hero",
171
- "subscriptionTier": "VWh0dG_subscriptionTier",
172
- "subscriptionPlan": "VWh0dG_subscriptionPlan",
173
- "triggerPopMetricValue": "VWh0dG_triggerPopMetricValue",
174
- "heroTop": "VWh0dG_heroTop",
147
+ "chartTooltipRow": "VWh0dG_chartTooltipRow",
148
+ "healthBadgeBad": "VWh0dG_healthBadgeBad",
175
149
  "subscriptionHead": "VWh0dG_subscriptionHead",
176
- "chartLegendBar": "VWh0dG_chartLegendBar",
177
- "pricingToggleText": "VWh0dG_pricingToggleText",
178
- "railButton": "VWh0dG_railButton",
179
- "triggerPopFootName": "VWh0dG_triggerPopFootName",
180
- "numCol": "VWh0dG_numCol",
181
- "providerGroupMeta": "VWh0dG_providerGroupMeta",
182
- "subscriptionTrack": "VWh0dG_subscriptionTrack",
183
- "exportLabel": "VWh0dG_exportLabel",
184
- "bucketStatLabel": "VWh0dG_bucketStatLabel",
185
- "budgetTrack": "VWh0dG_budgetTrack",
186
- "budgetFill": "VWh0dG_budgetFill",
187
- "siteRow": "VWh0dG_siteRow",
188
- "delta": "VWh0dG_delta",
189
- "exportBar": "VWh0dG_exportBar",
190
- "providerGroupBadge": "VWh0dG_providerGroupBadge",
191
- "liveCostBar": "VWh0dG_liveCostBar",
192
- "heroLabel": "VWh0dG_heroLabel",
193
- "bucketStatSub": "VWh0dG_bucketStatSub",
150
+ "subscriptionTier": "VWh0dG_subscriptionTier",
151
+ "roundsBars": "VWh0dG_roundsBars",
152
+ "roundsAxis": "VWh0dG_roundsAxis",
153
+ "triggerSparkBar": "VWh0dG_triggerSparkBar",
154
+ "rangeButton": "VWh0dG_rangeButton",
155
+ "triggerRow": "VWh0dG_triggerRow",
156
+ "shareDot": "VWh0dG_shareDot",
157
+ "balanceDetailValue": "VWh0dG_balanceDetailValue",
158
+ "heroSideValue": "VWh0dG_heroSideValue",
159
+ "kpiDetail": "VWh0dG_kpiDetail",
160
+ "budgetInputWrap": "VWh0dG_budgetInputWrap",
161
+ "subscriptionGrid": "VWh0dG_subscriptionGrid",
162
+ "tokenModelShareRow": "VWh0dG_tokenModelShareRow",
194
163
  "shareTrack": "VWh0dG_shareTrack",
195
- "closeButton": "VWh0dG_closeButton",
196
- "siteRowCallsLow": "VWh0dG_siteRowCallsLow",
197
- "peakAlertIn": "VWh0dG_peakAlertIn",
198
- "modelCell": "VWh0dG_modelCell",
199
- "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
200
- "chartLegend": "VWh0dG_chartLegend",
201
- "healthIdle": "VWh0dG_healthIdle",
202
- "budgetControls": "VWh0dG_budgetControls",
203
- "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
204
- "bucketOfficial": "VWh0dG_bucketOfficial",
205
- "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
206
- "panelHint": "VWh0dG_panelHint",
207
- "subscriptionAuto": "VWh0dG_subscriptionAuto",
208
- "providerGroupHead": "VWh0dG_providerGroupHead",
209
- "triggerPopMetricHighlight": "VWh0dG_triggerPopMetricHighlight",
210
- "triggerPopFootStatusLow": "VWh0dG_triggerPopFootStatusLow",
211
- "chartLine": "VWh0dG_chartLine",
212
- "rateBadge": "VWh0dG_rateBadge",
213
- "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
214
- "tokenModelParts": "VWh0dG_tokenModelParts",
215
- "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
216
- "triggerPopBars": "VWh0dG_triggerPopBars",
217
- "balanceDetailTitle": "VWh0dG_balanceDetailTitle",
218
- "healthDot": "VWh0dG_healthDot",
219
- "roundsEmpty": "VWh0dG_roundsEmpty",
164
+ "liveCostBar": "VWh0dG_liveCostBar",
165
+ "shareLegend": "VWh0dG_shareLegend",
166
+ "shareItem": "VWh0dG_shareItem",
167
+ "heroMeta": "VWh0dG_heroMeta",
220
168
  "balanceDaysBadgeLow": "VWh0dG_balanceDaysBadgeLow",
169
+ "peakAlertCorner": "VWh0dG_peakAlertCorner",
170
+ "triggerPopMetric": "VWh0dG_triggerPopMetric",
171
+ "peakAlertCountdown": "VWh0dG_peakAlertCountdown",
172
+ "deltaUp": "VWh0dG_deltaUp",
173
+ "liveCostItem": "VWh0dG_liveCostItem",
174
+ "bandPrice": "VWh0dG_bandPrice",
221
175
  "pluginInfo": "VWh0dG_pluginInfo",
222
- "triggerSparkBar": "VWh0dG_triggerSparkBar",
223
- "tabButtonActive": "VWh0dG_tabButtonActive",
224
- "roundsBarLabel": "VWh0dG_roundsBarLabel",
225
- "triggerPopFoot": "VWh0dG_triggerPopFoot",
226
- "triggerPopBar": "VWh0dG_triggerPopBar",
227
- "pluginInfoLabel": "VWh0dG_pluginInfoLabel",
228
- "triggerPopTitleMonth": "VWh0dG_triggerPopTitleMonth",
229
- "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
230
- "modelName": "VWh0dG_modelName",
176
+ "triggerPopBadge": "VWh0dG_triggerPopBadge",
177
+ "bandTagOff": "VWh0dG_bandTagOff",
178
+ "unpricedHint": "VWh0dG_unpricedHint",
179
+ "healthDot": "VWh0dG_healthDot",
180
+ "heroValue": "VWh0dG_heroValue",
181
+ "liveTierOff": "VWh0dG_liveTierOff",
182
+ "heroCurrency": "VWh0dG_heroCurrency",
183
+ "subscriptionCard": "VWh0dG_subscriptionCard",
184
+ "balanceDetailTitle": "VWh0dG_balanceDetailTitle",
231
185
  "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
232
- "switchKnob": "VWh0dG_switchKnob",
233
- "triggerPopValue": "VWh0dG_triggerPopValue",
234
- "dashboardTitle": "VWh0dG_dashboardTitle",
235
- "pluginInfoRow": "VWh0dG_pluginInfoRow",
236
- "flatTag": "VWh0dG_flatTag",
237
- "chartBarPlaceholder": "VWh0dG_chartBarPlaceholder",
238
- "switchOn": "VWh0dG_switchOn",
239
- "heroSideValue": "VWh0dG_heroSideValue",
240
- "peakAlertNum": "VWh0dG_peakAlertNum",
186
+ "triggerPopTitleMonth": "VWh0dG_triggerPopTitleMonth",
187
+ "triggerMeta": "VWh0dG_triggerMeta",
188
+ "chartLegendBar": "VWh0dG_chartLegendBar",
189
+ "heatmapLegend": "VWh0dG_heatmapLegend",
190
+ "triggerPopValueStack": "VWh0dG_triggerPopValueStack",
191
+ "siteKindTag": "VWh0dG_siteKindTag",
192
+ "triggerPopUpdated": "VWh0dG_triggerPopUpdated",
193
+ "dashboardBody": "VWh0dG_dashboardBody",
194
+ "triggerPopAlert": "VWh0dG_triggerPopAlert",
241
195
  "triggerPopBadgeSub": "VWh0dG_triggerPopBadgeSub",
242
- "subscriptionStatus": "VWh0dG_subscriptionStatus",
243
- "tokenPanel": "VWh0dG_tokenPanel",
244
- "heroSideSpacer": "VWh0dG_heroSideSpacer",
245
- "triggerPopStrong": "VWh0dG_triggerPopStrong",
246
- "triggerPopOpenBtn": "VWh0dG_triggerPopOpenBtn",
247
- "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
248
- "budgetOverPulse": "VWh0dG_budgetOverPulse",
249
- "settingsHint": "VWh0dG_settingsHint",
250
- "kpiValue": "VWh0dG_kpiValue",
251
- "siteRowTitle": "VWh0dG_siteRowTitle",
252
- "triggerPop": "VWh0dG_triggerPop",
253
- "chartTooltipRow": "VWh0dG_chartTooltipRow",
254
- "bucketCost": "VWh0dG_bucketCost",
255
- "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
256
- "chartLegendLine": "VWh0dG_chartLegendLine",
257
- "kpiLabel": "VWh0dG_kpiLabel",
258
- "chartDot": "VWh0dG_chartDot",
259
- "budgetLabel": "VWh0dG_budgetLabel",
260
- "roundsBar": "VWh0dG_roundsBar",
261
- "tokenModelBar": "VWh0dG_tokenModelBar",
196
+ "delta": "VWh0dG_delta",
262
197
  "balanceDaysLow": "VWh0dG_balanceDaysLow",
263
- "deltaDown": "VWh0dG_deltaDown",
264
- "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
265
- "triggerPopFootStrong": "VWh0dG_triggerPopFootStrong",
266
- "chartGrid": "VWh0dG_chartGrid",
267
- "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
268
- "heroCurrency": "VWh0dG_heroCurrency",
269
- "peakAlertOff": "VWh0dG_peakAlertOff",
198
+ "budgetFill": "VWh0dG_budgetFill",
199
+ "tokenModelBar": "VWh0dG_tokenModelBar",
200
+ "peakAlertText": "VWh0dG_peakAlertText",
201
+ "budgetHint": "VWh0dG_budgetHint",
202
+ "triggerPopMetricHighlight": "VWh0dG_triggerPopMetricHighlight",
203
+ "subscriptionAuto": "VWh0dG_subscriptionAuto",
204
+ "triggerPopName": "VWh0dG_triggerPopName",
205
+ "balanceDetailPop": "VWh0dG_balanceDetailPop",
206
+ "shareSeg": "VWh0dG_shareSeg",
207
+ "healthBadgeOk": "VWh0dG_healthBadgeOk",
208
+ "heroSideItem": "VWh0dG_heroSideItem",
270
209
  "siteRowName": "VWh0dG_siteRowName",
271
- "triggerPopFootStatus": "VWh0dG_triggerPopFootStatus",
210
+ "bandPriceOff": "VWh0dG_bandPriceOff",
211
+ "balanceCell": "VWh0dG_balanceCell",
212
+ "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
213
+ "tokenModelPartIn": "VWh0dG_tokenModelPartIn",
214
+ "pricingTip": "VWh0dG_pricingTip",
215
+ "liveCostSep": "VWh0dG_liveCostSep",
216
+ "providerGroupMeta": "VWh0dG_providerGroupMeta",
217
+ "pluginInfoValue": "VWh0dG_pluginInfoValue",
218
+ "triggerAmount": "VWh0dG_triggerAmount",
219
+ "subscriptionFill": "VWh0dG_subscriptionFill",
220
+ "budgetInput": "VWh0dG_budgetInput",
221
+ "siteKindDirect": "VWh0dG_siteKindDirect",
222
+ "tabButton": "VWh0dG_tabButton",
272
223
  "heroGauge": "VWh0dG_heroGauge",
273
- "liveTierPeak": "VWh0dG_liveTierPeak",
274
- "balanceDetailGrid": "VWh0dG_balanceDetailGrid",
275
- "peakAlertCheck": "VWh0dG_peakAlertCheck",
276
- "triggerSub": "VWh0dG_triggerSub",
277
- "triggerPopMetrics": "VWh0dG_triggerPopMetrics",
278
- "heatmapYearCell": "VWh0dG_heatmapYearCell",
279
- "tokenModelShareRow": "VWh0dG_tokenModelShareRow",
224
+ "heroLabel": "VWh0dG_heroLabel",
225
+ "triggerPopFootName": "VWh0dG_triggerPopFootName",
226
+ "shareSegPeak": "VWh0dG_shareSegPeak",
227
+ "healthOk": "VWh0dG_healthOk",
228
+ "roundsBarCol": "VWh0dG_roundsBarCol",
229
+ "peakAlertSelect": "VWh0dG_peakAlertSelect",
230
+ "triggerPopMetricValue": "VWh0dG_triggerPopMetricValue",
231
+ "dashboard": "VWh0dG_dashboard",
232
+ "panelTitle": "VWh0dG_panelTitle",
233
+ "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
234
+ "currencyButtonActive": "VWh0dG_currencyButtonActive",
235
+ "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
236
+ "budgetFillOver": "VWh0dG_budgetFillOver",
237
+ "bucketStatValue": "VWh0dG_bucketStatValue",
238
+ "peakAlertIn": "VWh0dG_peakAlertIn",
239
+ "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
280
240
  "peakAlertHint": "VWh0dG_peakAlertHint",
281
- "balanceDetailPop": "VWh0dG_balanceDetailPop",
282
- "budgetInput": "VWh0dG_budgetInput",
283
- "triggerIcon": "VWh0dG_triggerIcon",
284
- "liveCostSep": "VWh0dG_liveCostSep",
285
- "heroGaugePct": "VWh0dG_heroGaugePct",
241
+ "dashboardRight": "VWh0dG_dashboardRight",
242
+ "settingsHint": "VWh0dG_settingsHint",
243
+ "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
244
+ "pricingToggle": "VWh0dG_pricingToggle",
286
245
  "budgetHead": "VWh0dG_budgetHead",
287
- "settingsTitle": "VWh0dG_settingsTitle",
288
- "heroMeta": "VWh0dG_heroMeta",
289
- "budget": "VWh0dG_budget",
290
- "peakAlertPeak": "VWh0dG_peakAlertPeak",
291
- "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
292
- "shareValue": "VWh0dG_shareValue",
293
- "triggerPopValueStack": "VWh0dG_triggerPopValueStack",
294
- "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
295
- "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
296
- "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
297
- "balanceDetailClose": "VWh0dG_balanceDetailClose",
298
- "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
246
+ "bandTag": "VWh0dG_bandTag",
247
+ "subscriptionTrack": "VWh0dG_subscriptionTrack",
248
+ "peakAlertPreview": "VWh0dG_peakAlertPreview",
249
+ "budgetOverPulse": "VWh0dG_budgetOverPulse",
250
+ "triggerIcon": "VWh0dG_triggerIcon",
251
+ "rateBadgeLive": "VWh0dG_rateBadgeLive",
252
+ "heroSide": "VWh0dG_heroSide",
299
253
  "providerGroupList": "VWh0dG_providerGroupList",
300
- "na": "VWh0dG_na",
301
- "siteKindDirect": "VWh0dG_siteKindDirect",
302
- "trendPanel": "VWh0dG_trendPanel",
303
- "providerGroupName": "VWh0dG_providerGroupName",
254
+ "chartGrid": "VWh0dG_chartGrid",
255
+ "siteRowMeta": "VWh0dG_siteRowMeta",
256
+ "triggerPopOpenBtn": "VWh0dG_triggerPopOpenBtn",
257
+ "triggerPopFootTitle": "VWh0dG_triggerPopFootTitle",
258
+ "triggerPopFootNotes": "VWh0dG_triggerPopFootNotes",
259
+ "rangeButtonActive": "VWh0dG_rangeButtonActive",
260
+ "chartWrap": "VWh0dG_chartWrap",
261
+ "peakAlertTag": "VWh0dG_peakAlertTag",
262
+ "subscriptionWindow": "VWh0dG_subscriptionWindow",
304
263
  "tabPanel": "VWh0dG_tabPanel",
305
- "dashboardBody": "VWh0dG_dashboardBody",
306
- "modelTableScroll": "VWh0dG_modelTableScroll",
307
- "subscriptionMeta": "VWh0dG_subscriptionMeta",
308
- "shareSegTool": "VWh0dG_shareSegTool",
309
- "dashboardRight": "VWh0dG_dashboardRight",
310
- "tokenModelPartIn": "VWh0dG_tokenModelPartIn",
311
- "triggerPopAlert": "VWh0dG_triggerPopAlert",
312
- "rangeButton": "VWh0dG_rangeButton",
264
+ "rateBadge": "VWh0dG_rateBadge",
265
+ "triggerPopRow": "VWh0dG_triggerPopRow",
313
266
  "bucketSummary": "VWh0dG_bucketSummary",
314
- "peakAlertTag": "VWh0dG_peakAlertTag",
267
+ "numCol": "VWh0dG_numCol",
268
+ "heatmapHover": "VWh0dG_heatmapHover",
269
+ "triggerPopFootStatus": "VWh0dG_triggerPopFootStatus",
270
+ "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
271
+ "pricingChevron": "VWh0dG_pricingChevron",
272
+ "trendPanel": "VWh0dG_trendPanel",
273
+ "modelTableScroll": "VWh0dG_modelTableScroll",
274
+ "modelName": "VWh0dG_modelName",
275
+ "currencyToggle": "VWh0dG_currencyToggle",
276
+ "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
277
+ "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
278
+ "tabButtonActive": "VWh0dG_tabButtonActive",
279
+ "chartEmpty": "VWh0dG_chartEmpty",
280
+ "siteKindSite": "VWh0dG_siteKindSite",
281
+ "triggerPopBadgeDirect": "VWh0dG_triggerPopBadgeDirect",
282
+ "subscriptionName": "VWh0dG_subscriptionName",
283
+ "dashboardHead": "VWh0dG_dashboardHead",
284
+ "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
285
+ "kpiValue": "VWh0dG_kpiValue",
286
+ "exportButton": "VWh0dG_exportButton",
287
+ "balanceDays": "VWh0dG_balanceDays",
288
+ "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
289
+ "heatmap": "VWh0dG_heatmap",
290
+ "dashboardIn": "VWh0dG_dashboardIn",
291
+ "chartBar": "VWh0dG_chartBar",
292
+ "heatmapYearGrid": "VWh0dG_heatmapYearGrid",
293
+ "peakAlertNum": "VWh0dG_peakAlertNum",
294
+ "shareSegUser": "VWh0dG_shareSegUser",
315
295
  "subscriptionGoldFlow": "VWh0dG_subscriptionGoldFlow",
316
- "budgetValue": "VWh0dG_budgetValue",
296
+ "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
297
+ "triggerPopFootStrong": "VWh0dG_triggerPopFootStrong",
298
+ "providerGroupBadge": "VWh0dG_providerGroupBadge",
317
299
  "bucketThird": "VWh0dG_bucketThird",
318
- "bucketStat": "VWh0dG_bucketStat",
319
- "budgetInputWrap": "VWh0dG_budgetInputWrap",
320
- "peakAlertText": "VWh0dG_peakAlertText",
321
- "triggerSparkHot": "VWh0dG_triggerSparkHot",
322
- "panel": "VWh0dG_panel",
323
- "roundsFlagMark": "VWh0dG_roundsFlagMark",
324
- "providerGroup": "VWh0dG_providerGroup",
325
- "bandTagOff": "VWh0dG_bandTagOff",
326
- "balanceCell": "VWh0dG_balanceCell",
327
- "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
328
- "chartAxisLabel": "VWh0dG_chartAxisLabel",
329
- "triggerWrap": "VWh0dG_triggerWrap",
330
- "kpiGrid": "VWh0dG_kpiGrid",
331
- "rangeButtonActive": "VWh0dG_rangeButtonActive",
332
- "headTitleRow": "VWh0dG_headTitleRow",
333
- "planTag": "VWh0dG_planTag",
334
- "costCol": "VWh0dG_costCol",
335
- "roundsBars": "VWh0dG_roundsBars",
300
+ "siteKindUnknown": "VWh0dG_siteKindUnknown",
336
301
  "roundsBarColOff": "VWh0dG_roundsBarColOff",
337
- "peakAlertCorner": "VWh0dG_peakAlertCorner",
338
- "peakAlertPanel": "VWh0dG_peakAlertPanel",
339
- "heatmap": "VWh0dG_heatmap",
340
- "bucketSep": "VWh0dG_bucketSep",
341
- "bucketStatValue": "VWh0dG_bucketStatValue",
342
- "shareSeg": "VWh0dG_shareSeg",
343
- "shareItem": "VWh0dG_shareItem",
344
- "triggerBody": "VWh0dG_triggerBody",
345
- "balanceDetailValue": "VWh0dG_balanceDetailValue",
346
- "subscriptionGrid": "VWh0dG_subscriptionGrid",
347
- "pluginInfoValue": "VWh0dG_pluginInfoValue"
302
+ "roundsBar": "VWh0dG_roundsBar",
303
+ "triggerPopBar": "VWh0dG_triggerPopBar",
304
+ "billing-trigger": "VWh0dG_billing-trigger",
305
+ "budgetUnit": "VWh0dG_budgetUnit",
306
+ "roundsBarLabel": "VWh0dG_roundsBarLabel",
307
+ "panel": "VWh0dG_panel",
308
+ "pluginInfoLabel": "VWh0dG_pluginInfoLabel",
309
+ "subscriptionReset": "VWh0dG_subscriptionReset",
310
+ "triggerPopLabel": "VWh0dG_triggerPopLabel",
311
+ "settingsHead": "VWh0dG_settingsHead",
312
+ "triggerPop": "VWh0dG_triggerPop",
313
+ "modelProvider": "VWh0dG_modelProvider",
314
+ "currencyButton": "VWh0dG_currencyButton",
315
+ "balanceDetailLabel": "VWh0dG_balanceDetailLabel",
316
+ "healthBadge": "VWh0dG_healthBadge",
317
+ "heroTop": "VWh0dG_heroTop",
318
+ "peakAlertField": "VWh0dG_peakAlertField",
319
+ "trigger": "VWh0dG_trigger",
320
+ "balanceDetailGrid": "VWh0dG_balanceDetailGrid",
321
+ "subscriptionPct": "VWh0dG_subscriptionPct",
322
+ "subscriptionPlan": "VWh0dG_subscriptionPlan",
323
+ "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
324
+ "bucketStat": "VWh0dG_bucketStat",
325
+ "budgetTrack": "VWh0dG_budgetTrack",
326
+ "triggerPopBars": "VWh0dG_triggerPopBars",
327
+ "heroSideLabel": "VWh0dG_heroSideLabel",
328
+ "exportBar": "VWh0dG_exportBar",
329
+ "tableScroll": "VWh0dG_tableScroll",
330
+ "heatmapYearCell": "VWh0dG_heatmapYearCell",
331
+ "budgetFillWarn": "VWh0dG_budgetFillWarn",
332
+ "shareSegAssistant": "VWh0dG_shareSegAssistant",
333
+ "healthBad": "VWh0dG_healthBad",
334
+ "rounds": "VWh0dG_rounds",
335
+ "tokenPanel": "VWh0dG_tokenPanel",
336
+ "peakAlert": "VWh0dG_peakAlert",
337
+ "triggerPopTitle": "VWh0dG_triggerPopTitle",
338
+ "rangeToggle": "VWh0dG_rangeToggle",
339
+ "siteRow": "VWh0dG_siteRow",
340
+ "subscriptionMeta": "VWh0dG_subscriptionMeta",
341
+ "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
342
+ "subscriptionStatus": "VWh0dG_subscriptionStatus",
343
+ "heroReadout": "VWh0dG_heroReadout",
344
+ "na": "VWh0dG_na",
345
+ "bucketCost": "VWh0dG_bucketCost",
346
+ "balanceDetailHead": "VWh0dG_balanceDetailHead",
347
+ "panelHint": "VWh0dG_panelHint",
348
+ "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty"
348
349
  };
349
350
  //#endregion
350
351
  //#region src/client/plan-knowledge.ts
package/lib/index.js CHANGED
@@ -1062,6 +1062,51 @@ function workspaceNameOf(cwd) {
1062
1062
  if (cwd === void 0 || cwd === "") return "—";
1063
1063
  return cwd.split(/[\\/]/).filter(Boolean).at(-1) ?? "—";
1064
1064
  }
1065
+ /** Serialize Map/Set-heavy fold state into a JSON-safe ledger entry. */
1066
+ function serializeFold(fold) {
1067
+ return {
1068
+ total: fold.total,
1069
+ byModel: Object.fromEntries(fold.byModel),
1070
+ byDay: Object.fromEntries(fold.byDay),
1071
+ byDayModels: Object.fromEntries([...fold.byDayModels].map(([day, models]) => [day, Object.fromEntries(models)])),
1072
+ bySite: Object.fromEntries(fold.bySite),
1073
+ unpricedModels: [...fold.unpricedModels],
1074
+ planCalls: Object.fromEntries(fold.planCalls),
1075
+ turns: fold.turns,
1076
+ perf: fold.perf,
1077
+ roles: fold.roles,
1078
+ lastActive: fold.lastActive
1079
+ };
1080
+ }
1081
+ /** Restore a JSON-safe ledger fold into the in-memory Map/Set representation. */
1082
+ function deserializeFold(fold) {
1083
+ return {
1084
+ total: fold.total,
1085
+ byModel: new Map(Object.entries(fold.byModel)),
1086
+ byDay: new Map(Object.entries(fold.byDay)),
1087
+ byDayModels: new Map(Object.entries(fold.byDayModels).map(([day, models]) => [day, new Map(Object.entries(models))])),
1088
+ bySite: new Map(Object.entries(fold.bySite)),
1089
+ unpricedModels: new Set(fold.unpricedModels),
1090
+ planCalls: new Map(Object.entries(fold.planCalls)),
1091
+ turns: fold.turns,
1092
+ perf: fold.perf,
1093
+ roles: fold.roles,
1094
+ lastActive: fold.lastActive
1095
+ };
1096
+ }
1097
+ /** Runtime boundary for a user-editable/corrupt ledger file. Invalid rows are ignored. */
1098
+ function ledgerSessionsOf(value) {
1099
+ if (value === null || typeof value !== "object") return [];
1100
+ const document = value;
1101
+ if (document.version !== 1 || !Array.isArray(document.sessions)) return [];
1102
+ return document.sessions.filter((entry) => {
1103
+ if (entry === null || typeof entry !== "object") return false;
1104
+ const row = entry;
1105
+ if (typeof row.id !== "string" || row.id === "" || row.fold === null || typeof row.fold !== "object") return false;
1106
+ const fold = row.fold;
1107
+ return fold.total !== void 0 && fold.byModel !== void 0 && fold.byDay !== void 0 && fold.byDayModels !== void 0 && fold.bySite !== void 0 && Array.isArray(fold.unpricedModels) && fold.planCalls !== void 0 && Array.isArray(fold.turns) && Array.isArray(fold.perf) && fold.roles !== void 0 && typeof fold.lastActive === "number";
1108
+ });
1109
+ }
1065
1110
  /**
1066
1111
  * 消息文本长度:user/tool 角色分摊输入成本的启发式依据。字符串内容取其
1067
1112
  * 长度;内容块数组累计文本块长度;其余形状按 0 计(durable 边界收窄)。
@@ -1338,10 +1383,23 @@ function createUsageAggregator(persistence, options = {}) {
1338
1383
  const officialProviderIds = options.officialProviderIds === void 0 ? void 0 : new Set(options.officialProviderIds);
1339
1384
  const maxCacheSessions = options.maxCacheSessions ?? 400;
1340
1385
  const cache = /* @__PURE__ */ new Map();
1386
+ const ledger = /* @__PURE__ */ new Map();
1387
+ let ledgerLoaded = false;
1388
+ let ledgerNeedsSave = false;
1341
1389
  let lastDoc;
1342
1390
  let lastAt = 0;
1343
1391
  /** 每次聚合取最新的 provider 路由视图(中转站零配置发现);缺省按空处理(全部未知路由)。 */
1344
1392
  const routesOf = () => options.resolveRoutes?.() ?? {};
1393
+ const ensureLedgerLoaded = async () => {
1394
+ if (ledgerLoaded || options.ledger === void 0) return;
1395
+ ledgerLoaded = true;
1396
+ try {
1397
+ const stored = await options.ledger.load();
1398
+ for (const entry of ledgerSessionsOf(stored)) ledger.set(entry.id, entry);
1399
+ } catch (error) {
1400
+ console.warn("[usage-billing] failed to load durable usage ledger; rebuilding from current sessions:", error);
1401
+ }
1402
+ };
1345
1403
  /** 失效键:日志文件的 mtime+size;拿不到(后端无 locate / 文件丢失)时每次重折。 */
1346
1404
  const stampOf = async (meta) => {
1347
1405
  const location = persistence.locate?.(meta);
@@ -1356,8 +1414,17 @@ function createUsageAggregator(persistence, options = {}) {
1356
1414
  return { async aggregate() {
1357
1415
  const now = Date.now();
1358
1416
  if (lastDoc !== void 0 && now - lastAt < 5e3) return lastDoc;
1359
- const metas = await persistence.list();
1417
+ await ensureLedgerLoaded();
1418
+ let metas;
1419
+ try {
1420
+ metas = await persistence.list();
1421
+ } catch (error) {
1422
+ if (options.ledger === void 0 || ledger.size === 0) throw error;
1423
+ console.warn("[usage-billing] session list unavailable; serving durable usage ledger:", error);
1424
+ metas = [];
1425
+ }
1360
1426
  const seen = /* @__PURE__ */ new Set();
1427
+ const included = /* @__PURE__ */ new Set();
1361
1428
  const folds = [];
1362
1429
  const skipped = [];
1363
1430
  for (const meta of metas) {
@@ -1369,9 +1436,11 @@ function createUsageAggregator(persistence, options = {}) {
1369
1436
  cache.delete(id);
1370
1437
  cache.set(id, hit);
1371
1438
  folds.push({
1372
- meta,
1439
+ id,
1440
+ ...meta.cwd === void 0 ? {} : { cwd: meta.cwd },
1373
1441
  fold: hit.fold
1374
1442
  });
1443
+ included.add(id);
1375
1444
  continue;
1376
1445
  }
1377
1446
  try {
@@ -1384,9 +1453,24 @@ function createUsageAggregator(persistence, options = {}) {
1384
1453
  fold
1385
1454
  });
1386
1455
  folds.push({
1387
- meta,
1456
+ id,
1457
+ ...meta.cwd === void 0 ? {} : { cwd: meta.cwd },
1388
1458
  fold
1389
1459
  });
1460
+ included.add(id);
1461
+ if (options.ledger !== void 0) {
1462
+ const entry = {
1463
+ id,
1464
+ ...meta.cwd === void 0 ? {} : { cwd: meta.cwd },
1465
+ ...stamp === null ? {} : { stamp },
1466
+ fold: serializeFold(fold)
1467
+ };
1468
+ const previous = ledger.get(id);
1469
+ if (previous === void 0 || previous.stamp !== entry.stamp || previous.cwd !== entry.cwd || stamp === null && JSON.stringify(previous.fold) !== JSON.stringify(entry.fold)) {
1470
+ ledger.set(id, entry);
1471
+ ledgerNeedsSave = true;
1472
+ }
1473
+ }
1390
1474
  } catch (error) {
1391
1475
  skipped.push(id);
1392
1476
  console.warn("[usage-billing] skip unreadable session", id, error);
@@ -1398,6 +1482,31 @@ function createUsageAggregator(persistence, options = {}) {
1398
1482
  if (oldest.done === true) break;
1399
1483
  cache.delete(oldest.value);
1400
1484
  }
1485
+ if (options.ledger !== void 0) {
1486
+ for (const entry of ledger.values()) {
1487
+ if (included.has(entry.id)) continue;
1488
+ try {
1489
+ folds.push({
1490
+ id: entry.id,
1491
+ ...entry.cwd === void 0 ? {} : { cwd: entry.cwd },
1492
+ fold: deserializeFold(entry.fold)
1493
+ });
1494
+ included.add(entry.id);
1495
+ } catch (error) {
1496
+ console.warn("[usage-billing] skip invalid durable ledger session", entry.id, error);
1497
+ }
1498
+ }
1499
+ if (ledgerNeedsSave) try {
1500
+ await options.ledger.save({
1501
+ version: 1,
1502
+ updatedAt: now,
1503
+ sessions: [...ledger.values()]
1504
+ });
1505
+ ledgerNeedsSave = false;
1506
+ } catch (error) {
1507
+ console.warn("[usage-billing] failed to persist durable usage ledger:", error);
1508
+ }
1509
+ }
1401
1510
  if (skipped.length > 0) console.warn(`[usage-billing] aggregated ${folds.length} sessions, skipped ${skipped.length} unreadable:`, skipped);
1402
1511
  const total = emptyUsage();
1403
1512
  const byModel = /* @__PURE__ */ new Map();
@@ -1417,8 +1526,7 @@ function createUsageAggregator(persistence, options = {}) {
1417
1526
  };
1418
1527
  const perfModel = /* @__PURE__ */ new Map();
1419
1528
  const perfHour = /* @__PURE__ */ new Map();
1420
- for (const { meta, fold } of folds) {
1421
- const sessionId = String(meta.id);
1529
+ for (const { id: sessionId, cwd, fold } of folds) {
1422
1530
  mergeUsageInto(total, fold.total);
1423
1531
  roles.userChars += fold.roles.userChars;
1424
1532
  roles.toolChars += fold.roles.toolChars;
@@ -1460,7 +1568,7 @@ function createUsageAggregator(persistence, options = {}) {
1460
1568
  sessionId,
1461
1569
  ...row
1462
1570
  });
1463
- const wsName = options.resolveWorkspaceTitle !== void 0 && meta.cwd !== void 0 ? options.resolveWorkspaceTitle(meta.cwd) ?? workspaceNameOf(meta.cwd) : workspaceNameOf(meta.cwd);
1571
+ const wsName = options.resolveWorkspaceTitle !== void 0 && cwd !== void 0 ? options.resolveWorkspaceTitle(cwd) ?? workspaceNameOf(cwd) : workspaceNameOf(cwd);
1464
1572
  const ws = workspaceMap.get(wsName) ?? {
1465
1573
  name: wsName,
1466
1574
  calls: 0,
@@ -1478,7 +1586,7 @@ function createUsageAggregator(persistence, options = {}) {
1478
1586
  if (fold.total.calls > 0) sessionRows.push({
1479
1587
  id: sessionId,
1480
1588
  ...fold.title !== void 0 ? { title: fold.title } : {},
1481
- ...meta.cwd !== void 0 ? { cwd: meta.cwd } : {},
1589
+ ...cwd !== void 0 ? { cwd } : {},
1482
1590
  calls: fold.total.calls,
1483
1591
  cost: fold.total.cost,
1484
1592
  lastActive: fold.lastActive
@@ -3257,6 +3365,37 @@ function warnAuthOnce(source, provider, displayName) {
3257
3365
  authWarnedAt.set(key, now);
3258
3366
  console.warn(`[usage-billing] ${displayName}(${provider})鉴权失败:请检查 llm-pi-ai 设置中该 provider 的 apiKeyEnv 凭据是否正确/有效。`);
3259
3367
  }
3368
+ /**
3369
+ * Create the atomic file-backed durable-ledger store. The previous complete file
3370
+ * is retained as `.bak`; a malformed/missing main file falls back to that backup.
3371
+ */
3372
+ function createFileUsageLedgerStore(ledgerPath) {
3373
+ return {
3374
+ async load() {
3375
+ for (const path of [ledgerPath, `${ledgerPath}.bak`]) try {
3376
+ const parsed = JSON.parse(await readFile(path, "utf8"));
3377
+ if (parsed !== null && typeof parsed === "object") {
3378
+ const candidate = parsed;
3379
+ if (candidate.version === 1 && Array.isArray(candidate.sessions)) return parsed;
3380
+ }
3381
+ } catch {}
3382
+ },
3383
+ async save(document) {
3384
+ try {
3385
+ const existing = await readFile(ledgerPath, "utf8");
3386
+ JSON.parse(existing);
3387
+ await writeFileAtomic(`${ledgerPath}.bak`, existing, {
3388
+ mode: 384,
3389
+ dirMode: 448
3390
+ });
3391
+ } catch {}
3392
+ await writeFileAtomic(ledgerPath, JSON.stringify(document), {
3393
+ mode: 384,
3394
+ dirMode: 448
3395
+ });
3396
+ }
3397
+ };
3398
+ }
3260
3399
  /** Required services: the web server, the persisted session log store, and user settings. */
3261
3400
  const inject = [
3262
3401
  "webServer",
@@ -3412,14 +3551,16 @@ async function resolveSubscriptionKeys(settings, credentials) {
3412
3551
  */
3413
3552
  function apply(ctx, config = {}) {
3414
3553
  let usageSettingsScope;
3554
+ const cwd = process.cwd();
3555
+ const snapshotPath = join(homedir(), ".dsh/.dsh-usage-stats.json");
3556
+ const ledgerStore = createFileUsageLedgerStore(config.ledgerPath ?? join(homedir(), ".dsh/.dsh-usage-ledger.json"));
3415
3557
  const workspaceTitleResolver = buildWorkspaceTitleResolver(ctx);
3416
3558
  const aggregator = createUsageAggregator(ctx.sessionPersistence, {
3417
3559
  ...config.subscriptionProviders === void 0 ? {} : { subscriptionProviders: config.subscriptionProviders },
3418
3560
  resolveRoutes: () => readPiAiProviderRoutes(ctx.settings),
3419
- ...workspaceTitleResolver === void 0 ? {} : { resolveWorkspaceTitle: workspaceTitleResolver }
3561
+ ...workspaceTitleResolver === void 0 ? {} : { resolveWorkspaceTitle: workspaceTitleResolver },
3562
+ ledger: ledgerStore
3420
3563
  });
3421
- const cwd = process.cwd();
3422
- const snapshotPath = join(homedir(), ".dsh/.dsh-usage-stats.json");
3423
3564
  const candidates = [
3424
3565
  config.statsPath,
3425
3566
  process.env.DSH_USAGE_STATS,
@@ -3803,4 +3944,4 @@ function apply(ctx, config = {}) {
3803
3944
  }), "usage-billing: usage-stats route");
3804
3945
  }
3805
3946
  //#endregion
3806
- export { apply, guardLoopback, inject, readPiAiProviderRoutes, resolveSubscriptionKeys };
3947
+ export { apply, createFileUsageLedgerStore, guardLoopback, inject, readPiAiProviderRoutes, resolveSubscriptionKeys };
@@ -70,6 +70,9 @@ export interface AggregateOptions {
70
70
  /** 工作区标题解析:给定会话 cwd 返回项目显示标题;undefined = 回退到 cwd 末级目录名
71
71
  * (host 的 workspaceRegistry 为可选依赖,缺失时不注入,行为保持不变)。 */
72
72
  resolveWorkspaceTitle?: (cwd: string) => string | undefined;
73
+ /** 独立的持久用量账本。启用后,已经成功折叠过的会话即使随后从
74
+ * sessionPersistence 中永久删除,也会继续计入累计用量。 */
75
+ ledger?: UsageLedgerStore;
73
76
  }
74
77
  /** 每会话折叠缓存默认上限:超过则按 LRU 淘汰(P1-6 峰值内存治理)。 */
75
78
  export declare const DEFAULT_MAX_CACHE_SESSIONS = 400;
@@ -264,7 +267,7 @@ export interface PerfSample {
264
267
  estimated: boolean;
265
268
  }
266
269
  /** One persisted session's folded usage plus drill-down metadata. */
267
- interface SessionFold {
270
+ export interface SessionFold {
268
271
  total: ModelUsage;
269
272
  byModel: Map<string, ModelUsage>;
270
273
  byDay: Map<string, ModelUsage>;
@@ -295,6 +298,39 @@ interface RoleFold {
295
298
  /** 输出侧成本(人民币元)。 */
296
299
  outputCost: number;
297
300
  }
301
+ /** JSON-safe form of one session fold, used by the durable usage ledger. */
302
+ export interface SerializedSessionFold {
303
+ total: ModelUsage;
304
+ byModel: Record<string, ModelUsage>;
305
+ byDay: Record<string, ModelUsage>;
306
+ byDayModels: Record<string, Record<string, ModelUsage>>;
307
+ bySite: Record<string, ModelUsage>;
308
+ unpricedModels: string[];
309
+ planCalls: Record<string, number>;
310
+ turns: SessionTurnRow[];
311
+ perf: PerfSample[];
312
+ roles: RoleFold;
313
+ lastActive: number;
314
+ }
315
+ /** One independently retained session in the durable usage ledger. */
316
+ export interface UsageLedgerSession {
317
+ id: string;
318
+ cwd?: string;
319
+ /** Stable log stamp (mtime + size) when the persistence backend exposes it. */
320
+ stamp?: string;
321
+ fold: SerializedSessionFold;
322
+ }
323
+ /** On-disk durable usage ledger. Versioned independently from the dashboard document. */
324
+ export interface UsageLedgerDocument {
325
+ version: 1;
326
+ updatedAt: number;
327
+ sessions: UsageLedgerSession[];
328
+ }
329
+ /** Storage seam for the durable ledger; the host supplies an atomic file implementation. */
330
+ export interface UsageLedgerStore {
331
+ load(): Promise<unknown | undefined>;
332
+ save(document: UsageLedgerDocument): Promise<void>;
333
+ }
298
334
  /**
299
335
  * 消息文本长度:user/tool 角色分摊输入成本的启发式依据。字符串内容取其
300
336
  * 长度;内容块数组累计文本块长度;其余形状按 0 计(durable 边界收窄)。
@@ -13,6 +13,7 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
13
13
  import type { Context } from '@deepseek-ai/cordis';
14
14
  import type { CredentialProvider } from '@deepseek-ai/dsh-credentials';
15
15
  import { type SettingsProvider } from '@deepseek-ai/dsh-settings';
16
+ import { type UsageLedgerStore } from './aggregate.ts';
16
17
  import type { CustomBalanceConfig, SubscriptionPlanConfig } from './pricing-shared.ts';
17
18
  import { type IdentifiedSubscriptionPlan, type SubscriptionKeys } from './subscriptions.ts';
18
19
  /**
@@ -27,6 +28,9 @@ export declare function guardLoopback(req: IncomingMessage, res: ServerResponse)
27
28
  export interface UsageBillingConfig {
28
29
  /** Absolute path to a `.dsh-usage-stats.json` fallback file. */
29
30
  statsPath?: string;
31
+ /** 独立持久用量账本的绝对路径;默认 `~/.dsh/.dsh-usage-ledger.json`。
32
+ * 账本与会话日志解耦,因此永久删除会话不会抹掉已经观测到的用量。 */
33
+ ledgerPath?: string;
30
34
  /** 订阅制(coding / token / agent plan)provider id 列表;默认 kimi-coding、xiaomi-token-plan-cn。 */
31
35
  subscriptionProviders?: string[];
32
36
  /** 订阅套餐额度适配器(kimi / zai / opencode-go);默认全部内置。 */
@@ -44,6 +48,11 @@ export interface UsageBillingConfig {
44
48
  * 作为用户设置(设置 Tab 开关)的组合兜底。该工具占用每次请求的上下文,coding 场景多在仪表盘查看。 */
45
49
  enableUsageStatsTool?: boolean;
46
50
  }
51
+ /**
52
+ * Create the atomic file-backed durable-ledger store. The previous complete file
53
+ * is retained as `.bak`; a malformed/missing main file falls back to that backup.
54
+ */
55
+ export declare function createFileUsageLedgerStore(ledgerPath: string): UsageLedgerStore;
47
56
  /** Required services: the web server, the persisted session log store, and user settings. */
48
57
  export declare const inject: string[];
49
58
  /**
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.9.11",
4
+ "version": "0.9.12",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },