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

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",
37
+ "pluginInfoValue": "VWh0dG_pluginInfoValue",
71
38
  "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",
39
+ "triggerPopLabel": "VWh0dG_triggerPopLabel",
40
+ "triggerPopMetricValue": "VWh0dG_triggerPopMetricValue",
91
41
  "triggerPopTitle": "VWh0dG_triggerPopTitle",
42
+ "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
43
+ "unpricedHint": "VWh0dG_unpricedHint",
44
+ "switch": "VWh0dG_switch",
45
+ "balanceDaysBadgeLow": "VWh0dG_balanceDaysBadgeLow",
46
+ "subscriptionFill": "VWh0dG_subscriptionFill",
47
+ "chartBar": "VWh0dG_chartBar",
48
+ "triggerSub": "VWh0dG_triggerSub",
49
+ "estimatedTag": "VWh0dG_estimatedTag",
50
+ "planTag": "VWh0dG_planTag",
51
+ "modelProvider": "VWh0dG_modelProvider",
52
+ "dashboardTitle": "VWh0dG_dashboardTitle",
53
+ "triggerMeta": "VWh0dG_triggerMeta",
54
+ "dashboardBody": "VWh0dG_dashboardBody",
55
+ "flatTag": "VWh0dG_flatTag",
56
+ "settingsHead": "VWh0dG_settingsHead",
57
+ "pricingTable": "VWh0dG_pricingTable",
92
58
  "heatmapFooter": "VWh0dG_heatmapFooter",
59
+ "triggerSparkBar": "VWh0dG_triggerSparkBar",
93
60
  "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",
61
+ "balanceDetailHead": "VWh0dG_balanceDetailHead",
62
+ "shareTrack": "VWh0dG_shareTrack",
108
63
  "chartSvg": "VWh0dG_chartSvg",
109
- "currencyButtonActive": "VWh0dG_currencyButtonActive",
110
- "heatmapHover": "VWh0dG_heatmapHover",
111
- "bandPriceOff": "VWh0dG_bandPriceOff",
112
- "estimatedTag": "VWh0dG_estimatedTag",
64
+ "providerGroupBadge": "VWh0dG_providerGroupBadge",
65
+ "subscriptionGrid": "VWh0dG_subscriptionGrid",
66
+ "tokenModelPartOut": "VWh0dG_tokenModelPartOut",
67
+ "roundsBars": "VWh0dG_roundsBars",
68
+ "triggerPopFoot": "VWh0dG_triggerPopFoot",
69
+ "heroSideLabel": "VWh0dG_heroSideLabel",
70
+ "na": "VWh0dG_na",
71
+ "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
72
+ "triggerPopFootTitle": "VWh0dG_triggerPopFootTitle",
73
+ "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
113
74
  "heatmapGrid": "VWh0dG_heatmapGrid",
114
- "heatmapYearScroll": "VWh0dG_heatmapYearScroll",
115
- "chartWrap": "VWh0dG_chartWrap",
75
+ "triggerPopRow": "VWh0dG_triggerPopRow",
76
+ "bucketStatValue": "VWh0dG_bucketStatValue",
77
+ "tokenModelShareRow": "VWh0dG_tokenModelShareRow",
78
+ "subscriptionCard": "VWh0dG_subscriptionCard",
79
+ "peakAlertNum": "VWh0dG_peakAlertNum",
80
+ "bucketOfficial": "VWh0dG_bucketOfficial",
81
+ "siteKindTag": "VWh0dG_siteKindTag",
82
+ "subscriptionPlan": "VWh0dG_subscriptionPlan",
83
+ "bucketStatLabel": "VWh0dG_bucketStatLabel",
84
+ "switchKnob": "VWh0dG_switchKnob",
85
+ "tokenPanel": "VWh0dG_tokenPanel",
86
+ "triggerAmount": "VWh0dG_triggerAmount",
87
+ "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
116
88
  "balanceDays": "VWh0dG_balanceDays",
117
- "unpricedHint": "VWh0dG_unpricedHint",
89
+ "balanceDetailTitle": "VWh0dG_balanceDetailTitle",
90
+ "peakAlertPreview": "VWh0dG_peakAlertPreview",
91
+ "exportLabel": "VWh0dG_exportLabel",
92
+ "rangeButton": "VWh0dG_rangeButton",
93
+ "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
94
+ "roundsEmpty": "VWh0dG_roundsEmpty",
95
+ "healthBadgeOk": "VWh0dG_healthBadgeOk",
96
+ "providerGroupName": "VWh0dG_providerGroupName",
97
+ "bucketCost": "VWh0dG_bucketCost",
98
+ "heroMain": "VWh0dG_heroMain",
99
+ "subscriptionStatus": "VWh0dG_subscriptionStatus",
100
+ "peakAlertSelect": "VWh0dG_peakAlertSelect",
101
+ "roundsBarLabel": "VWh0dG_roundsBarLabel",
102
+ "shareSegUser": "VWh0dG_shareSegUser",
103
+ "siteRowName": "VWh0dG_siteRowName",
104
+ "chartStack": "VWh0dG_chartStack",
105
+ "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
106
+ "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
107
+ "shareValue": "VWh0dG_shareValue",
108
+ "providerGroupList": "VWh0dG_providerGroupList",
109
+ "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
110
+ "triggerPopFootName": "VWh0dG_triggerPopFootName",
111
+ "chartLegend": "VWh0dG_chartLegend",
112
+ "heatmapYearScroll": "VWh0dG_heatmapYearScroll",
113
+ "pluginInfoLink": "VWh0dG_pluginInfoLink",
114
+ "triggerPopBadgeSub": "VWh0dG_triggerPopBadgeSub",
115
+ "tabPanel": "VWh0dG_tabPanel",
116
+ "tokenModelPartIn": "VWh0dG_tokenModelPartIn",
117
+ "settingsTitle": "VWh0dG_settingsTitle",
118
+ "rangeToggle": "VWh0dG_rangeToggle",
119
+ "dashboardRight": "VWh0dG_dashboardRight",
120
+ "triggerPopOpenBtn": "VWh0dG_triggerPopOpenBtn",
121
+ "triggerPopFootStrong": "VWh0dG_triggerPopFootStrong",
122
+ "tabButtonActive": "VWh0dG_tabButtonActive",
123
+ "budgetOverPulse": "VWh0dG_budgetOverPulse",
124
+ "tabPanelIn": "VWh0dG_tabPanelIn",
125
+ "triggerPop": "VWh0dG_triggerPop",
126
+ "exportBar": "VWh0dG_exportBar",
118
127
  "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",
125
128
  "modelTable": "VWh0dG_modelTable",
126
- "triggerPopFootNote": "VWh0dG_triggerPopFootNote",
129
+ "balanceDetailRow": "VWh0dG_balanceDetailRow",
130
+ "healthIdle": "VWh0dG_healthIdle",
131
+ "subscriptionName": "VWh0dG_subscriptionName",
132
+ "subscriptionWindow": "VWh0dG_subscriptionWindow",
127
133
  "siteKindUnknown": "VWh0dG_siteKindUnknown",
128
- "healthBadgeOk": "VWh0dG_healthBadgeOk",
129
- "healthBadgeBad": "VWh0dG_healthBadgeBad",
130
- "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
131
- "peakAlertSelect": "VWh0dG_peakAlertSelect",
132
- "chartTooltipDate": "VWh0dG_chartTooltipDate",
134
+ "rateBadgeLive": "VWh0dG_rateBadgeLive",
135
+ "kpiValue": "VWh0dG_kpiValue",
136
+ "bucketThird": "VWh0dG_bucketThird",
137
+ "providerGroupHead": "VWh0dG_providerGroupHead",
138
+ "peakAlert": "VWh0dG_peakAlert",
139
+ "triggerRow": "VWh0dG_triggerRow",
140
+ "siteRow": "VWh0dG_siteRow",
141
+ "triggerPopMetrics": "VWh0dG_triggerPopMetrics",
142
+ "chartAxisLabel": "VWh0dG_chartAxisLabel",
143
+ "shareSegTool": "VWh0dG_shareSegTool",
144
+ "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
145
+ "bandTagOff": "VWh0dG_bandTagOff",
133
146
  "providerGroupBalance": "VWh0dG_providerGroupBalance",
134
- "chartEmpty": "VWh0dG_chartEmpty",
147
+ "peakAlertCenter": "VWh0dG_peakAlertCenter",
148
+ "trendPanel": "VWh0dG_trendPanel",
135
149
  "tabNav": "VWh0dG_tabNav",
136
- "panelHead": "VWh0dG_panelHead",
137
- "pricingTable": "VWh0dG_pricingTable",
138
- "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
139
- "liveTierOff": "VWh0dG_liveTierOff",
140
- "triggerPopMuted": "VWh0dG_triggerPopMuted",
141
- "siteRowCalls": "VWh0dG_siteRowCalls",
142
- "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",
150
+ "exportButton": "VWh0dG_exportButton",
151
+ "pricingToggle": "VWh0dG_pricingToggle",
152
+ "triggerPopAlert": "VWh0dG_triggerPopAlert",
153
+ "headTitleRow": "VWh0dG_headTitleRow",
154
+ "heatmap": "VWh0dG_heatmap",
155
+ "siteKindDirect": "VWh0dG_siteKindDirect",
156
+ "budgetFillWarn": "VWh0dG_budgetFillWarn",
157
+ "panel": "VWh0dG_panel",
158
+ "modelCell": "VWh0dG_modelCell",
159
+ "triggerPopMetricHighlight": "VWh0dG_triggerPopMetricHighlight",
160
+ "tokenModelParts": "VWh0dG_tokenModelParts",
161
+ "budgetInput": "VWh0dG_budgetInput",
162
+ "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
163
+ "railButton": "VWh0dG_railButton",
151
164
  "pricingTip": "VWh0dG_pricingTip",
152
- "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
153
- "panelTitle": "VWh0dG_panelTitle",
154
- "triggerPopFootTitle": "VWh0dG_triggerPopFootTitle",
155
- "triggerPopBadgeDirect": "VWh0dG_triggerPopBadgeDirect",
165
+ "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
166
+ "rateBadge": "VWh0dG_rateBadge",
167
+ "subscriptionHead": "VWh0dG_subscriptionHead",
168
+ "roundsBarColOff": "VWh0dG_roundsBarColOff",
169
+ "bucketSummary": "VWh0dG_bucketSummary",
170
+ "closeButton": "VWh0dG_closeButton",
171
+ "roundsBarWrap": "VWh0dG_roundsBarWrap",
156
172
  "deltaUp": "VWh0dG_deltaUp",
157
- "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
158
- "tabPanelIn": "VWh0dG_tabPanelIn",
173
+ "subscriptionTier": "VWh0dG_subscriptionTier",
174
+ "triggerSparkHot": "VWh0dG_triggerSparkHot",
175
+ "balanceDetailLabel": "VWh0dG_balanceDetailLabel",
176
+ "shareSegAssistant": "VWh0dG_shareSegAssistant",
177
+ "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
178
+ "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
179
+ "healthDot": "VWh0dG_healthDot",
180
+ "balanceDetailClose": "VWh0dG_balanceDetailClose",
181
+ "budgetValue": "VWh0dG_budgetValue",
159
182
  "chartTooltip": "VWh0dG_chartTooltip",
160
- "subscriptionFill": "VWh0dG_subscriptionFill",
161
- "uncataloguedTag": "VWh0dG_uncataloguedTag",
162
- "peakAlertClose": "VWh0dG_peakAlertClose",
163
- "peakAlertField": "VWh0dG_peakAlertField",
164
- "subscriptionCard": "VWh0dG_subscriptionCard",
165
- "triggerPopMetricLabel": "VWh0dG_triggerPopMetricLabel",
166
183
  "siteRowMeta": "VWh0dG_siteRowMeta",
167
- "roundsBarCol": "VWh0dG_roundsBarCol",
168
- "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",
175
- "subscriptionHead": "VWh0dG_subscriptionHead",
176
- "chartLegendBar": "VWh0dG_chartLegendBar",
177
- "pricingToggleText": "VWh0dG_pricingToggleText",
178
- "railButton": "VWh0dG_railButton",
179
- "triggerPopFootName": "VWh0dG_triggerPopFootName",
184
+ "dashboardModal": "VWh0dG_dashboardModal",
185
+ "peakAlertPeak": "VWh0dG_peakAlertPeak",
186
+ "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
187
+ "bucketStatSub": "VWh0dG_bucketStatSub",
188
+ "subscriptionMeta": "VWh0dG_subscriptionMeta",
189
+ "heatmapLegend": "VWh0dG_heatmapLegend",
190
+ "dashboardIn": "VWh0dG_dashboardIn",
191
+ "dashboard": "VWh0dG_dashboard",
192
+ "costCol": "VWh0dG_costCol",
180
193
  "numCol": "VWh0dG_numCol",
181
- "providerGroupMeta": "VWh0dG_providerGroupMeta",
194
+ "kpiDetail": "VWh0dG_kpiDetail",
195
+ "chartTooltipDate": "VWh0dG_chartTooltipDate",
196
+ "heroLabel": "VWh0dG_heroLabel",
197
+ "balanceCell": "VWh0dG_balanceCell",
198
+ "heroSide": "VWh0dG_heroSide",
199
+ "currencyButtonActive": "VWh0dG_currencyButtonActive",
200
+ "providerGroupTitle": "VWh0dG_providerGroupTitle",
201
+ "heatmapYearCell": "VWh0dG_heatmapYearCell",
202
+ "tableScroll": "VWh0dG_tableScroll",
203
+ "peakAlertTag": "VWh0dG_peakAlertTag",
204
+ "subscriptionAuto": "VWh0dG_subscriptionAuto",
205
+ "chartDot": "VWh0dG_chartDot",
206
+ "triggerPopFootStatus": "VWh0dG_triggerPopFootStatus",
207
+ "bucketStat": "VWh0dG_bucketStat",
208
+ "heroSideItem": "VWh0dG_heroSideItem",
209
+ "budget": "VWh0dG_budget",
210
+ "triggerPopValue": "VWh0dG_triggerPopValue",
211
+ "roundsFlagMark": "VWh0dG_roundsFlagMark",
182
212
  "subscriptionTrack": "VWh0dG_subscriptionTrack",
183
- "exportLabel": "VWh0dG_exportLabel",
184
- "bucketStatLabel": "VWh0dG_bucketStatLabel",
185
- "budgetTrack": "VWh0dG_budgetTrack",
213
+ "siteRowCallsLow": "VWh0dG_siteRowCallsLow",
214
+ "pluginInfoLabel": "VWh0dG_pluginInfoLabel",
215
+ "tokenModelBar": "VWh0dG_tokenModelBar",
216
+ "triggerSpark": "VWh0dG_triggerSpark",
217
+ "providerGroupMeta": "VWh0dG_providerGroupMeta",
218
+ "triggerPopTitleMonth": "VWh0dG_triggerPopTitleMonth",
219
+ "heroGaugePct": "VWh0dG_heroGaugePct",
220
+ "balanceDetailPop": "VWh0dG_balanceDetailPop",
221
+ "triggerPopFootNote": "VWh0dG_triggerPopFootNote",
222
+ "triggerPopName": "VWh0dG_triggerPopName",
223
+ "heroSideValue": "VWh0dG_heroSideValue",
224
+ "triggerPopUpdated": "VWh0dG_triggerPopUpdated",
225
+ "peakAlertOff": "VWh0dG_peakAlertOff",
226
+ "peakAlertCountdown": "VWh0dG_peakAlertCountdown",
227
+ "liveCostItem": "VWh0dG_liveCostItem",
228
+ "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
229
+ "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
230
+ "siteRowCost": "VWh0dG_siteRowCost",
231
+ "triggerPopFootNotes": "VWh0dG_triggerPopFootNotes",
232
+ "balanceDaysBadge": "VWh0dG_balanceDaysBadge",
233
+ "triggerPopBadgeDirect": "VWh0dG_triggerPopBadgeDirect",
234
+ "roundsBarCol": "VWh0dG_roundsBarCol",
235
+ "peakAlertText": "VWh0dG_peakAlertText",
186
236
  "budgetFill": "VWh0dG_budgetFill",
187
- "siteRow": "VWh0dG_siteRow",
188
- "delta": "VWh0dG_delta",
189
- "exportBar": "VWh0dG_exportBar",
190
- "providerGroupBadge": "VWh0dG_providerGroupBadge",
237
+ "liveTierPeak": "VWh0dG_liveTierPeak",
191
238
  "liveCostBar": "VWh0dG_liveCostBar",
192
- "heroLabel": "VWh0dG_heroLabel",
193
- "bucketStatSub": "VWh0dG_bucketStatSub",
194
- "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",
239
+ "triggerPopMuted": "VWh0dG_triggerPopMuted",
240
+ "triggerPopFootStatusLow": "VWh0dG_triggerPopFootStatusLow",
241
+ "liveCostSep": "VWh0dG_liveCostSep",
202
242
  "budgetControls": "VWh0dG_budgetControls",
203
- "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
204
- "bucketOfficial": "VWh0dG_bucketOfficial",
243
+ "chartEmpty": "VWh0dG_chartEmpty",
244
+ "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
245
+ "peakAlertHint": "VWh0dG_peakAlertHint",
246
+ "chartWrap": "VWh0dG_chartWrap",
247
+ "hero": "VWh0dG_hero",
248
+ "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
249
+ "rangeButtonActive": "VWh0dG_rangeButtonActive",
250
+ "budgetInputWrap": "VWh0dG_budgetInputWrap",
251
+ "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
252
+ "budgetFillOver": "VWh0dG_budgetFillOver",
253
+ "emptyRow": "VWh0dG_emptyRow",
254
+ "healthBadge": "VWh0dG_healthBadge",
255
+ "kpiGreen": "VWh0dG_kpiGreen",
256
+ "delta": "VWh0dG_delta",
257
+ "providerGroup": "VWh0dG_providerGroup",
258
+ "shareItem": "VWh0dG_shareItem",
259
+ "chartTooltipRow": "VWh0dG_chartTooltipRow",
260
+ "healthBadgeBad": "VWh0dG_healthBadgeBad",
205
261
  "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
206
- "panelHint": "VWh0dG_panelHint",
207
- "subscriptionAuto": "VWh0dG_subscriptionAuto",
208
- "providerGroupHead": "VWh0dG_providerGroupHead",
209
- "triggerPopMetricHighlight": "VWh0dG_triggerPopMetricHighlight",
210
- "triggerPopFootStatusLow": "VWh0dG_triggerPopFootStatusLow",
211
262
  "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",
220
- "balanceDaysBadgeLow": "VWh0dG_balanceDaysBadgeLow",
221
- "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",
231
- "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",
241
- "triggerPopBadgeSub": "VWh0dG_triggerPopBadgeSub",
242
- "subscriptionStatus": "VWh0dG_subscriptionStatus",
243
- "tokenPanel": "VWh0dG_tokenPanel",
244
- "heroSideSpacer": "VWh0dG_heroSideSpacer",
263
+ "siteKindSite": "VWh0dG_siteKindSite",
264
+ "peakAlertIn": "VWh0dG_peakAlertIn",
265
+ "modelTableScroll": "VWh0dG_modelTableScroll",
266
+ "peakAlertCheck": "VWh0dG_peakAlertCheck",
267
+ "budgetHint": "VWh0dG_budgetHint",
268
+ "peakAlertField": "VWh0dG_peakAlertField",
269
+ "budgetHead": "VWh0dG_budgetHead",
245
270
  "triggerPopStrong": "VWh0dG_triggerPopStrong",
246
- "triggerPopOpenBtn": "VWh0dG_triggerPopOpenBtn",
247
- "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
248
- "budgetOverPulse": "VWh0dG_budgetOverPulse",
249
- "settingsHint": "VWh0dG_settingsHint",
250
- "kpiValue": "VWh0dG_kpiValue",
271
+ "shareSeg": "VWh0dG_shareSeg",
272
+ "chartLegendBar": "VWh0dG_chartLegendBar",
273
+ "subscriptionReset": "VWh0dG_subscriptionReset",
274
+ "shareDot": "VWh0dG_shareDot",
251
275
  "siteRowTitle": "VWh0dG_siteRowTitle",
252
- "triggerPop": "VWh0dG_triggerPop",
253
- "chartTooltipRow": "VWh0dG_chartTooltipRow",
254
- "bucketCost": "VWh0dG_bucketCost",
255
- "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
256
- "chartLegendLine": "VWh0dG_chartLegendLine",
276
+ "peakAlertPanel": "VWh0dG_peakAlertPanel",
277
+ "panelTitle": "VWh0dG_panelTitle",
278
+ "triggerPopBar": "VWh0dG_triggerPopBar",
279
+ "deltaDown": "VWh0dG_deltaDown",
280
+ "chartCrosshair": "VWh0dG_chartCrosshair",
281
+ "healthBad": "VWh0dG_healthBad",
282
+ "budgetTrack": "VWh0dG_budgetTrack",
283
+ "panelHead": "VWh0dG_panelHead",
284
+ "bucketSep": "VWh0dG_bucketSep",
285
+ "triggerPopMetricLabel": "VWh0dG_triggerPopMetricLabel",
286
+ "currencyButton": "VWh0dG_currencyButton",
287
+ "pricingToggleText": "VWh0dG_pricingToggleText",
257
288
  "kpiLabel": "VWh0dG_kpiLabel",
258
- "chartDot": "VWh0dG_chartDot",
259
- "budgetLabel": "VWh0dG_budgetLabel",
260
- "roundsBar": "VWh0dG_roundsBar",
261
- "tokenModelBar": "VWh0dG_tokenModelBar",
262
289
  "balanceDaysLow": "VWh0dG_balanceDaysLow",
263
- "deltaDown": "VWh0dG_deltaDown",
264
- "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
265
- "triggerPopFootStrong": "VWh0dG_triggerPopFootStrong",
266
- "chartGrid": "VWh0dG_chartGrid",
267
- "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
290
+ "panelHint": "VWh0dG_panelHint",
291
+ "shareSegPeak": "VWh0dG_shareSegPeak",
292
+ "settingsHint": "VWh0dG_settingsHint",
293
+ "triggerPopValueStack": "VWh0dG_triggerPopValueStack",
294
+ "budgetUnit": "VWh0dG_budgetUnit",
268
295
  "heroCurrency": "VWh0dG_heroCurrency",
269
- "peakAlertOff": "VWh0dG_peakAlertOff",
270
- "siteRowName": "VWh0dG_siteRowName",
271
- "triggerPopFootStatus": "VWh0dG_triggerPopFootStatus",
296
+ "currencyToggle": "VWh0dG_currencyToggle",
297
+ "shareSegOff": "VWh0dG_shareSegOff",
298
+ "switchOn": "VWh0dG_switchOn",
299
+ "balanceDetailValue": "VWh0dG_balanceDetailValue",
300
+ "pluginInfoRow": "VWh0dG_pluginInfoRow",
301
+ "subscriptionGoldFlow": "VWh0dG_subscriptionGoldFlow",
272
302
  "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",
280
- "peakAlertHint": "VWh0dG_peakAlertHint",
281
- "balanceDetailPop": "VWh0dG_balanceDetailPop",
282
- "budgetInput": "VWh0dG_budgetInput",
283
- "triggerIcon": "VWh0dG_triggerIcon",
284
- "liveCostSep": "VWh0dG_liveCostSep",
285
- "heroGaugePct": "VWh0dG_heroGaugePct",
286
- "budgetHead": "VWh0dG_budgetHead",
287
- "settingsTitle": "VWh0dG_settingsTitle",
303
+ "triggerPopBadge": "VWh0dG_triggerPopBadge",
304
+ "heroReadout": "VWh0dG_heroReadout",
305
+ "heatmapCell": "VWh0dG_heatmapCell",
288
306
  "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",
299
- "providerGroupList": "VWh0dG_providerGroupList",
300
- "na": "VWh0dG_na",
301
- "siteKindDirect": "VWh0dG_siteKindDirect",
302
- "trendPanel": "VWh0dG_trendPanel",
303
- "providerGroupName": "VWh0dG_providerGroupName",
304
- "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",
313
- "bucketSummary": "VWh0dG_bucketSummary",
314
- "peakAlertTag": "VWh0dG_peakAlertTag",
315
- "subscriptionGoldFlow": "VWh0dG_subscriptionGoldFlow",
316
- "budgetValue": "VWh0dG_budgetValue",
317
- "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",
307
+ "billing-trigger": "VWh0dG_billing-trigger",
308
+ "pricingChevron": "VWh0dG_pricingChevron",
309
+ "bandPriceOff": "VWh0dG_bandPriceOff",
310
+ "pluginInfo": "VWh0dG_pluginInfo",
311
+ "uncataloguedTag": "VWh0dG_uncataloguedTag",
312
+ "bandPrice": "VWh0dG_bandPrice",
313
+ "rounds": "VWh0dG_rounds",
314
+ "peakAlertClose": "VWh0dG_peakAlertClose",
315
+ "modelDot": "VWh0dG_modelDot",
316
+ "triggerPopBars": "VWh0dG_triggerPopBars",
317
+ "heroGaugeArc": "VWh0dG_heroGaugeArc",
318
+ "triggerIcon": "VWh0dG_triggerIcon",
319
+ "chartLegendLine": "VWh0dG_chartLegendLine",
320
+ "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
321
+ "healthOk": "VWh0dG_healthOk",
322
+ "balanceDetailGrid": "VWh0dG_balanceDetailGrid",
323
+ "liveTierOff": "VWh0dG_liveTierOff",
324
+ "subscriptionPct": "VWh0dG_subscriptionPct",
325
+ "roundsAxis": "VWh0dG_roundsAxis",
326
+ "heatmapHover": "VWh0dG_heatmapHover",
327
+ "budgetLabel": "VWh0dG_budgetLabel",
329
328
  "triggerWrap": "VWh0dG_triggerWrap",
329
+ "heroSideSpacer": "VWh0dG_heroSideSpacer",
330
330
  "kpiGrid": "VWh0dG_kpiGrid",
331
- "rangeButtonActive": "VWh0dG_rangeButtonActive",
332
- "headTitleRow": "VWh0dG_headTitleRow",
333
- "planTag": "VWh0dG_planTag",
334
- "costCol": "VWh0dG_costCol",
335
- "roundsBars": "VWh0dG_roundsBars",
336
- "roundsBarColOff": "VWh0dG_roundsBarColOff",
331
+ "roundsBar": "VWh0dG_roundsBar",
337
332
  "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",
333
+ "trigger": "VWh0dG_trigger",
334
+ "tabButton": "VWh0dG_tabButton",
335
+ "triggerPopHead": "VWh0dG_triggerPopHead",
336
+ "modelName": "VWh0dG_modelName",
337
+ "chartGrid": "VWh0dG_chartGrid",
338
+ "chartBarPlaceholder": "VWh0dG_chartBarPlaceholder",
344
339
  "triggerBody": "VWh0dG_triggerBody",
345
- "balanceDetailValue": "VWh0dG_balanceDetailValue",
346
- "subscriptionGrid": "VWh0dG_subscriptionGrid",
347
- "pluginInfoValue": "VWh0dG_pluginInfoValue"
340
+ "kpiTile": "VWh0dG_kpiTile",
341
+ "heroTop": "VWh0dG_heroTop",
342
+ "siteRowCalls": "VWh0dG_siteRowCalls",
343
+ "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
344
+ "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
345
+ "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
346
+ "shareLegend": "VWh0dG_shareLegend",
347
+ "heatmapYearGrid": "VWh0dG_heatmapYearGrid",
348
+ "dashboardHead": "VWh0dG_dashboardHead"
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
@@ -2436,11 +2544,12 @@ function clampPercent$1(value) {
2436
2544
  function round1$1(value) {
2437
2545
  return Math.round(value * 10) / 10;
2438
2546
  }
2439
- /** Number → ISO string (seconds treated as epoch seconds, ms as epoch ms). */
2547
+ /** Number → ISO string. Real epoch-seconds are far below 1e11 (~year 5138), while
2548
+ * epoch-ms for any 1973+ instant is >= 1e11 — so treat < 1e11 as seconds. */
2440
2549
  function toIso(value) {
2441
2550
  if (value === null || value === void 0 || value === "") return null;
2442
2551
  if (typeof value === "number" && Number.isFinite(value)) {
2443
- const date = new Date(value < 2e12 ? value * 1e3 : value);
2552
+ const date = new Date(value < 1e11 ? value * 1e3 : value);
2444
2553
  return Number.isNaN(date.getTime()) ? null : date.toISOString();
2445
2554
  }
2446
2555
  const date = new Date(String(value));
@@ -3257,6 +3366,37 @@ function warnAuthOnce(source, provider, displayName) {
3257
3366
  authWarnedAt.set(key, now);
3258
3367
  console.warn(`[usage-billing] ${displayName}(${provider})鉴权失败:请检查 llm-pi-ai 设置中该 provider 的 apiKeyEnv 凭据是否正确/有效。`);
3259
3368
  }
3369
+ /**
3370
+ * Create the atomic file-backed durable-ledger store. The previous complete file
3371
+ * is retained as `.bak`; a malformed/missing main file falls back to that backup.
3372
+ */
3373
+ function createFileUsageLedgerStore(ledgerPath) {
3374
+ return {
3375
+ async load() {
3376
+ for (const path of [ledgerPath, `${ledgerPath}.bak`]) try {
3377
+ const parsed = JSON.parse(await readFile(path, "utf8"));
3378
+ if (parsed !== null && typeof parsed === "object") {
3379
+ const candidate = parsed;
3380
+ if (candidate.version === 1 && Array.isArray(candidate.sessions)) return parsed;
3381
+ }
3382
+ } catch {}
3383
+ },
3384
+ async save(document) {
3385
+ try {
3386
+ const existing = await readFile(ledgerPath, "utf8");
3387
+ JSON.parse(existing);
3388
+ await writeFileAtomic(`${ledgerPath}.bak`, existing, {
3389
+ mode: 384,
3390
+ dirMode: 448
3391
+ });
3392
+ } catch {}
3393
+ await writeFileAtomic(ledgerPath, JSON.stringify(document), {
3394
+ mode: 384,
3395
+ dirMode: 448
3396
+ });
3397
+ }
3398
+ };
3399
+ }
3260
3400
  /** Required services: the web server, the persisted session log store, and user settings. */
3261
3401
  const inject = [
3262
3402
  "webServer",
@@ -3412,14 +3552,16 @@ async function resolveSubscriptionKeys(settings, credentials) {
3412
3552
  */
3413
3553
  function apply(ctx, config = {}) {
3414
3554
  let usageSettingsScope;
3555
+ const cwd = process.cwd();
3556
+ const snapshotPath = join(homedir(), ".dsh/.dsh-usage-stats.json");
3557
+ const ledgerStore = createFileUsageLedgerStore(config.ledgerPath ?? join(homedir(), ".dsh/.dsh-usage-ledger.json"));
3415
3558
  const workspaceTitleResolver = buildWorkspaceTitleResolver(ctx);
3416
3559
  const aggregator = createUsageAggregator(ctx.sessionPersistence, {
3417
3560
  ...config.subscriptionProviders === void 0 ? {} : { subscriptionProviders: config.subscriptionProviders },
3418
3561
  resolveRoutes: () => readPiAiProviderRoutes(ctx.settings),
3419
- ...workspaceTitleResolver === void 0 ? {} : { resolveWorkspaceTitle: workspaceTitleResolver }
3562
+ ...workspaceTitleResolver === void 0 ? {} : { resolveWorkspaceTitle: workspaceTitleResolver },
3563
+ ledger: ledgerStore
3420
3564
  });
3421
- const cwd = process.cwd();
3422
- const snapshotPath = join(homedir(), ".dsh/.dsh-usage-stats.json");
3423
3565
  const candidates = [
3424
3566
  config.statsPath,
3425
3567
  process.env.DSH_USAGE_STATS,
@@ -3803,4 +3945,4 @@ function apply(ctx, config = {}) {
3803
3945
  }), "usage-billing: usage-stats route");
3804
3946
  }
3805
3947
  //#endregion
3806
- export { apply, guardLoopback, inject, readPiAiProviderRoutes, resolveSubscriptionKeys };
3948
+ 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.13",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },