@kenz1117/dsh-ui-usage-billing 1.4.18 → 1.4.19
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/lib/client.js +1 -1
- package/lib/index.js +183 -130
- package/lib/types/client/usage-billing-settings.d.ts +6 -4
- package/lib/types/index.d.ts +22 -3
- package/package.json +3 -3
package/lib/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
window.__ModuleLoader__.load({id:`@kenz1117/dsh-ui-usage-billing`,factory:e=>{var t={exports:{}},n=t.exports;Object.defineProperty(n,Symbol.toStringTag,{value:`Module`});var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;l<u;l++)d=s[l],!c.call(e,d)&&d!==n&&i(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e},u=(e,t,n)=>(n=e==null?{}:r(s(e)),l(t||!e||!e.__esModule||!c.call(e,`default`)?i(n,`default`,{value:e,enumerable:!0}):n,e));let d=e("react"),f=e("react-dom"),p=e("@deepseek-ai/dsh-client-ui-primitives");p=u(p,1);let m=e("react/jsx-runtime"),h=e("@deepseek-ai/dsh-client-store");function g(e){return e}function _(e){return g(e)}function v(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`){if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=v(e[t]))&&(r&&(r+=` `),r+=n)}else for(n in e)e[n]&&(r&&(r+=` `),r+=n)}return r}function y(){for(var e,t,n=0,r=``,i=arguments.length;n<i;n++)(e=arguments[n])&&(t=v(e))&&(r&&(r+=` `),r+=t);return r}function b(e,t){try{localStorage.setItem(e,t)}catch{}}function x(e){try{return localStorage.getItem(e)??void 0}catch{return}}function S(e){let t=x(e);if(t!==void 0)try{return JSON.parse(t)}catch{return}}let C={mode:`combined`,targets:[]},w=`dsh.ui-usage-billing.float`;function T(){let e=()=>({...C,targets:[...C.targets]}),t=S(w);if(typeof t!=`object`||!t)return e();let n=t;return{mode:n.mode===`subscription`?`subscription`:`combined`,targets:Array.isArray(n.targets)?n.targets.filter(e=>typeof e==`string`):[]}}function ee(e){b(w,JSON.stringify(e))}let E={metric:`money`,span:`day`},D=`dsh.ui-usage-billing.card`;function O(){let e=S(D);if(typeof e!=`object`||!e)return{...E};let t=e;return{metric:t.metric===`tokens`?`tokens`:`money`,span:t.span===`week`||t.span===`month`?t.span:`day`}}function te(e){b(D,JSON.stringify(e))}let ne=`dsh.ui-usage-billing.kpi-range`;function k(){let e=x(ne);return e===`today`||e===`7d`||e===`week`||e===`month`||e===`all`?e:`all`}function re(e){b(ne,e)}let ie={hideUnidentified:!0},A=`dsh.ui-usage-billing.sites`;function ae(){let e=S(A);return typeof e!=`object`||!e?{...ie}:{hideUnidentified:e.hideUnidentified!==!1}}function oe(e){b(A,JSON.stringify(e))}let se={show:!0,position:`toolbar`},ce=`dsh.ui-usage-billing.livecost`,j=`dsh.ui-usage-billing.livecost-pref`;function le(){let e=S(ce);if(typeof e!=`object`||!e)return{...se};let t=e;return{show:t.show!==!1,position:t.position===`above`||t.position===`toolbar`||t.position===`below`?t.position:se.position}}function M(e){b(ce,JSON.stringify(e))}let N=`dsh.ui-usage-billing.currency`,ue=`dsh.ui-usage-billing.currency-pref`;function de(){let e=x(N);return e===`usd`||e===`cny`||e===`eur`?e:`cny`}function fe(e){b(N,e)}let pe=`dsh.ui-usage-billing.pinned`,me=`dsh.ui-usage-billing.pinned-pref`;function he(){let e=S(pe);return Array.isArray(e)?e.filter(e=>typeof e==`string`&&e!==``):[]}function ge(e){b(pe,JSON.stringify(e))}let _e=`dsh.ui-usage-billing.provider-expanded`;function ve(){let e=S(_e);return Array.isArray(e)?e.filter(e=>typeof e==`string`&&/^(ch|sub|bal):/.test(e)):[]}function ye(e){b(_e,JSON.stringify(e))}let be=`dsh.ui-usage-billing.providers-today`;function xe(){return x(be)===`1`}function Se(e){b(be,e?`1`:`0`)}let P=`dsh.ui-usage-billing.language`;function Ce(){let e=x(P);if(e===`en`||e===`zh`)return e;let t=de()===`usd`?`en`:`zh`;return we(t),t}function we(e){b(P,e)}function Te(e){let t=he(),n=t.includes(e)?t.filter(t=>t!==e):[...t,e];return ge(n),n}let F=`dsh.ui-usage-billing.prices`;function Ee(){let e=S(F);if(e==null)return[];let t=[],n=(e,n)=>{if(typeof n!=`object`||!n)return;let r=n,i=Number(r.input),a=Number(r.cacheHit),o=Number(r.output);if(![i,a,o].every(e=>Number.isFinite(e)&&e>=0))return;let s=r.offPeak,c;if(typeof s==`object`&&s){let e=s,t=Number(e.input),n=Number(e.cacheHit),r=Number(e.output);[t,n,r].every(e=>Number.isFinite(e)&&e>=0)&&(c={input:t,cacheHit:n,output:r})}t.push({key:e,...typeof r.origin==`string`&&r.origin!==``?{origin:r.origin}:{},input:i,cacheHit:a,output:o,...c===void 0?{}:{offPeak:c},...r.currency===`USD`?{currency:`USD`}:{}})};if(Array.isArray(e))for(let t of e){if(typeof t!=`object`||!t)continue;let e=t;typeof e.key==`string`&&e.key!==``&&n(e.key,t)}else if(typeof e==`object`)for(let[t,r]of Object.entries(e))n(t,r);return t}function De(e){b(F,JSON.stringify(e))}let Oe={metric:`ttft`},ke=`dsh.ui-usage-billing.perf`;function Ae(){let e=S(ke);if(typeof e!=`object`||!e)return{...Oe};let t=e;return{metric:t.metric===`tps`?`tps`:`ttft`,...Array.isArray(t.models)?{models:t.models.filter(e=>typeof e==`string`)}:{}}}function je(e){b(ke,JSON.stringify(e))}let Me=`@kenz1117/dsh-ui-usage-billing/UsageBilling.module.css`;if(typeof document<`u`&&document.querySelector(`style[data-plugin-css=`+JSON.stringify(Me)+`]`)===null){let e=document.createElement(`style`);e.dataset.plugin=`@kenz1117/dsh-ui-usage-billing`,e.dataset.pluginCss=Me,e.textContent=`:root{--ds-blue:#4f8cff;--ds-cyan:#2dd4bf;--ds-green:#34d399;--ds-amber:#f59e0b;--ds-red:#ef4444;--ds-violet:#a78bfa}body{--dsb:var(--dsw-alias-bg-layer-1);--dsb-2:var(--dsw-alias-bg-layer-2);--dsb-3:var(--dsw-alias-bg-layer-3);--dsb-glass:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 78%,transparent);--dsb-glass-strong:color-mix(in srgb,var(--dsw-alias-bg-layer-3) 88%,transparent);--ds-border:var(--dsw-alias-border-l1);--ds-border-strong:var(--dsw-alias-border-l2);--ds-hi-top:#ffffff0b;--ds-shadow-1:0 1px 0 #ffffff0a inset,0 8px 24px #00000059;--ds-shadow-2:0 1px 0 #ffffff0d inset,0 18px 48px #00000080;--ds-t-1:var(--dsw-alias-label-primary);--ds-t-2:var(--dsw-alias-label-secondary);--ds-t-3:var(--dsw-alias-label-tertiary);--ds-t-4:var(--dsw-alias-label-dimmed);--ds-c-1:#4f8cff;--ds-c-2:#2dd4bf;--ds-c-3:#a78bfa;--ds-c-4:#f59e0b;--ds-c-5:#f472b6;--ds-c-6:#fbbf24;--ds-c-7:#38bdf8;--ds-r-1:8px;--ds-r-2:12px;--ds-r-3:16px;--ds-t-fast:.16s cubic-bezier(.2,.8,.2,1)}.KFXqYa_railButton{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);background:var(--dsb-2);width:36px;height:36px;color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast);flex:none;justify-content:center;align-items:center;padding:0;display:flex}.KFXqYa_railButton:hover,.KFXqYa_railButton:focus-visible{border-color:var(--ds-blue);color:var(--ds-blue);outline:none}.KFXqYa_railButton svg{width:26px;height:26px}.KFXqYa_triggerBudgetPulse{border-color:color-mix(in srgb, var(--ds-red) 55%, transparent);animation:2s ease-in-out infinite KFXqYa_budgetPulse}.KFXqYa_triggerBudgetOver{animation-duration:1.2s}@keyframes KFXqYa_budgetPulse{0%,to{box-shadow:0 1px 2px #0000000a,0 0 #ef444400}50%{box-shadow:0 1px 2px #0000000a,0 0 0 3px #ef444429}}.KFXqYa_trigger{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);-webkit-backdrop-filter:blur(14px)saturate(1.2);width:100%;min-width:0;color:var(--ds-t-1);cursor:pointer;text-align:left;transition:border-color var(--ds-t-fast), transform var(--ds-t-fast), box-shadow var(--ds-t-fast);align-items:center;gap:12px;padding:10px 14px;display:flex;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a}.KFXqYa_trigger:hover,.KFXqYa_trigger:focus-visible{border-color:var(--ds-border-strong);box-shadow:0 6px 18px -8px color-mix(in srgb, var(--ds-blue) 45%, transparent);outline:none;transform:translateY(-1px)}.KFXqYa_trigger:before{content:"";background:linear-gradient(180deg, var(--ds-hi-top), transparent);pointer-events:none;height:1px;position:absolute;top:0;left:0;right:0}.KFXqYa_trigger:after{content:"";background:linear-gradient(105deg, transparent 42%, color-mix(in srgb, var(--ds-blue) 9%, transparent) 50%, transparent 58%);opacity:0;pointer-events:none;position:absolute;inset:0;transform:translate(-110%)}.KFXqYa_trigger:hover:after,.KFXqYa_trigger:focus-visible:after{animation:.9s ease-out KFXqYa_triggerScan}@keyframes KFXqYa_triggerScan{0%{opacity:0;transform:translate(-110%)}25%{opacity:1}to{opacity:0;transform:translate(110%)}}@media (prefers-reduced-motion:reduce){.KFXqYa_triggerSparkBar,.KFXqYa_trigger:hover:after,.KFXqYa_trigger:focus-visible:after{animation:none}.KFXqYa_triggerGaugeNeedle,.KFXqYa_triggerGaugeArc{transition:none}.KFXqYa_triggerBudgetPulse{animation:none}}.KFXqYa_triggerIcon{width:32px;height:32px;color:var(--ds-blue);flex:none;justify-content:center;align-items:center;display:inline-flex}.KFXqYa_triggerIcon svg{width:30px;height:30px}.KFXqYa_triggerGaugeNeedle{transition:transform 1.1s cubic-bezier(.22,1,.36,1)}.KFXqYa_triggerGaugeArc{transition:stroke-dasharray 1.1s cubic-bezier(.22,1,.36,1)}.KFXqYa_triggerBudgetHot{color:var(--ds-red)}.KFXqYa_triggerMain{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.KFXqYa_triggerPrimary{flex-direction:column;gap:1px;min-width:0;display:flex}.KFXqYa_triggerValueRow{align-items:baseline;gap:2px;min-width:0;display:flex}.KFXqYa_triggerLabel{color:var(--ds-t-3);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:15px;overflow:hidden}.KFXqYa_triggerYen{color:var(--ds-t-3);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;line-height:16px}.KFXqYa_triggerMetric{color:var(--ds-t-1);font-variant-numeric:tabular-nums;white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:22px;font-weight:600;line-height:26px;overflow:hidden}.KFXqYa_triggerSpark{flex:none;align-items:flex-end;gap:2px;height:20px;display:flex}.KFXqYa_triggerSparkBar,.KFXqYa_triggerSparkHot{background:var(--ds-blue);opacity:.6;border-radius:1px 1px 0 0;width:3px}.KFXqYa_triggerSparkHot{opacity:1}.KFXqYa_triggerSparkBar{animation:3.6s ease-in-out infinite KFXqYa_triggerSparkBreath}.KFXqYa_triggerSparkBar:nth-child(2n){animation-delay:-1.2s}.KFXqYa_triggerSparkBar:nth-child(3n){animation-delay:-2.4s}@keyframes KFXqYa_triggerSparkBreath{0%,to{opacity:.6}50%{opacity:.34}}.KFXqYa_triggerWrap{flex:auto;width:100%;min-width:96px;max-width:100%;display:block;position:relative;container:KFXqYa_billing-trigger/inline-size}@container KFXqYa_billing-trigger (width<=210px){.KFXqYa_trigger{box-shadow:none;-webkit-backdrop-filter:none;background:0 0;border:none;border-radius:12px;padding:7px 8px}.KFXqYa_trigger:before,.KFXqYa_trigger:after{display:none}.KFXqYa_trigger:hover,.KFXqYa_trigger:focus-visible{background:var(--dsw-alias-interactive-bg-hover);box-shadow:none;border-color:#0000;transform:none}.KFXqYa_triggerSpark,.KFXqYa_triggerLabel{display:none}}@container KFXqYa_billing-trigger (width<=140px){.KFXqYa_triggerMain{display:none}}.KFXqYa_triggerPop{box-sizing:border-box;border:1px solid var(--ds-border-strong);border-radius:var(--ds-r-3);background:var(--dsb-glass-strong);-webkit-backdrop-filter:blur(14px)saturate(1.2);width:256px;box-shadow:var(--ds-shadow-2);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--ds-t-fast), transform var(--ds-t-fast), visibility 0s linear .16s;z-index:2000;flex-direction:column;gap:5px;padding:10px 12px;display:flex;position:fixed;top:0;left:0;overflow:hidden;transform:translateY(calc(4px - 100%))}.KFXqYa_triggerPop,.KFXqYa_triggerPop *{box-sizing:border-box}.KFXqYa_triggerPop:before{content:"";background:linear-gradient(90deg, transparent 10%, var(--ds-amber) 50%, transparent 90%);opacity:.65;pointer-events:none;height:1.5px;position:absolute;top:0;left:0;right:0}.KFXqYa_triggerPopShown{opacity:1;visibility:visible;transition:opacity var(--ds-t-fast), transform var(--ds-t-fast), visibility 0s linear 0s;transform:translateY(-100%)}.KFXqYa_popHead{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.KFXqYa_popTitle{letter-spacing:.06em;text-transform:uppercase;color:var(--ds-t-3);font-size:12px;font-weight:700;line-height:18px}.KFXqYa_metricGrid{grid-template-columns:repeat(3,1fr);gap:10px 12px;display:grid}.KFXqYa_metricCell{flex-direction:column;gap:2px;min-width:0;display:flex}.KFXqYa_metricLabel{color:var(--ds-t-3);font-size:11px;line-height:14px}.KFXqYa_metricValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;white-space:nowrap;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:13px;font-weight:700;line-height:16px}.KFXqYa_metricValueSuccess{color:var(--ds-green)}.KFXqYa_popModel{border-top:1px dashed var(--ds-border);flex-direction:column;gap:6px;margin-top:9px;padding-top:10px;display:flex}.KFXqYa_popModelLabel{color:var(--ds-t-3);font-size:10px;line-height:14px}.KFXqYa_popModelRow{align-items:center;gap:8px;min-width:0;display:flex}.KFXqYa_popDot{border-radius:999px;flex:none;width:6px;height:6px}.KFXqYa_popDotDirect{background:var(--ds-green)}.KFXqYa_popDotSub{background:var(--ds-amber)}.KFXqYa_popDotNeutral{background:var(--ds-t-3)}.KFXqYa_popTagPrimary,.KFXqYa_popTagSub{white-space:nowrap;border-radius:5px;flex:none;align-items:center;height:18px;padding:0 6px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_popTagPrimary{background:color-mix(in srgb, var(--ds-blue) 14%, transparent);color:var(--ds-blue)}.KFXqYa_popTagSub{background:color-mix(in srgb, var(--ds-amber) 18%, transparent);color:var(--ds-amber)}.KFXqYa_popModelName{color:var(--ds-t-2);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}.KFXqYa_popModelStatus{color:var(--ds-t-1);font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:11px;font-weight:600;line-height:16px}.KFXqYa_popModelStatusLow{color:var(--ds-red)}.KFXqYa_dashboardModal{border:1px solid var(--ds-border-strong);border-radius:var(--ds-r-3);background:var(--dsb-2);width:min(760px,100vw - 48px);max-height:min(760px,88vh);box-shadow:var(--ds-shadow-2);animation:.16s ease-out KFXqYa_dashboardIn}@keyframes KFXqYa_dashboardIn{0%{opacity:0;transform:translateY(4px)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)}.KFXqYa_dashboard{flex-direction:column;width:100%;max-height:min(760px,88vh);display:flex}.KFXqYa_dashboardHead{border-bottom:1px solid var(--ds-border);justify-content:space-between;align-items:center;gap:12px;padding:12px 18px;display:flex}.KFXqYa_dashboardTitle{color:var(--ds-t-1);margin:0;font-size:14px;font-weight:600;line-height:20px}.KFXqYa_dashboardSubtitle{color:var(--ds-t-3);margin:2px 0 0;font-size:11px;line-height:16px}.KFXqYa_closeButton{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);width:32px;height:32px;color:var(--ds-t-2);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast);background:0 0;flex:none;justify-content:center;align-items:center;display:inline-flex}.KFXqYa_closeButton:hover{background:var(--dsb-3);color:var(--ds-t-1)}.KFXqYa_closeButton svg{stroke-width:2px;width:16px;height:16px}.KFXqYa_dashboardBody{flex-direction:column;gap:14px;padding:16px 24px 24px;display:flex;overflow-y:auto}.KFXqYa_modalFooter{border-top:1px solid var(--ds-border);color:var(--ds-t-3);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:8px 18px;font-size:11px;line-height:16px;display:flex}.KFXqYa_tabNav{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);background:var(--dsb);align-items:center;gap:4px;margin:14px 24px 0;padding:4px;display:flex}.KFXqYa_tabButton{color:var(--ds-t-3);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast), box-shadow var(--ds-t-fast);background:0 0;border:none;border-radius:6px;padding:6px 12px;font-size:12px;font-weight:500;line-height:16px}.KFXqYa_tabButton:hover{color:var(--ds-t-2)}.KFXqYa_tabButton:focus-visible{color:var(--ds-t-2);box-shadow:0 0 0 1px var(--ds-border-strong);outline:none}.KFXqYa_tabButtonActive,.KFXqYa_tabButtonActive:hover,.KFXqYa_tabButtonActive:focus-visible{background:var(--dsb-3);color:var(--ds-t-1);box-shadow:0 0 0 1px var(--ds-border-strong) inset;font-weight:600}.KFXqYa_tabPanel{flex-direction:column;gap:14px;animation:.14s ease-out KFXqYa_tabPanelIn;display:flex}@keyframes KFXqYa_tabPanelIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.KFXqYa_reconcileNotice{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 78%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);color:var(--dsw-alias-label-secondary);border-radius:10px;align-items:flex-start;gap:10px;padding:10px 12px;font-size:12px;line-height:1.55;display:flex}.KFXqYa_reconcileIcon{color:var(--dsw-alias-label-tertiary);flex:none;margin-top:1px;display:inline-flex}.KFXqYa_reconcileText{flex:1}.KFXqYa_reconcileDismiss{color:var(--dsw-alias-label-tertiary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;flex:none;padding:2px 8px;font-size:12px;line-height:1.4;transition:color .15s,background-color .15s}.KFXqYa_reconcileDismiss:hover{color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent)}.KFXqYa_hero{border:1px solid var(--ds-border);border-radius:var(--ds-r-3);background:var(--dsb-glass-strong);flex-direction:column;gap:12px;padding:18px 20px;display:flex;position:relative;overflow:hidden}.KFXqYa_hero:after{content:"";background:linear-gradient(90deg, transparent 10%, var(--ds-amber) 50%, transparent 90%);opacity:.65;pointer-events:none;height:1.5px;position:absolute;top:0;left:0;right:0}.KFXqYa_heroTop{justify-content:space-between;align-items:center;gap:24px;display:flex}.KFXqYa_heroMain{flex-direction:column;gap:2px;min-width:0;display:flex}.KFXqYa_heroLabel{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;font-size:11px;font-weight:500;line-height:15px}.KFXqYa_heroReadout{align-items:baseline;gap:4px;display:flex}.KFXqYa_heroCurrency{letter-spacing:-.01em;color:var(--ds-t-2);font-variant-numeric:tabular-nums;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:22px;font-weight:600;line-height:26px}.KFXqYa_heroValue{letter-spacing:-.03em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--ds-t-1);font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:52px;font-weight:600;line-height:56px}.KFXqYa_heroMeta{color:var(--ds-t-2);white-space:nowrap;margin-top:2px;font-size:12px;line-height:16px}.KFXqYa_heroGauge{flex-direction:column;flex:none;align-items:center;gap:4px;width:96px;display:flex}.KFXqYa_heroGaugeDial{flex:none;width:96px;height:96px;position:relative}.KFXqYa_heroGaugeSvg{width:100%;height:100%;display:block;transform:rotate(-90deg)}.KFXqYa_heroGaugeTrack{fill:none;stroke:var(--dsb-3);stroke-width:7px}.KFXqYa_heroGaugeArc{fill:none;stroke:var(--ds-blue);stroke-width:7px;stroke-linecap:round;transition:stroke-dasharray var(--ds-t-fast)}.KFXqYa_heroGaugeArcOver{stroke:var(--ds-red)}.KFXqYa_heroGaugeCenter{flex-direction:column;justify-content:center;align-items:center;gap:1px;display:flex;position:absolute;inset:0}.KFXqYa_heroGaugeRemain{letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--ds-t-1);font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:16px;font-weight:600;line-height:18px}.KFXqYa_heroGaugeRemainOver{color:var(--ds-red)}.KFXqYa_heroGaugeLabel{color:var(--ds-t-3);font-size:11px;line-height:13px}.KFXqYa_heroGaugeSub{font-variant-numeric:tabular-nums;color:var(--ds-t-2);white-space:nowrap;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;line-height:12px}.KFXqYa_heroSide{border-top:1px solid var(--ds-border);align-items:stretch;padding-top:12px;display:flex}.KFXqYa_heroSideItem{border-left:1px solid var(--ds-border);flex-direction:column;flex:1;gap:2px;min-width:0;padding-left:14px;display:flex}.KFXqYa_heroSideItem:first-child{border-left:none;padding-left:0}.KFXqYa_heroSideLabel{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;font-size:10px;font-weight:500;line-height:13px}.KFXqYa_heroSideValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;letter-spacing:-.01em;white-space:nowrap;align-items:baseline;gap:6px;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:15px;font-weight:600;line-height:20px;display:inline-flex}.KFXqYa_heroSideSpacer{flex:1;display:block}.KFXqYa_delta{font-variant-numeric:tabular-nums;border-radius:999px;align-items:center;gap:2px;margin-left:6px;padding:1px 7px;font-size:10.5px;font-weight:600;line-height:16px;display:inline-flex}.KFXqYa_deltaUp{color:var(--ds-green);background:color-mix(in srgb, var(--ds-green) 12%, transparent)}.KFXqYa_deltaDown{color:var(--ds-red);background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_unpricedHint{border:1px solid color-mix(in srgb, var(--ds-amber) 30%, transparent);background:color-mix(in srgb, var(--ds-amber) 8%, transparent);color:var(--ds-amber);border-radius:8px;align-items:center;padding:8px 12px;font-size:11.5px;font-weight:500;line-height:17px;display:flex}.KFXqYa_kpiZone{flex-direction:column;gap:8px;display:flex}.KFXqYa_kpiZoneHead{justify-content:flex-end;align-items:center;gap:8px;display:flex}.KFXqYa_kpiZoneLabel{color:var(--ds-t-3);font-size:11px;line-height:14px}.KFXqYa_kpiGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.KFXqYa_kpiTile{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);transition:border-color var(--ds-t-fast);flex-direction:column;gap:2px;padding:14px 16px;display:flex;position:relative;overflow:hidden}.KFXqYa_kpiTile:hover{border-color:var(--ds-border-strong)}.KFXqYa_kpiLabel{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.04em;font-size:11px;font-weight:500;line-height:14px}.KFXqYa_kpiValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;letter-spacing:-.01em;margin-top:6px;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:22px;font-weight:600;line-height:26px}.KFXqYa_kpiGreen{color:var(--ds-green)}.KFXqYa_kpiDetail{color:var(--ds-t-3);white-space:nowrap;text-overflow:ellipsis;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:11px;line-height:15px;overflow:hidden}.KFXqYa_panel{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);transition:border-color var(--ds-t-fast);flex-direction:column;gap:8px;padding:12px 14px;display:flex}.KFXqYa_panelHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.KFXqYa_panelHeadControls{align-items:center;gap:8px;display:inline-flex}.KFXqYa_panelTitle{letter-spacing:-.005em;color:var(--ds-t-1);margin:0;font-size:13px;font-weight:600;line-height:20px}.KFXqYa_panelHint{color:var(--ds-t-3);white-space:nowrap;font-size:11px;line-height:16px}.KFXqYa_rangeToggle{border:1px solid var(--ds-border);background:var(--dsb-3);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.KFXqYa_rangeButton{color:var(--ds-t-3);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast);background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:11px;line-height:16px}.KFXqYa_rangeButtonActive{background:var(--dsb-2);color:var(--ds-t-1);box-shadow:0 0 0 1px var(--ds-border-strong);font-weight:600}.KFXqYa_exportBar{justify-content:flex-end;align-items:center;gap:8px;display:flex}.KFXqYa_exportLabel{color:var(--ds-t-3);font-size:11px;line-height:16px}.KFXqYa_exportButton{border:1px solid var(--ds-border);color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast), background-color var(--ds-t-fast);background:0 0;border-radius:999px;padding:4px 12px;font-size:11.5px;line-height:16px}.KFXqYa_exportButton:hover,.KFXqYa_exportButton:focus-visible{border-color:var(--ds-border-strong);color:var(--ds-t-1);outline:none}.KFXqYa_exportButton:disabled{opacity:.45;cursor:not-allowed}.KFXqYa_exportButton:disabled:hover{border-color:var(--ds-border);color:var(--ds-t-2)}.KFXqYa_shareTrack{background:var(--dsb-3);border-radius:4px;height:8px;display:flex;overflow:hidden}.KFXqYa_shareSeg{height:100%;transition:width var(--ds-t-fast)}.KFXqYa_shareSegPeak{background:var(--ds-blue)}.KFXqYa_shareSegOff{background:color-mix(in srgb, var(--ds-blue) 30%, var(--dsb-3))}.KFXqYa_shareSegUser{background:var(--ds-blue)}.KFXqYa_shareSegAssistant{background:var(--ds-green)}.KFXqYa_shareSegTool{background:var(--ds-amber)}.KFXqYa_shareLegend{align-items:center;gap:16px;display:flex}.KFXqYa_shareItem{color:var(--ds-t-2);align-items:baseline;gap:6px;font-size:11px;line-height:17px;display:inline-flex}.KFXqYa_bucketCost{font-variant-numeric:tabular-nums;align-items:baseline;gap:3px;display:inline-flex}.KFXqYa_bucketOfficial{color:var(--ds-blue);font-weight:600}.KFXqYa_bucketSep{color:var(--ds-t-4)}.KFXqYa_bucketThird{color:var(--ds-t-2)}.KFXqYa_shareDot{border-radius:2px;flex:none;align-self:center;width:8px;height:8px}.KFXqYa_shareValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-weight:600}.KFXqYa_budgetInput{width:64px;color:var(--ds-t-1);font-variant-numeric:tabular-nums;text-align:right;background:0 0;border:none;padding:0;font-size:12px;line-height:16px}.KFXqYa_budgetInput:focus-visible{outline:none}.KFXqYa_switch{border:1px solid var(--ds-border);background:var(--dsb-3);cursor:pointer;width:32px;height:18px;transition:background-color var(--ds-t-fast), border-color var(--ds-t-fast);border-radius:999px;flex:none;padding:0;position:relative}.KFXqYa_switchOn{background:color-mix(in srgb, var(--ds-blue) 60%, transparent);border-color:#0000}.KFXqYa_switchKnob{width:12px;height:12px;transition:transform var(--ds-t-fast);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px}.KFXqYa_switchOn .KFXqYa_switchKnob{transform:translate(14px)}.KFXqYa_budgetFillWarn{background:var(--ds-amber)}.KFXqYa_budgetFillOver{background:var(--ds-red)}.KFXqYa_chartWrap{width:100%;position:relative}.KFXqYa_chartSvg{width:100%;height:auto;display:block}.KFXqYa_chartEmpty{height:140px;color:var(--ds-t-3);justify-content:center;align-items:center;font-size:13px;display:flex}.KFXqYa_emptyRow{text-align:center;color:var(--ds-t-3);padding:28px 0;font-size:13px}.KFXqYa_chartGrid{stroke:var(--ds-border);stroke-width:1px}.KFXqYa_chartAxisLabel{fill:var(--ds-t-3);font-size:10px}.KFXqYa_chartBar{fill:var(--ds-blue);opacity:.7}.KFXqYa_chartBar:hover{opacity:1}.KFXqYa_chartStack{stroke:var(--dsb);stroke-width:.75px}.KFXqYa_chartStack:hover{opacity:.9}.KFXqYa_chartLine{stroke:var(--ds-blue);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.KFXqYa_chartCrosshair{stroke:var(--ds-t-4);stroke-width:1px;stroke-dasharray:3 3}.KFXqYa_chartTooltip{pointer-events:none;z-index:2;border:1px solid var(--ds-border-strong);background:var(--dsb-2);box-shadow:var(--ds-shadow-1);white-space:nowrap;border-radius:8px;padding:8px 10px;position:absolute;transform:translate(-50%,calc(-100% - 10px))}.KFXqYa_chartTooltipAlignRight{transform:translate(calc(-100% - 8px),calc(-100% - 10px))}.KFXqYa_chartTooltipAlignLeft{transform:translate(8px,calc(-100% - 10px))}.KFXqYa_chartTooltipDate{color:var(--ds-t-1);margin-bottom:3px;font-size:11px;font-weight:600}.KFXqYa_chartTooltipRow{color:var(--ds-t-2);align-items:center;gap:5px;font-size:11px;line-height:17px;display:flex}.KFXqYa_chartTooltipRow strong{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-weight:600}.KFXqYa_chartTooltipHead{justify-content:space-between;align-items:baseline;gap:14px;margin-bottom:3px;display:flex}.KFXqYa_chartTooltipHead .KFXqYa_chartTooltipDate{margin-bottom:0}.KFXqYa_chartTooltipHead strong{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600}.KFXqYa_chartTooltipSplit{justify-content:space-between;gap:14px}.KFXqYa_chartTooltipLabel{align-items:center;gap:5px;display:flex}.KFXqYa_chartTooltipModelDetail{color:var(--ds-t-3);font-variant-numeric:tabular-nums;margin:-2px 0 4px 13px;font-size:10.5px;line-height:14px}.KFXqYa_chartBarPlaceholder{fill:color-mix(in srgb, var(--ds-t-2) 30%, transparent)}.KFXqYa_chartLegendLine{background:var(--ds-blue);border-radius:2px;width:10px;height:3px;display:inline-block}.KFXqYa_chartLegendBar{background:var(--ds-blue);opacity:.5;border-radius:2px;width:7px;height:7px;display:inline-block}.KFXqYa_chartTooltipSwatch{border-radius:2px;flex:none;width:8px;height:8px;display:inline-block}.KFXqYa_chartLegend{color:var(--ds-t-2);justify-content:flex-end;gap:14px;margin-top:2px;font-size:11px;display:flex}.KFXqYa_chartLegend span{align-items:center;gap:5px;display:inline-flex}.KFXqYa_chartLegendItem{font:inherit;color:inherit;cursor:pointer;background:0 0;border:none;align-items:center;gap:5px;padding:0;transition:color .12s;display:inline-flex}.KFXqYa_chartLegendItem:hover{color:var(--ds-t-1)}.KFXqYa_chartLegendItemActive{color:var(--ds-t-1);font-weight:600}.KFXqYa_perfBar{align-items:center;margin:10px 0 2px;display:flex}.KFXqYa_perfChips{flex-wrap:wrap;gap:6px;margin:6px 0 2px;display:flex}.KFXqYa_perfChip{border:1px solid var(--ds-border);background:var(--dsb-3);color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast), opacity var(--ds-t-fast);border-radius:999px;align-items:center;gap:5px;padding:2px 9px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_perfChip:hover{color:var(--ds-t-1)}.KFXqYa_perfChipOff{opacity:.45}.KFXqYa_perfChipDot{border-radius:2px;flex:none;width:8px;height:8px;display:inline-block}.KFXqYa_chartHoverDot{stroke:var(--dsb-2);stroke-width:1.5px}.KFXqYa_tableScroll{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);overflow:auto}.KFXqYa_ubAlert{border:1px solid color-mix(in srgb, var(--ds-blue) 30%, transparent);border-radius:var(--ds-r-1);background:color-mix(in srgb, var(--ds-blue) 8%, transparent);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;font-size:12px;line-height:17px;display:flex}.KFXqYa_ubAlertLeft{align-items:center;gap:8px;display:inline-flex}.KFXqYa_ubRate{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-weight:600}.KFXqYa_ubAlertNote{color:var(--ds-t-2);margin:0}.KFXqYa_ubTag,.KFXqYa_ubTagSuccess,.KFXqYa_ubTagNeutral,.KFXqYa_ubTagAlert,.KFXqYa_ubTagPromo{border:1px solid var(--ds-border-strong);white-space:nowrap;border-radius:999px;align-items:center;gap:4px;padding:1px 5px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_ubTag{color:var(--ds-t-2);background:var(--dsb-2)}.KFXqYa_ubTagSuccess{color:var(--ds-green);border-color:color-mix(in srgb, var(--ds-green) 36%, transparent);background:color-mix(in srgb, var(--ds-green) 12%, transparent)}.KFXqYa_ubTagNeutral{color:var(--ds-t-2);background:var(--dsb-2)}.KFXqYa_ubTagAlert{color:var(--ds-amber);border-color:color-mix(in srgb, var(--ds-amber) 36%, transparent);background:color-mix(in srgb, var(--ds-amber) 12%, transparent)}.KFXqYa_ubTagPromo{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 36%, transparent);background:color-mix(in srgb, var(--ds-red) 12%, transparent);cursor:help}.KFXqYa_ubExtraRow td{opacity:.72;padding-top:2px;padding-bottom:2px;font-size:12px}.KFXqYa_ubExtraName{color:var(--ds-t-2);margin-left:26px}.KFXqYa_ubExtraNote{color:var(--ds-t-3);margin-left:8px;font-size:10px}.KFXqYa_ubCard{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);flex-direction:column;gap:12px;padding:16px 18px;display:flex}.KFXqYa_ubCardHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.KFXqYa_ubCardTitle{color:var(--ds-t-1);margin:0;font-size:13px;font-weight:600;line-height:18px}.KFXqYa_ubCardSub{color:var(--ds-t-3);font-size:11px;line-height:16px}.KFXqYa_ubTablewrap{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);overflow:auto}.KFXqYa_ubTable{border-collapse:collapse;white-space:nowrap;width:100%;font-size:12px}.KFXqYa_ubTable th,.KFXqYa_ubTable td{border-bottom:1px solid var(--ds-border);text-align:left;color:var(--ds-t-1);padding:7px 9px}.KFXqYa_ubSearch{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);width:200px;max-width:45%;color:var(--ds-t-1);background:0 0;outline:none;align-self:center;margin-left:auto;padding:5px 9px;font-size:12px;line-height:18px}.KFXqYa_bandDots{flex:none;align-items:center;gap:5px;display:inline-flex}.KFXqYa_bandDot{cursor:pointer;background:0 0;border:1.5px solid;border-radius:999px;flex:none;width:9px;height:9px;padding:0}.KFXqYa_bandDotOn{background:currentColor}.KFXqYa_offPeak{color:var(--ds-blue)}.KFXqYa_soon{color:var(--ds-amber)}.KFXqYa_peak{color:var(--ds-red)}span.KFXqYa_bandDot{cursor:default}.KFXqYa_ubTable th,.KFXqYa_ubTable td:first-child{white-space:normal}.KFXqYa_ubTable tbody tr:last-child td{border-bottom:0}.KFXqYa_ubTable thead th,.KFXqYa_ubTable thead th.KFXqYa_numCol{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.04em;text-align:center;padding:6px 9px;font-size:11px;font-weight:500}.KFXqYa_ubModel{align-items:center;gap:6px;display:inline-flex}.KFXqYa_vendorLetter{color:#fff;border-radius:4px;flex:none;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;font-weight:600;line-height:1;display:inline-flex}.KFXqYa_ubModelName{color:var(--ds-t-1);align-items:center;gap:4px;font-weight:500;display:inline-flex}.KFXqYa_ubChipPeak,.KFXqYa_ubChipOff{font-variant-numeric:tabular-nums;border-radius:999px;align-items:center;gap:4px;height:18px;padding:0 6px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_ubChipLabel{font-size:10px;font-weight:600}.KFXqYa_ubChipPeak{background:color-mix(in srgb, var(--ds-blue) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-blue) 36%, transparent);color:var(--ds-blue)}.KFXqYa_ubChipOff{background:color-mix(in srgb, var(--ds-green) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-green) 36%, transparent);color:var(--ds-green)}.KFXqYa_ubNotes{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.KFXqYa_ubNotesItem{align-items:baseline;gap:10px;display:flex}.KFXqYa_ubNotesTerm{color:var(--ds-t-1);flex:0 0 72px;font-size:12px;font-weight:500}.KFXqYa_ubNotesDesc{min-width:0;color:var(--ds-t-2);flex:1;font-size:12px;line-height:17px}.KFXqYa_ubCardControlGroup{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.KFXqYa_ubTagError{white-space:nowrap;background:color-mix(in srgb, var(--ds-red) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-red) 36%, transparent);height:18px;color:var(--ds-red);border-radius:999px;align-items:center;padding:0 7px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_modelTable{border-collapse:collapse;table-layout:fixed;width:100%;min-width:640px;font-size:12px}.KFXqYa_modelTable th:first-child{width:26%}.KFXqYa_modelTable th,.KFXqYa_modelTable td{border-bottom:1px solid var(--ds-border);text-align:left;white-space:nowrap;color:var(--ds-t-1);padding:10px 12px}.KFXqYa_modelTable tbody tr:last-child td{border-bottom:0}.KFXqYa_sessionGroupRow{cursor:pointer}.KFXqYa_sessionGroupRow .KFXqYa_modelName:before{content:"›";color:var(--ds-t-3);margin-right:6px;display:inline-block}.KFXqYa_sessionGroupRow[aria-expanded=true] .KFXqYa_modelName:before{transform:rotate(90deg)}.KFXqYa_sessionGroupRow:focus-visible{outline:2px solid var(--ds-border-strong);outline-offset:-2px}.KFXqYa_sessionChildRow td:first-child{padding-left:30px}.KFXqYa_modelTable thead th{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.04em;background:0 0;padding:8px 12px;font-size:11px;font-weight:500}.KFXqYa_modelTable tbody tr{transition:background-color .12s}.KFXqYa_modelTable tbody tr:hover{background:0 0}.KFXqYa_modelTable tbody tr.KFXqYa_modelRowFocusable{cursor:pointer}.KFXqYa_modelTable tbody tr.KFXqYa_modelRowActive,.KFXqYa_modelTable tbody tr.KFXqYa_modelRowActive:hover{background:color-mix(in srgb, var(--ds-blue) 10%, transparent)}.KFXqYa_numCol{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums}.KFXqYa_modelTable .KFXqYa_numCol,.KFXqYa_ubTable .KFXqYa_numCol{text-align:right}.KFXqYa_na{color:var(--ds-t-4)}.KFXqYa_modelCell{align-items:center;gap:8px;display:inline-flex}.KFXqYa_modelDot{border-radius:2px;flex:none;width:8px;height:8px}.KFXqYa_modelName{color:var(--ds-t-1);font-weight:500;line-height:16px;display:block}.KFXqYa_modelProvider{color:var(--ds-t-3);font-size:10.5px;line-height:14px;display:block}.KFXqYa_siteRow{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);background:var(--dsb-2);justify-content:space-between;align-items:center;gap:12px;padding:8px 10px;display:flex}.KFXqYa_siteRowName{align-items:center;gap:8px;min-width:0;display:inline-flex}.KFXqYa_siteKindTag{white-space:nowrap;border:1px solid #0000;border-radius:999px;flex:none;align-items:center;padding:2px 7px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_siteKindSite{color:var(--ds-blue);border-color:color-mix(in srgb, var(--ds-blue) 36%, transparent);background:color-mix(in srgb, var(--ds-blue) 12%, transparent)}.KFXqYa_siteKindDirect{color:var(--ds-green);border-color:color-mix(in srgb, var(--ds-green) 36%, transparent);background:color-mix(in srgb, var(--ds-green) 12%, transparent)}.KFXqYa_siteKindUnknown{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 36%, transparent);background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_siteRowTitle{color:var(--ds-t-1);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.KFXqYa_siteRowMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.KFXqYa_siteRowCost{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-size:12.5px;font-weight:600;line-height:18px}.KFXqYa_siteRowCalls{color:var(--ds-t-2);font-variant-numeric:tabular-nums;font-size:11.5px;line-height:17px}.KFXqYa_siteRowCallsLow{color:var(--ds-red)}.KFXqYa_flatTag{color:var(--ds-t-3);font-size:10.5px;line-height:14px}.KFXqYa_healthDot{border-radius:50%;flex:none;width:6px;height:6px;display:inline-block}.KFXqYa_healthOk{background:var(--ds-green);box-shadow:0 0 0 3px color-mix(in srgb, var(--ds-green) 18%, transparent)}.KFXqYa_healthBad{background:var(--ds-red);box-shadow:0 0 0 3px color-mix(in srgb, var(--ds-red) 18%, transparent)}.KFXqYa_healthIdle{background:var(--ds-t-4)}.KFXqYa_dashboardRight{align-items:center;gap:8px;min-width:0;display:flex}.KFXqYa_healthBadge{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_healthBadgeOk{color:var(--ds-green);background:var(--dsb-2)}.KFXqYa_healthBadgeBad{color:var(--ds-red);background:var(--dsb-2)}.KFXqYa_planTag{color:var(--ds-green);white-space:nowrap;align-items:center;gap:4px;font-size:10px;font-weight:500;line-height:14px;display:inline-flex}.KFXqYa_planTagBadge{background:color-mix(in srgb, var(--ds-green) 20%, transparent);border-radius:4px;padding:0 4px;font-size:9px;line-height:12px}.KFXqYa_uncataloguedTag{border:1px solid color-mix(in srgb, var(--ds-amber) 36%, transparent);vertical-align:1px;color:var(--ds-amber);background:color-mix(in srgb, var(--ds-amber) 12%, transparent);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.KFXqYa_estimatedTag{border:1px solid color-mix(in srgb, var(--ds-blue) 36%, transparent);vertical-align:1px;color:var(--ds-blue);background:color-mix(in srgb, var(--ds-blue) 12%, transparent);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.KFXqYa_feeBar{border:1px solid var(--ds-border-strong);background:var(--dsb-glass-strong);backdrop-filter:blur(14px)saturate(1.3);color:var(--ds-t-2);font-variant-numeric:tabular-nums;border-radius:999px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 12px;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_feeBarAbove{order:-1;align-self:center;margin-bottom:8px}.KFXqYa_feeInline{font-variant-numeric:tabular-nums;white-space:nowrap;cursor:default;border-radius:999px;align-self:center;align-items:center;gap:5px;height:22px;padding:0 4px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_feeInline .KFXqYa_feeChipPrimary,.KFXqYa_feeInline .KFXqYa_feeChipOff{height:18px;padding:0 7px}.KFXqYa_feeInlineNum{color:var(--ds-t-1);padding-right:6px;font-weight:600}.KFXqYa_feeInlineAlert{background:color-mix(in srgb, var(--ds-amber) 12%, transparent)}.KFXqYa_feeInlineAlert .KFXqYa_feeInlineNum{color:var(--ds-amber)}.KFXqYa_feeInlineError{background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_feeInlineError .KFXqYa_feeInlineNum{color:var(--ds-red)}.KFXqYa_feeBar .KFXqYa_feeSep{color:var(--ds-t-4)}.KFXqYa_feeCount{color:var(--ds-t-1);font-weight:600}.KFXqYa_feeSuffix{color:var(--ds-t-3)}.KFXqYa_feeItem{color:var(--ds-t-2);white-space:nowrap}.KFXqYa_feeNum{color:var(--ds-t-1);font-weight:600}.KFXqYa_feeSep{color:var(--ds-t-4)}.KFXqYa_feeChipPrimary,.KFXqYa_feeChipOff,.KFXqYa_feeChipAlert,.KFXqYa_feeChipError{border:1px solid var(--ds-border);background:var(--dsb-3);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;align-items:center;height:20px;padding:0 8px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_feeChipPrimary{color:var(--ds-blue);border-color:color-mix(in srgb, var(--ds-blue) 30%, transparent)}.KFXqYa_feeChipOff{color:var(--ds-cyan);border-color:color-mix(in srgb, var(--ds-cyan) 30%, transparent)}.KFXqYa_feeChipAlert{color:var(--ds-amber);border-color:color-mix(in srgb, var(--ds-amber) 30%, transparent)}.KFXqYa_feeChipError{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 30%, transparent)}.KFXqYa_balanceCell{align-items:center;gap:6px;display:inline-flex;position:relative}.KFXqYa_providerGroupRecharge{border:1px solid color-mix(in srgb, var(--ds-c-1) 38%, transparent);background:color-mix(in srgb, var(--ds-c-1) 8%, transparent);color:var(--ds-c-1);white-space:nowrap;border-radius:999px;justify-content:center;align-items:center;min-width:48px;padding:1px 8px;font-size:10.5px;font-weight:600;line-height:16px;text-decoration:none;display:inline-flex}.KFXqYa_providerGroupRecharge:empty{background:0 0;border-color:#0000}.KFXqYa_providerGroupRecharge:hover{background:color-mix(in srgb, var(--ds-c-1) 15%, transparent);border-color:color-mix(in srgb, var(--ds-c-1) 60%, transparent)}.KFXqYa_balanceDaysBadge{border:1px solid var(--ds-border-strong);background:var(--dsb-2);min-width:16px;height:16px;color:var(--ds-t-2);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;padding:0 4px;font-size:10px;font-weight:600;line-height:1;display:inline-flex}.KFXqYa_balanceDaysBadge:hover{border-color:var(--ds-t-3);color:var(--ds-t-1)}.KFXqYa_balanceDaysBadgeLow{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 36%, transparent);background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_balanceDetailPop{z-index:20;background:var(--dsb-2);border:1px solid var(--ds-border-strong);min-width:180px;box-shadow:var(--ds-shadow-1);white-space:nowrap;border-radius:8px;flex-direction:column;gap:6px;padding:8px 10px;display:inline-flex;position:absolute;top:calc(100% + 6px);right:0}.KFXqYa_balanceDetailHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.KFXqYa_balanceDetailTitle{color:var(--ds-t-1);font-size:12px;font-weight:600}.KFXqYa_balanceDetailClose{cursor:pointer;color:var(--ds-t-3);background:0 0;border:none;font-size:14px;line-height:1}.KFXqYa_balanceDetailClose:hover{color:var(--ds-t-1)}.KFXqYa_balanceDetailGrid{flex-direction:column;gap:4px;display:inline-flex}.KFXqYa_balanceDetailRow{color:var(--ds-t-2);font-variant-numeric:tabular-nums;justify-content:space-between;gap:16px;font-size:11px;line-height:15px;display:flex}.KFXqYa_balanceDetailLabel{color:var(--ds-t-3)}.KFXqYa_balanceDetailValue{color:var(--ds-t-1);font-weight:500}.KFXqYa_currencyToggle{background:var(--dsw-alias-bg-layer-3);border:none;border-radius:8px;align-items:center;gap:2px;margin-right:8px;padding:2px;display:inline-flex}.KFXqYa_currencyButton{color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 8px;font-size:11px;font-weight:700;line-height:1}.KFXqYa_currencyButtonActive{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary)}.KFXqYa_subscriptionGrid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;margin-top:10px;display:grid}.KFXqYa_subscriptionCard{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);-webkit-backdrop-filter:blur(12px)saturate(1.3);transition:border-color var(--ds-t-fast);padding:14px 16px;position:relative;overflow:hidden}.KFXqYa_subscriptionHead{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.KFXqYa_subscriptionName{color:var(--ds-t-1);font-size:13px;font-weight:600}.KFXqYa_subscriptionPlan{color:var(--ds-t-2);font-size:11px}.KFXqYa_subscriptionPlan[data-kind=code],.KFXqYa_subscriptionPlan[data-kind=token]{color:var(--ds-t-2);background:var(--dsb-3);border-radius:999px;padding:1px 8px;font-weight:500}.KFXqYa_subscriptionTier{color:var(--ds-t-3);margin-left:6px}.KFXqYa_subscriptionAuto{border:1px solid color-mix(in srgb, var(--ds-blue) 36%, transparent);color:var(--ds-blue);background:color-mix(in srgb, var(--ds-blue) 12%, transparent);border-radius:999px;margin-left:6px;padding:1px 6px;font-size:10px}.KFXqYa_subscriptionStatus{color:var(--ds-t-2);margin-bottom:6px;font-size:11px}.KFXqYa_subscriptionWindow{align-items:center;gap:10px;margin-top:8px;font-size:11px;display:flex}.KFXqYa_subscriptionWindowLabel{color:var(--ds-t-3);flex:0 0 44px}.KFXqYa_subscriptionTrack{background:var(--dsb-3);height:6px;box-shadow:inset 0 0 0 1px var(--ds-border);border-radius:3px;flex:1;overflow:hidden}.KFXqYa_subscriptionFill{background:var(--ds-blue);height:calc(100% - 2px);transition:width var(--ds-t-fast);border-radius:2px;margin:1px;display:block}.KFXqYa_subscriptionFillWarn{background:var(--ds-amber)}.KFXqYa_subscriptionFillOver{background:var(--ds-red)}.KFXqYa_subscriptionMeta{flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.KFXqYa_subscriptionPct{text-align:right;min-width:52px;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ds-t-1);flex:none}.KFXqYa_subscriptionExhausted{color:var(--ds-red);min-width:52px;font-weight:600}.KFXqYa_subscriptionReset{color:var(--ds-t-3);white-space:nowrap;flex:none;font-size:10px}.KFXqYa_providerGroupList{flex-direction:column;gap:10px;display:flex}.KFXqYa_providerGroup{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);padding:12px 14px}.KFXqYa_providerGroupHead{justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;display:flex}.KFXqYa_providerGroupCollapsible{cursor:pointer}.KFXqYa_providerGroupCollapsible .KFXqYa_providerGroupTitle:before{content:"›";color:var(--ds-t-3);margin-right:6px;display:inline-block}.KFXqYa_providerGroupCollapsible[aria-expanded=true] .KFXqYa_providerGroupTitle:before{transform:rotate(90deg)}.KFXqYa_providerGroupCollapsible:focus-visible{outline:2px solid var(--ds-border-strong);outline-offset:2px;border-radius:6px}.KFXqYa_providerCtlRow{align-items:center;gap:12px;margin-bottom:10px;display:flex}.KFXqYa_providerTodayToggle{color:var(--ds-t-3);align-items:center;gap:7px;font-size:11px;display:inline-flex}.KFXqYa_providerGroupTitle{align-items:center;gap:7px;min-width:0;display:inline-flex}.KFXqYa_kindBadge{border:1px solid color-mix(in srgb, var(--ds-c-1) 32%, transparent);background:color-mix(in srgb, var(--ds-c-1) 10%, transparent);color:var(--ds-c-1);border-radius:4px;flex:none;padding:1px 6px;font-size:10px;font-weight:600;line-height:15px}.KFXqYa_kindBadgeRelay{border-color:color-mix(in srgb, var(--ds-c-2) 32%, transparent);background:color-mix(in srgb, var(--ds-c-2) 10%, transparent);color:var(--ds-c-2)}.KFXqYa_kindBadgeUnknown{border-color:var(--ds-border);background:color-mix(in srgb, var(--ds-t-3) 12%, transparent);color:var(--ds-t-3)}.KFXqYa_providerGroupName{color:var(--ds-t-1);font-size:13px;font-weight:600;line-height:18px}.KFXqYa_providerGroupMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.KFXqYa_providerGroupBadge{border:1px solid color-mix(in srgb, var(--ds-green) 36%, transparent);color:var(--ds-green);background:color-mix(in srgb, var(--ds-green) 12%, transparent);border-radius:999px;justify-content:center;align-items:center;padding:1px 8px;font-size:10px;font-weight:500;line-height:16px;display:inline-flex}.KFXqYa_providerGroupBalance,.KFXqYa_providerGroupCost{color:var(--ds-t-2);font-variant-numeric:tabular-nums;white-space:nowrap;justify-content:flex-end;align-items:baseline;gap:6px;min-width:118px;font-size:12px;line-height:17px;display:inline-flex}.KFXqYa_providerGroupCostLabel{font-size:11px}.KFXqYa_providerGroupCostValue{color:var(--ds-t-1);text-align:right;min-width:56px;font-weight:600}.KFXqYa_providerGroupBalanceLabel{color:var(--ds-t-3);font-size:11px;line-height:17px}.KFXqYa_rounds{margin-top:10px}.KFXqYa_roundsBars{align-items:flex-end;gap:3px;height:124px;padding:16px 2px 0;display:flex;overflow-x:auto}.KFXqYa_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}.KFXqYa_roundsBarColPeak{background:color-mix(in srgb, var(--ds-amber) 16%, transparent)}.KFXqYa_roundsBarColOff{background:var(--dsb-3)}.KFXqYa_roundsBarLabel{text-align:center;color:var(--ds-t-2);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%)}.KFXqYa_roundsBarWrap{flex:1;align-items:flex-end;min-height:0;display:flex}.KFXqYa_roundsBar{background:var(--ds-blue);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.KFXqYa_roundsBarFlagged{background:var(--ds-red);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.KFXqYa_roundsFlagMark{background:var(--ds-red);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-3px}.KFXqYa_roundsAxis{color:var(--ds-t-3);justify-content:space-between;margin-top:6px;font-size:10px;display:flex}.KFXqYa_roundsEmpty{color:var(--ds-t-2);margin-top:10px;font-size:12px}.KFXqYa_heatmap{margin-top:10px}.KFXqYa_heatmapGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:3px;display:grid}.KFXqYa_heatmapCellEmpty{box-sizing:border-box;border:1px dashed var(--ds-border);height:30px;color:var(--ds-t-4);font-variant-numeric:tabular-nums;background:0 0;border-radius:2px;justify-content:center;align-items:center;font-size:11px;display:flex}.KFXqYa_heatmapCell{font-variant-numeric:tabular-nums;cursor:pointer;border:0;border-radius:2px;justify-content:center;align-items:center;height:30px;padding:0;font-size:11px;display:flex}.KFXqYa_heatmapCell[data-level="0"],.KFXqYa_heatmapCell[data-level="1"],.KFXqYa_heatmapCell[data-level="2"]{color:var(--dsw-alias-label-primary)}.KFXqYa_heatmapCell[data-level="3"],.KFXqYa_heatmapCell[data-level="4"]{color:var(--dsw-static-neutral-bluish-00)}.KFXqYa_heatmapFooter{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin-top:10px;font-size:10px;display:flex}.KFXqYa_heatmapLegend{gap:3px;display:inline-flex}.KFXqYa_heatmapLegend i{border-radius:2px;width:14px;height:14px;display:block}.KFXqYa_heatmapHover{font-variant-numeric:tabular-nums;margin-left:auto;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace}.KFXqYa_heatmapRangeSwitch{gap:4px;margin-left:auto;display:inline-flex}.KFXqYa_heatmapRangeButton{border:1px solid var(--ds-border);color:var(--ds-t-2);cursor:pointer;background:0 0;border-radius:6px;padding:2px 8px;font-size:11px;line-height:1.4}.KFXqYa_heatmapRangeButtonActive{border-color:var(--ds-border-strong);color:var(--ds-t-1);font-weight:600}.KFXqYa_heatmapYear{flex-direction:column;gap:6px;display:flex}.KFXqYa_heatmapYearBody{align-items:flex-start;gap:6px;display:flex}.KFXqYa_heatmapYearWeekdays{color:var(--ds-t-3);flex:none;grid-template-rows:repeat(7,11px);gap:3px;padding-top:12px;font-size:9px;line-height:11px;display:grid}.KFXqYa_heatmapYearWeekday{white-space:nowrap;text-align:right;height:11px}.KFXqYa_heatmapYearMonths{min-width:max-content;color:var(--ds-t-3);grid-template-columns:repeat(52,11px);gap:3px;font-size:9px;line-height:12px;display:grid;overflow:visible}.KFXqYa_heatmapYearMonth{white-space:nowrap;overflow:visible}.KFXqYa_heatmapYearScroll{padding-bottom:2px;overflow-x:auto}.KFXqYa_heatmapYearGrid{grid-template-rows:repeat(7,11px);grid-auto-flow:column;gap:3px;min-width:max-content;display:grid}.KFXqYa_heatmapYearCell{cursor:pointer;border:0;border-radius:2px;width:11px;height:11px;padding:0}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearWeekdays{grid-template-rows:repeat(7,16px);line-height:16px}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearWeekday{height:16px}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearMonths{grid-template-columns:repeat(26,16px)}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearGrid{grid-template-rows:repeat(7,16px)}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearCell{border-radius:3px;width:16px;height:16px}.KFXqYa_floatSub{flex-direction:column;gap:6px;min-width:0;display:flex}.KFXqYa_floatSubHead{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.KFXqYa_floatSubName{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:700}.KFXqYa_floatSubPlan{color:var(--dsw-alias-label-secondary);font-size:10px}.KFXqYa_floatSub .KFXqYa_subscriptionWindow{flex-wrap:wrap;gap:4px 10px}.KFXqYa_floatSub .KFXqYa_subscriptionWindowLabel{flex:none}.KFXqYa_floatSub .KFXqYa_subscriptionMeta{min-width:0;max-width:100%}.KFXqYa_floatSub .KFXqYa_subscriptionPct{min-width:0}.KFXqYa_floatSub .KFXqYa_subscriptionReset{white-space:normal;overflow-wrap:anywhere}.KFXqYa_triggerPopEmpty{color:var(--dsw-alias-label-tertiary);padding:2px 0;font-size:11px;line-height:1.5}.KFXqYa_triggerPopSwitcher{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.KFXqYa_triggerPopSwitchCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:10px}.KFXqYa_floatModeBtn{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) 60%, transparent);color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;border-radius:10px;flex:1;padding:7px 10px;font-size:12px}.KFXqYa_floatModeBtnOn{border-color:var(--ds-blue);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--ds-blue) 16%, transparent)}.KFXqYa_rdoRow{justify-content:space-between;align-items:center;gap:8px;margin-top:10px;display:flex}.KFXqYa_rdoLabel{color:var(--dsw-alias-label-secondary);font-size:12px}.KFXqYa_rdoSelect{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) 60%, transparent);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;border-radius:10px;align-items:center;gap:5px;padding:5px 8px 5px 10px;font-size:12px;display:inline-flex}.KFXqYa_rdoSelect:hover{background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 85%, transparent)}.KFXqYa_rdoSelect:focus-visible{border-color:var(--ds-blue);outline:none}.KFXqYa_rdoChevron{color:var(--dsw-alias-label-tertiary);transition:transform .15s;display:inline-flex}.KFXqYa_rdoChevronOpen{transform:rotate(180deg)}.KFXqYa_floatTarget{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:5px;font-size:12px;display:inline-flex}.KFXqYa_floatTargetLabel{color:var(--dsw-alias-label-secondary)}.KFXqYa_staleNotice{color:var(--ds-amber);background:color-mix(in srgb, var(--ds-amber) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-amber) 30%, transparent);border-radius:10px;align-items:center;gap:6px;margin:0 0 10px;padding:8px 10px;font-size:11px;display:flex}.KFXqYa_plgHead{align-items:flex-start;gap:12px;display:flex}.KFXqYa_plgIcon{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:40px;height:40px;color:var(--dsw-alias-label-secondary);border-radius:10px;flex:none;justify-content:center;align-items:center;display:inline-flex}.KFXqYa_plgTitle{flex-direction:column;gap:4px;min-width:0;display:flex}.KFXqYa_plgNameRow{align-items:center;gap:8px;display:flex}.KFXqYa_plgName{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:600;line-height:18px}.KFXqYa_plgTag{height:18px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);white-space:nowrap;border-radius:5px;align-items:center;padding:0 6px;font-size:10px;font-weight:600;display:inline-flex}.KFXqYa_plgDesc{color:var(--dsw-alias-label-secondary);margin:0;font-size:11px;line-height:16px}.KFXqYa_plgGrid{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:12px;display:grid}.KFXqYa_plgItem{flex-direction:column;gap:2px;min-width:0;display:flex}.KFXqYa_plgLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.KFXqYa_plgVal{color:var(--dsw-alias-label-primary);word-break:break-all;font-size:12px;line-height:17px}.KFXqYa_plgLink{color:var(--ds-blue);word-break:break-all;font-size:12px;line-height:17px;text-decoration:none}.KFXqYa_plgLink:hover{text-decoration:underline}.KFXqYa_tokenPanel{flex-direction:column;gap:14px;display:flex}.KFXqYa_tokenModelBar{background:var(--dsw-alias-bg-layer-2);border-radius:999px;height:8px;overflow:hidden}.KFXqYa_tokenModelParts{height:100%;display:flex}.KFXqYa_tokenModelPartIn{background:var(--ds-blue)}.KFXqYa_tokenModelPartOut{background:var(--ds-amber)}.KFXqYa_tokenModelShareRow{align-items:center;gap:6px;display:inline-flex}@media (width<=640px){.KFXqYa_kpiGrid{grid-template-columns:repeat(2,minmax(0,1fr))}.KFXqYa_hero{gap:14px}.KFXqYa_heroTop{flex-direction:column;align-items:flex-start;gap:12px}.KFXqYa_heroGauge{width:72px;height:72px}.KFXqYa_heroSide{gap:12px}.KFXqYa_heroSideSpacer{display:none}}.KFXqYa_peakCard{z-index:2000;border-radius:var(--ds-r-2);border:1px solid var(--ds-border-strong);background:var(--dsb-glass-strong);-webkit-backdrop-filter:blur(14px)saturate(1.2);min-width:280px;max-width:380px;box-shadow:var(--ds-shadow-2);animation:KFXqYa_peakAlertIn var(--ds-t-fast);flex-direction:column;gap:12px;padding:14px 16px;display:flex;position:fixed}.KFXqYa_peakCardCorner{bottom:18px;right:18px}.KFXqYa_peakCardCenter{top:20%;left:50%;transform:translate(-50%)}.KFXqYa_peakCardPeak{color:var(--ds-blue)}.KFXqYa_peakCardOff{color:var(--ds-cyan)}.KFXqYa_peakHead{justify-content:space-between;align-items:center;gap:8px;display:flex}.KFXqYa_peakTag{white-space:nowrap;border-radius:6px;align-items:center;gap:6px;height:20px;padding:0 8px;font-size:11px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_peakTagPrimary{background:var(--dsw-alias-bg-layer-3);color:var(--ds-blue)}.KFXqYa_peakTagSuccess{background:var(--dsw-alias-bg-layer-3);color:var(--ds-cyan)}.KFXqYa_peakDot{border-radius:999px;flex:none;width:6px;height:6px}.KFXqYa_peakDotPrimary{background:var(--ds-blue)}.KFXqYa_peakDotSuccess{background:var(--ds-cyan)}.KFXqYa_peakClose{width:24px;height:24px;color:var(--ds-t-3);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast);background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;font-size:15px;line-height:1;display:inline-flex}.KFXqYa_peakClose:hover{color:var(--ds-t-1);background:var(--dsw-alias-bg-layer-2)}.KFXqYa_peakCount{font-variant-numeric:tabular-nums;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:28px;font-weight:600;line-height:1}.KFXqYa_peakCountPrimary{color:var(--ds-blue)}.KFXqYa_peakCountSuccess{color:var(--ds-cyan)}.KFXqYa_peakDesc{color:var(--ds-t-1);margin:4px 0 0;font-size:12px;line-height:18px}@keyframes KFXqYa_peakAlertIn{0%{opacity:0}to{opacity:1}}.KFXqYa_setCard{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);flex-direction:column;gap:12px;padding:16px 18px;display:flex}.KFXqYa_setGrid3,.KFXqYa_setGrid2{gap:10px;display:grid}.KFXqYa_setGrid3{grid-template-columns:repeat(3,minmax(0,1fr))}.KFXqYa_setGrid2{grid-template-columns:repeat(2,minmax(0,1fr))}@media (width<=720px){.KFXqYa_setGrid3,.KFXqYa_setGrid2{grid-template-columns:1fr}}.KFXqYa_setCell{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);flex-direction:column;gap:8px;min-width:0;padding:12px 14px;display:flex}.KFXqYa_setCardHead{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.KFXqYa_setCardMeta{flex-direction:column;gap:4px;min-width:0;display:flex}.KFXqYa_setCardTitle{color:var(--ds-t-1);margin:0;font-size:13px;font-weight:600;line-height:18px}.KFXqYa_setCardDesc{color:var(--ds-t-3);margin:0;font-size:11px;line-height:16px}.KFXqYa_ctlCol{flex-direction:column;gap:10px;padding-top:2px;display:flex}.KFXqYa_ctlRow{align-items:center;gap:12px;min-height:28px;display:flex}.KFXqYa_ctlRowStretch{display:flex}.KFXqYa_ctlLabel{color:var(--ds-t-3);flex:0 0 96px;font-size:11px;line-height:16px}.KFXqYa_ctlGroup{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.KFXqYa_userPriceRow{border-bottom:1px solid var(--ds-border);align-items:center;gap:10px;padding:8px 0;display:flex}.KFXqYa_userPriceCheck{width:14px;height:14px;accent-color:var(--ds-blue);flex:none;margin:0}.KFXqYa_userPriceBody{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.KFXqYa_userPriceLineMeta{grid-template-columns:minmax(0,1fr) minmax(0,1.4fr) auto;align-items:end;gap:8px 10px;display:grid}@media (width<=720px){.KFXqYa_userPriceLineMeta{grid-template-columns:repeat(2,minmax(0,1fr))}}.KFXqYa_userPriceLineMeta .KFXqYa_userPriceInput{box-sizing:border-box;width:100%;min-width:0;max-width:none}.KFXqYa_userPriceBody .KFXqYa_ctlGroup{flex-wrap:nowrap}.KFXqYa_userPriceLineMeta .KFXqYa_userPriceField .KFXqYa_ctlLabel{align-items:flex-end;min-height:30px;display:flex}.KFXqYa_userPricePriceLine{border-left:2px solid var(--ds-amber);flex-wrap:wrap;align-items:center;gap:10px;width:calc(100% - 22px);margin-left:10px;padding:2px 0 6px 12px;display:flex}.KFXqYa_userPricePriceLine>.KFXqYa_ctlLabel{color:var(--ds-t-3);flex:0 0 44px;font-size:11px}.KFXqYa_userPricePriceLine .KFXqYa_userPriceInputNum{box-sizing:border-box;flex:1 1 0;width:auto;min-width:120px;max-width:240px}.KFXqYa_userPriceField{flex-direction:column;gap:4px;min-width:0;display:flex}.KFXqYa_userPriceField .KFXqYa_ctlLabel{flex:none;font-size:11px}.KFXqYa_userPriceInput,.KFXqYa_userPriceInputNum{border:1px solid var(--ds-border);background:var(--dsb-3);min-width:96px;max-width:160px;color:var(--ds-t-1);border-radius:6px;padding:4px 8px;font-size:12px;line-height:16px}.KFXqYa_userPriceInputNum{min-width:72px;max-width:88px}.KFXqYa_rdo{color:var(--ds-t-2);cursor:pointer;white-space:nowrap;align-items:center;gap:6px;font-size:12px;line-height:16px;display:inline-flex}.KFXqYa_rdo input{opacity:0;pointer-events:none;position:absolute}.KFXqYa_rdoDot{border:1px solid var(--ds-border-strong);background:var(--dsb-3);border-radius:50%;flex:none;width:14px;height:14px;position:relative}.KFXqYa_rdo input:checked+.KFXqYa_rdoDot{border-color:var(--ds-blue)}.KFXqYa_rdo input:checked+.KFXqYa_rdoDot:after{content:"";background:var(--ds-blue);border-radius:50%;position:absolute;inset:3px}.KFXqYa_inp{border:1px solid var(--ds-border);background:var(--dsb-3);border-radius:6px;align-items:center;gap:4px;padding:2px 6px;display:inline-flex}.KFXqYa_affix{color:var(--ds-t-3);font-size:11px;line-height:16px}.KFXqYa_prog{background:var(--dsb-3);min-width:0;height:6px;box-shadow:inset 0 0 0 1px var(--ds-border);border-radius:3px;flex:1;overflow:hidden}.KFXqYa_progFill{background:var(--ds-blue);height:calc(100% - 2px);transition:width var(--ds-t-fast);border-radius:2px;margin:1px}.KFXqYa_btn{border:1px solid var(--ds-border);height:28px;color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast), background-color var(--ds-t-fast);background:0 0;border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-size:12px;line-height:16px;display:inline-flex}.KFXqYa_btn:hover{border-color:var(--ds-blue);color:var(--ds-t-1);background:color-mix(in srgb, var(--ds-blue) 12%, transparent)}.KFXqYa_modelTable tbody td:not(:first-child) tbody td:not(:first-child){text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ds-t-1)}`,document.head.appendChild(e)}var I={affix:`KFXqYa_affix`,balanceCell:`KFXqYa_balanceCell`,balanceDaysBadge:`KFXqYa_balanceDaysBadge`,balanceDaysBadgeLow:`KFXqYa_balanceDaysBadgeLow`,balanceDetailClose:`KFXqYa_balanceDetailClose`,balanceDetailGrid:`KFXqYa_balanceDetailGrid`,balanceDetailHead:`KFXqYa_balanceDetailHead`,balanceDetailLabel:`KFXqYa_balanceDetailLabel`,balanceDetailPop:`KFXqYa_balanceDetailPop`,balanceDetailRow:`KFXqYa_balanceDetailRow`,balanceDetailTitle:`KFXqYa_balanceDetailTitle`,balanceDetailValue:`KFXqYa_balanceDetailValue`,bandDot:`KFXqYa_bandDot`,bandDotOn:`KFXqYa_bandDotOn`,bandDots:`KFXqYa_bandDots`,"billing-trigger":`KFXqYa_billing-trigger`,btn:`KFXqYa_btn`,bucketCost:`KFXqYa_bucketCost`,bucketOfficial:`KFXqYa_bucketOfficial`,bucketSep:`KFXqYa_bucketSep`,bucketThird:`KFXqYa_bucketThird`,budgetFillOver:`KFXqYa_budgetFillOver`,budgetFillWarn:`KFXqYa_budgetFillWarn`,budgetInput:`KFXqYa_budgetInput`,budgetPulse:`KFXqYa_budgetPulse`,chartAxisLabel:`KFXqYa_chartAxisLabel`,chartBar:`KFXqYa_chartBar`,chartBarPlaceholder:`KFXqYa_chartBarPlaceholder`,chartCrosshair:`KFXqYa_chartCrosshair`,chartEmpty:`KFXqYa_chartEmpty`,chartGrid:`KFXqYa_chartGrid`,chartHoverDot:`KFXqYa_chartHoverDot`,chartLegend:`KFXqYa_chartLegend`,chartLegendBar:`KFXqYa_chartLegendBar`,chartLegendItem:`KFXqYa_chartLegendItem`,chartLegendItemActive:`KFXqYa_chartLegendItemActive`,chartLegendLine:`KFXqYa_chartLegendLine`,chartLine:`KFXqYa_chartLine`,chartStack:`KFXqYa_chartStack`,chartSvg:`KFXqYa_chartSvg`,chartTooltip:`KFXqYa_chartTooltip`,chartTooltipAlignLeft:`KFXqYa_chartTooltipAlignLeft`,chartTooltipAlignRight:`KFXqYa_chartTooltipAlignRight`,chartTooltipDate:`KFXqYa_chartTooltipDate`,chartTooltipHead:`KFXqYa_chartTooltipHead`,chartTooltipLabel:`KFXqYa_chartTooltipLabel`,chartTooltipModelDetail:`KFXqYa_chartTooltipModelDetail`,chartTooltipRow:`KFXqYa_chartTooltipRow`,chartTooltipSplit:`KFXqYa_chartTooltipSplit`,chartTooltipSwatch:`KFXqYa_chartTooltipSwatch`,chartWrap:`KFXqYa_chartWrap`,closeButton:`KFXqYa_closeButton`,ctlCol:`KFXqYa_ctlCol`,ctlGroup:`KFXqYa_ctlGroup`,ctlLabel:`KFXqYa_ctlLabel`,ctlRow:`KFXqYa_ctlRow`,ctlRowStretch:`KFXqYa_ctlRowStretch`,currencyButton:`KFXqYa_currencyButton`,currencyButtonActive:`KFXqYa_currencyButtonActive`,currencyToggle:`KFXqYa_currencyToggle`,dashboard:`KFXqYa_dashboard`,dashboardBody:`KFXqYa_dashboardBody`,dashboardHead:`KFXqYa_dashboardHead`,dashboardIn:`KFXqYa_dashboardIn`,dashboardModal:`KFXqYa_dashboardModal`,dashboardRight:`KFXqYa_dashboardRight`,dashboardSubtitle:`KFXqYa_dashboardSubtitle`,dashboardTitle:`KFXqYa_dashboardTitle`,delta:`KFXqYa_delta`,deltaDown:`KFXqYa_deltaDown`,deltaUp:`KFXqYa_deltaUp`,emptyRow:`KFXqYa_emptyRow`,estimatedTag:`KFXqYa_estimatedTag`,exportBar:`KFXqYa_exportBar`,exportButton:`KFXqYa_exportButton`,exportLabel:`KFXqYa_exportLabel`,feeBar:`KFXqYa_feeBar`,feeBarAbove:`KFXqYa_feeBarAbove`,feeChipAlert:`KFXqYa_feeChipAlert`,feeChipError:`KFXqYa_feeChipError`,feeChipOff:`KFXqYa_feeChipOff`,feeChipPrimary:`KFXqYa_feeChipPrimary`,feeCount:`KFXqYa_feeCount`,feeInline:`KFXqYa_feeInline`,feeInlineAlert:`KFXqYa_feeInlineAlert`,feeInlineError:`KFXqYa_feeInlineError`,feeInlineNum:`KFXqYa_feeInlineNum`,feeItem:`KFXqYa_feeItem`,feeNum:`KFXqYa_feeNum`,feeSep:`KFXqYa_feeSep`,feeSuffix:`KFXqYa_feeSuffix`,flatTag:`KFXqYa_flatTag`,floatModeBtn:`KFXqYa_floatModeBtn`,floatModeBtnOn:`KFXqYa_floatModeBtnOn`,floatSub:`KFXqYa_floatSub`,floatSubHead:`KFXqYa_floatSubHead`,floatSubName:`KFXqYa_floatSubName`,floatSubPlan:`KFXqYa_floatSubPlan`,floatTarget:`KFXqYa_floatTarget`,floatTargetLabel:`KFXqYa_floatTargetLabel`,healthBad:`KFXqYa_healthBad`,healthBadge:`KFXqYa_healthBadge`,healthBadgeBad:`KFXqYa_healthBadgeBad`,healthBadgeOk:`KFXqYa_healthBadgeOk`,healthDot:`KFXqYa_healthDot`,healthIdle:`KFXqYa_healthIdle`,healthOk:`KFXqYa_healthOk`,heatmap:`KFXqYa_heatmap`,heatmapCell:`KFXqYa_heatmapCell`,heatmapCellEmpty:`KFXqYa_heatmapCellEmpty`,heatmapFooter:`KFXqYa_heatmapFooter`,heatmapGrid:`KFXqYa_heatmapGrid`,heatmapHalf:`KFXqYa_heatmapHalf`,heatmapHover:`KFXqYa_heatmapHover`,heatmapLegend:`KFXqYa_heatmapLegend`,heatmapRangeButton:`KFXqYa_heatmapRangeButton`,heatmapRangeButtonActive:`KFXqYa_heatmapRangeButtonActive`,heatmapRangeSwitch:`KFXqYa_heatmapRangeSwitch`,heatmapYear:`KFXqYa_heatmapYear`,heatmapYearBody:`KFXqYa_heatmapYearBody`,heatmapYearCell:`KFXqYa_heatmapYearCell`,heatmapYearGrid:`KFXqYa_heatmapYearGrid`,heatmapYearMonth:`KFXqYa_heatmapYearMonth`,heatmapYearMonths:`KFXqYa_heatmapYearMonths`,heatmapYearScroll:`KFXqYa_heatmapYearScroll`,heatmapYearWeekday:`KFXqYa_heatmapYearWeekday`,heatmapYearWeekdays:`KFXqYa_heatmapYearWeekdays`,hero:`KFXqYa_hero`,heroCurrency:`KFXqYa_heroCurrency`,heroGauge:`KFXqYa_heroGauge`,heroGaugeArc:`KFXqYa_heroGaugeArc`,heroGaugeArcOver:`KFXqYa_heroGaugeArcOver`,heroGaugeCenter:`KFXqYa_heroGaugeCenter`,heroGaugeDial:`KFXqYa_heroGaugeDial`,heroGaugeLabel:`KFXqYa_heroGaugeLabel`,heroGaugeRemain:`KFXqYa_heroGaugeRemain`,heroGaugeRemainOver:`KFXqYa_heroGaugeRemainOver`,heroGaugeSub:`KFXqYa_heroGaugeSub`,heroGaugeSvg:`KFXqYa_heroGaugeSvg`,heroGaugeTrack:`KFXqYa_heroGaugeTrack`,heroLabel:`KFXqYa_heroLabel`,heroMain:`KFXqYa_heroMain`,heroMeta:`KFXqYa_heroMeta`,heroReadout:`KFXqYa_heroReadout`,heroSide:`KFXqYa_heroSide`,heroSideItem:`KFXqYa_heroSideItem`,heroSideLabel:`KFXqYa_heroSideLabel`,heroSideSpacer:`KFXqYa_heroSideSpacer`,heroSideValue:`KFXqYa_heroSideValue`,heroTop:`KFXqYa_heroTop`,heroValue:`KFXqYa_heroValue`,inp:`KFXqYa_inp`,kindBadge:`KFXqYa_kindBadge`,kindBadgeRelay:`KFXqYa_kindBadgeRelay`,kindBadgeUnknown:`KFXqYa_kindBadgeUnknown`,kpiDetail:`KFXqYa_kpiDetail`,kpiGreen:`KFXqYa_kpiGreen`,kpiGrid:`KFXqYa_kpiGrid`,kpiLabel:`KFXqYa_kpiLabel`,kpiTile:`KFXqYa_kpiTile`,kpiValue:`KFXqYa_kpiValue`,kpiZone:`KFXqYa_kpiZone`,kpiZoneHead:`KFXqYa_kpiZoneHead`,kpiZoneLabel:`KFXqYa_kpiZoneLabel`,metricCell:`KFXqYa_metricCell`,metricGrid:`KFXqYa_metricGrid`,metricLabel:`KFXqYa_metricLabel`,metricValue:`KFXqYa_metricValue`,metricValueSuccess:`KFXqYa_metricValueSuccess`,modalFooter:`KFXqYa_modalFooter`,modelCell:`KFXqYa_modelCell`,modelDot:`KFXqYa_modelDot`,modelName:`KFXqYa_modelName`,modelProvider:`KFXqYa_modelProvider`,modelRowActive:`KFXqYa_modelRowActive`,modelRowFocusable:`KFXqYa_modelRowFocusable`,modelTable:`KFXqYa_modelTable`,na:`KFXqYa_na`,numCol:`KFXqYa_numCol`,offPeak:`KFXqYa_offPeak`,panel:`KFXqYa_panel`,panelHead:`KFXqYa_panelHead`,panelHeadControls:`KFXqYa_panelHeadControls`,panelHint:`KFXqYa_panelHint`,panelTitle:`KFXqYa_panelTitle`,peak:`KFXqYa_peak`,peakAlertIn:`KFXqYa_peakAlertIn`,peakCard:`KFXqYa_peakCard`,peakCardCenter:`KFXqYa_peakCardCenter`,peakCardCorner:`KFXqYa_peakCardCorner`,peakCardOff:`KFXqYa_peakCardOff`,peakCardPeak:`KFXqYa_peakCardPeak`,peakClose:`KFXqYa_peakClose`,peakCount:`KFXqYa_peakCount`,peakCountPrimary:`KFXqYa_peakCountPrimary`,peakCountSuccess:`KFXqYa_peakCountSuccess`,peakDesc:`KFXqYa_peakDesc`,peakDot:`KFXqYa_peakDot`,peakDotPrimary:`KFXqYa_peakDotPrimary`,peakDotSuccess:`KFXqYa_peakDotSuccess`,peakHead:`KFXqYa_peakHead`,peakTag:`KFXqYa_peakTag`,peakTagPrimary:`KFXqYa_peakTagPrimary`,peakTagSuccess:`KFXqYa_peakTagSuccess`,perfBar:`KFXqYa_perfBar`,perfChip:`KFXqYa_perfChip`,perfChipDot:`KFXqYa_perfChipDot`,perfChipOff:`KFXqYa_perfChipOff`,perfChips:`KFXqYa_perfChips`,planTag:`KFXqYa_planTag`,planTagBadge:`KFXqYa_planTagBadge`,plgDesc:`KFXqYa_plgDesc`,plgGrid:`KFXqYa_plgGrid`,plgHead:`KFXqYa_plgHead`,plgIcon:`KFXqYa_plgIcon`,plgItem:`KFXqYa_plgItem`,plgLabel:`KFXqYa_plgLabel`,plgLink:`KFXqYa_plgLink`,plgName:`KFXqYa_plgName`,plgNameRow:`KFXqYa_plgNameRow`,plgTag:`KFXqYa_plgTag`,plgTitle:`KFXqYa_plgTitle`,plgVal:`KFXqYa_plgVal`,popDot:`KFXqYa_popDot`,popDotDirect:`KFXqYa_popDotDirect`,popDotNeutral:`KFXqYa_popDotNeutral`,popDotSub:`KFXqYa_popDotSub`,popHead:`KFXqYa_popHead`,popModel:`KFXqYa_popModel`,popModelLabel:`KFXqYa_popModelLabel`,popModelName:`KFXqYa_popModelName`,popModelRow:`KFXqYa_popModelRow`,popModelStatus:`KFXqYa_popModelStatus`,popModelStatusLow:`KFXqYa_popModelStatusLow`,popTagPrimary:`KFXqYa_popTagPrimary`,popTagSub:`KFXqYa_popTagSub`,popTitle:`KFXqYa_popTitle`,prog:`KFXqYa_prog`,progFill:`KFXqYa_progFill`,providerCtlRow:`KFXqYa_providerCtlRow`,providerGroup:`KFXqYa_providerGroup`,providerGroupBadge:`KFXqYa_providerGroupBadge`,providerGroupBalance:`KFXqYa_providerGroupBalance`,providerGroupBalanceLabel:`KFXqYa_providerGroupBalanceLabel`,providerGroupCollapsible:`KFXqYa_providerGroupCollapsible`,providerGroupCost:`KFXqYa_providerGroupCost`,providerGroupCostLabel:`KFXqYa_providerGroupCostLabel`,providerGroupCostValue:`KFXqYa_providerGroupCostValue`,providerGroupHead:`KFXqYa_providerGroupHead`,providerGroupList:`KFXqYa_providerGroupList`,providerGroupMeta:`KFXqYa_providerGroupMeta`,providerGroupName:`KFXqYa_providerGroupName`,providerGroupRecharge:`KFXqYa_providerGroupRecharge`,providerGroupTitle:`KFXqYa_providerGroupTitle`,providerTodayToggle:`KFXqYa_providerTodayToggle`,railButton:`KFXqYa_railButton`,rangeButton:`KFXqYa_rangeButton`,rangeButtonActive:`KFXqYa_rangeButtonActive`,rangeToggle:`KFXqYa_rangeToggle`,rdo:`KFXqYa_rdo`,rdoChevron:`KFXqYa_rdoChevron`,rdoChevronOpen:`KFXqYa_rdoChevronOpen`,rdoDot:`KFXqYa_rdoDot`,rdoLabel:`KFXqYa_rdoLabel`,rdoRow:`KFXqYa_rdoRow`,rdoSelect:`KFXqYa_rdoSelect`,reconcileDismiss:`KFXqYa_reconcileDismiss`,reconcileIcon:`KFXqYa_reconcileIcon`,reconcileNotice:`KFXqYa_reconcileNotice`,reconcileText:`KFXqYa_reconcileText`,rounds:`KFXqYa_rounds`,roundsAxis:`KFXqYa_roundsAxis`,roundsBar:`KFXqYa_roundsBar`,roundsBarCol:`KFXqYa_roundsBarCol`,roundsBarColOff:`KFXqYa_roundsBarColOff`,roundsBarColPeak:`KFXqYa_roundsBarColPeak`,roundsBarFlagged:`KFXqYa_roundsBarFlagged`,roundsBarLabel:`KFXqYa_roundsBarLabel`,roundsBarWrap:`KFXqYa_roundsBarWrap`,roundsBars:`KFXqYa_roundsBars`,roundsEmpty:`KFXqYa_roundsEmpty`,roundsFlagMark:`KFXqYa_roundsFlagMark`,sessionChildRow:`KFXqYa_sessionChildRow`,sessionGroupRow:`KFXqYa_sessionGroupRow`,setCard:`KFXqYa_setCard`,setCardDesc:`KFXqYa_setCardDesc`,setCardHead:`KFXqYa_setCardHead`,setCardMeta:`KFXqYa_setCardMeta`,setCardTitle:`KFXqYa_setCardTitle`,setCell:`KFXqYa_setCell`,setGrid2:`KFXqYa_setGrid2`,setGrid3:`KFXqYa_setGrid3`,shareDot:`KFXqYa_shareDot`,shareItem:`KFXqYa_shareItem`,shareLegend:`KFXqYa_shareLegend`,shareSeg:`KFXqYa_shareSeg`,shareSegAssistant:`KFXqYa_shareSegAssistant`,shareSegOff:`KFXqYa_shareSegOff`,shareSegPeak:`KFXqYa_shareSegPeak`,shareSegTool:`KFXqYa_shareSegTool`,shareSegUser:`KFXqYa_shareSegUser`,shareTrack:`KFXqYa_shareTrack`,shareValue:`KFXqYa_shareValue`,siteKindDirect:`KFXqYa_siteKindDirect`,siteKindSite:`KFXqYa_siteKindSite`,siteKindTag:`KFXqYa_siteKindTag`,siteKindUnknown:`KFXqYa_siteKindUnknown`,siteRow:`KFXqYa_siteRow`,siteRowCalls:`KFXqYa_siteRowCalls`,siteRowCallsLow:`KFXqYa_siteRowCallsLow`,siteRowCost:`KFXqYa_siteRowCost`,siteRowMeta:`KFXqYa_siteRowMeta`,siteRowName:`KFXqYa_siteRowName`,siteRowTitle:`KFXqYa_siteRowTitle`,soon:`KFXqYa_soon`,staleNotice:`KFXqYa_staleNotice`,subscriptionAuto:`KFXqYa_subscriptionAuto`,subscriptionCard:`KFXqYa_subscriptionCard`,subscriptionExhausted:`KFXqYa_subscriptionExhausted`,subscriptionFill:`KFXqYa_subscriptionFill`,subscriptionFillOver:`KFXqYa_subscriptionFillOver`,subscriptionFillWarn:`KFXqYa_subscriptionFillWarn`,subscriptionGrid:`KFXqYa_subscriptionGrid`,subscriptionHead:`KFXqYa_subscriptionHead`,subscriptionMeta:`KFXqYa_subscriptionMeta`,subscriptionName:`KFXqYa_subscriptionName`,subscriptionPct:`KFXqYa_subscriptionPct`,subscriptionPlan:`KFXqYa_subscriptionPlan`,subscriptionReset:`KFXqYa_subscriptionReset`,subscriptionStatus:`KFXqYa_subscriptionStatus`,subscriptionTier:`KFXqYa_subscriptionTier`,subscriptionTrack:`KFXqYa_subscriptionTrack`,subscriptionWindow:`KFXqYa_subscriptionWindow`,subscriptionWindowLabel:`KFXqYa_subscriptionWindowLabel`,switch:`KFXqYa_switch`,switchKnob:`KFXqYa_switchKnob`,switchOn:`KFXqYa_switchOn`,tabButton:`KFXqYa_tabButton`,tabButtonActive:`KFXqYa_tabButtonActive`,tabNav:`KFXqYa_tabNav`,tabPanel:`KFXqYa_tabPanel`,tabPanelIn:`KFXqYa_tabPanelIn`,tableScroll:`KFXqYa_tableScroll`,tokenModelBar:`KFXqYa_tokenModelBar`,tokenModelPartIn:`KFXqYa_tokenModelPartIn`,tokenModelPartOut:`KFXqYa_tokenModelPartOut`,tokenModelParts:`KFXqYa_tokenModelParts`,tokenModelShareRow:`KFXqYa_tokenModelShareRow`,tokenPanel:`KFXqYa_tokenPanel`,trigger:`KFXqYa_trigger`,triggerBudgetHot:`KFXqYa_triggerBudgetHot`,triggerBudgetOver:`KFXqYa_triggerBudgetOver`,triggerBudgetPulse:`KFXqYa_triggerBudgetPulse`,triggerGaugeArc:`KFXqYa_triggerGaugeArc`,triggerGaugeNeedle:`KFXqYa_triggerGaugeNeedle`,triggerIcon:`KFXqYa_triggerIcon`,triggerLabel:`KFXqYa_triggerLabel`,triggerMain:`KFXqYa_triggerMain`,triggerMetric:`KFXqYa_triggerMetric`,triggerPop:`KFXqYa_triggerPop`,triggerPopEmpty:`KFXqYa_triggerPopEmpty`,triggerPopShown:`KFXqYa_triggerPopShown`,triggerPopSwitchCount:`KFXqYa_triggerPopSwitchCount`,triggerPopSwitcher:`KFXqYa_triggerPopSwitcher`,triggerPrimary:`KFXqYa_triggerPrimary`,triggerScan:`KFXqYa_triggerScan`,triggerSpark:`KFXqYa_triggerSpark`,triggerSparkBar:`KFXqYa_triggerSparkBar`,triggerSparkBreath:`KFXqYa_triggerSparkBreath`,triggerSparkHot:`KFXqYa_triggerSparkHot`,triggerValueRow:`KFXqYa_triggerValueRow`,triggerWrap:`KFXqYa_triggerWrap`,triggerYen:`KFXqYa_triggerYen`,ubAlert:`KFXqYa_ubAlert`,ubAlertLeft:`KFXqYa_ubAlertLeft`,ubAlertNote:`KFXqYa_ubAlertNote`,ubCard:`KFXqYa_ubCard`,ubCardControlGroup:`KFXqYa_ubCardControlGroup`,ubCardHead:`KFXqYa_ubCardHead`,ubCardSub:`KFXqYa_ubCardSub`,ubCardTitle:`KFXqYa_ubCardTitle`,ubChipLabel:`KFXqYa_ubChipLabel`,ubChipOff:`KFXqYa_ubChipOff`,ubChipPeak:`KFXqYa_ubChipPeak`,ubExtraName:`KFXqYa_ubExtraName`,ubExtraNote:`KFXqYa_ubExtraNote`,ubExtraRow:`KFXqYa_ubExtraRow`,ubModel:`KFXqYa_ubModel`,ubModelName:`KFXqYa_ubModelName`,ubNotes:`KFXqYa_ubNotes`,ubNotesDesc:`KFXqYa_ubNotesDesc`,ubNotesItem:`KFXqYa_ubNotesItem`,ubNotesTerm:`KFXqYa_ubNotesTerm`,ubRate:`KFXqYa_ubRate`,ubSearch:`KFXqYa_ubSearch`,ubTable:`KFXqYa_ubTable`,ubTablewrap:`KFXqYa_ubTablewrap`,ubTag:`KFXqYa_ubTag`,ubTagAlert:`KFXqYa_ubTagAlert`,ubTagError:`KFXqYa_ubTagError`,ubTagNeutral:`KFXqYa_ubTagNeutral`,ubTagPromo:`KFXqYa_ubTagPromo`,ubTagSuccess:`KFXqYa_ubTagSuccess`,uncataloguedTag:`KFXqYa_uncataloguedTag`,unpricedHint:`KFXqYa_unpricedHint`,userPriceBody:`KFXqYa_userPriceBody`,userPriceCheck:`KFXqYa_userPriceCheck`,userPriceField:`KFXqYa_userPriceField`,userPriceInput:`KFXqYa_userPriceInput`,userPriceInputNum:`KFXqYa_userPriceInputNum`,userPriceLineMeta:`KFXqYa_userPriceLineMeta`,userPricePriceLine:`KFXqYa_userPricePriceLine`,userPriceRow:`KFXqYa_userPriceRow`,vendorLetter:`KFXqYa_vendorLetter`};let Ne=`usageBilling`,Pe={title:`使用统计`,cost:`费用`,todayCost:`今日费用`,monthCost:`本月费用`,yearCost:`本年费用`,monthProjected:`本月预计`,liveTurn:`本轮`,liveSession:`会话`,calls:`调用`,cacheHitRate:`缓存命中率`,tokens:`Token`,inputTokens:`输入`,outputTokens:`输出`,avgCost:`平均成本`,kpiRange:`统计范围`,avgRangeToday:`今日`,avgRange7d:`近7天`,avgRangeWeek:`本周`,avgRangeMonth:`本月`,avgRangeAll:`累计`,trend:`每日费用与调用趋势`,trend7d:`7 天`,trend30d:`30 天`,trendMetric:`趋势指标`,trendMetricCost:`费用`,trendMetricTokens:`Token`,pricingSearch:`搜索模型 / 厂商`,bandPinHint:`点击固定到输入框`,trendEmpty:`暂无趋势数据`,trendTotal:`总计`,roundsUnit:`轮`,healthModelsLive:`{n} 模型可用`,healthVendorsDown:`{n} 厂商失效`,healthVendorsUnavailable:`{n} 厂商不可用`,budget:`本月预算`,budgetRemain:`剩余预算`,budgetAmount:`预算金额`,budgetSummary:`本月已用 {used} / {total};达到 80% 时提醒,达到 100% 时红色脉冲警示`,sessions:`会话明细`,sessionTitle:`标题`,lastActive:`最后活跃`,sessionOverflow:`仅显示花费前 {limit} 个,共 {total} 个会话`,budgetTierBody:`本月花费 {cost} 已达预算 {budget} 的 {pct}%`,models:`模型计费明细`,providerBilling:`提供商计费与订阅`,channelUnknown:`未知路由`,directTag:`直连`,relayTag:`中转`,unknownTag:`未知`,planCountUnit:`套餐`,actual:`实际`,pricing:`模型单价表`,input:`输入`,output:`输出`,cacheHit:`缓存命中`,peak:`高峰`,offPeak:`低谷`,flat:`全天统一`,band:`时段`,close:`关闭`,footer:`每 30s 自动轮询 · 仅统计本机 dsh 会话`,footerCredit:`dsh-ui-usage-billing {version} · MIT`,lastUpdated:`数据更新于`,noData:`暂无计费数据`,todayRate:`今日汇率`,rateLive:`实时`,rateBuiltin:`内置`,pricingSyncedAt:`上次同步`,pricingSyncNow:`立即同步`,pricingSyncing:`同步中…`,promoBadge:`促`,promoUntil:`促销价至 {date},之后自动恢复刊例价`,promoOpenEnded:`厂商未公布截止时间,当前按折扣计价;公告截止后自动恢复刊例价`,pricingTip:`DeepSeek 现行刊例:V4.1 Flash 谷档 未命中 ¥1 / 缓存命中 ¥0.02 / 输出 ¥4;V4 Pro 谷档 未命中 ¥4.5 / 缓存命中 ¥0.15 / 输出 ¥13.5;峰价均为谷价 × 2。工作日 9-12 / 14-18 为高峰价,其余时段(含周末全天)为低谷价;费用按调用时刻计。`,pricingUnit:`单位:人民币 / 每百万 Token`,pricingNotes:`计价说明`,ubPeak:`峰`,ubOff:`谷`,ubStd:`标准`,peakBand:`峰谷分带`,pricingSource:`数据来源`,noteCache:`命中部分按缓存价计费,显著降低成本。`,noteBand:`高峰与空闲时段单价不同,空闲约半价。`,noteSource:`价格来自实时汇率 + 模型定价目录,未收录模型按 0 计并提示。`,balance:`余额`,recharge:`充值`,rechargeHint:`打开该厂商官方平台的充值页`,balanceUnconfigured:`未配置`,balanceUnauthorized:`密钥无效`,balanceUnreachable:`查询失败`,uncatalogued:`未收录`,estimatedPricing:`估算价`,balanceDays:`约可撑 {days} 天`,balanceLowBody:`{name} 余额 {balance},约可撑 {days} 天,请及时充值`,reconcileDrift:`系统监控到{provider}官方余额变动 {spent},本面板记录 {today},差额通常由其它工具或 API 的消耗所致`,reconcileDismiss:`知道了`,subscriptionNotConfigured:`未配置密钥`,subscriptionUnauthorized:`密钥无效`,subscriptionUnavailable:`查询失败`,subscriptionInvalid:`响应异常`,subscriptionRateLimited:`触发限流`,subscriptionSession:`本次`,subscriptionWeekly:`本周`,subscriptionMonthly:`本月`,subscriptionBilling:`计费周期`,subscriptionRemaining:`剩余 {pct}%`,subscriptionExhausted:`已用尽`,subscriptionReset:`{date} 重置`,subscriptionNoApi:`该厂商暂未提供用量查询接口`,floatWindow:`模型用量悬浮窗`,floatModeCombined:`综合`,floatModeSubscription:`订阅卡`,floatMode:`展示模式`,floatTargets:`订阅目标`,floatWindowHint:`悬浮在左下角计费卡上的用量速览;综合=当前样式,订阅卡=每次展示一张订阅额度卡(可切换)。`,floatPrimaryToday:`今日`,floatPrimaryWeek:`本周`,floatPrimaryMonth:`本月`,cardDisplay:`计费卡显示`,cardDisplayHint:`切换左下角计费卡的主指标与主数字统计范围(迷你柱跟随视角,悬浮窗不受影响)。`,cardMetric:`主指标`,cardMetricMoney:`花费金额`,cardMetricTokens:`Token 消耗`,cardSpan:`统计范围`,cardSpanDay:`日`,cardSpanWeek:`周`,cardSpanMonth:`月`,floatNoTargets:`未指定订阅通道,请在设置中勾选要展示的订阅。`,floatNoTargetsHint:`暂无可选的订阅通道。`,subscriptionsStale:`订阅额度刷新失败,以下为缓存数据`,staleLedgerNotice:`{count} 个会话出自旧版算法存档(日志已删,无法重算),模型归属可能有误差`,unreadableNotice:`{count} 个会话因会话格式版本较新暂未统计(原始数据仍在,升级 dsh 兼容修复后自动恢复)`,tokenCacheWrite:`写入`,toolRank:`工具排行`,toolName:`工具`,userPrices:`自定义单价`,userPricesHint:`为未收录或变价模型填入实付单价,总览与日趋势按此重估;模型可用下拉候选(目录键或模型 id);来源留空=该模型默认价,填入中转站域名=仅该来源的同名模型用此价(协议可省);低谷价三栏填后按峰/谷混合估算,留空=平档`,userPriceSave:`保存`,userPriceModel:`模型`,userPriceSource:`来源(中转站域名)`,userPriceSourceHint:`留空=默认价,或 https://api.中转站.com`,userPriceOffPeak:`低谷价`,userPriceNormal:`标准价`,userPriceCurrency:`币种`,userPriceAdd:`新增`,userPriceRemoveSelected:`删除所选`,userPriceSelect:`选择此行`,sessionStaleBadge:`旧版统计`,sessionUntitled:`未命名会话`,heatmapLess:`少`,heatmapMore:`多`,currency:`币种`,currencyCny:`人民币`,currencyUsd:`美元`,currencyEur:`欧元`,language:`界面语言`,heatmap:`用量热力图`,rounds:`每轮费用`,roundsHint:`最近 {count} 轮 · 柱顶为金额 · 底色为峰谷时段`,anomaly:`成本突增`,model:`模型`,thModel:`模型名称`,thInputMiss:`输入缓存未命中`,thInputHit:`输入缓存命中`,costAbbr:`费用`,tabOverview:`概览`,tabTrends:`趋势`,tabProviders:`账单`,tabPricing:`费率`,tabSettings:`设置`,budgetHint:`设置月度上限,用于本月预计与超支分段提醒`,peakAlertHint:`在切档前弹窗提醒,可选同步系统通知`,peakAlertDescPeak:`即将进入高峰时段,价格将上调,请提前安排长任务`,peakAlertDescOff:`即将进入平价时段,价格减半,适合运行大批量任务`,peakAlertDescPeakZhipu:`即将进入高峰时段(工作日 14:00–18:00),Coding Plan 额度将按基础积分全额抵扣`,peakAlertDescOffZhipu:`即将进入非高峰时段,Coding Plan 额度按基础积分 5 折抵扣`,export:`导出`,exportCsvDay:`按日 CSV`,exportCsvSession:`按会话 CSV`,exportJson:`全量 JSON`,peakShare:`峰谷时段占比`,peakSharePerCall:`按调用时刻精确判档`,offPeakSavings:`挪谷可省约 {amount}`,perfMax:`最大 TTFT`,weekCost:`本周消耗金额`,roleCost:`费用构成`,roleUser:`用户输入`,roleAssistant:`助手输出`,roleTool:`工具结果`,roleHint:`估算:输出按实测计价,输入按消息长度摊分`,tierPeak:`峰时`,tierOff:`平价`,tierToPeak:`后转峰时`,tierToOff:`后转平价`,tierAlertEnterPeak:`{minutes} 分钟后进入峰时(DeepSeek 高峰价 ×2),不急的调用可稍等`,tierAlertEnterOff:`{minutes} 分钟后进入平价(价格减半)`,tierAlertEnterPeakZhipu:`{minutes} 分钟后进入智谱高峰时段,Coding Plan 额度将全额抵扣`,tierAlertEnterOffZhipu:`{minutes} 分钟后进入智谱非高峰时段,额度按基础积分 5 折抵扣`,peakAlertTitlePeak:`即将进入高峰价`,peakAlertTitleOff:`即将进入平价`,peakAlert:`峰谷切换提醒`,peakAlertLeadMin:`提前量(分钟)`,peakAlertPos:`位置`,peakAlertMode:`提醒模式`,peakAlertPosCorner:`右下角`,peakAlertPosCenter:`屏幕居中`,peakAlertModePeak:`仅进入峰时`,peakAlertModeOff:`仅进入平价`,peakAlertModeBoth:`峰与谷都提醒`,peakAlertWebNotify:`同时发系统通知`,peakAlertPreview:`预览提醒`,planTypeCode:`订阅制`,planTypeToken:`按量`,subscriptionFeePerMonth:`{amount}/月`,triggerToday:`今日消耗金额`,triggerMonth:`当月消耗金额`,triggerMonthTokens:`当月消耗 Token`,triggerTodayTokens:`今日消耗 Token`,triggerWeekTokens:`本周消耗 Token`,subscriptionTag:`订阅`,free:`免费`,perfSamples:`样本`,perfTtft:`首字延时`,perfP50:`P50`,perfP90:`P90`,perfTps:`生成速度`,perfLatency:`总延迟`,perfEstimated:`估算样本`,perfEmpty:`暂无性能数据`,perfTpsUnit:`tok/s`,perfTitle:`性能`,perfHint:`按模型与按小时聚合;估算样本为工具续写步骤`,perfAll:`全选`,perfChartEmpty:`未选择模型或该指标暂无数据`,heatmapYear:`年`,heatmapHalf:`半年`,heatmapMonth:`月`,metricCost:`费用`,metricTokens:`Token`,heatmapTotal:`合计`,activeDays:`活跃天数`,streakDays:`连续使用`,subscriptionAutoDetect:`自动识别`,pluginAuthor:`作者`,pluginRepository:`仓库`,pluginNpm:`npm`,pluginLicense:`许可证`,tabToken:`用量`,tokenExport:`导出 Token`,tokenExportCsv:`按日 Token CSV`,tokenReasoningShare:`思考占比`,tokenReasoningShort:`思考`,tokenIo:`输入/输出比`,tokenPeak:`峰值日`,tokenDaily:`每日 Token`,tokenByModel:`模型 Token`,tokenMiss:`输入(缓存未命中)`,tokenHit:`输入(缓存命中)`,tokenOutput:`输出`,tokenViewStructure:`按结构`,tokenViewModel:`按模型`,tokenHitShort:`命中`,tokenMissShort:`未命中`,tokenTotal:`总 Token`,tokenShare:`占比`,usageStatsTool:`注入用量查询工具`,usageStatsToolHint:`让模型可在对话中查询用量/费用;会占用模型每次请求的上下文,coding 场景建议关闭(改后需重载应用生效)`,balanceGranted:`赠金余额`,balanceTopped:`充值余额`,balanceDaily:`日均消耗`,balanceDaysLong:`约可撑`,balanceDaysUnit:`天`,popTodayModel:`主力消耗模型余额`,popTitle:`用量速览`,popNoConsumption:`暂无消耗`,popDirectLead:`直联`,popSubLead:`订阅`,unpricedHint:`{count} 个模型未收录计价,费用已按 0 计`,searchEstimateHint:`含 {count} 次联网搜索请求的估算费用(每次约 {each};日志无用量事件,按次估算,可在配置 searchCallEstimateCny 调整或关闭)`,siteListDisplay:`中转站列表`,siteListDisplayHint:`隐藏「未识别」占位条目,净化中转站额度列表`,liveCostBar:`平价消耗胶囊`,liveCostBarHint:`输入框旁的即时代费条,悬浮可看详情`,liveCostBarPosition:`位置`,liveCostBarPosBelow:`输入框下方`,liveCostBarPosAbove:`输入框上方`,liveCostBarPosToolbar:`输入框内部`,exportCsvSite:`按站点 CSV`,panelRelayQuota:`中转站额度`,relayBalance:`余额`,relayNoQuota:`未读出额度`,relayWindowUsed:`已用`,relayKindNewApi:`New API`,relayKindSub2Api:`Sub2API`,relayKindUnknown:`未识别`,expandAll:`全部展开`,collapseAll:`全部收起`,todayOnly:`仅看今日`,todayNoConsumption:`今日暂无消耗`},Fe={title:`Usage`,cost:`Cost`,todayCost:`Today`,monthCost:`This month`,yearCost:`This year`,monthProjected:`Projected`,liveTurn:`Turn`,liveSession:`Session`,calls:`Calls`,cacheHitRate:`Cache Hit`,tokens:`Tokens`,inputTokens:`Input`,outputTokens:`Output`,avgCost:`Avg cost`,kpiRange:`Range`,avgRangeToday:`Today`,avgRange7d:`7d`,avgRangeWeek:`Week`,avgRangeMonth:`Month`,avgRangeAll:`All`,trend:`Daily cost & calls`,trend7d:`7D`,trend30d:`30D`,trendMetric:`Trend metric`,trendMetricCost:`Cost`,trendMetricTokens:`Tokens`,pricingSearch:`Search model or vendor`,bandPinHint:`click to pin to the composer`,trendEmpty:`No trend data yet`,trendTotal:`Total`,roundsUnit:`turns`,healthModelsLive:`{n} models live`,healthVendorsDown:`{n} vendors down`,healthVendorsUnavailable:`{n} vendors unavailable`,budget:`Monthly budget`,budgetRemain:`Remaining`,budgetAmount:`Budget amount`,budgetSummary:`Used {used} / {total} this month; warn at 80%, pulse red at 100%`,sessions:`Sessions`,sessionTitle:`Title`,lastActive:`Last active`,sessionOverflow:`Top {limit} of {total} sessions by cost`,budgetTierBody:`This month {cost} reached {pct}% of the budget {budget}`,models:`Model billing`,providerBilling:`Provider billing & subscriptions`,channelUnknown:`Unknown routes`,directTag:`Direct`,relayTag:`Relay`,unknownTag:`Unknown`,planCountUnit:`plan(s)`,actual:`Actual`,pricing:`Model pricing`,input:`Input`,output:`Output`,cacheHit:`Cache hit`,peak:`Peak`,offPeak:`Off-peak`,flat:`Flat`,band:`Band`,close:`Close`,footer:`Polls every 30s · local dsh sessions only`,footerCredit:`dsh-ui-usage-billing {version} · MIT`,lastUpdated:`Updated`,noData:`No billing data yet`,todayRate:`Today rate`,rateLive:`Live`,rateBuiltin:`Built-in`,pricingSyncedAt:`Synced`,pricingSyncNow:`Sync now`,pricingSyncing:`Syncing…`,promoBadge:`Promo`,promoUntil:`Promo price until {date}, then list price resumes automatically`,promoOpenEnded:`End date not announced; billed at the discounted rate until further notice, then list price resumes`,pricingTip:`DeepSeek list rates: V4.1 Flash off-peak ¥1 miss / ¥0.02 cache-hit / ¥4 output; V4 Pro off-peak ¥4.5 miss / ¥0.15 cache-hit / ¥13.5 output; peak = 2× off-peak. Weekday 9-12 / 14-18 bills at peak, all other times (weekends included) at off-peak; billed at call time.`,pricingUnit:`Unit: CNY / per 1M tokens`,pricingNotes:`Pricing notes`,ubPeak:`Peak`,ubOff:`Off`,ubStd:`Std`,peakBand:`Peak/off-peak band`,pricingSource:`Data source`,noteCache:`Cache hits are billed at the cache rate, cutting cost.`,noteBand:`Peak and off-peak prices differ; off-peak is roughly half price.`,noteSource:`Prices come from the live rate + model catalog; unlisted models count as 0 and are flagged.`,balance:`Balance`,recharge:`Top up`,rechargeHint:`Open the vendor's official top-up page`,balanceUnconfigured:`Not set`,balanceUnauthorized:`Bad key`,balanceUnreachable:`Unavailable`,uncatalogued:`Not catalogued`,estimatedPricing:`Estimated`,balanceDays:`~{days} days left`,balanceLowBody:`{name} balance {balance}, ~{days} days left, please top up`,reconcileDrift:`Detected {provider} official balance moved {spent}, this panel recorded {today}; the gap usually comes from other tools or APIs consuming too`,reconcileDismiss:`Got it`,subscriptionNotConfigured:`Key not set`,subscriptionUnauthorized:`Bad key`,subscriptionUnavailable:`Unavailable`,subscriptionInvalid:`Bad response`,subscriptionRateLimited:`Rate limited`,subscriptionSession:`Current`,subscriptionWeekly:`Weekly`,subscriptionMonthly:`Monthly`,subscriptionBilling:`Billing`,subscriptionRemaining:`{pct}% left`,subscriptionExhausted:`Exhausted`,subscriptionReset:`Resets {date}`,subscriptionNoApi:`Provider does not offer a usage API`,floatWindow:`Model usage popover`,floatModeCombined:`Combined`,floatModeSubscription:`Subscription card`,floatMode:`Display mode`,floatTargets:`Targets`,floatWindowHint:`Usage summary floating on the footer card; Combined=current style, Subscription cards=one quota card at a time (switchable).`,floatPrimaryToday:`Today`,floatPrimaryWeek:`Week`,floatPrimaryMonth:`Month`,cardDisplay:`Billing card`,cardDisplayHint:`Switch the bottom-left billing card between cost and token usage, and pick the figure range (sparkline follows; the popover is unaffected).`,cardMetric:`Main metric`,cardMetricMoney:`Cost`,cardMetricTokens:`Token usage`,cardSpan:`Range`,cardSpanDay:`Day`,cardSpanWeek:`Week`,cardSpanMonth:`Month`,floatNoTargets:`No subscription selected — pick some in Settings.`,floatNoTargetsHint:`No subscription channel available.`,subscriptionsStale:`Subscription refresh failed — showing cached data`,staleLedgerNotice:`{count} sessions use legacy-algorithm archives (logs deleted); attribution may be off`,unreadableNotice:`{count} sessions are not counted yet (newer session format; data is intact and restores automatically after a dsh fix)`,tokenCacheWrite:`written`,toolRank:`Tool calls`,toolName:`Tool`,userPrices:`Custom prices`,userPricesHint:`Enter actual per-1M-token prices; main views are re-costed. Pick a model key from the dropdown candidates. Leave source empty for the model default, or enter a relay origin (protocol optional) to price only that source. Fill all three off-peak fields for peak/off-peak estimation; leave them empty for flat pricing.`,userPriceSave:`Save`,userPriceModel:`Model`,userPriceSource:`Source (relay origin)`,userPriceSourceHint:`Empty = default; e.g. https://api.relay.com`,userPriceOffPeak:`Off-peak price`,userPriceNormal:`Standard price`,userPriceCurrency:`Currency`,userPriceAdd:`Add`,userPriceRemoveSelected:`Remove selected`,userPriceSelect:`Select this row`,sessionStaleBadge:`legacy`,sessionUntitled:`Untitled session`,heatmapLess:`Less`,heatmapMore:`More`,currency:`Currency`,currencyCny:`CNY`,currencyUsd:`USD`,currencyEur:`EUR`,language:`Interface language`,heatmap:`Usage heatmap`,rounds:`Cost per turn`,roundsHint:`Last {count} rounds · bar tops show amount · fill = peak/off-peak`,anomaly:`Cost spike`,model:`Model`,thModel:`Model name`,thInputMiss:`Input (cache miss)`,thInputHit:`Input (cache hit)`,costAbbr:`cost`,tabOverview:`Overview`,tabTrends:`Trends`,tabProviders:`Bills`,tabPricing:`Rates`,tabSettings:`Settings`,budgetHint:`Set a monthly cap for projections and tier alerts`,peakAlertHint:`Alert before a tier switch, optionally via system notification`,peakAlertDescPeak:`About to enter peak hours — prices rise, plan long tasks ahead`,peakAlertDescOff:`About to enter off-peak hours — price halves, ideal for large batches`,peakAlertDescPeakZhipu:`Peak hours soon (weekdays 14:00–18:00) — Coding Plan credits will be deducted at full rate`,peakAlertDescOffZhipu:`Off-peak soon — Coding Plan credits will be deducted at 50% of base credits`,export:`Export`,exportCsvDay:`Daily CSV`,exportCsvSession:`Sessions CSV`,exportJson:`Full JSON`,peakShare:`Peak vs off-peak`,peakSharePerCall:`per-call attribution, full history`,offPeakSavings:`Shift peak to off-peak: save ~{amount}`,perfMax:`Max TTFT`,weekCost:`This week's spend`,roleCost:`Cost breakdown`,roleUser:`User input`,roleAssistant:`Assistant output`,roleTool:`Tool results`,roleHint:`Estimated: output priced exactly, input split by message size`,tierPeak:`Peak`,tierOff:`Off-peak`,tierToPeak:`until peak`,tierToOff:`until off-peak`,tierAlertEnterPeak:`Peak pricing (2x) starts in {minutes} min — non-urgent calls can wait`,tierAlertEnterOff:`Off-peak pricing (50% off) starts in {minutes} min`,tierAlertEnterPeakZhipu:`Zhipu peak hours in {minutes} min — Coding Plan credits burn at full rate`,tierAlertEnterOffZhipu:`Zhipu off-peak in {minutes} min — credit burn drops to 50%`,peakAlertTitlePeak:`Peak pricing incoming`,peakAlertTitleOff:`Off-peak incoming`,peakAlert:`Peak/off-peak alert`,peakAlertLeadMin:`Lead time (min)`,peakAlertPos:`Position`,peakAlertMode:`Remind mode`,peakAlertPosCorner:`Bottom-right`,peakAlertPosCenter:`Center`,peakAlertModePeak:`Entering peak only`,peakAlertModeOff:`Entering off-peak only`,peakAlertModeBoth:`Both`,peakAlertWebNotify:`Also send system notification`,peakAlertPreview:`Preview alert`,planTypeCode:`Subscription`,planTypeToken:`Usage`,subscriptionFeePerMonth:`{amount}/mo`,triggerToday:`Today's spend`,triggerMonth:`This month's spend`,triggerMonthTokens:`This month's tokens`,triggerTodayTokens:`Today's tokens`,triggerWeekTokens:`This week's tokens`,subscriptionTag:`Plan`,free:`Free`,perfSamples:`Samples`,perfTtft:`TTFT`,perfP50:`P50`,perfP90:`P90`,perfTps:`Speed`,perfLatency:`Total latency`,perfEstimated:`Estimated`,perfEmpty:`No performance data yet`,perfTpsUnit:`tok/s`,perfTitle:`Performance`,perfHint:`Per model & per hour; estimated samples are tool-continuation steps`,perfAll:`All`,perfChartEmpty:`No model selected or no data for this metric`,heatmapYear:`Year`,heatmapHalf:`Half`,heatmapMonth:`Month`,metricCost:`Cost`,metricTokens:`Tokens`,heatmapTotal:`Total`,activeDays:`Active days`,streakDays:`Streak`,subscriptionAutoDetect:`Auto`,pluginAuthor:`Author`,pluginRepository:`Repository`,pluginNpm:`npm`,pluginLicense:`License`,tabToken:`Usage`,tokenExport:`Export tokens`,tokenExportCsv:`Daily token CSV`,tokenReasoningShare:`Reasoning share`,tokenReasoningShort:`reasoning`,tokenIo:`In/out ratio`,tokenPeak:`Peak day`,tokenDaily:`Daily tokens`,tokenByModel:`Tokens by model`,tokenMiss:`Input (cache miss)`,tokenHit:`Input (cache hit)`,tokenOutput:`Output`,tokenViewStructure:`Structure`,tokenViewModel:`By model`,tokenHitShort:`Hit`,tokenMissShort:`Miss`,tokenTotal:`Total tokens`,tokenShare:`Share`,usageStatsTool:`Inject usage-stats tool`,usageStatsToolHint:`Lets the model query usage/cost inside a conversation; it consumes context per request, so keep it off for coding (takes effect after a reload)`,balanceGranted:`Granted`,balanceTopped:`Topped up`,balanceDaily:`Daily burn`,balanceDaysLong:`~days left`,balanceDaysUnit:`days`,popTodayModel:`Main model balance`,popTitle:`Usage overview`,popNoConsumption:`No usage yet`,popDirectLead:`Direct`,popSubLead:`Subscription`,unpricedHint:`{count} models not priced; their cost counts as 0`,searchEstimateHint:`Includes estimated cost of {count} web-search requests (~{each} each; no usage events logged, per-call estimate; tune via searchCallEstimateCny)`,siteListDisplay:`Relay lists`,siteListDisplayHint:`Hide "unidentified" placeholder rows in the relay quota list`,liveCostBar:`Live cost capsule`,liveCostBarHint:`Live cost bar beside the composer; hover for details`,liveCostBarPosition:`Position`,liveCostBarPosBelow:`Below composer`,liveCostBarPosAbove:`Above composer`,liveCostBarPosToolbar:`Inside composer`,exportCsvSite:`By site CSV`,panelRelayQuota:`Relay quotas`,relayBalance:`Balance`,relayNoQuota:`No quota`,relayWindowUsed:`used`,relayKindNewApi:`New API`,relayKindSub2Api:`Sub2API`,relayKindUnknown:`Unknown`,expandAll:`Expand all`,collapseAll:`Collapse all`,todayOnly:`Today only`,todayNoConsumption:`No usage today`},L={"opencode-go":{type:`code`,subscription:{amount:10,currency:`USD`,period:`month`},tier:{amount:10,currency:`USD`,periodDays:7,label:`周额度 $30`}},opencode:{type:`code`,subscription:{amount:10,currency:`USD`,period:`month`},tier:{amount:10,currency:`USD`,periodDays:7,label:`周额度 $30`}},"kimi-coding":{type:`code`},"zai-coding-cn":{type:`code`},"zai-coding":{type:`code`},commandcode:{type:`code`},"qwen-token-plan":{type:`code`},"qwen-token-plan-cn":{type:`code`},"xiaomi-token-plan-ams":{type:`code`},"xiaomi-token-plan-cn":{type:`code`},"xiaomi-token-plan-sgp":{type:`code`},"volcengine-token-plan":{type:`code`},"ark-token-plan":{type:`code`},"doubao-token-plan":{type:`code`},minimax:{type:`code`},"minimax-cn":{type:`code`},"minimax-token-plan":{type:`code`},"minimax-token-plan-cn":{type:`code`},"hunyuan-token-plan":{type:`code`},"tencent-token-plan":{type:`code`},"hy-token-plan":{type:`code`},"xinghuo-token-plan":{type:`code`},"xfyun-coding":{type:`code`},"spark-coding":{type:`code`},"huawei-token-plan":{type:`code`},"pangu-token-plan":{type:`code`},"huawei-maas-token-plan":{type:`code`},"volcengine-agent-plan":{type:`code`},"ark-agent-plan":{type:`code`},"baidu-token-plan":{type:`code`},"ernie-token-plan":{type:`code`},"wenxin-token-plan":{type:`code`}},R={glm:`zai-coding-cn`,bigmodel:`zai-coding-cn`,zhipu:`zai-coding-cn`,zhipuai:`zai-coding-cn`,zai:`zai-coding`,ark:`volcengine-token-plan`,volcengine:`volcengine-token-plan`,doubao:`doubao-token-plan`,moonshot:`kimi-coding`,kimi:`kimi-coding`,xiaomi:`xiaomi-token-plan-cn`,opencode:`opencode-go`};function Ie(e){return e===``?e:R[e]??e}function Le(e){let t=L[Ie(e)];return t?.type===`code`?t.tier:void 0}let Re=[{key:`deepseek-v4-flash`,input:.14,cacheHit:.0028,output:.28},{key:`deepseek-v4-pro`,input:.435,cacheHit:.003625,output:.87},{key:`gpt-5.6-sol`,input:5,cacheHit:.5,output:30},{key:`gpt-5.6-terra`,input:2,cacheHit:.2,output:12},{key:`gpt-5.6-luna`,input:.2,cacheHit:.02,output:1.2},{key:`glm-5.2`,input:1.4,cacheHit:.26,output:4.4},{key:`qwen3.8-max`,input:2,cacheHit:.21,output:6},{key:`kimi-k3`,input:2.82,cacheHit:.28,output:14.08},{key:`grok-4.6`,input:2,cacheHit:.5,output:6},{key:`gemini-2.5-pro`,input:1.25,cacheHit:.125,output:10}],ze,Be,Ve,z,He,B;function Ue(e){let t=/:\/\//.test(e)?e:`https://${e}`;try{return new URL(t).origin}catch{return e.trim().toLowerCase().replace(/\/+$/,``)}}function We(e,t){return Ue(e)===Ue(t)}function V(e){B=e.length>0?e:void 0}function Ge(){return B}function H(e){return At(e)}function U(e,t){let n=Ke(e,t);if(n!==void 0)return{input:n.input,cacheHit:n.cacheHit,output:n.output,...n.currency===void 0?{}:{currency:n.currency},...n.offPeak===void 0?{}:{offPeak:n.offPeak}}}function Ke(e,t){if(B===void 0)return;let n=H(e),r=G(n),i=e=>H(e.key)===n||G(e.key)===r;if(t!==void 0){for(let e of B)if(e.origin!==void 0&&e.origin!==``&&i(e)&&We(e.origin,t))return e}for(let e of B)if((e.origin===void 0||e.origin===``)&&i(e))return e}function qe(e){if(B===void 0)return;let t=H(e),n=G(t);return B.find(e=>e.origin!==void 0&&e.origin!==``&&(H(e.key)===t||G(e.key)===n))}function Je(e){ze=typeof e.rate==`number`&&Number.isFinite(e.rate)&&e.rate>0?e.rate:void 0,Be=typeof e.rateEur==`number`&&Number.isFinite(e.rateEur)&&e.rateEur>0?e.rateEur:void 0,Ve=e.prices,z=e.extraModels}function Ye(e){He=e}function Xe(){return ze??6.79}function Ze(){return Be??7.71}function Qe(){return{rate:Xe(),live:ze!==void 0}}function $e(){return{rate:Ze(),live:Be!==void 0}}let et=.5;function tt(e){return e==null||!Number.isFinite(e)?`peak`:nt(e,at,!0)}function nt(e,t,n=!1){if(W(e)||n&&it(e))return`offPeak`;let r=Math.floor(st(e)/6e4);for(let e=0;e+1<t.length;e+=2){let n=t[e]??0,i=t[e+1]??0;if(r>=n&&r<i)return`peak`}return`offPeak`}function W(e){let t=new Date(e+288e5).getUTCDay();return t===0||t===6}function rt(e){return new Date(e+288e5).toISOString().slice(0,10).replace(/-/g,``)}function it(e){return`20260925 20260926 20260927 20261001 20261002 20261003 20261004 20261005 20261006 20261007`.includes(rt(e))}let at=[540,720,840,1080],ot=[840,1080];function st(e){return((e+288e5)%864e5+864e5)%864e5}function ct(e,t,n=!1){let r=nt(e,t,n),i=st(e);for(let a=0;a<10;a++){let o=a*864e5-i;for(let i of t){let a=o+i*6e4;if(!(a<=0)&&nt(e+a,t,n)!==r)return{tier:r,nextSwitchInMs:a}}}let a=t[0]??0;return{tier:r,nextSwitchInMs:864e5-i+a*6e4}}function lt(e,t,n,r=!1){let{nextSwitchInMs:i}=ct(e,t,r);if(i>n)return null;let a=e+i;return{entering:nt(a,t,r),atMs:a}}function ut(e,t){if(e===void 0||e===``)return`none`;let n=At(e),r=_t().find(e=>e.key===n)?.provider;return r===`DeepSeek`?`deepseek-metered`:t&&r===`智谱 AI`?`zhipu-coding-plan`:`none`}function dt(e,t){switch(t){case`deepseek-metered`:return ct(e,at,!0);case`zhipu-coding-plan`:return ct(e,ot);case`none`:return null}}function ft(e,t,n){switch(t){case`deepseek-metered`:return lt(e,at,n,!0);case`zhipu-coding-plan`:return lt(e,ot,n);case`none`:return null}}function pt(e){let t=Math.max(1,Math.ceil(e/6e4)),n=Math.floor(t/60),r=t%60;return n>0?`${n}h${String(r).padStart(2,`0`)}m`:`${r}m`}let mt=[],ht={};function gt(e,t){mt=e,ht=t,bt=void 0}function _t(){return mt}function vt(){return ht}let yt={key:`other`,name:`其他模型`,provider:`Custom`,colorVar:`dsw-static-neutral-bluish-500`,price:{currency:`CNY`,input:0,cacheHit:0,cacheMiss:0,output:0}};function G(e){return String(e).toLowerCase().replace(/\([^)]*\)/g,``).replace(/[^a-z0-9]+/g,``)}let bt;function xt(){if(bt!==void 0)return bt;let e=new Map,t=(t,n)=>{let r=G(t);r!==``&&!e.has(r)&&e.set(r,n)};for(let e of mt)t(e.key,e.key);for(let[e,n]of Object.entries(ht))t(e,n);for(let e of Re)t(e.key,e.key);return bt=e,e}let St,Ct,wt;function Tt(){if(St===z)return;let e=new Map,t=new Map;for(let n of z??[]){t.has(n.key)||t.set(n.key,n);let r=G(n.key);r!==``&&!e.has(r)&&e.set(r,n)}St=z,Ct=e,wt=t}function Et(){return Tt(),Ct??new Map}function Dt(){return Tt(),wt??new Map}function Ot(e){let t=[],n=e=>{e!==``&&!t.includes(e)&&t.push(e)},r=e=>{let t=e;for(;;){let e=t.replace(/[-_]\d{3,}$/u,``);if(e===t||e===``)return;t=e,n(t)}},i=e.lastIndexOf(`/`);if(i>0&&i<e.length-1){let t=e.slice(i+1);n(t),r(t)}return r(e),t}function kt(e){let t=vt()[e];if(t!==void 0)return t;let n=G(e);if(n===``)return;let r=xt().get(n);return r===void 0?Et().get(n)?.key:r}function At(e){let t=vt()[e]??e;if(t===e){let t=G(e);if(t!==``){let e=xt().get(t);if(e!==void 0)return e;let n=Et().get(t);if(n!==void 0)return n.key}for(let t of Ot(e)){let e=kt(t);if(e!==void 0)return e}}return t}function jt(e){let t=At(e),n=Ve?.[t];if(n!==void 0)return n;let r=Re.find(e=>e.key.toLowerCase()===t.toLowerCase());if(r!==void 0)return{input:r.input,cacheHit:r.cacheHit,output:r.output}}function Mt(e){let t=At(e),n=_t().find(e=>e.key===t),r=Dt().get(t),i=n??(r===void 0?_t().find(e=>e.key===`other`)??yt:Nt(r)),a=U(t);if(a!==void 0)return{...i,userPriced:!0,price:{currency:a.currency??`CNY`,input:a.input,cacheHit:a.cacheHit,output:a.output,...a.offPeak===void 0?{}:{offPeak:a.offPeak}}};let o=jt(t);return o===void 0||i.price.offPeak!==void 0?i:{...i,price:{currency:`USD`,input:o.input,cacheHit:o.cacheHit,output:o.output}}}function Nt(e){return{key:e.key,name:e.name,provider:e.provider,colorVar:`dsw-static-neutral-400`,price:{currency:`USD`,input:e.price.input,cacheHit:e.price.cacheHit,output:e.price.output}}}function Pt(e,t){let n=e.endsAtMs!==void 0&&t>=e.endsAtMs;return Number.isFinite(t)&&!n&&e.factor>0&&e.factor<1}function Ft(e,t){let{promo:n}=e;if(n===void 0||!Pt(n,t))return e;let r=e=>n.factors?.[e]??n.factor,i=e=>({input:e.input*r(`input`),cacheHit:e.cacheHit*r(`cacheHit`),...e.cacheMiss===void 0?{}:{cacheMiss:e.cacheMiss*r(`cacheMiss`)},output:e.output*r(`output`)});return{...e,price:{...i(e.price),currency:e.price.currency,...e.price.offPeak===void 0?{}:{offPeak:i(e.price.offPeak)}}}}function It(e=Date.now()){let t=[..._t().filter(e=>e.retired!==!0).map(t=>Ft(t,e))],n=new Set(t.map(e=>e.key.toLowerCase())),r=new Set(t.map(e=>G(e.key)));for(let e of He??[]){let i=e.id.toLowerCase();if((()=>{let t=At(e.id);return _t().find(e=>e.key===t)})()!==void 0)continue;let a=G(e.id);if(n.has(i)||a!==``&&r.has(a))continue;let o=Et().get(a),s;if(o!==void 0)s=Nt(o),e.name!==void 0&&e.name!==``&&(s={...s,name:e.name});else{let t=jt(i);s=t===void 0?{key:At(e.id),name:e.name??e.id,provider:e.provider,colorVar:`dsw-static-neutral-400`,price:{currency:`USD`,input:0,cacheHit:0,output:0},uncatalogued:!0}:{key:i,name:e.name??e.id,provider:e.provider,colorVar:`dsw-static-neutral-400`,price:{currency:`USD`,input:t.input,cacheHit:t.cacheHit,output:t.output}}}n.add(s.key.toLowerCase()),a!==``&&r.add(a),t.push(s)}return t.map(e=>{let t=U(e.key);return t===void 0?e:{...e,userPriced:!0,price:{currency:t.currency??`CNY`,input:t.input,cacheHit:t.cacheHit,output:t.output}}})}function Lt(e){let t=getComputedStyle(document.documentElement).getPropertyValue(`--${e}`).trim();return t===``?`#8b95a3`:t}function Rt(e,t,n){let r=t.cacheMiss>0?t.cacheMiss:Math.max(0,t.input-t.cacheHit),i=Math.min(t.cacheHit,t.input),a=(r*(e.cacheMiss??e.input)+i*e.cacheHit+t.output*e.output)/1e6;return n===`USD`?a*Xe():a}function zt(e,t,n=et,r=Date.now()){let i=Ft(e,r),a=Rt(i.price,t,i.price.currency),o=i.price.offPeak===void 0?a:Rt(i.price.offPeak,t,i.price.currency);return a*n+o*(1-n)}function K(e){let t=Xe();return t>0?e/t:e}function Bt(e,t){if(t===`usd`)return K(e);if(t===`eur`){let t=Ze();return t>0?e/t:e}return e}function q(e,t=`cny`){let n=Number(e),r=t===`usd`?`$`:t===`eur`?`€`:`¥`;return!Number.isFinite(n)||n<=0?`${r}0`:n>=1e3?`${r}${n.toFixed(0)}`:n>=10?`${r}${n.toFixed(1)}`:n>=.1?`${r}${n.toFixed(2)}`:`${r}${n.toFixed(3)}`}function Vt(e,t=`CNY`){return`${t===`USD`?`$`:t===`EUR`?`€`:`¥`}${e.toFixed(e>=10?1:2)}`}function Ht(e,t,n,r){if(r<=0||!Number.isFinite(r))return e;let i=t===`USD`?e*r:e;if(n===`cny`)return i;if(n===`usd`)return i/r;let a=$e().rate;return a>0?i/a:i}function J(e=Date.now()){let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`}function Y(e){return e>=1e9?`${(e/1e9).toFixed(2)}B`:e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(0)}K`:String(e)}function Ut(e){let t=Number(e);return Number.isFinite(t)?`${t.toFixed(1)}%`:`0.0%`}function Wt(e){return/[",\r\n]/.test(e)?`"${e.replace(/"/g,`""`)}"`:e}function Gt(e){return/^[=+\-@\t\r]/.test(e)?`'${e}`:e}function Kt(e){return e.toFixed(2)}function qt(e){return[`date,calls,input,output,cache_hit,cache_miss,cost_cny`,...Object.keys(e).sort().map(t=>{let n=e[t];return n===void 0?``:[t,n.calls,n.input,n.output,n.cacheHit,n.cacheMiss,Kt(n.cost)].join(`,`)})].join(`
|
|
1
|
+
window.__ModuleLoader__.load({id:`@kenz1117/dsh-ui-usage-billing`,factory:e=>{var t={exports:{}},n=t.exports;Object.defineProperty(n,Symbol.toStringTag,{value:`Module`});var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;l<u;l++)d=s[l],!c.call(e,d)&&d!==n&&i(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e},u=(e,t,n)=>(n=e==null?{}:r(s(e)),l(t||!e||!e.__esModule||!c.call(e,`default`)?i(n,`default`,{value:e,enumerable:!0}):n,e));let d=e("react"),f=e("react-dom"),p=e("@deepseek-ai/dsh-client-ui-primitives");p=u(p,1);let m=e("react/jsx-runtime"),h=e("@deepseek-ai/dsh-client-store");function g(e){return e}function _(e){return g(e)}function v(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`){if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=v(e[t]))&&(r&&(r+=` `),r+=n)}else for(n in e)e[n]&&(r&&(r+=` `),r+=n)}return r}function y(){for(var e,t,n=0,r=``,i=arguments.length;n<i;n++)(e=arguments[n])&&(t=v(e))&&(r&&(r+=` `),r+=t);return r}function b(e,t){try{localStorage.setItem(e,t)}catch{}}function x(e){try{return localStorage.getItem(e)??void 0}catch{return}}function S(e){let t=x(e);if(t!==void 0)try{return JSON.parse(t)}catch{return}}let C={mode:`combined`,targets:[]},w=`dsh.ui-usage-billing.float`;function T(){let e=()=>({...C,targets:[...C.targets]}),t=S(w);if(typeof t!=`object`||!t)return e();let n=t;return{mode:n.mode===`subscription`?`subscription`:`combined`,targets:Array.isArray(n.targets)?n.targets.filter(e=>typeof e==`string`):[]}}function ee(e){b(w,JSON.stringify(e))}let E={metric:`money`,span:`day`},D=`dsh.ui-usage-billing.card`;function O(){let e=S(D);if(typeof e!=`object`||!e)return{...E};let t=e;return{metric:t.metric===`tokens`?`tokens`:`money`,span:t.span===`week`||t.span===`month`?t.span:`day`}}function te(e){b(D,JSON.stringify(e))}let ne=`dsh.ui-usage-billing.kpi-range`;function k(){let e=x(ne);return e===`today`||e===`7d`||e===`week`||e===`month`||e===`all`?e:`all`}function re(e){b(ne,e)}let ie={hideUnidentified:!0},A=`dsh.ui-usage-billing.sites`;function ae(){let e=S(A);return typeof e!=`object`||!e?{...ie}:{hideUnidentified:e.hideUnidentified!==!1}}function oe(e){b(A,JSON.stringify(e))}let se={show:!0,position:`toolbar`},ce=`dsh.ui-usage-billing.livecost`,j=`dsh.ui-usage-billing.livecost-pref`;function le(){let e=S(ce);if(typeof e!=`object`||!e)return{...se};let t=e;return{show:t.show!==!1,position:t.position===`above`||t.position===`toolbar`||t.position===`below`?t.position:se.position}}function M(e){b(ce,JSON.stringify(e))}let N=`dsh.ui-usage-billing.currency`,ue=`dsh.ui-usage-billing.currency-pref`;function de(){let e=x(N);return e===`usd`||e===`cny`||e===`eur`?e:`cny`}function fe(e){b(N,e)}let pe=`dsh.ui-usage-billing.pinned`,me=`dsh.ui-usage-billing.pinned-pref`;function he(){let e=S(pe);return Array.isArray(e)?e.filter(e=>typeof e==`string`&&e!==``):[]}function ge(e){b(pe,JSON.stringify(e))}let _e=`dsh.ui-usage-billing.provider-expanded`;function ve(){let e=S(_e);return Array.isArray(e)?e.filter(e=>typeof e==`string`&&/^(ch|sub|bal):/.test(e)):[]}function ye(e){b(_e,JSON.stringify(e))}let be=`dsh.ui-usage-billing.providers-today`;function xe(){return x(be)===`1`}function Se(e){b(be,e?`1`:`0`)}let P=`dsh.ui-usage-billing.language`;function Ce(){let e=x(P);if(e===`en`||e===`zh`)return e;let t=de()===`usd`?`en`:`zh`;return we(t),t}function we(e){b(P,e)}function Te(e){let t=he(),n=t.includes(e)?t.filter(t=>t!==e):[...t,e];return ge(n),n}let F=`dsh.ui-usage-billing.prices`;function Ee(){let e=S(F);if(e==null)return[];let t=[],n=(e,n)=>{if(typeof n!=`object`||!n)return;let r=n,i=Number(r.input),a=Number(r.cacheHit),o=Number(r.output);if(![i,a,o].every(e=>Number.isFinite(e)&&e>=0))return;let s=r.offPeak,c;if(typeof s==`object`&&s){let e=s,t=Number(e.input),n=Number(e.cacheHit),r=Number(e.output);[t,n,r].every(e=>Number.isFinite(e)&&e>=0)&&(c={input:t,cacheHit:n,output:r})}t.push({key:e,...typeof r.origin==`string`&&r.origin!==``?{origin:r.origin}:{},input:i,cacheHit:a,output:o,...c===void 0?{}:{offPeak:c},...r.currency===`USD`?{currency:`USD`}:{}})};if(Array.isArray(e))for(let t of e){if(typeof t!=`object`||!t)continue;let e=t;typeof e.key==`string`&&e.key!==``&&n(e.key,t)}else if(typeof e==`object`)for(let[t,r]of Object.entries(e))n(t,r);return t}function De(e){b(F,JSON.stringify(e))}let Oe={metric:`ttft`},ke=`dsh.ui-usage-billing.perf`;function Ae(){let e=S(ke);if(typeof e!=`object`||!e)return{...Oe};let t=e;return{metric:t.metric===`tps`?`tps`:`ttft`,...Array.isArray(t.models)?{models:t.models.filter(e=>typeof e==`string`)}:{}}}function je(e){b(ke,JSON.stringify(e))}let Me=`@kenz1117/dsh-ui-usage-billing/UsageBilling.module.css`;if(typeof document<`u`&&document.querySelector(`style[data-plugin-css=`+JSON.stringify(Me)+`]`)===null){let e=document.createElement(`style`);e.dataset.plugin=`@kenz1117/dsh-ui-usage-billing`,e.dataset.pluginCss=Me,e.textContent=`:root{--ds-blue:#4f8cff;--ds-cyan:#2dd4bf;--ds-green:#34d399;--ds-amber:#f59e0b;--ds-red:#ef4444;--ds-violet:#a78bfa}body{--dsb:var(--dsw-alias-bg-layer-1);--dsb-2:var(--dsw-alias-bg-layer-2);--dsb-3:var(--dsw-alias-bg-layer-3);--dsb-glass:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 78%,transparent);--dsb-glass-strong:color-mix(in srgb,var(--dsw-alias-bg-layer-3) 88%,transparent);--ds-border:var(--dsw-alias-border-l1);--ds-border-strong:var(--dsw-alias-border-l2);--ds-hi-top:#ffffff0b;--ds-shadow-1:0 1px 0 #ffffff0a inset,0 8px 24px #00000059;--ds-shadow-2:0 1px 0 #ffffff0d inset,0 18px 48px #00000080;--ds-t-1:var(--dsw-alias-label-primary);--ds-t-2:var(--dsw-alias-label-secondary);--ds-t-3:var(--dsw-alias-label-tertiary);--ds-t-4:var(--dsw-alias-label-dimmed);--ds-c-1:#4f8cff;--ds-c-2:#2dd4bf;--ds-c-3:#a78bfa;--ds-c-4:#f59e0b;--ds-c-5:#f472b6;--ds-c-6:#fbbf24;--ds-c-7:#38bdf8;--ds-r-1:8px;--ds-r-2:12px;--ds-r-3:16px;--ds-t-fast:.16s cubic-bezier(.2,.8,.2,1)}.KFXqYa_railButton{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);background:var(--dsb-2);width:36px;height:36px;color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast);flex:none;justify-content:center;align-items:center;padding:0;display:flex}.KFXqYa_railButton:hover,.KFXqYa_railButton:focus-visible{border-color:var(--ds-blue);color:var(--ds-blue);outline:none}.KFXqYa_railButton svg{width:26px;height:26px}.KFXqYa_triggerBudgetPulse{border-color:color-mix(in srgb, var(--ds-red) 55%, transparent);animation:2s ease-in-out infinite KFXqYa_budgetPulse}.KFXqYa_triggerBudgetOver{animation-duration:1.2s}@keyframes KFXqYa_budgetPulse{0%,to{box-shadow:0 1px 2px #0000000a,0 0 #ef444400}50%{box-shadow:0 1px 2px #0000000a,0 0 0 3px #ef444429}}.KFXqYa_trigger{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);-webkit-backdrop-filter:blur(14px)saturate(1.2);width:100%;min-width:0;color:var(--ds-t-1);cursor:pointer;text-align:left;transition:border-color var(--ds-t-fast), transform var(--ds-t-fast), box-shadow var(--ds-t-fast);align-items:center;gap:12px;padding:10px 14px;display:flex;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a}.KFXqYa_trigger:hover,.KFXqYa_trigger:focus-visible{border-color:var(--ds-border-strong);box-shadow:0 6px 18px -8px color-mix(in srgb, var(--ds-blue) 45%, transparent);outline:none;transform:translateY(-1px)}.KFXqYa_trigger:before{content:"";background:linear-gradient(180deg, var(--ds-hi-top), transparent);pointer-events:none;height:1px;position:absolute;top:0;left:0;right:0}.KFXqYa_trigger:after{content:"";background:linear-gradient(105deg, transparent 42%, color-mix(in srgb, var(--ds-blue) 9%, transparent) 50%, transparent 58%);opacity:0;pointer-events:none;position:absolute;inset:0;transform:translate(-110%)}.KFXqYa_trigger:hover:after,.KFXqYa_trigger:focus-visible:after{animation:.9s ease-out KFXqYa_triggerScan}@keyframes KFXqYa_triggerScan{0%{opacity:0;transform:translate(-110%)}25%{opacity:1}to{opacity:0;transform:translate(110%)}}@media (prefers-reduced-motion:reduce){.KFXqYa_triggerSparkBar,.KFXqYa_trigger:hover:after,.KFXqYa_trigger:focus-visible:after{animation:none}.KFXqYa_triggerGaugeNeedle,.KFXqYa_triggerGaugeArc{transition:none}.KFXqYa_triggerBudgetPulse{animation:none}}.KFXqYa_triggerIcon{width:32px;height:32px;color:var(--ds-blue);flex:none;justify-content:center;align-items:center;display:inline-flex}.KFXqYa_triggerIcon svg{width:30px;height:30px}.KFXqYa_triggerGaugeNeedle{transition:transform 1.1s cubic-bezier(.22,1,.36,1)}.KFXqYa_triggerGaugeArc{transition:stroke-dasharray 1.1s cubic-bezier(.22,1,.36,1)}.KFXqYa_triggerBudgetHot{color:var(--ds-red)}.KFXqYa_triggerMain{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.KFXqYa_triggerPrimary{flex-direction:column;gap:1px;min-width:0;display:flex}.KFXqYa_triggerValueRow{align-items:baseline;gap:2px;min-width:0;display:flex}.KFXqYa_triggerLabel{color:var(--ds-t-3);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:15px;overflow:hidden}.KFXqYa_triggerYen{color:var(--ds-t-3);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;line-height:16px}.KFXqYa_triggerMetric{color:var(--ds-t-1);font-variant-numeric:tabular-nums;white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:22px;font-weight:600;line-height:26px;overflow:hidden}.KFXqYa_triggerSpark{flex:none;align-items:flex-end;gap:2px;height:20px;display:flex}.KFXqYa_triggerSparkBar,.KFXqYa_triggerSparkHot{background:var(--ds-blue);opacity:.6;border-radius:1px 1px 0 0;width:3px}.KFXqYa_triggerSparkHot{opacity:1}.KFXqYa_triggerSparkBar{animation:3.6s ease-in-out infinite KFXqYa_triggerSparkBreath}.KFXqYa_triggerSparkBar:nth-child(2n){animation-delay:-1.2s}.KFXqYa_triggerSparkBar:nth-child(3n){animation-delay:-2.4s}@keyframes KFXqYa_triggerSparkBreath{0%,to{opacity:.6}50%{opacity:.34}}.KFXqYa_triggerWrap{flex:auto;width:100%;min-width:96px;max-width:100%;display:block;position:relative;container:KFXqYa_billing-trigger/inline-size}@container KFXqYa_billing-trigger (width<=210px){.KFXqYa_trigger{box-shadow:none;-webkit-backdrop-filter:none;background:0 0;border:none;border-radius:12px;padding:7px 8px}.KFXqYa_trigger:before,.KFXqYa_trigger:after{display:none}.KFXqYa_trigger:hover,.KFXqYa_trigger:focus-visible{background:var(--dsw-alias-interactive-bg-hover);box-shadow:none;border-color:#0000;transform:none}.KFXqYa_triggerSpark,.KFXqYa_triggerLabel{display:none}}@container KFXqYa_billing-trigger (width<=140px){.KFXqYa_triggerMain{display:none}}.KFXqYa_triggerPop{box-sizing:border-box;border:1px solid var(--ds-border-strong);border-radius:var(--ds-r-3);background:var(--dsb-glass-strong);-webkit-backdrop-filter:blur(14px)saturate(1.2);width:256px;box-shadow:var(--ds-shadow-2);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--ds-t-fast), transform var(--ds-t-fast), visibility 0s linear .16s;z-index:2000;flex-direction:column;gap:5px;padding:10px 12px;display:flex;position:fixed;top:0;left:0;overflow:hidden;transform:translateY(calc(4px - 100%))}.KFXqYa_triggerPop,.KFXqYa_triggerPop *{box-sizing:border-box}.KFXqYa_triggerPop:before{content:"";background:linear-gradient(90deg, transparent 10%, var(--ds-amber) 50%, transparent 90%);opacity:.65;pointer-events:none;height:1.5px;position:absolute;top:0;left:0;right:0}.KFXqYa_triggerPopShown{opacity:1;visibility:visible;transition:opacity var(--ds-t-fast), transform var(--ds-t-fast), visibility 0s linear 0s;transform:translateY(-100%)}.KFXqYa_popHead{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.KFXqYa_popTitle{letter-spacing:.06em;text-transform:uppercase;color:var(--ds-t-3);font-size:12px;font-weight:700;line-height:18px}.KFXqYa_metricGrid{grid-template-columns:repeat(3,1fr);gap:10px 12px;display:grid}.KFXqYa_metricCell{flex-direction:column;gap:2px;min-width:0;display:flex}.KFXqYa_metricLabel{color:var(--ds-t-3);font-size:11px;line-height:14px}.KFXqYa_metricValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;white-space:nowrap;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:13px;font-weight:700;line-height:16px}.KFXqYa_metricValueSuccess{color:var(--ds-green)}.KFXqYa_popModel{border-top:1px dashed var(--ds-border);flex-direction:column;gap:6px;margin-top:9px;padding-top:10px;display:flex}.KFXqYa_popModelLabel{color:var(--ds-t-3);font-size:10px;line-height:14px}.KFXqYa_popModelRow{align-items:center;gap:8px;min-width:0;display:flex}.KFXqYa_popDot{border-radius:999px;flex:none;width:6px;height:6px}.KFXqYa_popDotDirect{background:var(--ds-green)}.KFXqYa_popDotSub{background:var(--ds-amber)}.KFXqYa_popDotNeutral{background:var(--ds-t-3)}.KFXqYa_popTagPrimary,.KFXqYa_popTagSub{white-space:nowrap;border-radius:5px;flex:none;align-items:center;height:18px;padding:0 6px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_popTagPrimary{background:color-mix(in srgb, var(--ds-blue) 14%, transparent);color:var(--ds-blue)}.KFXqYa_popTagSub{background:color-mix(in srgb, var(--ds-amber) 18%, transparent);color:var(--ds-amber)}.KFXqYa_popModelName{color:var(--ds-t-2);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}.KFXqYa_popModelStatus{color:var(--ds-t-1);font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:11px;font-weight:600;line-height:16px}.KFXqYa_popModelStatusLow{color:var(--ds-red)}.KFXqYa_dashboardModal{border:1px solid var(--ds-border-strong);border-radius:var(--ds-r-3);background:var(--dsb-2);width:min(760px,100vw - 48px);max-height:min(760px,88vh);box-shadow:var(--ds-shadow-2);animation:.16s ease-out KFXqYa_dashboardIn}@keyframes KFXqYa_dashboardIn{0%{opacity:0;transform:translateY(4px)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)}.KFXqYa_dashboard{flex-direction:column;width:100%;max-height:min(760px,88vh);display:flex}.KFXqYa_dashboardHead{border-bottom:1px solid var(--ds-border);justify-content:space-between;align-items:center;gap:12px;padding:12px 18px;display:flex}.KFXqYa_dashboardTitle{color:var(--ds-t-1);margin:0;font-size:14px;font-weight:600;line-height:20px}.KFXqYa_dashboardSubtitle{color:var(--ds-t-3);margin:2px 0 0;font-size:11px;line-height:16px}.KFXqYa_closeButton{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);width:32px;height:32px;color:var(--ds-t-2);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast);background:0 0;flex:none;justify-content:center;align-items:center;display:inline-flex}.KFXqYa_closeButton:hover{background:var(--dsb-3);color:var(--ds-t-1)}.KFXqYa_closeButton svg{stroke-width:2px;width:16px;height:16px}.KFXqYa_dashboardBody{flex-direction:column;gap:14px;padding:16px 24px 24px;display:flex;overflow-y:auto}.KFXqYa_modalFooter{border-top:1px solid var(--ds-border);color:var(--ds-t-3);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:8px 18px;font-size:11px;line-height:16px;display:flex}.KFXqYa_tabNav{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);background:var(--dsb);align-items:center;gap:4px;margin:14px 24px 0;padding:4px;display:flex}.KFXqYa_tabButton{color:var(--ds-t-3);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast), box-shadow var(--ds-t-fast);background:0 0;border:none;border-radius:6px;padding:6px 12px;font-size:12px;font-weight:500;line-height:16px}.KFXqYa_tabButton:hover{color:var(--ds-t-2)}.KFXqYa_tabButton:focus-visible{color:var(--ds-t-2);box-shadow:0 0 0 1px var(--ds-border-strong);outline:none}.KFXqYa_tabButtonActive,.KFXqYa_tabButtonActive:hover,.KFXqYa_tabButtonActive:focus-visible{background:var(--dsb-3);color:var(--ds-t-1);box-shadow:0 0 0 1px var(--ds-border-strong) inset;font-weight:600}.KFXqYa_tabPanel{flex-direction:column;gap:14px;animation:.14s ease-out KFXqYa_tabPanelIn;display:flex}@keyframes KFXqYa_tabPanelIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.KFXqYa_reconcileNotice{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 78%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);color:var(--dsw-alias-label-secondary);border-radius:10px;align-items:flex-start;gap:10px;padding:10px 12px;font-size:12px;line-height:1.55;display:flex}.KFXqYa_reconcileIcon{color:var(--dsw-alias-label-tertiary);flex:none;margin-top:1px;display:inline-flex}.KFXqYa_reconcileText{flex:1}.KFXqYa_reconcileDismiss{color:var(--dsw-alias-label-tertiary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;flex:none;padding:2px 8px;font-size:12px;line-height:1.4;transition:color .15s,background-color .15s}.KFXqYa_reconcileDismiss:hover{color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent)}.KFXqYa_hero{border:1px solid var(--ds-border);border-radius:var(--ds-r-3);background:var(--dsb-glass-strong);flex-direction:column;gap:12px;padding:18px 20px;display:flex;position:relative;overflow:hidden}.KFXqYa_hero:after{content:"";background:linear-gradient(90deg, transparent 10%, var(--ds-amber) 50%, transparent 90%);opacity:.65;pointer-events:none;height:1.5px;position:absolute;top:0;left:0;right:0}.KFXqYa_heroTop{justify-content:space-between;align-items:center;gap:24px;display:flex}.KFXqYa_heroMain{flex-direction:column;gap:2px;min-width:0;display:flex}.KFXqYa_heroLabel{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;font-size:11px;font-weight:500;line-height:15px}.KFXqYa_heroReadout{align-items:baseline;gap:4px;display:flex}.KFXqYa_heroCurrency{letter-spacing:-.01em;color:var(--ds-t-2);font-variant-numeric:tabular-nums;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:22px;font-weight:600;line-height:26px}.KFXqYa_heroValue{letter-spacing:-.03em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--ds-t-1);font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:52px;font-weight:600;line-height:56px}.KFXqYa_heroMeta{color:var(--ds-t-2);white-space:nowrap;margin-top:2px;font-size:12px;line-height:16px}.KFXqYa_heroGauge{flex-direction:column;flex:none;align-items:center;gap:4px;width:96px;display:flex}.KFXqYa_heroGaugeDial{flex:none;width:96px;height:96px;position:relative}.KFXqYa_heroGaugeSvg{width:100%;height:100%;display:block;transform:rotate(-90deg)}.KFXqYa_heroGaugeTrack{fill:none;stroke:var(--dsb-3);stroke-width:7px}.KFXqYa_heroGaugeArc{fill:none;stroke:var(--ds-blue);stroke-width:7px;stroke-linecap:round;transition:stroke-dasharray var(--ds-t-fast)}.KFXqYa_heroGaugeArcOver{stroke:var(--ds-red)}.KFXqYa_heroGaugeCenter{flex-direction:column;justify-content:center;align-items:center;gap:1px;display:flex;position:absolute;inset:0}.KFXqYa_heroGaugeRemain{letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--ds-t-1);font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:16px;font-weight:600;line-height:18px}.KFXqYa_heroGaugeRemainOver{color:var(--ds-red)}.KFXqYa_heroGaugeLabel{color:var(--ds-t-3);font-size:11px;line-height:13px}.KFXqYa_heroGaugeSub{font-variant-numeric:tabular-nums;color:var(--ds-t-2);white-space:nowrap;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;line-height:12px}.KFXqYa_heroSide{border-top:1px solid var(--ds-border);align-items:stretch;padding-top:12px;display:flex}.KFXqYa_heroSideItem{border-left:1px solid var(--ds-border);flex-direction:column;flex:1;gap:2px;min-width:0;padding-left:14px;display:flex}.KFXqYa_heroSideItem:first-child{border-left:none;padding-left:0}.KFXqYa_heroSideLabel{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;font-size:10px;font-weight:500;line-height:13px}.KFXqYa_heroSideValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;letter-spacing:-.01em;white-space:nowrap;align-items:baseline;gap:6px;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:15px;font-weight:600;line-height:20px;display:inline-flex}.KFXqYa_heroSideSpacer{flex:1;display:block}.KFXqYa_delta{font-variant-numeric:tabular-nums;border-radius:999px;align-items:center;gap:2px;margin-left:6px;padding:1px 7px;font-size:10.5px;font-weight:600;line-height:16px;display:inline-flex}.KFXqYa_deltaUp{color:var(--ds-green);background:color-mix(in srgb, var(--ds-green) 12%, transparent)}.KFXqYa_deltaDown{color:var(--ds-red);background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_unpricedHint{border:1px solid color-mix(in srgb, var(--ds-amber) 30%, transparent);background:color-mix(in srgb, var(--ds-amber) 8%, transparent);color:var(--ds-amber);border-radius:8px;align-items:center;padding:8px 12px;font-size:11.5px;font-weight:500;line-height:17px;display:flex}.KFXqYa_kpiZone{flex-direction:column;gap:8px;display:flex}.KFXqYa_kpiZoneHead{justify-content:flex-end;align-items:center;gap:8px;display:flex}.KFXqYa_kpiZoneLabel{color:var(--ds-t-3);font-size:11px;line-height:14px}.KFXqYa_kpiGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.KFXqYa_kpiTile{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);transition:border-color var(--ds-t-fast);flex-direction:column;gap:2px;padding:14px 16px;display:flex;position:relative;overflow:hidden}.KFXqYa_kpiTile:hover{border-color:var(--ds-border-strong)}.KFXqYa_kpiLabel{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.04em;font-size:11px;font-weight:500;line-height:14px}.KFXqYa_kpiValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;letter-spacing:-.01em;margin-top:6px;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:22px;font-weight:600;line-height:26px}.KFXqYa_kpiGreen{color:var(--ds-green)}.KFXqYa_kpiDetail{color:var(--ds-t-3);white-space:nowrap;text-overflow:ellipsis;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:11px;line-height:15px;overflow:hidden}.KFXqYa_panel{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);transition:border-color var(--ds-t-fast);flex-direction:column;gap:8px;padding:12px 14px;display:flex}.KFXqYa_panelHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.KFXqYa_panelHeadControls{align-items:center;gap:8px;display:inline-flex}.KFXqYa_panelTitle{letter-spacing:-.005em;color:var(--ds-t-1);margin:0;font-size:13px;font-weight:600;line-height:20px}.KFXqYa_panelHint{color:var(--ds-t-3);white-space:nowrap;font-size:11px;line-height:16px}.KFXqYa_rangeToggle{border:1px solid var(--ds-border);background:var(--dsb-3);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.KFXqYa_rangeButton{color:var(--ds-t-3);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast);background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:11px;line-height:16px}.KFXqYa_rangeButtonActive{background:var(--dsb-2);color:var(--ds-t-1);box-shadow:0 0 0 1px var(--ds-border-strong);font-weight:600}.KFXqYa_exportBar{justify-content:flex-end;align-items:center;gap:8px;display:flex}.KFXqYa_exportLabel{color:var(--ds-t-3);font-size:11px;line-height:16px}.KFXqYa_exportButton{border:1px solid var(--ds-border);color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast), background-color var(--ds-t-fast);background:0 0;border-radius:999px;padding:4px 12px;font-size:11.5px;line-height:16px}.KFXqYa_exportButton:hover,.KFXqYa_exportButton:focus-visible{border-color:var(--ds-border-strong);color:var(--ds-t-1);outline:none}.KFXqYa_exportButton:disabled{opacity:.45;cursor:not-allowed}.KFXqYa_exportButton:disabled:hover{border-color:var(--ds-border);color:var(--ds-t-2)}.KFXqYa_shareTrack{background:var(--dsb-3);border-radius:4px;height:8px;display:flex;overflow:hidden}.KFXqYa_shareSeg{height:100%;transition:width var(--ds-t-fast)}.KFXqYa_shareSegPeak{background:var(--ds-blue)}.KFXqYa_shareSegOff{background:color-mix(in srgb, var(--ds-blue) 30%, var(--dsb-3))}.KFXqYa_shareSegUser{background:var(--ds-blue)}.KFXqYa_shareSegAssistant{background:var(--ds-green)}.KFXqYa_shareSegTool{background:var(--ds-amber)}.KFXqYa_shareLegend{align-items:center;gap:16px;display:flex}.KFXqYa_shareItem{color:var(--ds-t-2);align-items:baseline;gap:6px;font-size:11px;line-height:17px;display:inline-flex}.KFXqYa_bucketCost{font-variant-numeric:tabular-nums;align-items:baseline;gap:3px;display:inline-flex}.KFXqYa_bucketOfficial{color:var(--ds-blue);font-weight:600}.KFXqYa_bucketSep{color:var(--ds-t-4)}.KFXqYa_bucketThird{color:var(--ds-t-2)}.KFXqYa_shareDot{border-radius:2px;flex:none;align-self:center;width:8px;height:8px}.KFXqYa_shareValue{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-weight:600}.KFXqYa_budgetInput{width:64px;color:var(--ds-t-1);font-variant-numeric:tabular-nums;text-align:right;background:0 0;border:none;padding:0;font-size:12px;line-height:16px}.KFXqYa_budgetInput:focus-visible{outline:none}.KFXqYa_switch{border:1px solid var(--ds-border);background:var(--dsb-3);cursor:pointer;width:32px;height:18px;transition:background-color var(--ds-t-fast), border-color var(--ds-t-fast);border-radius:999px;flex:none;padding:0;position:relative}.KFXqYa_switchOn{background:color-mix(in srgb, var(--ds-blue) 60%, transparent);border-color:#0000}.KFXqYa_switchKnob{width:12px;height:12px;transition:transform var(--ds-t-fast);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px}.KFXqYa_switchOn .KFXqYa_switchKnob{transform:translate(14px)}.KFXqYa_budgetFillWarn{background:var(--ds-amber)}.KFXqYa_budgetFillOver{background:var(--ds-red)}.KFXqYa_chartWrap{width:100%;position:relative}.KFXqYa_chartSvg{width:100%;height:auto;display:block}.KFXqYa_chartEmpty{height:140px;color:var(--ds-t-3);justify-content:center;align-items:center;font-size:13px;display:flex}.KFXqYa_emptyRow{text-align:center;color:var(--ds-t-3);padding:28px 0;font-size:13px}.KFXqYa_chartGrid{stroke:var(--ds-border);stroke-width:1px}.KFXqYa_chartAxisLabel{fill:var(--ds-t-3);font-size:10px}.KFXqYa_chartBar{fill:var(--ds-blue);opacity:.7}.KFXqYa_chartBar:hover{opacity:1}.KFXqYa_chartStack{stroke:var(--dsb);stroke-width:.75px}.KFXqYa_chartStack:hover{opacity:.9}.KFXqYa_chartLine{stroke:var(--ds-blue);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.KFXqYa_chartCrosshair{stroke:var(--ds-t-4);stroke-width:1px;stroke-dasharray:3 3}.KFXqYa_chartTooltip{pointer-events:none;z-index:2;border:1px solid var(--ds-border-strong);background:var(--dsb-2);box-shadow:var(--ds-shadow-1);white-space:nowrap;border-radius:8px;padding:8px 10px;position:absolute;transform:translate(-50%,calc(-100% - 10px))}.KFXqYa_chartTooltipAlignRight{transform:translate(calc(-100% - 8px),calc(-100% - 10px))}.KFXqYa_chartTooltipAlignLeft{transform:translate(8px,calc(-100% - 10px))}.KFXqYa_chartTooltipDate{color:var(--ds-t-1);margin-bottom:3px;font-size:11px;font-weight:600}.KFXqYa_chartTooltipRow{color:var(--ds-t-2);align-items:center;gap:5px;font-size:11px;line-height:17px;display:flex}.KFXqYa_chartTooltipRow strong{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-weight:600}.KFXqYa_chartTooltipHead{justify-content:space-between;align-items:baseline;gap:14px;margin-bottom:3px;display:flex}.KFXqYa_chartTooltipHead .KFXqYa_chartTooltipDate{margin-bottom:0}.KFXqYa_chartTooltipHead strong{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600}.KFXqYa_chartTooltipSplit{justify-content:space-between;gap:14px}.KFXqYa_chartTooltipLabel{align-items:center;gap:5px;display:flex}.KFXqYa_chartTooltipModelDetail{color:var(--ds-t-3);font-variant-numeric:tabular-nums;margin:-2px 0 4px 13px;font-size:10.5px;line-height:14px}.KFXqYa_chartBarPlaceholder{fill:color-mix(in srgb, var(--ds-t-2) 30%, transparent)}.KFXqYa_chartLegendLine{background:var(--ds-blue);border-radius:2px;width:10px;height:3px;display:inline-block}.KFXqYa_chartLegendBar{background:var(--ds-blue);opacity:.5;border-radius:2px;width:7px;height:7px;display:inline-block}.KFXqYa_chartTooltipSwatch{border-radius:2px;flex:none;width:8px;height:8px;display:inline-block}.KFXqYa_chartLegend{color:var(--ds-t-2);justify-content:flex-end;gap:14px;margin-top:2px;font-size:11px;display:flex}.KFXqYa_chartLegend span{align-items:center;gap:5px;display:inline-flex}.KFXqYa_chartLegendItem{font:inherit;color:inherit;cursor:pointer;background:0 0;border:none;align-items:center;gap:5px;padding:0;transition:color .12s;display:inline-flex}.KFXqYa_chartLegendItem:hover{color:var(--ds-t-1)}.KFXqYa_chartLegendItemActive{color:var(--ds-t-1);font-weight:600}.KFXqYa_perfBar{align-items:center;margin:10px 0 2px;display:flex}.KFXqYa_perfChips{flex-wrap:wrap;gap:6px;margin:6px 0 2px;display:flex}.KFXqYa_perfChip{border:1px solid var(--ds-border);background:var(--dsb-3);color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast), opacity var(--ds-t-fast);border-radius:999px;align-items:center;gap:5px;padding:2px 9px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_perfChip:hover{color:var(--ds-t-1)}.KFXqYa_perfChipOff{opacity:.45}.KFXqYa_perfChipDot{border-radius:2px;flex:none;width:8px;height:8px;display:inline-block}.KFXqYa_chartHoverDot{stroke:var(--dsb-2);stroke-width:1.5px}.KFXqYa_tableScroll{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);overflow:auto}.KFXqYa_ubAlert{border:1px solid color-mix(in srgb, var(--ds-blue) 30%, transparent);border-radius:var(--ds-r-1);background:color-mix(in srgb, var(--ds-blue) 8%, transparent);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;font-size:12px;line-height:17px;display:flex}.KFXqYa_ubAlertLeft{align-items:center;gap:8px;display:inline-flex}.KFXqYa_ubRate{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-weight:600}.KFXqYa_ubAlertNote{color:var(--ds-t-2);margin:0}.KFXqYa_ubTag,.KFXqYa_ubTagSuccess,.KFXqYa_ubTagNeutral,.KFXqYa_ubTagAlert,.KFXqYa_ubTagPromo{border:1px solid var(--ds-border-strong);white-space:nowrap;border-radius:999px;align-items:center;gap:4px;padding:1px 5px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_ubTag{color:var(--ds-t-2);background:var(--dsb-2)}.KFXqYa_ubTagSuccess{color:var(--ds-green);border-color:color-mix(in srgb, var(--ds-green) 36%, transparent);background:color-mix(in srgb, var(--ds-green) 12%, transparent)}.KFXqYa_ubTagNeutral{color:var(--ds-t-2);background:var(--dsb-2)}.KFXqYa_ubTagAlert{color:var(--ds-amber);border-color:color-mix(in srgb, var(--ds-amber) 36%, transparent);background:color-mix(in srgb, var(--ds-amber) 12%, transparent)}.KFXqYa_ubTagPromo{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 36%, transparent);background:color-mix(in srgb, var(--ds-red) 12%, transparent);cursor:help}.KFXqYa_ubExtraRow td{opacity:.72;padding-top:2px;padding-bottom:2px;font-size:12px}.KFXqYa_ubExtraName{color:var(--ds-t-2);margin-left:26px}.KFXqYa_ubExtraNote{color:var(--ds-t-3);margin-left:8px;font-size:10px}.KFXqYa_ubCard{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);flex-direction:column;gap:12px;padding:16px 18px;display:flex}.KFXqYa_ubCardHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.KFXqYa_ubCardTitle{color:var(--ds-t-1);margin:0;font-size:13px;font-weight:600;line-height:18px}.KFXqYa_ubCardSub{color:var(--ds-t-3);font-size:11px;line-height:16px}.KFXqYa_ubTablewrap{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);overflow:auto}.KFXqYa_ubTable{border-collapse:collapse;white-space:nowrap;width:100%;font-size:12px}.KFXqYa_ubTable th,.KFXqYa_ubTable td{border-bottom:1px solid var(--ds-border);text-align:left;color:var(--ds-t-1);padding:7px 9px}.KFXqYa_ubSearch{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);width:200px;max-width:45%;color:var(--ds-t-1);background:0 0;outline:none;align-self:center;margin-left:auto;padding:5px 9px;font-size:12px;line-height:18px}.KFXqYa_bandDots{flex:none;align-items:center;gap:5px;display:inline-flex}.KFXqYa_bandDot{cursor:pointer;background:0 0;border:1.5px solid;border-radius:999px;flex:none;width:9px;height:9px;padding:0}.KFXqYa_bandDotOn{background:currentColor}.KFXqYa_offPeak{color:var(--ds-blue)}.KFXqYa_soon{color:var(--ds-amber)}.KFXqYa_peak{color:var(--ds-red)}span.KFXqYa_bandDot{cursor:default}.KFXqYa_ubTable th,.KFXqYa_ubTable td:first-child{white-space:normal}.KFXqYa_ubTable tbody tr:last-child td{border-bottom:0}.KFXqYa_ubTable thead th,.KFXqYa_ubTable thead th.KFXqYa_numCol{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.04em;text-align:center;padding:6px 9px;font-size:11px;font-weight:500}.KFXqYa_ubModel{align-items:center;gap:6px;display:inline-flex}.KFXqYa_vendorLetter{color:#fff;border-radius:4px;flex:none;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;font-weight:600;line-height:1;display:inline-flex}.KFXqYa_ubModelName{color:var(--ds-t-1);align-items:center;gap:4px;font-weight:500;display:inline-flex}.KFXqYa_ubChipPeak,.KFXqYa_ubChipOff{font-variant-numeric:tabular-nums;border-radius:999px;align-items:center;gap:4px;height:18px;padding:0 6px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_ubChipLabel{font-size:10px;font-weight:600}.KFXqYa_ubChipPeak{background:color-mix(in srgb, var(--ds-blue) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-blue) 36%, transparent);color:var(--ds-blue)}.KFXqYa_ubChipOff{background:color-mix(in srgb, var(--ds-green) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-green) 36%, transparent);color:var(--ds-green)}.KFXqYa_ubNotes{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.KFXqYa_ubNotesItem{align-items:baseline;gap:10px;display:flex}.KFXqYa_ubNotesTerm{color:var(--ds-t-1);flex:0 0 72px;font-size:12px;font-weight:500}.KFXqYa_ubNotesDesc{min-width:0;color:var(--ds-t-2);flex:1;font-size:12px;line-height:17px}.KFXqYa_ubCardControlGroup{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.KFXqYa_ubTagError{white-space:nowrap;background:color-mix(in srgb, var(--ds-red) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-red) 36%, transparent);height:18px;color:var(--ds-red);border-radius:999px;align-items:center;padding:0 7px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_modelTable{border-collapse:collapse;table-layout:fixed;width:100%;min-width:640px;font-size:12px}.KFXqYa_modelTable th:first-child{width:26%}.KFXqYa_modelTable th,.KFXqYa_modelTable td{border-bottom:1px solid var(--ds-border);text-align:left;white-space:nowrap;color:var(--ds-t-1);padding:10px 12px}.KFXqYa_modelTable tbody tr:last-child td{border-bottom:0}.KFXqYa_sessionGroupRow{cursor:pointer}.KFXqYa_sessionGroupRow .KFXqYa_modelName:before{content:"›";color:var(--ds-t-3);margin-right:6px;display:inline-block}.KFXqYa_sessionGroupRow[aria-expanded=true] .KFXqYa_modelName:before{transform:rotate(90deg)}.KFXqYa_sessionGroupRow:focus-visible{outline:2px solid var(--ds-border-strong);outline-offset:-2px}.KFXqYa_sessionChildRow td:first-child{padding-left:30px}.KFXqYa_modelTable thead th{color:var(--ds-t-3);text-transform:uppercase;letter-spacing:.04em;background:0 0;padding:8px 12px;font-size:11px;font-weight:500}.KFXqYa_modelTable tbody tr{transition:background-color .12s}.KFXqYa_modelTable tbody tr:hover{background:0 0}.KFXqYa_modelTable tbody tr.KFXqYa_modelRowFocusable{cursor:pointer}.KFXqYa_modelTable tbody tr.KFXqYa_modelRowActive,.KFXqYa_modelTable tbody tr.KFXqYa_modelRowActive:hover{background:color-mix(in srgb, var(--ds-blue) 10%, transparent)}.KFXqYa_numCol{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums}.KFXqYa_modelTable .KFXqYa_numCol,.KFXqYa_ubTable .KFXqYa_numCol{text-align:right}.KFXqYa_na{color:var(--ds-t-4)}.KFXqYa_modelCell{align-items:center;gap:8px;display:inline-flex}.KFXqYa_modelDot{border-radius:2px;flex:none;width:8px;height:8px}.KFXqYa_modelName{color:var(--ds-t-1);font-weight:500;line-height:16px;display:block}.KFXqYa_modelProvider{color:var(--ds-t-3);font-size:10.5px;line-height:14px;display:block}.KFXqYa_siteRow{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);background:var(--dsb-2);justify-content:space-between;align-items:center;gap:12px;padding:8px 10px;display:flex}.KFXqYa_siteRowName{align-items:center;gap:8px;min-width:0;display:inline-flex}.KFXqYa_siteKindTag{white-space:nowrap;border:1px solid #0000;border-radius:999px;flex:none;align-items:center;padding:2px 7px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_siteKindSite{color:var(--ds-blue);border-color:color-mix(in srgb, var(--ds-blue) 36%, transparent);background:color-mix(in srgb, var(--ds-blue) 12%, transparent)}.KFXqYa_siteKindDirect{color:var(--ds-green);border-color:color-mix(in srgb, var(--ds-green) 36%, transparent);background:color-mix(in srgb, var(--ds-green) 12%, transparent)}.KFXqYa_siteKindUnknown{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 36%, transparent);background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_siteRowTitle{color:var(--ds-t-1);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.KFXqYa_siteRowMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.KFXqYa_siteRowCost{color:var(--ds-t-1);font-variant-numeric:tabular-nums;font-size:12.5px;font-weight:600;line-height:18px}.KFXqYa_siteRowCalls{color:var(--ds-t-2);font-variant-numeric:tabular-nums;font-size:11.5px;line-height:17px}.KFXqYa_siteRowCallsLow{color:var(--ds-red)}.KFXqYa_flatTag{color:var(--ds-t-3);font-size:10.5px;line-height:14px}.KFXqYa_healthDot{border-radius:50%;flex:none;width:6px;height:6px;display:inline-block}.KFXqYa_healthOk{background:var(--ds-green);box-shadow:0 0 0 3px color-mix(in srgb, var(--ds-green) 18%, transparent)}.KFXqYa_healthBad{background:var(--ds-red);box-shadow:0 0 0 3px color-mix(in srgb, var(--ds-red) 18%, transparent)}.KFXqYa_healthIdle{background:var(--ds-t-4)}.KFXqYa_dashboardRight{align-items:center;gap:8px;min-width:0;display:flex}.KFXqYa_healthBadge{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_healthBadgeOk{color:var(--ds-green);background:var(--dsb-2)}.KFXqYa_healthBadgeBad{color:var(--ds-red);background:var(--dsb-2)}.KFXqYa_planTag{color:var(--ds-green);white-space:nowrap;align-items:center;gap:4px;font-size:10px;font-weight:500;line-height:14px;display:inline-flex}.KFXqYa_planTagBadge{background:color-mix(in srgb, var(--ds-green) 20%, transparent);border-radius:4px;padding:0 4px;font-size:9px;line-height:12px}.KFXqYa_uncataloguedTag{border:1px solid color-mix(in srgb, var(--ds-amber) 36%, transparent);vertical-align:1px;color:var(--ds-amber);background:color-mix(in srgb, var(--ds-amber) 12%, transparent);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.KFXqYa_estimatedTag{border:1px solid color-mix(in srgb, var(--ds-blue) 36%, transparent);vertical-align:1px;color:var(--ds-blue);background:color-mix(in srgb, var(--ds-blue) 12%, transparent);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.KFXqYa_feeBar{border:1px solid var(--ds-border-strong);background:var(--dsb-glass-strong);backdrop-filter:blur(14px)saturate(1.3);color:var(--ds-t-2);font-variant-numeric:tabular-nums;border-radius:999px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 12px;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_feeBarAbove{order:-1;align-self:center;margin-bottom:8px}.KFXqYa_feeInline{font-variant-numeric:tabular-nums;white-space:nowrap;cursor:default;border-radius:999px;align-self:center;align-items:center;gap:5px;height:22px;padding:0 4px;font-size:11px;line-height:16px;display:inline-flex}.KFXqYa_feeInline .KFXqYa_feeChipPrimary,.KFXqYa_feeInline .KFXqYa_feeChipOff{height:18px;padding:0 7px}.KFXqYa_feeInlineNum{color:var(--ds-t-1);padding-right:6px;font-weight:600}.KFXqYa_feeInlineAlert{background:color-mix(in srgb, var(--ds-amber) 12%, transparent)}.KFXqYa_feeInlineAlert .KFXqYa_feeInlineNum{color:var(--ds-amber)}.KFXqYa_feeInlineError{background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_feeInlineError .KFXqYa_feeInlineNum{color:var(--ds-red)}.KFXqYa_feeBar .KFXqYa_feeSep{color:var(--ds-t-4)}.KFXqYa_feeCount{color:var(--ds-t-1);font-weight:600}.KFXqYa_feeSuffix{color:var(--ds-t-3)}.KFXqYa_feeItem{color:var(--ds-t-2);white-space:nowrap}.KFXqYa_feeNum{color:var(--ds-t-1);font-weight:600}.KFXqYa_feeSep{color:var(--ds-t-4)}.KFXqYa_feeChipPrimary,.KFXqYa_feeChipOff,.KFXqYa_feeChipAlert,.KFXqYa_feeChipError{border:1px solid var(--ds-border);background:var(--dsb-3);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;align-items:center;height:20px;padding:0 8px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_feeChipPrimary{color:var(--ds-blue);border-color:color-mix(in srgb, var(--ds-blue) 30%, transparent)}.KFXqYa_feeChipOff{color:var(--ds-cyan);border-color:color-mix(in srgb, var(--ds-cyan) 30%, transparent)}.KFXqYa_feeChipAlert{color:var(--ds-amber);border-color:color-mix(in srgb, var(--ds-amber) 30%, transparent)}.KFXqYa_feeChipError{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 30%, transparent)}.KFXqYa_balanceCell{align-items:center;gap:6px;display:inline-flex;position:relative}.KFXqYa_providerGroupRecharge{border:1px solid color-mix(in srgb, var(--ds-c-1) 38%, transparent);background:color-mix(in srgb, var(--ds-c-1) 8%, transparent);color:var(--ds-c-1);white-space:nowrap;border-radius:999px;justify-content:center;align-items:center;min-width:48px;padding:1px 8px;font-size:10.5px;font-weight:600;line-height:16px;text-decoration:none;display:inline-flex}.KFXqYa_providerGroupRecharge:empty{background:0 0;border-color:#0000}.KFXqYa_providerGroupRecharge:hover{background:color-mix(in srgb, var(--ds-c-1) 15%, transparent);border-color:color-mix(in srgb, var(--ds-c-1) 60%, transparent)}.KFXqYa_balanceDaysBadge{border:1px solid var(--ds-border-strong);background:var(--dsb-2);min-width:16px;height:16px;color:var(--ds-t-2);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;padding:0 4px;font-size:10px;font-weight:600;line-height:1;display:inline-flex}.KFXqYa_balanceDaysBadge:hover{border-color:var(--ds-t-3);color:var(--ds-t-1)}.KFXqYa_balanceDaysBadgeLow{color:var(--ds-red);border-color:color-mix(in srgb, var(--ds-red) 36%, transparent);background:color-mix(in srgb, var(--ds-red) 12%, transparent)}.KFXqYa_balanceDetailPop{z-index:20;background:var(--dsb-2);border:1px solid var(--ds-border-strong);min-width:180px;box-shadow:var(--ds-shadow-1);white-space:nowrap;border-radius:8px;flex-direction:column;gap:6px;padding:8px 10px;display:inline-flex;position:absolute;top:calc(100% + 6px);right:0}.KFXqYa_balanceDetailHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.KFXqYa_balanceDetailTitle{color:var(--ds-t-1);font-size:12px;font-weight:600}.KFXqYa_balanceDetailClose{cursor:pointer;color:var(--ds-t-3);background:0 0;border:none;font-size:14px;line-height:1}.KFXqYa_balanceDetailClose:hover{color:var(--ds-t-1)}.KFXqYa_balanceDetailGrid{flex-direction:column;gap:4px;display:inline-flex}.KFXqYa_balanceDetailRow{color:var(--ds-t-2);font-variant-numeric:tabular-nums;justify-content:space-between;gap:16px;font-size:11px;line-height:15px;display:flex}.KFXqYa_balanceDetailLabel{color:var(--ds-t-3)}.KFXqYa_balanceDetailValue{color:var(--ds-t-1);font-weight:500}.KFXqYa_currencyToggle{background:var(--dsw-alias-bg-layer-3);border:none;border-radius:8px;align-items:center;gap:2px;margin-right:8px;padding:2px;display:inline-flex}.KFXqYa_currencyButton{color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 8px;font-size:11px;font-weight:700;line-height:1}.KFXqYa_currencyButtonActive{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary)}.KFXqYa_subscriptionGrid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;margin-top:10px;display:grid}.KFXqYa_subscriptionCard{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);-webkit-backdrop-filter:blur(12px)saturate(1.3);transition:border-color var(--ds-t-fast);padding:14px 16px;position:relative;overflow:hidden}.KFXqYa_subscriptionHead{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.KFXqYa_subscriptionName{color:var(--ds-t-1);font-size:13px;font-weight:600}.KFXqYa_subscriptionPlan{color:var(--ds-t-2);font-size:11px}.KFXqYa_subscriptionPlan[data-kind=code],.KFXqYa_subscriptionPlan[data-kind=token]{color:var(--ds-t-2);background:var(--dsb-3);border-radius:999px;padding:1px 8px;font-weight:500}.KFXqYa_subscriptionTier{color:var(--ds-t-3);margin-left:6px}.KFXqYa_subscriptionAuto{border:1px solid color-mix(in srgb, var(--ds-blue) 36%, transparent);color:var(--ds-blue);background:color-mix(in srgb, var(--ds-blue) 12%, transparent);border-radius:999px;margin-left:6px;padding:1px 6px;font-size:10px}.KFXqYa_subscriptionStatus{color:var(--ds-t-2);margin-bottom:6px;font-size:11px}.KFXqYa_subscriptionWindow{align-items:center;gap:10px;margin-top:8px;font-size:11px;display:flex}.KFXqYa_subscriptionWindowLabel{color:var(--ds-t-3);flex:0 0 44px}.KFXqYa_subscriptionTrack{background:var(--dsb-3);height:6px;box-shadow:inset 0 0 0 1px var(--ds-border);border-radius:3px;flex:1;overflow:hidden}.KFXqYa_subscriptionFill{background:var(--ds-blue);height:calc(100% - 2px);transition:width var(--ds-t-fast);border-radius:2px;margin:1px;display:block}.KFXqYa_subscriptionFillWarn{background:var(--ds-amber)}.KFXqYa_subscriptionFillOver{background:var(--ds-red)}.KFXqYa_subscriptionMeta{flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.KFXqYa_subscriptionPct{text-align:right;min-width:52px;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ds-t-1);flex:none}.KFXqYa_subscriptionExhausted{color:var(--ds-red);min-width:52px;font-weight:600}.KFXqYa_subscriptionReset{color:var(--ds-t-3);white-space:nowrap;flex:none;font-size:10px}.KFXqYa_providerGroupList{flex-direction:column;gap:10px;display:flex}.KFXqYa_providerGroup{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);padding:12px 14px}.KFXqYa_providerGroupHead{justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;display:flex}.KFXqYa_providerGroupCollapsible{cursor:pointer}.KFXqYa_providerGroupCollapsible .KFXqYa_providerGroupTitle:before{content:"›";color:var(--ds-t-3);margin-right:6px;display:inline-block}.KFXqYa_providerGroupCollapsible[aria-expanded=true] .KFXqYa_providerGroupTitle:before{transform:rotate(90deg)}.KFXqYa_providerGroupCollapsible:focus-visible{outline:2px solid var(--ds-border-strong);outline-offset:2px;border-radius:6px}.KFXqYa_providerCtlRow{align-items:center;gap:12px;margin-bottom:10px;display:flex}.KFXqYa_providerTodayToggle{color:var(--ds-t-3);align-items:center;gap:7px;font-size:11px;display:inline-flex}.KFXqYa_providerGroupTitle{align-items:center;gap:7px;min-width:0;display:inline-flex}.KFXqYa_kindBadge{border:1px solid color-mix(in srgb, var(--ds-c-1) 32%, transparent);background:color-mix(in srgb, var(--ds-c-1) 10%, transparent);color:var(--ds-c-1);border-radius:4px;flex:none;padding:1px 6px;font-size:10px;font-weight:600;line-height:15px}.KFXqYa_kindBadgeRelay{border-color:color-mix(in srgb, var(--ds-c-2) 32%, transparent);background:color-mix(in srgb, var(--ds-c-2) 10%, transparent);color:var(--ds-c-2)}.KFXqYa_kindBadgeUnknown{border-color:var(--ds-border);background:color-mix(in srgb, var(--ds-t-3) 12%, transparent);color:var(--ds-t-3)}.KFXqYa_providerGroupName{color:var(--ds-t-1);font-size:13px;font-weight:600;line-height:18px}.KFXqYa_providerGroupMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.KFXqYa_providerGroupBadge{border:1px solid color-mix(in srgb, var(--ds-green) 36%, transparent);color:var(--ds-green);background:color-mix(in srgb, var(--ds-green) 12%, transparent);border-radius:999px;justify-content:center;align-items:center;padding:1px 8px;font-size:10px;font-weight:500;line-height:16px;display:inline-flex}.KFXqYa_providerGroupBalance,.KFXqYa_providerGroupCost{color:var(--ds-t-2);font-variant-numeric:tabular-nums;white-space:nowrap;justify-content:flex-end;align-items:baseline;gap:6px;min-width:118px;font-size:12px;line-height:17px;display:inline-flex}.KFXqYa_providerGroupCostLabel{font-size:11px}.KFXqYa_providerGroupCostValue{color:var(--ds-t-1);text-align:right;min-width:56px;font-weight:600}.KFXqYa_providerGroupBalanceLabel{color:var(--ds-t-3);font-size:11px;line-height:17px}.KFXqYa_rounds{margin-top:10px}.KFXqYa_roundsBars{align-items:flex-end;gap:3px;height:124px;padding:16px 2px 0;display:flex;overflow-x:auto}.KFXqYa_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}.KFXqYa_roundsBarColPeak{background:color-mix(in srgb, var(--ds-amber) 16%, transparent)}.KFXqYa_roundsBarColOff{background:var(--dsb-3)}.KFXqYa_roundsBarLabel{text-align:center;color:var(--ds-t-2);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%)}.KFXqYa_roundsBarWrap{flex:1;align-items:flex-end;min-height:0;display:flex}.KFXqYa_roundsBar{background:var(--ds-blue);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.KFXqYa_roundsBarFlagged{background:var(--ds-red);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.KFXqYa_roundsFlagMark{background:var(--ds-red);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-3px}.KFXqYa_roundsAxis{color:var(--ds-t-3);justify-content:space-between;margin-top:6px;font-size:10px;display:flex}.KFXqYa_roundsEmpty{color:var(--ds-t-2);margin-top:10px;font-size:12px}.KFXqYa_heatmap{margin-top:10px}.KFXqYa_heatmapGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:3px;display:grid}.KFXqYa_heatmapCellEmpty{box-sizing:border-box;border:1px dashed var(--ds-border);height:30px;color:var(--ds-t-4);font-variant-numeric:tabular-nums;background:0 0;border-radius:2px;justify-content:center;align-items:center;font-size:11px;display:flex}.KFXqYa_heatmapCell{font-variant-numeric:tabular-nums;cursor:pointer;border:0;border-radius:2px;justify-content:center;align-items:center;height:30px;padding:0;font-size:11px;display:flex}.KFXqYa_heatmapCell[data-level="0"],.KFXqYa_heatmapCell[data-level="1"],.KFXqYa_heatmapCell[data-level="2"]{color:var(--dsw-alias-label-primary)}.KFXqYa_heatmapCell[data-level="3"],.KFXqYa_heatmapCell[data-level="4"]{color:var(--dsw-static-neutral-bluish-00)}.KFXqYa_heatmapFooter{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin-top:10px;font-size:10px;display:flex}.KFXqYa_heatmapLegend{gap:3px;display:inline-flex}.KFXqYa_heatmapLegend i{border-radius:2px;width:14px;height:14px;display:block}.KFXqYa_heatmapHover{font-variant-numeric:tabular-nums;margin-left:auto;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace}.KFXqYa_heatmapRangeSwitch{gap:4px;margin-left:auto;display:inline-flex}.KFXqYa_heatmapRangeButton{border:1px solid var(--ds-border);color:var(--ds-t-2);cursor:pointer;background:0 0;border-radius:6px;padding:2px 8px;font-size:11px;line-height:1.4}.KFXqYa_heatmapRangeButtonActive{border-color:var(--ds-border-strong);color:var(--ds-t-1);font-weight:600}.KFXqYa_heatmapYear{flex-direction:column;gap:6px;display:flex}.KFXqYa_heatmapYearBody{align-items:flex-start;gap:6px;display:flex}.KFXqYa_heatmapYearWeekdays{color:var(--ds-t-3);flex:none;grid-template-rows:repeat(7,11px);gap:3px;padding-top:12px;font-size:9px;line-height:11px;display:grid}.KFXqYa_heatmapYearWeekday{white-space:nowrap;text-align:right;height:11px}.KFXqYa_heatmapYearMonths{min-width:max-content;color:var(--ds-t-3);grid-template-columns:repeat(52,11px);gap:3px;font-size:9px;line-height:12px;display:grid;overflow:visible}.KFXqYa_heatmapYearMonth{white-space:nowrap;overflow:visible}.KFXqYa_heatmapYearScroll{padding-bottom:2px;overflow-x:auto}.KFXqYa_heatmapYearGrid{grid-template-rows:repeat(7,11px);grid-auto-flow:column;gap:3px;min-width:max-content;display:grid}.KFXqYa_heatmapYearCell{cursor:pointer;border:0;border-radius:2px;width:11px;height:11px;padding:0}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearWeekdays{grid-template-rows:repeat(7,16px);line-height:16px}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearWeekday{height:16px}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearMonths{grid-template-columns:repeat(26,16px)}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearGrid{grid-template-rows:repeat(7,16px)}.KFXqYa_heatmapHalf .KFXqYa_heatmapYearCell{border-radius:3px;width:16px;height:16px}.KFXqYa_floatSub{flex-direction:column;gap:6px;min-width:0;display:flex}.KFXqYa_floatSubHead{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.KFXqYa_floatSubName{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:700}.KFXqYa_floatSubPlan{color:var(--dsw-alias-label-secondary);font-size:10px}.KFXqYa_floatSub .KFXqYa_subscriptionWindow{flex-wrap:wrap;gap:4px 10px}.KFXqYa_floatSub .KFXqYa_subscriptionWindowLabel{flex:none}.KFXqYa_floatSub .KFXqYa_subscriptionMeta{min-width:0;max-width:100%}.KFXqYa_floatSub .KFXqYa_subscriptionPct{min-width:0}.KFXqYa_floatSub .KFXqYa_subscriptionReset{white-space:normal;overflow-wrap:anywhere}.KFXqYa_triggerPopEmpty{color:var(--dsw-alias-label-tertiary);padding:2px 0;font-size:11px;line-height:1.5}.KFXqYa_triggerPopSwitcher{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.KFXqYa_triggerPopSwitchCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:10px}.KFXqYa_floatModeBtn{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) 60%, transparent);color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;border-radius:10px;flex:1;padding:7px 10px;font-size:12px}.KFXqYa_floatModeBtnOn{border-color:var(--ds-blue);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--ds-blue) 16%, transparent)}.KFXqYa_rdoRow{justify-content:space-between;align-items:center;gap:8px;margin-top:10px;display:flex}.KFXqYa_rdoLabel{color:var(--dsw-alias-label-secondary);font-size:12px}.KFXqYa_rdoSelect{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) 60%, transparent);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;border-radius:10px;align-items:center;gap:5px;padding:5px 8px 5px 10px;font-size:12px;display:inline-flex}.KFXqYa_rdoSelect:hover{background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 85%, transparent)}.KFXqYa_rdoSelect:focus-visible{border-color:var(--ds-blue);outline:none}.KFXqYa_rdoChevron{color:var(--dsw-alias-label-tertiary);transition:transform .15s;display:inline-flex}.KFXqYa_rdoChevronOpen{transform:rotate(180deg)}.KFXqYa_floatTarget{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:5px;font-size:12px;display:inline-flex}.KFXqYa_floatTargetLabel{color:var(--dsw-alias-label-secondary)}.KFXqYa_staleNotice{color:var(--ds-amber);background:color-mix(in srgb, var(--ds-amber) 12%, transparent);border:1px solid color-mix(in srgb, var(--ds-amber) 30%, transparent);border-radius:10px;align-items:center;gap:6px;margin:0 0 10px;padding:8px 10px;font-size:11px;display:flex}.KFXqYa_plgHead{align-items:flex-start;gap:12px;display:flex}.KFXqYa_plgIcon{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:40px;height:40px;color:var(--dsw-alias-label-secondary);border-radius:10px;flex:none;justify-content:center;align-items:center;display:inline-flex}.KFXqYa_plgTitle{flex-direction:column;gap:4px;min-width:0;display:flex}.KFXqYa_plgNameRow{align-items:center;gap:8px;display:flex}.KFXqYa_plgName{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:600;line-height:18px}.KFXqYa_plgTag{height:18px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);white-space:nowrap;border-radius:5px;align-items:center;padding:0 6px;font-size:10px;font-weight:600;display:inline-flex}.KFXqYa_plgDesc{color:var(--dsw-alias-label-secondary);margin:0;font-size:11px;line-height:16px}.KFXqYa_plgGrid{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:12px;display:grid}.KFXqYa_plgItem{flex-direction:column;gap:2px;min-width:0;display:flex}.KFXqYa_plgLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.KFXqYa_plgVal{color:var(--dsw-alias-label-primary);word-break:break-all;font-size:12px;line-height:17px}.KFXqYa_plgLink{color:var(--ds-blue);word-break:break-all;font-size:12px;line-height:17px;text-decoration:none}.KFXqYa_plgLink:hover{text-decoration:underline}.KFXqYa_tokenPanel{flex-direction:column;gap:14px;display:flex}.KFXqYa_tokenModelBar{background:var(--dsw-alias-bg-layer-2);border-radius:999px;height:8px;overflow:hidden}.KFXqYa_tokenModelParts{height:100%;display:flex}.KFXqYa_tokenModelPartIn{background:var(--ds-blue)}.KFXqYa_tokenModelPartOut{background:var(--ds-amber)}.KFXqYa_tokenModelShareRow{align-items:center;gap:6px;display:inline-flex}@media (width<=640px){.KFXqYa_kpiGrid{grid-template-columns:repeat(2,minmax(0,1fr))}.KFXqYa_hero{gap:14px}.KFXqYa_heroTop{flex-direction:column;align-items:flex-start;gap:12px}.KFXqYa_heroGauge{width:72px;height:72px}.KFXqYa_heroSide{gap:12px}.KFXqYa_heroSideSpacer{display:none}}.KFXqYa_peakCard{z-index:2000;border-radius:var(--ds-r-2);border:1px solid var(--ds-border-strong);background:var(--dsb-glass-strong);-webkit-backdrop-filter:blur(14px)saturate(1.2);min-width:280px;max-width:380px;box-shadow:var(--ds-shadow-2);animation:KFXqYa_peakAlertIn var(--ds-t-fast);flex-direction:column;gap:12px;padding:14px 16px;display:flex;position:fixed}.KFXqYa_peakCardCorner{bottom:18px;right:18px}.KFXqYa_peakCardCenter{top:20%;left:50%;transform:translate(-50%)}.KFXqYa_peakCardPeak{color:var(--ds-blue)}.KFXqYa_peakCardOff{color:var(--ds-cyan)}.KFXqYa_peakHead{justify-content:space-between;align-items:center;gap:8px;display:flex}.KFXqYa_peakTag{white-space:nowrap;border-radius:6px;align-items:center;gap:6px;height:20px;padding:0 8px;font-size:11px;font-weight:600;line-height:14px;display:inline-flex}.KFXqYa_peakTagPrimary{background:var(--dsw-alias-bg-layer-3);color:var(--ds-blue)}.KFXqYa_peakTagSuccess{background:var(--dsw-alias-bg-layer-3);color:var(--ds-cyan)}.KFXqYa_peakDot{border-radius:999px;flex:none;width:6px;height:6px}.KFXqYa_peakDotPrimary{background:var(--ds-blue)}.KFXqYa_peakDotSuccess{background:var(--ds-cyan)}.KFXqYa_peakClose{width:24px;height:24px;color:var(--ds-t-3);cursor:pointer;transition:background-color var(--ds-t-fast), color var(--ds-t-fast);background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;font-size:15px;line-height:1;display:inline-flex}.KFXqYa_peakClose:hover{color:var(--ds-t-1);background:var(--dsw-alias-bg-layer-2)}.KFXqYa_peakCount{font-variant-numeric:tabular-nums;font-family:JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:28px;font-weight:600;line-height:1}.KFXqYa_peakCountPrimary{color:var(--ds-blue)}.KFXqYa_peakCountSuccess{color:var(--ds-cyan)}.KFXqYa_peakDesc{color:var(--ds-t-1);margin:4px 0 0;font-size:12px;line-height:18px}@keyframes KFXqYa_peakAlertIn{0%{opacity:0}to{opacity:1}}.KFXqYa_setCard{border:1px solid var(--ds-border);border-radius:var(--ds-r-2);background:var(--dsb-glass);flex-direction:column;gap:12px;padding:16px 18px;display:flex}.KFXqYa_setGrid3,.KFXqYa_setGrid2{gap:10px;display:grid}.KFXqYa_setGrid3{grid-template-columns:repeat(3,minmax(0,1fr))}.KFXqYa_setGrid2{grid-template-columns:repeat(2,minmax(0,1fr))}@media (width<=720px){.KFXqYa_setGrid3,.KFXqYa_setGrid2{grid-template-columns:1fr}}.KFXqYa_setCell{border:1px solid var(--ds-border);border-radius:var(--ds-r-1);flex-direction:column;gap:8px;min-width:0;padding:12px 14px;display:flex}.KFXqYa_setCardHead{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.KFXqYa_setCardMeta{flex-direction:column;gap:4px;min-width:0;display:flex}.KFXqYa_setCardTitle{color:var(--ds-t-1);margin:0;font-size:13px;font-weight:600;line-height:18px}.KFXqYa_setCardDesc{color:var(--ds-t-3);margin:0;font-size:11px;line-height:16px}.KFXqYa_ctlCol{flex-direction:column;gap:10px;padding-top:2px;display:flex}.KFXqYa_ctlRow{align-items:center;gap:12px;min-height:28px;display:flex}.KFXqYa_ctlRowStretch{display:flex}.KFXqYa_ctlLabel{color:var(--ds-t-3);flex:0 0 96px;font-size:11px;line-height:16px}.KFXqYa_ctlGroup{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.KFXqYa_userPriceRow{border-bottom:1px solid var(--ds-border);align-items:center;gap:10px;padding:8px 0;display:flex}.KFXqYa_userPriceCheck{width:14px;height:14px;accent-color:var(--ds-blue);flex:none;margin:0}.KFXqYa_userPriceBody{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.KFXqYa_userPriceLineMeta{grid-template-columns:minmax(0,1fr) minmax(0,1.4fr) auto;align-items:end;gap:8px 10px;display:grid}@media (width<=720px){.KFXqYa_userPriceLineMeta{grid-template-columns:repeat(2,minmax(0,1fr))}}.KFXqYa_userPriceLineMeta .KFXqYa_userPriceInput{box-sizing:border-box;width:100%;min-width:0;max-width:none}.KFXqYa_userPriceBody .KFXqYa_ctlGroup{flex-wrap:nowrap}.KFXqYa_userPriceLineMeta .KFXqYa_userPriceField .KFXqYa_ctlLabel{align-items:flex-end;min-height:30px;display:flex}.KFXqYa_userPricePriceLine{border-left:2px solid var(--ds-amber);flex-wrap:wrap;align-items:center;gap:10px;width:calc(100% - 22px);margin-left:10px;padding:2px 0 6px 12px;display:flex}.KFXqYa_userPricePriceLine>.KFXqYa_ctlLabel{color:var(--ds-t-3);flex:0 0 44px;font-size:11px}.KFXqYa_userPricePriceLine .KFXqYa_userPriceInputNum{box-sizing:border-box;flex:1 1 0;width:auto;min-width:120px;max-width:240px}.KFXqYa_userPriceField{flex-direction:column;gap:4px;min-width:0;display:flex}.KFXqYa_userPriceField .KFXqYa_ctlLabel{flex:none;font-size:11px}.KFXqYa_userPriceInput,.KFXqYa_userPriceInputNum{border:1px solid var(--ds-border);background:var(--dsb-3);min-width:96px;max-width:160px;color:var(--ds-t-1);border-radius:6px;padding:4px 8px;font-size:12px;line-height:16px}.KFXqYa_userPriceInputNum{min-width:72px;max-width:88px}.KFXqYa_rdo{color:var(--ds-t-2);cursor:pointer;white-space:nowrap;align-items:center;gap:6px;font-size:12px;line-height:16px;display:inline-flex}.KFXqYa_rdo input{opacity:0;pointer-events:none;position:absolute}.KFXqYa_rdoDot{border:1px solid var(--ds-border-strong);background:var(--dsb-3);border-radius:50%;flex:none;width:14px;height:14px;position:relative}.KFXqYa_rdo input:checked+.KFXqYa_rdoDot{border-color:var(--ds-blue)}.KFXqYa_rdo input:checked+.KFXqYa_rdoDot:after{content:"";background:var(--ds-blue);border-radius:50%;position:absolute;inset:3px}.KFXqYa_inp{border:1px solid var(--ds-border);background:var(--dsb-3);border-radius:6px;align-items:center;gap:4px;padding:2px 6px;display:inline-flex}.KFXqYa_affix{color:var(--ds-t-3);font-size:11px;line-height:16px}.KFXqYa_prog{background:var(--dsb-3);min-width:0;height:6px;box-shadow:inset 0 0 0 1px var(--ds-border);border-radius:3px;flex:1;overflow:hidden}.KFXqYa_progFill{background:var(--ds-blue);height:calc(100% - 2px);transition:width var(--ds-t-fast);border-radius:2px;margin:1px}.KFXqYa_btn{border:1px solid var(--ds-border);height:28px;color:var(--ds-t-2);cursor:pointer;transition:border-color var(--ds-t-fast), color var(--ds-t-fast), background-color var(--ds-t-fast);background:0 0;border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-size:12px;line-height:16px;display:inline-flex}.KFXqYa_btn:hover{border-color:var(--ds-blue);color:var(--ds-t-1);background:color-mix(in srgb, var(--ds-blue) 12%, transparent)}.KFXqYa_modelTable tbody td:not(:first-child) tbody td:not(:first-child){text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ds-t-1)}`,document.head.appendChild(e)}var I={affix:`KFXqYa_affix`,balanceCell:`KFXqYa_balanceCell`,balanceDaysBadge:`KFXqYa_balanceDaysBadge`,balanceDaysBadgeLow:`KFXqYa_balanceDaysBadgeLow`,balanceDetailClose:`KFXqYa_balanceDetailClose`,balanceDetailGrid:`KFXqYa_balanceDetailGrid`,balanceDetailHead:`KFXqYa_balanceDetailHead`,balanceDetailLabel:`KFXqYa_balanceDetailLabel`,balanceDetailPop:`KFXqYa_balanceDetailPop`,balanceDetailRow:`KFXqYa_balanceDetailRow`,balanceDetailTitle:`KFXqYa_balanceDetailTitle`,balanceDetailValue:`KFXqYa_balanceDetailValue`,bandDot:`KFXqYa_bandDot`,bandDotOn:`KFXqYa_bandDotOn`,bandDots:`KFXqYa_bandDots`,"billing-trigger":`KFXqYa_billing-trigger`,btn:`KFXqYa_btn`,bucketCost:`KFXqYa_bucketCost`,bucketOfficial:`KFXqYa_bucketOfficial`,bucketSep:`KFXqYa_bucketSep`,bucketThird:`KFXqYa_bucketThird`,budgetFillOver:`KFXqYa_budgetFillOver`,budgetFillWarn:`KFXqYa_budgetFillWarn`,budgetInput:`KFXqYa_budgetInput`,budgetPulse:`KFXqYa_budgetPulse`,chartAxisLabel:`KFXqYa_chartAxisLabel`,chartBar:`KFXqYa_chartBar`,chartBarPlaceholder:`KFXqYa_chartBarPlaceholder`,chartCrosshair:`KFXqYa_chartCrosshair`,chartEmpty:`KFXqYa_chartEmpty`,chartGrid:`KFXqYa_chartGrid`,chartHoverDot:`KFXqYa_chartHoverDot`,chartLegend:`KFXqYa_chartLegend`,chartLegendBar:`KFXqYa_chartLegendBar`,chartLegendItem:`KFXqYa_chartLegendItem`,chartLegendItemActive:`KFXqYa_chartLegendItemActive`,chartLegendLine:`KFXqYa_chartLegendLine`,chartLine:`KFXqYa_chartLine`,chartStack:`KFXqYa_chartStack`,chartSvg:`KFXqYa_chartSvg`,chartTooltip:`KFXqYa_chartTooltip`,chartTooltipAlignLeft:`KFXqYa_chartTooltipAlignLeft`,chartTooltipAlignRight:`KFXqYa_chartTooltipAlignRight`,chartTooltipDate:`KFXqYa_chartTooltipDate`,chartTooltipHead:`KFXqYa_chartTooltipHead`,chartTooltipLabel:`KFXqYa_chartTooltipLabel`,chartTooltipModelDetail:`KFXqYa_chartTooltipModelDetail`,chartTooltipRow:`KFXqYa_chartTooltipRow`,chartTooltipSplit:`KFXqYa_chartTooltipSplit`,chartTooltipSwatch:`KFXqYa_chartTooltipSwatch`,chartWrap:`KFXqYa_chartWrap`,closeButton:`KFXqYa_closeButton`,ctlCol:`KFXqYa_ctlCol`,ctlGroup:`KFXqYa_ctlGroup`,ctlLabel:`KFXqYa_ctlLabel`,ctlRow:`KFXqYa_ctlRow`,ctlRowStretch:`KFXqYa_ctlRowStretch`,currencyButton:`KFXqYa_currencyButton`,currencyButtonActive:`KFXqYa_currencyButtonActive`,currencyToggle:`KFXqYa_currencyToggle`,dashboard:`KFXqYa_dashboard`,dashboardBody:`KFXqYa_dashboardBody`,dashboardHead:`KFXqYa_dashboardHead`,dashboardIn:`KFXqYa_dashboardIn`,dashboardModal:`KFXqYa_dashboardModal`,dashboardRight:`KFXqYa_dashboardRight`,dashboardSubtitle:`KFXqYa_dashboardSubtitle`,dashboardTitle:`KFXqYa_dashboardTitle`,delta:`KFXqYa_delta`,deltaDown:`KFXqYa_deltaDown`,deltaUp:`KFXqYa_deltaUp`,emptyRow:`KFXqYa_emptyRow`,estimatedTag:`KFXqYa_estimatedTag`,exportBar:`KFXqYa_exportBar`,exportButton:`KFXqYa_exportButton`,exportLabel:`KFXqYa_exportLabel`,feeBar:`KFXqYa_feeBar`,feeBarAbove:`KFXqYa_feeBarAbove`,feeChipAlert:`KFXqYa_feeChipAlert`,feeChipError:`KFXqYa_feeChipError`,feeChipOff:`KFXqYa_feeChipOff`,feeChipPrimary:`KFXqYa_feeChipPrimary`,feeCount:`KFXqYa_feeCount`,feeInline:`KFXqYa_feeInline`,feeInlineAlert:`KFXqYa_feeInlineAlert`,feeInlineError:`KFXqYa_feeInlineError`,feeInlineNum:`KFXqYa_feeInlineNum`,feeItem:`KFXqYa_feeItem`,feeNum:`KFXqYa_feeNum`,feeSep:`KFXqYa_feeSep`,feeSuffix:`KFXqYa_feeSuffix`,flatTag:`KFXqYa_flatTag`,floatModeBtn:`KFXqYa_floatModeBtn`,floatModeBtnOn:`KFXqYa_floatModeBtnOn`,floatSub:`KFXqYa_floatSub`,floatSubHead:`KFXqYa_floatSubHead`,floatSubName:`KFXqYa_floatSubName`,floatSubPlan:`KFXqYa_floatSubPlan`,floatTarget:`KFXqYa_floatTarget`,floatTargetLabel:`KFXqYa_floatTargetLabel`,healthBad:`KFXqYa_healthBad`,healthBadge:`KFXqYa_healthBadge`,healthBadgeBad:`KFXqYa_healthBadgeBad`,healthBadgeOk:`KFXqYa_healthBadgeOk`,healthDot:`KFXqYa_healthDot`,healthIdle:`KFXqYa_healthIdle`,healthOk:`KFXqYa_healthOk`,heatmap:`KFXqYa_heatmap`,heatmapCell:`KFXqYa_heatmapCell`,heatmapCellEmpty:`KFXqYa_heatmapCellEmpty`,heatmapFooter:`KFXqYa_heatmapFooter`,heatmapGrid:`KFXqYa_heatmapGrid`,heatmapHalf:`KFXqYa_heatmapHalf`,heatmapHover:`KFXqYa_heatmapHover`,heatmapLegend:`KFXqYa_heatmapLegend`,heatmapRangeButton:`KFXqYa_heatmapRangeButton`,heatmapRangeButtonActive:`KFXqYa_heatmapRangeButtonActive`,heatmapRangeSwitch:`KFXqYa_heatmapRangeSwitch`,heatmapYear:`KFXqYa_heatmapYear`,heatmapYearBody:`KFXqYa_heatmapYearBody`,heatmapYearCell:`KFXqYa_heatmapYearCell`,heatmapYearGrid:`KFXqYa_heatmapYearGrid`,heatmapYearMonth:`KFXqYa_heatmapYearMonth`,heatmapYearMonths:`KFXqYa_heatmapYearMonths`,heatmapYearScroll:`KFXqYa_heatmapYearScroll`,heatmapYearWeekday:`KFXqYa_heatmapYearWeekday`,heatmapYearWeekdays:`KFXqYa_heatmapYearWeekdays`,hero:`KFXqYa_hero`,heroCurrency:`KFXqYa_heroCurrency`,heroGauge:`KFXqYa_heroGauge`,heroGaugeArc:`KFXqYa_heroGaugeArc`,heroGaugeArcOver:`KFXqYa_heroGaugeArcOver`,heroGaugeCenter:`KFXqYa_heroGaugeCenter`,heroGaugeDial:`KFXqYa_heroGaugeDial`,heroGaugeLabel:`KFXqYa_heroGaugeLabel`,heroGaugeRemain:`KFXqYa_heroGaugeRemain`,heroGaugeRemainOver:`KFXqYa_heroGaugeRemainOver`,heroGaugeSub:`KFXqYa_heroGaugeSub`,heroGaugeSvg:`KFXqYa_heroGaugeSvg`,heroGaugeTrack:`KFXqYa_heroGaugeTrack`,heroLabel:`KFXqYa_heroLabel`,heroMain:`KFXqYa_heroMain`,heroMeta:`KFXqYa_heroMeta`,heroReadout:`KFXqYa_heroReadout`,heroSide:`KFXqYa_heroSide`,heroSideItem:`KFXqYa_heroSideItem`,heroSideLabel:`KFXqYa_heroSideLabel`,heroSideSpacer:`KFXqYa_heroSideSpacer`,heroSideValue:`KFXqYa_heroSideValue`,heroTop:`KFXqYa_heroTop`,heroValue:`KFXqYa_heroValue`,inp:`KFXqYa_inp`,kindBadge:`KFXqYa_kindBadge`,kindBadgeRelay:`KFXqYa_kindBadgeRelay`,kindBadgeUnknown:`KFXqYa_kindBadgeUnknown`,kpiDetail:`KFXqYa_kpiDetail`,kpiGreen:`KFXqYa_kpiGreen`,kpiGrid:`KFXqYa_kpiGrid`,kpiLabel:`KFXqYa_kpiLabel`,kpiTile:`KFXqYa_kpiTile`,kpiValue:`KFXqYa_kpiValue`,kpiZone:`KFXqYa_kpiZone`,kpiZoneHead:`KFXqYa_kpiZoneHead`,kpiZoneLabel:`KFXqYa_kpiZoneLabel`,metricCell:`KFXqYa_metricCell`,metricGrid:`KFXqYa_metricGrid`,metricLabel:`KFXqYa_metricLabel`,metricValue:`KFXqYa_metricValue`,metricValueSuccess:`KFXqYa_metricValueSuccess`,modalFooter:`KFXqYa_modalFooter`,modelCell:`KFXqYa_modelCell`,modelDot:`KFXqYa_modelDot`,modelName:`KFXqYa_modelName`,modelProvider:`KFXqYa_modelProvider`,modelRowActive:`KFXqYa_modelRowActive`,modelRowFocusable:`KFXqYa_modelRowFocusable`,modelTable:`KFXqYa_modelTable`,na:`KFXqYa_na`,numCol:`KFXqYa_numCol`,offPeak:`KFXqYa_offPeak`,panel:`KFXqYa_panel`,panelHead:`KFXqYa_panelHead`,panelHeadControls:`KFXqYa_panelHeadControls`,panelHint:`KFXqYa_panelHint`,panelTitle:`KFXqYa_panelTitle`,peak:`KFXqYa_peak`,peakAlertIn:`KFXqYa_peakAlertIn`,peakCard:`KFXqYa_peakCard`,peakCardCenter:`KFXqYa_peakCardCenter`,peakCardCorner:`KFXqYa_peakCardCorner`,peakCardOff:`KFXqYa_peakCardOff`,peakCardPeak:`KFXqYa_peakCardPeak`,peakClose:`KFXqYa_peakClose`,peakCount:`KFXqYa_peakCount`,peakCountPrimary:`KFXqYa_peakCountPrimary`,peakCountSuccess:`KFXqYa_peakCountSuccess`,peakDesc:`KFXqYa_peakDesc`,peakDot:`KFXqYa_peakDot`,peakDotPrimary:`KFXqYa_peakDotPrimary`,peakDotSuccess:`KFXqYa_peakDotSuccess`,peakHead:`KFXqYa_peakHead`,peakTag:`KFXqYa_peakTag`,peakTagPrimary:`KFXqYa_peakTagPrimary`,peakTagSuccess:`KFXqYa_peakTagSuccess`,perfBar:`KFXqYa_perfBar`,perfChip:`KFXqYa_perfChip`,perfChipDot:`KFXqYa_perfChipDot`,perfChipOff:`KFXqYa_perfChipOff`,perfChips:`KFXqYa_perfChips`,planTag:`KFXqYa_planTag`,planTagBadge:`KFXqYa_planTagBadge`,plgDesc:`KFXqYa_plgDesc`,plgGrid:`KFXqYa_plgGrid`,plgHead:`KFXqYa_plgHead`,plgIcon:`KFXqYa_plgIcon`,plgItem:`KFXqYa_plgItem`,plgLabel:`KFXqYa_plgLabel`,plgLink:`KFXqYa_plgLink`,plgName:`KFXqYa_plgName`,plgNameRow:`KFXqYa_plgNameRow`,plgTag:`KFXqYa_plgTag`,plgTitle:`KFXqYa_plgTitle`,plgVal:`KFXqYa_plgVal`,popDot:`KFXqYa_popDot`,popDotDirect:`KFXqYa_popDotDirect`,popDotNeutral:`KFXqYa_popDotNeutral`,popDotSub:`KFXqYa_popDotSub`,popHead:`KFXqYa_popHead`,popModel:`KFXqYa_popModel`,popModelLabel:`KFXqYa_popModelLabel`,popModelName:`KFXqYa_popModelName`,popModelRow:`KFXqYa_popModelRow`,popModelStatus:`KFXqYa_popModelStatus`,popModelStatusLow:`KFXqYa_popModelStatusLow`,popTagPrimary:`KFXqYa_popTagPrimary`,popTagSub:`KFXqYa_popTagSub`,popTitle:`KFXqYa_popTitle`,prog:`KFXqYa_prog`,progFill:`KFXqYa_progFill`,providerCtlRow:`KFXqYa_providerCtlRow`,providerGroup:`KFXqYa_providerGroup`,providerGroupBadge:`KFXqYa_providerGroupBadge`,providerGroupBalance:`KFXqYa_providerGroupBalance`,providerGroupBalanceLabel:`KFXqYa_providerGroupBalanceLabel`,providerGroupCollapsible:`KFXqYa_providerGroupCollapsible`,providerGroupCost:`KFXqYa_providerGroupCost`,providerGroupCostLabel:`KFXqYa_providerGroupCostLabel`,providerGroupCostValue:`KFXqYa_providerGroupCostValue`,providerGroupHead:`KFXqYa_providerGroupHead`,providerGroupList:`KFXqYa_providerGroupList`,providerGroupMeta:`KFXqYa_providerGroupMeta`,providerGroupName:`KFXqYa_providerGroupName`,providerGroupRecharge:`KFXqYa_providerGroupRecharge`,providerGroupTitle:`KFXqYa_providerGroupTitle`,providerTodayToggle:`KFXqYa_providerTodayToggle`,railButton:`KFXqYa_railButton`,rangeButton:`KFXqYa_rangeButton`,rangeButtonActive:`KFXqYa_rangeButtonActive`,rangeToggle:`KFXqYa_rangeToggle`,rdo:`KFXqYa_rdo`,rdoChevron:`KFXqYa_rdoChevron`,rdoChevronOpen:`KFXqYa_rdoChevronOpen`,rdoDot:`KFXqYa_rdoDot`,rdoLabel:`KFXqYa_rdoLabel`,rdoRow:`KFXqYa_rdoRow`,rdoSelect:`KFXqYa_rdoSelect`,reconcileDismiss:`KFXqYa_reconcileDismiss`,reconcileIcon:`KFXqYa_reconcileIcon`,reconcileNotice:`KFXqYa_reconcileNotice`,reconcileText:`KFXqYa_reconcileText`,rounds:`KFXqYa_rounds`,roundsAxis:`KFXqYa_roundsAxis`,roundsBar:`KFXqYa_roundsBar`,roundsBarCol:`KFXqYa_roundsBarCol`,roundsBarColOff:`KFXqYa_roundsBarColOff`,roundsBarColPeak:`KFXqYa_roundsBarColPeak`,roundsBarFlagged:`KFXqYa_roundsBarFlagged`,roundsBarLabel:`KFXqYa_roundsBarLabel`,roundsBarWrap:`KFXqYa_roundsBarWrap`,roundsBars:`KFXqYa_roundsBars`,roundsEmpty:`KFXqYa_roundsEmpty`,roundsFlagMark:`KFXqYa_roundsFlagMark`,sessionChildRow:`KFXqYa_sessionChildRow`,sessionGroupRow:`KFXqYa_sessionGroupRow`,setCard:`KFXqYa_setCard`,setCardDesc:`KFXqYa_setCardDesc`,setCardHead:`KFXqYa_setCardHead`,setCardMeta:`KFXqYa_setCardMeta`,setCardTitle:`KFXqYa_setCardTitle`,setCell:`KFXqYa_setCell`,setGrid2:`KFXqYa_setGrid2`,setGrid3:`KFXqYa_setGrid3`,shareDot:`KFXqYa_shareDot`,shareItem:`KFXqYa_shareItem`,shareLegend:`KFXqYa_shareLegend`,shareSeg:`KFXqYa_shareSeg`,shareSegAssistant:`KFXqYa_shareSegAssistant`,shareSegOff:`KFXqYa_shareSegOff`,shareSegPeak:`KFXqYa_shareSegPeak`,shareSegTool:`KFXqYa_shareSegTool`,shareSegUser:`KFXqYa_shareSegUser`,shareTrack:`KFXqYa_shareTrack`,shareValue:`KFXqYa_shareValue`,siteKindDirect:`KFXqYa_siteKindDirect`,siteKindSite:`KFXqYa_siteKindSite`,siteKindTag:`KFXqYa_siteKindTag`,siteKindUnknown:`KFXqYa_siteKindUnknown`,siteRow:`KFXqYa_siteRow`,siteRowCalls:`KFXqYa_siteRowCalls`,siteRowCallsLow:`KFXqYa_siteRowCallsLow`,siteRowCost:`KFXqYa_siteRowCost`,siteRowMeta:`KFXqYa_siteRowMeta`,siteRowName:`KFXqYa_siteRowName`,siteRowTitle:`KFXqYa_siteRowTitle`,soon:`KFXqYa_soon`,staleNotice:`KFXqYa_staleNotice`,subscriptionAuto:`KFXqYa_subscriptionAuto`,subscriptionCard:`KFXqYa_subscriptionCard`,subscriptionExhausted:`KFXqYa_subscriptionExhausted`,subscriptionFill:`KFXqYa_subscriptionFill`,subscriptionFillOver:`KFXqYa_subscriptionFillOver`,subscriptionFillWarn:`KFXqYa_subscriptionFillWarn`,subscriptionGrid:`KFXqYa_subscriptionGrid`,subscriptionHead:`KFXqYa_subscriptionHead`,subscriptionMeta:`KFXqYa_subscriptionMeta`,subscriptionName:`KFXqYa_subscriptionName`,subscriptionPct:`KFXqYa_subscriptionPct`,subscriptionPlan:`KFXqYa_subscriptionPlan`,subscriptionReset:`KFXqYa_subscriptionReset`,subscriptionStatus:`KFXqYa_subscriptionStatus`,subscriptionTier:`KFXqYa_subscriptionTier`,subscriptionTrack:`KFXqYa_subscriptionTrack`,subscriptionWindow:`KFXqYa_subscriptionWindow`,subscriptionWindowLabel:`KFXqYa_subscriptionWindowLabel`,switch:`KFXqYa_switch`,switchKnob:`KFXqYa_switchKnob`,switchOn:`KFXqYa_switchOn`,tabButton:`KFXqYa_tabButton`,tabButtonActive:`KFXqYa_tabButtonActive`,tabNav:`KFXqYa_tabNav`,tabPanel:`KFXqYa_tabPanel`,tabPanelIn:`KFXqYa_tabPanelIn`,tableScroll:`KFXqYa_tableScroll`,tokenModelBar:`KFXqYa_tokenModelBar`,tokenModelPartIn:`KFXqYa_tokenModelPartIn`,tokenModelPartOut:`KFXqYa_tokenModelPartOut`,tokenModelParts:`KFXqYa_tokenModelParts`,tokenModelShareRow:`KFXqYa_tokenModelShareRow`,tokenPanel:`KFXqYa_tokenPanel`,trigger:`KFXqYa_trigger`,triggerBudgetHot:`KFXqYa_triggerBudgetHot`,triggerBudgetOver:`KFXqYa_triggerBudgetOver`,triggerBudgetPulse:`KFXqYa_triggerBudgetPulse`,triggerGaugeArc:`KFXqYa_triggerGaugeArc`,triggerGaugeNeedle:`KFXqYa_triggerGaugeNeedle`,triggerIcon:`KFXqYa_triggerIcon`,triggerLabel:`KFXqYa_triggerLabel`,triggerMain:`KFXqYa_triggerMain`,triggerMetric:`KFXqYa_triggerMetric`,triggerPop:`KFXqYa_triggerPop`,triggerPopEmpty:`KFXqYa_triggerPopEmpty`,triggerPopShown:`KFXqYa_triggerPopShown`,triggerPopSwitchCount:`KFXqYa_triggerPopSwitchCount`,triggerPopSwitcher:`KFXqYa_triggerPopSwitcher`,triggerPrimary:`KFXqYa_triggerPrimary`,triggerScan:`KFXqYa_triggerScan`,triggerSpark:`KFXqYa_triggerSpark`,triggerSparkBar:`KFXqYa_triggerSparkBar`,triggerSparkBreath:`KFXqYa_triggerSparkBreath`,triggerSparkHot:`KFXqYa_triggerSparkHot`,triggerValueRow:`KFXqYa_triggerValueRow`,triggerWrap:`KFXqYa_triggerWrap`,triggerYen:`KFXqYa_triggerYen`,ubAlert:`KFXqYa_ubAlert`,ubAlertLeft:`KFXqYa_ubAlertLeft`,ubAlertNote:`KFXqYa_ubAlertNote`,ubCard:`KFXqYa_ubCard`,ubCardControlGroup:`KFXqYa_ubCardControlGroup`,ubCardHead:`KFXqYa_ubCardHead`,ubCardSub:`KFXqYa_ubCardSub`,ubCardTitle:`KFXqYa_ubCardTitle`,ubChipLabel:`KFXqYa_ubChipLabel`,ubChipOff:`KFXqYa_ubChipOff`,ubChipPeak:`KFXqYa_ubChipPeak`,ubExtraName:`KFXqYa_ubExtraName`,ubExtraNote:`KFXqYa_ubExtraNote`,ubExtraRow:`KFXqYa_ubExtraRow`,ubModel:`KFXqYa_ubModel`,ubModelName:`KFXqYa_ubModelName`,ubNotes:`KFXqYa_ubNotes`,ubNotesDesc:`KFXqYa_ubNotesDesc`,ubNotesItem:`KFXqYa_ubNotesItem`,ubNotesTerm:`KFXqYa_ubNotesTerm`,ubRate:`KFXqYa_ubRate`,ubSearch:`KFXqYa_ubSearch`,ubTable:`KFXqYa_ubTable`,ubTablewrap:`KFXqYa_ubTablewrap`,ubTag:`KFXqYa_ubTag`,ubTagAlert:`KFXqYa_ubTagAlert`,ubTagError:`KFXqYa_ubTagError`,ubTagNeutral:`KFXqYa_ubTagNeutral`,ubTagPromo:`KFXqYa_ubTagPromo`,ubTagSuccess:`KFXqYa_ubTagSuccess`,uncataloguedTag:`KFXqYa_uncataloguedTag`,unpricedHint:`KFXqYa_unpricedHint`,userPriceBody:`KFXqYa_userPriceBody`,userPriceCheck:`KFXqYa_userPriceCheck`,userPriceField:`KFXqYa_userPriceField`,userPriceInput:`KFXqYa_userPriceInput`,userPriceInputNum:`KFXqYa_userPriceInputNum`,userPriceLineMeta:`KFXqYa_userPriceLineMeta`,userPricePriceLine:`KFXqYa_userPricePriceLine`,userPriceRow:`KFXqYa_userPriceRow`,vendorLetter:`KFXqYa_vendorLetter`};let Ne=`usageBilling`,Pe={title:`使用统计`,cost:`费用`,todayCost:`今日费用`,monthCost:`本月费用`,yearCost:`本年费用`,monthProjected:`本月预计`,liveTurn:`本轮`,liveSession:`会话`,calls:`调用`,cacheHitRate:`缓存命中率`,tokens:`Token`,inputTokens:`输入`,outputTokens:`输出`,avgCost:`平均成本`,kpiRange:`统计范围`,avgRangeToday:`今日`,avgRange7d:`近7天`,avgRangeWeek:`本周`,avgRangeMonth:`本月`,avgRangeAll:`累计`,trend:`每日费用与调用趋势`,trend7d:`7 天`,trend30d:`30 天`,trendMetric:`趋势指标`,trendMetricCost:`费用`,trendMetricTokens:`Token`,pricingSearch:`搜索模型 / 厂商`,bandPinHint:`点击固定到输入框`,trendEmpty:`暂无趋势数据`,trendTotal:`总计`,roundsUnit:`轮`,healthModelsLive:`{n} 模型可用`,healthVendorsDown:`{n} 厂商失效`,healthVendorsUnavailable:`{n} 厂商不可用`,budget:`本月预算`,budgetRemain:`剩余预算`,budgetAmount:`预算金额`,budgetSummary:`本月已用 {used} / {total};达到 80% 时提醒,达到 100% 时红色脉冲警示`,sessions:`会话明细`,sessionTitle:`标题`,lastActive:`最后活跃`,sessionOverflow:`仅显示花费前 {limit} 个,共 {total} 个会话`,budgetTierBody:`本月花费 {cost} 已达预算 {budget} 的 {pct}%`,models:`模型计费明细`,providerBilling:`提供商计费与订阅`,channelUnknown:`未知路由`,directTag:`直连`,relayTag:`中转`,unknownTag:`未知`,planCountUnit:`套餐`,actual:`实际`,pricing:`模型单价表`,input:`输入`,output:`输出`,cacheHit:`缓存命中`,peak:`高峰`,offPeak:`低谷`,flat:`全天统一`,band:`时段`,close:`关闭`,footer:`每 30s 自动轮询 · 仅统计本机 dsh 会话`,footerCredit:`dsh-ui-usage-billing {version} · MIT`,lastUpdated:`数据更新于`,noData:`暂无计费数据`,todayRate:`今日汇率`,rateLive:`实时`,rateBuiltin:`内置`,pricingSyncedAt:`上次同步`,pricingSyncNow:`立即同步`,pricingSyncing:`同步中…`,promoBadge:`促`,promoUntil:`促销价至 {date},之后自动恢复刊例价`,promoOpenEnded:`厂商未公布截止时间,当前按折扣计价;公告截止后自动恢复刊例价`,pricingTip:`DeepSeek 现行刊例:V4.1 Flash 谷档 未命中 ¥1 / 缓存命中 ¥0.02 / 输出 ¥4;V4 Pro 谷档 未命中 ¥4.5 / 缓存命中 ¥0.15 / 输出 ¥13.5;峰价均为谷价 × 2。工作日 9-12 / 14-18 为高峰价,其余时段(含周末全天)为低谷价;费用按调用时刻计。`,pricingUnit:`单位:人民币 / 每百万 Token`,pricingNotes:`计价说明`,ubPeak:`峰`,ubOff:`谷`,ubStd:`标准`,peakBand:`峰谷分带`,pricingSource:`数据来源`,noteCache:`命中部分按缓存价计费,显著降低成本。`,noteBand:`高峰与空闲时段单价不同,空闲约半价。`,noteSource:`价格来自实时汇率 + 模型定价目录,未收录模型按 0 计并提示。`,balance:`余额`,recharge:`充值`,rechargeHint:`打开该厂商官方平台的充值页`,balanceUnconfigured:`未配置`,balanceUnauthorized:`密钥无效`,balanceUnreachable:`查询失败`,uncatalogued:`未收录`,estimatedPricing:`估算价`,balanceDays:`约可撑 {days} 天`,balanceLowBody:`{name} 余额 {balance},约可撑 {days} 天,请及时充值`,reconcileDrift:`系统监控到{provider}官方余额变动 {spent},本面板记录 {today},差额通常由其它工具或 API 的消耗所致`,reconcileDismiss:`知道了`,subscriptionNotConfigured:`未配置密钥`,subscriptionUnauthorized:`密钥无效`,subscriptionUnavailable:`查询失败`,subscriptionInvalid:`响应异常`,subscriptionRateLimited:`触发限流`,subscriptionSession:`本次`,subscriptionWeekly:`本周`,subscriptionMonthly:`本月`,subscriptionBilling:`计费周期`,subscriptionRemaining:`剩余 {pct}%`,subscriptionExhausted:`已用尽`,subscriptionReset:`{date} 重置`,subscriptionNoApi:`该厂商暂未提供用量查询接口`,floatWindow:`模型用量悬浮窗`,floatModeCombined:`综合`,floatModeSubscription:`订阅卡`,floatMode:`展示模式`,floatTargets:`订阅目标`,floatWindowHint:`悬浮在左下角计费卡上的用量速览;综合=当前样式,订阅卡=每次展示一张订阅额度卡(可切换)。`,floatPrimaryToday:`今日`,floatPrimaryWeek:`本周`,floatPrimaryMonth:`本月`,cardDisplay:`计费卡显示`,cardDisplayHint:`切换左下角计费卡的主指标与主数字统计范围(迷你柱跟随视角,悬浮窗不受影响)。`,cardMetric:`主指标`,cardMetricMoney:`花费金额`,cardMetricTokens:`Token 消耗`,cardSpan:`统计范围`,cardSpanDay:`日`,cardSpanWeek:`周`,cardSpanMonth:`月`,floatNoTargets:`未指定订阅通道,请在设置中勾选要展示的订阅。`,floatNoTargetsHint:`暂无可选的订阅通道。`,subscriptionsStale:`订阅额度刷新失败,以下为缓存数据`,staleLedgerNotice:`{count} 个会话出自旧版算法存档(日志已删,无法重算),模型归属可能有误差`,unreadableNotice:`{count} 个会话因会话格式版本较新暂未统计(原始数据仍在,升级 dsh 兼容修复后自动恢复)`,tokenCacheWrite:`写入`,toolRank:`工具排行`,toolName:`工具`,userPrices:`自定义单价`,userPricesHint:`为未收录或变价模型填入实付单价,总览与日趋势按此重估;模型可用下拉候选(目录键或模型 id);来源留空=该模型默认价,填入中转站域名=仅该来源的同名模型用此价(协议可省);低谷价三栏填后按峰/谷混合估算,留空=平档`,userPriceSave:`保存`,userPriceModel:`模型`,userPriceSource:`来源(中转站域名)`,userPriceSourceHint:`留空=默认价,或 https://api.中转站.com`,userPriceOffPeak:`低谷价`,userPriceNormal:`标准价`,userPriceCurrency:`币种`,userPriceAdd:`新增`,userPriceRemoveSelected:`删除所选`,userPriceSelect:`选择此行`,sessionStaleBadge:`旧版统计`,sessionUntitled:`未命名会话`,heatmapLess:`少`,heatmapMore:`多`,currency:`币种`,currencyCny:`人民币`,currencyUsd:`美元`,currencyEur:`欧元`,language:`界面语言`,heatmap:`用量热力图`,rounds:`每轮费用`,roundsHint:`最近 {count} 轮 · 柱顶为金额 · 底色为峰谷时段`,anomaly:`成本突增`,model:`模型`,thModel:`模型名称`,thInputMiss:`输入缓存未命中`,thInputHit:`输入缓存命中`,costAbbr:`费用`,tabOverview:`概览`,tabTrends:`趋势`,tabProviders:`账单`,tabPricing:`费率`,tabSettings:`设置`,budgetHint:`设置月度上限,用于本月预计与超支分段提醒`,peakAlertHint:`在切档前弹窗提醒,可选同步系统通知`,peakAlertDescPeak:`即将进入高峰时段,价格将上调,请提前安排长任务`,peakAlertDescOff:`即将进入平价时段,价格减半,适合运行大批量任务`,peakAlertDescPeakZhipu:`即将进入高峰时段(工作日 14:00–18:00),Coding Plan 额度将按基础积分全额抵扣`,peakAlertDescOffZhipu:`即将进入非高峰时段,Coding Plan 额度按基础积分 5 折抵扣`,export:`导出`,exportCsvDay:`按日 CSV`,exportCsvSession:`按会话 CSV`,exportJson:`全量 JSON`,peakShare:`峰谷时段占比`,peakSharePerCall:`按调用时刻精确判档`,offPeakSavings:`挪谷可省约 {amount}`,perfMax:`最大 TTFT`,weekCost:`本周消耗金额`,roleCost:`费用构成`,roleUser:`用户输入`,roleAssistant:`助手输出`,roleTool:`工具结果`,roleHint:`估算:输出按实测计价,输入按消息长度摊分`,tierPeak:`峰时`,tierOff:`平价`,tierToPeak:`后转峰时`,tierToOff:`后转平价`,tierAlertEnterPeak:`{minutes} 分钟后进入峰时(DeepSeek 高峰价 ×2),不急的调用可稍等`,tierAlertEnterOff:`{minutes} 分钟后进入平价(价格减半)`,tierAlertEnterPeakZhipu:`{minutes} 分钟后进入智谱高峰时段,Coding Plan 额度将全额抵扣`,tierAlertEnterOffZhipu:`{minutes} 分钟后进入智谱非高峰时段,额度按基础积分 5 折抵扣`,peakAlertTitlePeak:`即将进入高峰价`,peakAlertTitleOff:`即将进入平价`,peakAlert:`峰谷切换提醒`,peakAlertLeadMin:`提前量(分钟)`,peakAlertPos:`位置`,peakAlertMode:`提醒模式`,peakAlertPosCorner:`右下角`,peakAlertPosCenter:`屏幕居中`,peakAlertModePeak:`仅进入峰时`,peakAlertModeOff:`仅进入平价`,peakAlertModeBoth:`峰与谷都提醒`,peakAlertWebNotify:`同时发系统通知`,peakAlertPreview:`预览提醒`,planTypeCode:`订阅制`,planTypeToken:`按量`,subscriptionFeePerMonth:`{amount}/月`,triggerToday:`今日消耗金额`,triggerMonth:`当月消耗金额`,triggerMonthTokens:`当月消耗 Token`,triggerTodayTokens:`今日消耗 Token`,triggerWeekTokens:`本周消耗 Token`,subscriptionTag:`订阅`,free:`免费`,perfSamples:`样本`,perfTtft:`首字延时`,perfP50:`P50`,perfP90:`P90`,perfTps:`生成速度`,perfLatency:`总延迟`,perfEstimated:`估算样本`,perfEmpty:`暂无性能数据`,perfTpsUnit:`tok/s`,perfTitle:`性能`,perfHint:`按模型与按小时聚合;估算样本为工具续写步骤`,perfAll:`全选`,perfChartEmpty:`未选择模型或该指标暂无数据`,heatmapYear:`年`,heatmapHalf:`半年`,heatmapMonth:`月`,metricCost:`费用`,metricTokens:`Token`,heatmapTotal:`合计`,activeDays:`活跃天数`,streakDays:`连续使用`,subscriptionAutoDetect:`自动识别`,pluginAuthor:`作者`,pluginRepository:`仓库`,pluginNpm:`npm`,pluginLicense:`许可证`,tabToken:`用量`,tokenExport:`导出 Token`,tokenExportCsv:`按日 Token CSV`,tokenReasoningShare:`思考占比`,tokenReasoningShort:`思考`,tokenIo:`输入/输出比`,tokenPeak:`峰值日`,tokenDaily:`每日 Token`,tokenByModel:`模型 Token`,tokenMiss:`输入(缓存未命中)`,tokenHit:`输入(缓存命中)`,tokenOutput:`输出`,tokenViewStructure:`按结构`,tokenViewModel:`按模型`,tokenHitShort:`命中`,tokenMissShort:`未命中`,tokenTotal:`总 Token`,tokenShare:`占比`,usageStatsTool:`注入用量查询工具`,usageStatsToolHint:`让模型可在对话中查询用量/费用;会占用模型每次请求的上下文,coding 场景建议关闭(切换即时生效)`,balanceGranted:`赠金余额`,balanceTopped:`充值余额`,balanceDaily:`日均消耗`,balanceDaysLong:`约可撑`,balanceDaysUnit:`天`,popTodayModel:`主力消耗模型余额`,popTitle:`用量速览`,popNoConsumption:`暂无消耗`,popDirectLead:`直联`,popSubLead:`订阅`,unpricedHint:`{count} 个模型未收录计价,费用已按 0 计`,searchEstimateHint:`含 {count} 次联网搜索请求的估算费用(每次约 {each};日志无用量事件,按次估算,可在配置 searchCallEstimateCny 调整或关闭)`,siteListDisplay:`中转站列表`,siteListDisplayHint:`隐藏「未识别」占位条目,净化中转站额度列表`,liveCostBar:`平价消耗胶囊`,liveCostBarHint:`输入框旁的即时代费条,悬浮可看详情`,liveCostBarPosition:`位置`,liveCostBarPosBelow:`输入框下方`,liveCostBarPosAbove:`输入框上方`,liveCostBarPosToolbar:`输入框内部`,exportCsvSite:`按站点 CSV`,panelRelayQuota:`中转站额度`,relayBalance:`余额`,relayNoQuota:`未读出额度`,relayWindowUsed:`已用`,relayKindNewApi:`New API`,relayKindSub2Api:`Sub2API`,relayKindUnknown:`未识别`,expandAll:`全部展开`,collapseAll:`全部收起`,todayOnly:`仅看今日`,todayNoConsumption:`今日暂无消耗`},Fe={title:`Usage`,cost:`Cost`,todayCost:`Today`,monthCost:`This month`,yearCost:`This year`,monthProjected:`Projected`,liveTurn:`Turn`,liveSession:`Session`,calls:`Calls`,cacheHitRate:`Cache Hit`,tokens:`Tokens`,inputTokens:`Input`,outputTokens:`Output`,avgCost:`Avg cost`,kpiRange:`Range`,avgRangeToday:`Today`,avgRange7d:`7d`,avgRangeWeek:`Week`,avgRangeMonth:`Month`,avgRangeAll:`All`,trend:`Daily cost & calls`,trend7d:`7D`,trend30d:`30D`,trendMetric:`Trend metric`,trendMetricCost:`Cost`,trendMetricTokens:`Tokens`,pricingSearch:`Search model or vendor`,bandPinHint:`click to pin to the composer`,trendEmpty:`No trend data yet`,trendTotal:`Total`,roundsUnit:`turns`,healthModelsLive:`{n} models live`,healthVendorsDown:`{n} vendors down`,healthVendorsUnavailable:`{n} vendors unavailable`,budget:`Monthly budget`,budgetRemain:`Remaining`,budgetAmount:`Budget amount`,budgetSummary:`Used {used} / {total} this month; warn at 80%, pulse red at 100%`,sessions:`Sessions`,sessionTitle:`Title`,lastActive:`Last active`,sessionOverflow:`Top {limit} of {total} sessions by cost`,budgetTierBody:`This month {cost} reached {pct}% of the budget {budget}`,models:`Model billing`,providerBilling:`Provider billing & subscriptions`,channelUnknown:`Unknown routes`,directTag:`Direct`,relayTag:`Relay`,unknownTag:`Unknown`,planCountUnit:`plan(s)`,actual:`Actual`,pricing:`Model pricing`,input:`Input`,output:`Output`,cacheHit:`Cache hit`,peak:`Peak`,offPeak:`Off-peak`,flat:`Flat`,band:`Band`,close:`Close`,footer:`Polls every 30s · local dsh sessions only`,footerCredit:`dsh-ui-usage-billing {version} · MIT`,lastUpdated:`Updated`,noData:`No billing data yet`,todayRate:`Today rate`,rateLive:`Live`,rateBuiltin:`Built-in`,pricingSyncedAt:`Synced`,pricingSyncNow:`Sync now`,pricingSyncing:`Syncing…`,promoBadge:`Promo`,promoUntil:`Promo price until {date}, then list price resumes automatically`,promoOpenEnded:`End date not announced; billed at the discounted rate until further notice, then list price resumes`,pricingTip:`DeepSeek list rates: V4.1 Flash off-peak ¥1 miss / ¥0.02 cache-hit / ¥4 output; V4 Pro off-peak ¥4.5 miss / ¥0.15 cache-hit / ¥13.5 output; peak = 2× off-peak. Weekday 9-12 / 14-18 bills at peak, all other times (weekends included) at off-peak; billed at call time.`,pricingUnit:`Unit: CNY / per 1M tokens`,pricingNotes:`Pricing notes`,ubPeak:`Peak`,ubOff:`Off`,ubStd:`Std`,peakBand:`Peak/off-peak band`,pricingSource:`Data source`,noteCache:`Cache hits are billed at the cache rate, cutting cost.`,noteBand:`Peak and off-peak prices differ; off-peak is roughly half price.`,noteSource:`Prices come from the live rate + model catalog; unlisted models count as 0 and are flagged.`,balance:`Balance`,recharge:`Top up`,rechargeHint:`Open the vendor's official top-up page`,balanceUnconfigured:`Not set`,balanceUnauthorized:`Bad key`,balanceUnreachable:`Unavailable`,uncatalogued:`Not catalogued`,estimatedPricing:`Estimated`,balanceDays:`~{days} days left`,balanceLowBody:`{name} balance {balance}, ~{days} days left, please top up`,reconcileDrift:`Detected {provider} official balance moved {spent}, this panel recorded {today}; the gap usually comes from other tools or APIs consuming too`,reconcileDismiss:`Got it`,subscriptionNotConfigured:`Key not set`,subscriptionUnauthorized:`Bad key`,subscriptionUnavailable:`Unavailable`,subscriptionInvalid:`Bad response`,subscriptionRateLimited:`Rate limited`,subscriptionSession:`Current`,subscriptionWeekly:`Weekly`,subscriptionMonthly:`Monthly`,subscriptionBilling:`Billing`,subscriptionRemaining:`{pct}% left`,subscriptionExhausted:`Exhausted`,subscriptionReset:`Resets {date}`,subscriptionNoApi:`Provider does not offer a usage API`,floatWindow:`Model usage popover`,floatModeCombined:`Combined`,floatModeSubscription:`Subscription card`,floatMode:`Display mode`,floatTargets:`Targets`,floatWindowHint:`Usage summary floating on the footer card; Combined=current style, Subscription cards=one quota card at a time (switchable).`,floatPrimaryToday:`Today`,floatPrimaryWeek:`Week`,floatPrimaryMonth:`Month`,cardDisplay:`Billing card`,cardDisplayHint:`Switch the bottom-left billing card between cost and token usage, and pick the figure range (sparkline follows; the popover is unaffected).`,cardMetric:`Main metric`,cardMetricMoney:`Cost`,cardMetricTokens:`Token usage`,cardSpan:`Range`,cardSpanDay:`Day`,cardSpanWeek:`Week`,cardSpanMonth:`Month`,floatNoTargets:`No subscription selected — pick some in Settings.`,floatNoTargetsHint:`No subscription channel available.`,subscriptionsStale:`Subscription refresh failed — showing cached data`,staleLedgerNotice:`{count} sessions use legacy-algorithm archives (logs deleted); attribution may be off`,unreadableNotice:`{count} sessions are not counted yet (newer session format; data is intact and restores automatically after a dsh fix)`,tokenCacheWrite:`written`,toolRank:`Tool calls`,toolName:`Tool`,userPrices:`Custom prices`,userPricesHint:`Enter actual per-1M-token prices; main views are re-costed. Pick a model key from the dropdown candidates. Leave source empty for the model default, or enter a relay origin (protocol optional) to price only that source. Fill all three off-peak fields for peak/off-peak estimation; leave them empty for flat pricing.`,userPriceSave:`Save`,userPriceModel:`Model`,userPriceSource:`Source (relay origin)`,userPriceSourceHint:`Empty = default; e.g. https://api.relay.com`,userPriceOffPeak:`Off-peak price`,userPriceNormal:`Standard price`,userPriceCurrency:`Currency`,userPriceAdd:`Add`,userPriceRemoveSelected:`Remove selected`,userPriceSelect:`Select this row`,sessionStaleBadge:`legacy`,sessionUntitled:`Untitled session`,heatmapLess:`Less`,heatmapMore:`More`,currency:`Currency`,currencyCny:`CNY`,currencyUsd:`USD`,currencyEur:`EUR`,language:`Interface language`,heatmap:`Usage heatmap`,rounds:`Cost per turn`,roundsHint:`Last {count} rounds · bar tops show amount · fill = peak/off-peak`,anomaly:`Cost spike`,model:`Model`,thModel:`Model name`,thInputMiss:`Input (cache miss)`,thInputHit:`Input (cache hit)`,costAbbr:`cost`,tabOverview:`Overview`,tabTrends:`Trends`,tabProviders:`Bills`,tabPricing:`Rates`,tabSettings:`Settings`,budgetHint:`Set a monthly cap for projections and tier alerts`,peakAlertHint:`Alert before a tier switch, optionally via system notification`,peakAlertDescPeak:`About to enter peak hours — prices rise, plan long tasks ahead`,peakAlertDescOff:`About to enter off-peak hours — price halves, ideal for large batches`,peakAlertDescPeakZhipu:`Peak hours soon (weekdays 14:00–18:00) — Coding Plan credits will be deducted at full rate`,peakAlertDescOffZhipu:`Off-peak soon — Coding Plan credits will be deducted at 50% of base credits`,export:`Export`,exportCsvDay:`Daily CSV`,exportCsvSession:`Sessions CSV`,exportJson:`Full JSON`,peakShare:`Peak vs off-peak`,peakSharePerCall:`per-call attribution, full history`,offPeakSavings:`Shift peak to off-peak: save ~{amount}`,perfMax:`Max TTFT`,weekCost:`This week's spend`,roleCost:`Cost breakdown`,roleUser:`User input`,roleAssistant:`Assistant output`,roleTool:`Tool results`,roleHint:`Estimated: output priced exactly, input split by message size`,tierPeak:`Peak`,tierOff:`Off-peak`,tierToPeak:`until peak`,tierToOff:`until off-peak`,tierAlertEnterPeak:`Peak pricing (2x) starts in {minutes} min — non-urgent calls can wait`,tierAlertEnterOff:`Off-peak pricing (50% off) starts in {minutes} min`,tierAlertEnterPeakZhipu:`Zhipu peak hours in {minutes} min — Coding Plan credits burn at full rate`,tierAlertEnterOffZhipu:`Zhipu off-peak in {minutes} min — credit burn drops to 50%`,peakAlertTitlePeak:`Peak pricing incoming`,peakAlertTitleOff:`Off-peak incoming`,peakAlert:`Peak/off-peak alert`,peakAlertLeadMin:`Lead time (min)`,peakAlertPos:`Position`,peakAlertMode:`Remind mode`,peakAlertPosCorner:`Bottom-right`,peakAlertPosCenter:`Center`,peakAlertModePeak:`Entering peak only`,peakAlertModeOff:`Entering off-peak only`,peakAlertModeBoth:`Both`,peakAlertWebNotify:`Also send system notification`,peakAlertPreview:`Preview alert`,planTypeCode:`Subscription`,planTypeToken:`Usage`,subscriptionFeePerMonth:`{amount}/mo`,triggerToday:`Today's spend`,triggerMonth:`This month's spend`,triggerMonthTokens:`This month's tokens`,triggerTodayTokens:`Today's tokens`,triggerWeekTokens:`This week's tokens`,subscriptionTag:`Plan`,free:`Free`,perfSamples:`Samples`,perfTtft:`TTFT`,perfP50:`P50`,perfP90:`P90`,perfTps:`Speed`,perfLatency:`Total latency`,perfEstimated:`Estimated`,perfEmpty:`No performance data yet`,perfTpsUnit:`tok/s`,perfTitle:`Performance`,perfHint:`Per model & per hour; estimated samples are tool-continuation steps`,perfAll:`All`,perfChartEmpty:`No model selected or no data for this metric`,heatmapYear:`Year`,heatmapHalf:`Half`,heatmapMonth:`Month`,metricCost:`Cost`,metricTokens:`Tokens`,heatmapTotal:`Total`,activeDays:`Active days`,streakDays:`Streak`,subscriptionAutoDetect:`Auto`,pluginAuthor:`Author`,pluginRepository:`Repository`,pluginNpm:`npm`,pluginLicense:`License`,tabToken:`Usage`,tokenExport:`Export tokens`,tokenExportCsv:`Daily token CSV`,tokenReasoningShare:`Reasoning share`,tokenReasoningShort:`reasoning`,tokenIo:`In/out ratio`,tokenPeak:`Peak day`,tokenDaily:`Daily tokens`,tokenByModel:`Tokens by model`,tokenMiss:`Input (cache miss)`,tokenHit:`Input (cache hit)`,tokenOutput:`Output`,tokenViewStructure:`Structure`,tokenViewModel:`By model`,tokenHitShort:`Hit`,tokenMissShort:`Miss`,tokenTotal:`Total tokens`,tokenShare:`Share`,usageStatsTool:`Inject usage-stats tool`,usageStatsToolHint:`Lets the model query usage/cost inside a conversation; it consumes context per request, so keep it off for coding (takes effect immediately)`,balanceGranted:`Granted`,balanceTopped:`Topped up`,balanceDaily:`Daily burn`,balanceDaysLong:`~days left`,balanceDaysUnit:`days`,popTodayModel:`Main model balance`,popTitle:`Usage overview`,popNoConsumption:`No usage yet`,popDirectLead:`Direct`,popSubLead:`Subscription`,unpricedHint:`{count} models not priced; their cost counts as 0`,searchEstimateHint:`Includes estimated cost of {count} web-search requests (~{each} each; no usage events logged, per-call estimate; tune via searchCallEstimateCny)`,siteListDisplay:`Relay lists`,siteListDisplayHint:`Hide "unidentified" placeholder rows in the relay quota list`,liveCostBar:`Live cost capsule`,liveCostBarHint:`Live cost bar beside the composer; hover for details`,liveCostBarPosition:`Position`,liveCostBarPosBelow:`Below composer`,liveCostBarPosAbove:`Above composer`,liveCostBarPosToolbar:`Inside composer`,exportCsvSite:`By site CSV`,panelRelayQuota:`Relay quotas`,relayBalance:`Balance`,relayNoQuota:`No quota`,relayWindowUsed:`used`,relayKindNewApi:`New API`,relayKindSub2Api:`Sub2API`,relayKindUnknown:`Unknown`,expandAll:`Expand all`,collapseAll:`Collapse all`,todayOnly:`Today only`,todayNoConsumption:`No usage today`},L={"opencode-go":{type:`code`,subscription:{amount:10,currency:`USD`,period:`month`},tier:{amount:10,currency:`USD`,periodDays:7,label:`周额度 $30`}},opencode:{type:`code`,subscription:{amount:10,currency:`USD`,period:`month`},tier:{amount:10,currency:`USD`,periodDays:7,label:`周额度 $30`}},"kimi-coding":{type:`code`},"zai-coding-cn":{type:`code`},"zai-coding":{type:`code`},commandcode:{type:`code`},"qwen-token-plan":{type:`code`},"qwen-token-plan-cn":{type:`code`},"xiaomi-token-plan-ams":{type:`code`},"xiaomi-token-plan-cn":{type:`code`},"xiaomi-token-plan-sgp":{type:`code`},"volcengine-token-plan":{type:`code`},"ark-token-plan":{type:`code`},"doubao-token-plan":{type:`code`},minimax:{type:`code`},"minimax-cn":{type:`code`},"minimax-token-plan":{type:`code`},"minimax-token-plan-cn":{type:`code`},"hunyuan-token-plan":{type:`code`},"tencent-token-plan":{type:`code`},"hy-token-plan":{type:`code`},"xinghuo-token-plan":{type:`code`},"xfyun-coding":{type:`code`},"spark-coding":{type:`code`},"huawei-token-plan":{type:`code`},"pangu-token-plan":{type:`code`},"huawei-maas-token-plan":{type:`code`},"volcengine-agent-plan":{type:`code`},"ark-agent-plan":{type:`code`},"baidu-token-plan":{type:`code`},"ernie-token-plan":{type:`code`},"wenxin-token-plan":{type:`code`}},R={glm:`zai-coding-cn`,bigmodel:`zai-coding-cn`,zhipu:`zai-coding-cn`,zhipuai:`zai-coding-cn`,zai:`zai-coding`,ark:`volcengine-token-plan`,volcengine:`volcengine-token-plan`,doubao:`doubao-token-plan`,moonshot:`kimi-coding`,kimi:`kimi-coding`,xiaomi:`xiaomi-token-plan-cn`,opencode:`opencode-go`};function Ie(e){return e===``?e:R[e]??e}function Le(e){let t=L[Ie(e)];return t?.type===`code`?t.tier:void 0}let Re=[{key:`deepseek-v4-flash`,input:.14,cacheHit:.0028,output:.28},{key:`deepseek-v4-pro`,input:.435,cacheHit:.003625,output:.87},{key:`gpt-5.6-sol`,input:5,cacheHit:.5,output:30},{key:`gpt-5.6-terra`,input:2,cacheHit:.2,output:12},{key:`gpt-5.6-luna`,input:.2,cacheHit:.02,output:1.2},{key:`glm-5.2`,input:1.4,cacheHit:.26,output:4.4},{key:`qwen3.8-max`,input:2,cacheHit:.21,output:6},{key:`kimi-k3`,input:2.82,cacheHit:.28,output:14.08},{key:`grok-4.6`,input:2,cacheHit:.5,output:6},{key:`gemini-2.5-pro`,input:1.25,cacheHit:.125,output:10}],ze,Be,Ve,z,He,B;function Ue(e){let t=/:\/\//.test(e)?e:`https://${e}`;try{return new URL(t).origin}catch{return e.trim().toLowerCase().replace(/\/+$/,``)}}function We(e,t){return Ue(e)===Ue(t)}function V(e){B=e.length>0?e:void 0}function Ge(){return B}function H(e){return At(e)}function U(e,t){let n=Ke(e,t);if(n!==void 0)return{input:n.input,cacheHit:n.cacheHit,output:n.output,...n.currency===void 0?{}:{currency:n.currency},...n.offPeak===void 0?{}:{offPeak:n.offPeak}}}function Ke(e,t){if(B===void 0)return;let n=H(e),r=G(n),i=e=>H(e.key)===n||G(e.key)===r;if(t!==void 0){for(let e of B)if(e.origin!==void 0&&e.origin!==``&&i(e)&&We(e.origin,t))return e}for(let e of B)if((e.origin===void 0||e.origin===``)&&i(e))return e}function qe(e){if(B===void 0)return;let t=H(e),n=G(t);return B.find(e=>e.origin!==void 0&&e.origin!==``&&(H(e.key)===t||G(e.key)===n))}function Je(e){ze=typeof e.rate==`number`&&Number.isFinite(e.rate)&&e.rate>0?e.rate:void 0,Be=typeof e.rateEur==`number`&&Number.isFinite(e.rateEur)&&e.rateEur>0?e.rateEur:void 0,Ve=e.prices,z=e.extraModels}function Ye(e){He=e}function Xe(){return ze??6.79}function Ze(){return Be??7.71}function Qe(){return{rate:Xe(),live:ze!==void 0}}function $e(){return{rate:Ze(),live:Be!==void 0}}let et=.5;function tt(e){return e==null||!Number.isFinite(e)?`peak`:nt(e,at,!0)}function nt(e,t,n=!1){if(W(e)||n&&it(e))return`offPeak`;let r=Math.floor(st(e)/6e4);for(let e=0;e+1<t.length;e+=2){let n=t[e]??0,i=t[e+1]??0;if(r>=n&&r<i)return`peak`}return`offPeak`}function W(e){let t=new Date(e+288e5).getUTCDay();return t===0||t===6}function rt(e){return new Date(e+288e5).toISOString().slice(0,10).replace(/-/g,``)}function it(e){return`20260925 20260926 20260927 20261001 20261002 20261003 20261004 20261005 20261006 20261007`.includes(rt(e))}let at=[540,720,840,1080],ot=[840,1080];function st(e){return((e+288e5)%864e5+864e5)%864e5}function ct(e,t,n=!1){let r=nt(e,t,n),i=st(e);for(let a=0;a<10;a++){let o=a*864e5-i;for(let i of t){let a=o+i*6e4;if(!(a<=0)&&nt(e+a,t,n)!==r)return{tier:r,nextSwitchInMs:a}}}let a=t[0]??0;return{tier:r,nextSwitchInMs:864e5-i+a*6e4}}function lt(e,t,n,r=!1){let{nextSwitchInMs:i}=ct(e,t,r);if(i>n)return null;let a=e+i;return{entering:nt(a,t,r),atMs:a}}function ut(e,t){if(e===void 0||e===``)return`none`;let n=At(e),r=_t().find(e=>e.key===n)?.provider;return r===`DeepSeek`?`deepseek-metered`:t&&r===`智谱 AI`?`zhipu-coding-plan`:`none`}function dt(e,t){switch(t){case`deepseek-metered`:return ct(e,at,!0);case`zhipu-coding-plan`:return ct(e,ot);case`none`:return null}}function ft(e,t,n){switch(t){case`deepseek-metered`:return lt(e,at,n,!0);case`zhipu-coding-plan`:return lt(e,ot,n);case`none`:return null}}function pt(e){let t=Math.max(1,Math.ceil(e/6e4)),n=Math.floor(t/60),r=t%60;return n>0?`${n}h${String(r).padStart(2,`0`)}m`:`${r}m`}let mt=[],ht={};function gt(e,t){mt=e,ht=t,bt=void 0}function _t(){return mt}function vt(){return ht}let yt={key:`other`,name:`其他模型`,provider:`Custom`,colorVar:`dsw-static-neutral-bluish-500`,price:{currency:`CNY`,input:0,cacheHit:0,cacheMiss:0,output:0}};function G(e){return String(e).toLowerCase().replace(/\([^)]*\)/g,``).replace(/[^a-z0-9]+/g,``)}let bt;function xt(){if(bt!==void 0)return bt;let e=new Map,t=(t,n)=>{let r=G(t);r!==``&&!e.has(r)&&e.set(r,n)};for(let e of mt)t(e.key,e.key);for(let[e,n]of Object.entries(ht))t(e,n);for(let e of Re)t(e.key,e.key);return bt=e,e}let St,Ct,wt;function Tt(){if(St===z)return;let e=new Map,t=new Map;for(let n of z??[]){t.has(n.key)||t.set(n.key,n);let r=G(n.key);r!==``&&!e.has(r)&&e.set(r,n)}St=z,Ct=e,wt=t}function Et(){return Tt(),Ct??new Map}function Dt(){return Tt(),wt??new Map}function Ot(e){let t=[],n=e=>{e!==``&&!t.includes(e)&&t.push(e)},r=e=>{let t=e;for(;;){let e=t.replace(/[-_]\d{3,}$/u,``);if(e===t||e===``)return;t=e,n(t)}},i=e.lastIndexOf(`/`);if(i>0&&i<e.length-1){let t=e.slice(i+1);n(t),r(t)}return r(e),t}function kt(e){let t=vt()[e];if(t!==void 0)return t;let n=G(e);if(n===``)return;let r=xt().get(n);return r===void 0?Et().get(n)?.key:r}function At(e){let t=vt()[e]??e;if(t===e){let t=G(e);if(t!==``){let e=xt().get(t);if(e!==void 0)return e;let n=Et().get(t);if(n!==void 0)return n.key}for(let t of Ot(e)){let e=kt(t);if(e!==void 0)return e}}return t}function jt(e){let t=At(e),n=Ve?.[t];if(n!==void 0)return n;let r=Re.find(e=>e.key.toLowerCase()===t.toLowerCase());if(r!==void 0)return{input:r.input,cacheHit:r.cacheHit,output:r.output}}function Mt(e){let t=At(e),n=_t().find(e=>e.key===t),r=Dt().get(t),i=n??(r===void 0?_t().find(e=>e.key===`other`)??yt:Nt(r)),a=U(t);if(a!==void 0)return{...i,userPriced:!0,price:{currency:a.currency??`CNY`,input:a.input,cacheHit:a.cacheHit,output:a.output,...a.offPeak===void 0?{}:{offPeak:a.offPeak}}};let o=jt(t);return o===void 0||i.price.offPeak!==void 0?i:{...i,price:{currency:`USD`,input:o.input,cacheHit:o.cacheHit,output:o.output}}}function Nt(e){return{key:e.key,name:e.name,provider:e.provider,colorVar:`dsw-static-neutral-400`,price:{currency:`USD`,input:e.price.input,cacheHit:e.price.cacheHit,output:e.price.output}}}function Pt(e,t){let n=e.endsAtMs!==void 0&&t>=e.endsAtMs;return Number.isFinite(t)&&!n&&e.factor>0&&e.factor<1}function Ft(e,t){let{promo:n}=e;if(n===void 0||!Pt(n,t))return e;let r=e=>n.factors?.[e]??n.factor,i=e=>({input:e.input*r(`input`),cacheHit:e.cacheHit*r(`cacheHit`),...e.cacheMiss===void 0?{}:{cacheMiss:e.cacheMiss*r(`cacheMiss`)},output:e.output*r(`output`)});return{...e,price:{...i(e.price),currency:e.price.currency,...e.price.offPeak===void 0?{}:{offPeak:i(e.price.offPeak)}}}}function It(e=Date.now()){let t=[..._t().filter(e=>e.retired!==!0).map(t=>Ft(t,e))],n=new Set(t.map(e=>e.key.toLowerCase())),r=new Set(t.map(e=>G(e.key)));for(let e of He??[]){let i=e.id.toLowerCase();if((()=>{let t=At(e.id);return _t().find(e=>e.key===t)})()!==void 0)continue;let a=G(e.id);if(n.has(i)||a!==``&&r.has(a))continue;let o=Et().get(a),s;if(o!==void 0)s=Nt(o),e.name!==void 0&&e.name!==``&&(s={...s,name:e.name});else{let t=jt(i);s=t===void 0?{key:At(e.id),name:e.name??e.id,provider:e.provider,colorVar:`dsw-static-neutral-400`,price:{currency:`USD`,input:0,cacheHit:0,output:0},uncatalogued:!0}:{key:i,name:e.name??e.id,provider:e.provider,colorVar:`dsw-static-neutral-400`,price:{currency:`USD`,input:t.input,cacheHit:t.cacheHit,output:t.output}}}n.add(s.key.toLowerCase()),a!==``&&r.add(a),t.push(s)}return t.map(e=>{let t=U(e.key);return t===void 0?e:{...e,userPriced:!0,price:{currency:t.currency??`CNY`,input:t.input,cacheHit:t.cacheHit,output:t.output}}})}function Lt(e){let t=getComputedStyle(document.documentElement).getPropertyValue(`--${e}`).trim();return t===``?`#8b95a3`:t}function Rt(e,t,n){let r=t.cacheMiss>0?t.cacheMiss:Math.max(0,t.input-t.cacheHit),i=Math.min(t.cacheHit,t.input),a=(r*(e.cacheMiss??e.input)+i*e.cacheHit+t.output*e.output)/1e6;return n===`USD`?a*Xe():a}function zt(e,t,n=et,r=Date.now()){let i=Ft(e,r),a=Rt(i.price,t,i.price.currency),o=i.price.offPeak===void 0?a:Rt(i.price.offPeak,t,i.price.currency);return a*n+o*(1-n)}function K(e){let t=Xe();return t>0?e/t:e}function Bt(e,t){if(t===`usd`)return K(e);if(t===`eur`){let t=Ze();return t>0?e/t:e}return e}function q(e,t=`cny`){let n=Number(e),r=t===`usd`?`$`:t===`eur`?`€`:`¥`;return!Number.isFinite(n)||n<=0?`${r}0`:n>=1e3?`${r}${n.toFixed(0)}`:n>=10?`${r}${n.toFixed(1)}`:n>=.1?`${r}${n.toFixed(2)}`:`${r}${n.toFixed(3)}`}function Vt(e,t=`CNY`){return`${t===`USD`?`$`:t===`EUR`?`€`:`¥`}${e.toFixed(e>=10?1:2)}`}function Ht(e,t,n,r){if(r<=0||!Number.isFinite(r))return e;let i=t===`USD`?e*r:e;if(n===`cny`)return i;if(n===`usd`)return i/r;let a=$e().rate;return a>0?i/a:i}function J(e=Date.now()){let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`}function Y(e){return e>=1e9?`${(e/1e9).toFixed(2)}B`:e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(0)}K`:String(e)}function Ut(e){let t=Number(e);return Number.isFinite(t)?`${t.toFixed(1)}%`:`0.0%`}function Wt(e){return/[",\r\n]/.test(e)?`"${e.replace(/"/g,`""`)}"`:e}function Gt(e){return/^[=+\-@\t\r]/.test(e)?`'${e}`:e}function Kt(e){return e.toFixed(2)}function qt(e){return[`date,calls,input,output,cache_hit,cache_miss,cost_cny`,...Object.keys(e).sort().map(t=>{let n=e[t];return n===void 0?``:[t,n.calls,n.input,n.output,n.cacheHit,n.cacheMiss,Kt(n.cost)].join(`,`)})].join(`
|
|
2
2
|
`)}function Jt(e){return[`site,kind,calls,cost_cny`,...Object.entries(e).map(([e,t])=>{let n=e.startsWith(`site:`)?e.slice(5):e.startsWith(`direct:`)?e.slice(7):`unknown`,r=e.startsWith(`site:`)?`site`:e.startsWith(`direct:`)?`direct`:`unknown`;return[Wt(Gt(n)),r,t.calls,Kt(t.cost)].join(`,`)})].join(`
|
|
3
3
|
`)}function Yt(e){return e===void 0?``:e.split(/[\\/]/).filter(Boolean).pop()??e}function Xt(e){return[`session_id,title,project,calls,cost_cny,last_active`,...e.map(e=>[Wt(Gt(e.id)),Wt(Gt(e.title??``)),Wt(Gt(Yt(e.cwd))),e.calls,Kt(e.cost),e.lastActive>0?new Date(e.lastActive).toISOString():``].join(`,`))].join(`
|
|
4
4
|
`)}function Zt(e,t,n){let r=[...n].sort(),i=r[0],a=r.at(-1);return`${e}${i!==void 0&&a!==void 0?`-${i}_${a}`:``}.${t}`}function Qt(e,t,n){let r=URL.createObjectURL(new Blob([t],{type:n})),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),setTimeout(()=>URL.revokeObjectURL(r),0)}function $t(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(Math.round(e))}let X={top:14,right:18,bottom:22,left:46},en=`var(--ds-blue)`,tn=`var(--ds-cyan)`,nn=`var(--ds-amber)`;function rn(e,t,n,r){return JSON.stringify({days:e,models:t,dayModels:n,total:r},null,2)}function an(e){let{stats:t,trendDays:n,onTrendDays:r,t:i}=e,a=e.money,o=e.models??[],{byDay:s,byModel:c,total:l}=t,[u,f]=(0,d.useState)(null),[p,h]=(0,d.useState)(`structure`),[g,_]=(0,d.useState)(null),v=t.byDayModels!==void 0,b=e=>{h(e),_(null)},x=(0,d.useMemo)(()=>{let e=t.byRole;if(e===void 0)return[];let n=e.user+e.assistant+e.tool;return n<=0?[]:[{label:i(`roleUser`),value:e.user,seg:I.shareSegUser},{label:i(`roleAssistant`),value:e.assistant,seg:I.shareSegAssistant},{label:i(`roleTool`),value:e.tool,seg:I.shareSegTool}].map(e=>({...e,pct:e.value/n*100}))},[t.byRole,i]),S=(0,d.useMemo)(()=>{let e=[];for(let t=n-1;t>=0;--t){let n=new Date;n.setDate(n.getDate()-t);let r=J(n.getTime()),i=s[r];e.push({date:r,miss:i?.cacheMiss??0,hit:i?.cacheHit??0,output:i?.output??0,reasoning:i?.reasoning??0})}return e},[s,n]),C=(0,d.useMemo)(()=>{let e=[];for(let r=n-1;r>=0;--r){let n=new Date;n.setDate(n.getDate()-r);let i=J(n.getTime()),a=t.byDayModels?.[i],o={},s=0;if(a!==void 0)for(let[e,t]of Object.entries(a)){let n=t.cacheHit??0,r=t.cacheMiss??0,i=t.output??0,a=n+r+i;a<=0||(o[e]={hit:n,miss:r,output:i,total:a},s+=a)}e.push({date:i,models:o,total:s})}return e},[t.byDayModels,n]),w=(0,d.useMemo)(()=>{let e=new Map;for(let t of C)for(let[n,r]of Object.entries(t.models))e.set(n,(e.get(n)??0)+r.total);return[...e.entries()].sort((e,t)=>t[1]-e[1]).map(([e])=>({key:e,name:o.find(t=>t.key===e)?.name??Mt(e).name,color:o.find(t=>t.key===e)?.color??`#8b95a3`}))},[C,o]),T=g!==null&&w.some(e=>e.key===g)?g:null,ee=e=>{if(v){if(p!==`model`){h(`model`),_(e);return}_(t=>t===e?null:e)}},E=(0,d.useMemo)(()=>{let e=0;return Object.entries(c).filter(([,e])=>e.calls>0).map(([t,n])=>{let r=n.input+n.output;e+=r;let i=n.cacheHit+n.cacheMiss;return{key:t,name:Mt(t).name,input:n.input,output:n.output,reasoning:n.reasoning??0,calls:n.calls,cacheHit:n.cacheHit,cacheMiss:n.cacheMiss,cacheHitRate:i>0?n.cacheHit/i*100:0,total:r,share:0}}).sort((e,t)=>t.total-e.total).map(t=>({...t,share:e>0?t.total/e:0}))},[c]),D=(0,d.useMemo)(()=>{let e=Object.entries(t.byTool??{}),n=e.slice(0,8),r=e.slice(8).reduce((e,[,t])=>e+t,0),i=e.reduce((e,[,t])=>e+t,0);return{top:n,rest:r>0?[[`…`,r]]:[],totalCalls:i}},[t.byTool]),O=(0,d.useMemo)(()=>{let e=S.length;if(e===0)return null;let t=680-X.left-X.right,n=200-X.top-X.bottom,r=Math.max(...p===`model`?C.map(e=>e.total):S.map(e=>e.miss+e.hit+e.output),1),i=e=>X.top+n-e/r*n,a=t/e,o=Math.min(20,a*.6),s=n=>e===1?X.left+t/2:X.left+t*n/(e-1),c=Math.max(1,Math.ceil(e/8)),l=[];for(let t=0;t<e;t+=c)l.push(t);return e>0&&l[l.length-1]!==e-1&&l.push(e-1),{n:e,plotW:t,plotH:n,max:r,y:i,barW:o,inner:s,indices:l,groupW:a}},[S,C,p]),te=()=>{Qt(`token-daily-${J()}.csv`,on(S),`text/csv`)},ne=()=>{Qt(`token-${J()}.json`,rn(S,E,C,l),`application/json`)},k=u===null?void 0:S[u],re=u===null?void 0:C[u],ie=O===null?0:Math.ceil(80/Math.max(O.groupW,1)),A=u===null||O===null?void 0:u>=O.n-ie?I.chartTooltipAlignRight:u<ie?I.chartTooltipAlignLeft:void 0;return(0,m.jsxs)(`div`,{className:I.tokenPanel,"data-testid":`billing-token-panel`,children:[(0,m.jsxs)(`div`,{className:I.exportBar,role:`group`,"aria-label":i(`tokenExport`),children:[(0,m.jsx)(`span`,{className:I.exportLabel,children:i(`export`)}),(0,m.jsx)(`button`,{type:`button`,className:I.exportButton,"data-testid":`billing-token-export-csv`,onClick:te,children:i(`tokenExportCsv`)}),(0,m.jsx)(`button`,{type:`button`,className:I.exportButton,"data-testid":`billing-token-export-json`,onClick:ne,children:i(`exportJson`)})]}),(0,m.jsxs)(`section`,{className:I.panel,"data-testid":`billing-token-daily`,children:[(0,m.jsxs)(`div`,{className:I.panelHead,children:[(0,m.jsx)(`h3`,{className:I.panelTitle,children:i(`tokenDaily`)}),(0,m.jsxs)(`span`,{className:I.panelHeadControls,children:[v&&(0,m.jsx)(`span`,{className:I.rangeToggle,role:`group`,"aria-label":i(`tokenDaily`),children:[`structure`,`model`].map(e=>(0,m.jsx)(`button`,{type:`button`,className:y(I.rangeButton,p===e&&I.rangeButtonActive),"aria-pressed":p===e,onClick:()=>{b(e)},"data-testid":`billing-token-view-${e}`,children:i(e===`structure`?`tokenViewStructure`:`tokenViewModel`)},e))}),(0,m.jsx)(`span`,{className:I.rangeToggle,role:`group`,"aria-label":i(`tokenDaily`),children:[7,30].map(e=>(0,m.jsx)(`button`,{type:`button`,className:y(I.rangeButton,n===e&&I.rangeButtonActive),"aria-pressed":n===e,onClick:()=>{r(e)},"data-testid":`billing-token-${e}d`,children:i(e===7?`trend7d`:`trend30d`)},e))})]})]}),O===null||p===`model`&&w.length===0?(0,m.jsx)(`div`,{className:I.chartEmpty,children:i(`trendEmpty`)}):(0,m.jsxs)(`div`,{className:I.chartWrap,children:[(0,m.jsxs)(`svg`,{viewBox:`0 0 680 200`,className:I.chartSvg,role:`img`,"aria-label":i(`tokenDaily`),onMouseLeave:()=>{f(null)},onMouseMove:e=>{let t=e.currentTarget.getBoundingClientRect(),n=((e.clientX-t.left)/t.width*680-X.left)/O.plotW,r=Math.round(n*(O.n-1));f(Math.min(Math.max(r,0),O.n-1))},children:[[0,.5,1].map(e=>{let t=O.max*e,n=O.y(t);return(0,m.jsxs)(`g`,{children:[(0,m.jsx)(`line`,{x1:X.left,x2:680-X.right,y1:n,y2:n,className:I.chartGrid}),(0,m.jsx)(`text`,{x:X.left-8,y:n+3,textAnchor:`end`,className:I.chartAxisLabel,children:$t(t)})]},e)}),p===`structure`?S.map((e,t)=>{let n=O.inner(t)-O.barW/2,r=O.y(0),i=O.y(e.miss),a=O.y(e.miss+e.hit),o=O.y(e.miss+e.hit+e.output);return(0,m.jsxs)(`g`,{children:[(0,m.jsx)(`rect`,{x:n,y:i,width:O.barW,height:r-i,fill:en}),(0,m.jsx)(`rect`,{x:n,y:a,width:O.barW,height:i-a,fill:tn}),(0,m.jsx)(`rect`,{x:n,y:o,width:O.barW,height:a-o,fill:nn})]},e.date)}):C.map((e,t)=>{let n=O.inner(t)-O.barW/2,r=0;return(0,m.jsx)(`g`,{children:w.map(t=>{let i=e.models[t.key];if(i===void 0)return null;let a=O.y(r);r+=i.total;let o=O.y(r),s=T!==null&&t.key!==T;return(0,m.jsx)(`rect`,{x:n,y:o,width:O.barW,height:a-o,fill:t.color,opacity:s?.15:1},t.key)})},e.date)}),O.indices.map(e=>{let t=S[e];return t===void 0?null:(0,m.jsx)(`text`,{x:O.inner(e),y:194,textAnchor:`middle`,className:I.chartAxisLabel,children:t.date.slice(5)},t.date)}),u!==null&&(0,m.jsx)(`line`,{x1:O.inner(u),x2:O.inner(u),y1:X.top,y2:X.top+O.plotH,className:I.chartCrosshair})]}),u!==null&&p===`structure`&&k!==void 0&&(0,m.jsxs)(`div`,{className:y(I.chartTooltip,A),"data-testid":`billing-token-tooltip`,style:{left:`${O.inner(u)/680*100}%`,top:`${O.y(k.miss+k.hit+k.output)/200*100}%`},children:[(0,m.jsxs)(`div`,{className:I.chartTooltipHead,children:[(0,m.jsx)(`span`,{className:I.chartTooltipDate,children:k.date}),(0,m.jsx)(`strong`,{children:(k.miss+k.hit+k.output).toLocaleString()})]}),(0,m.jsxs)(`div`,{className:y(I.chartTooltipRow,I.chartTooltipSplit),children:[(0,m.jsxs)(`span`,{className:I.chartTooltipLabel,children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:tn}}),i(`tokenHit`)]}),(0,m.jsx)(`strong`,{children:k.hit.toLocaleString()})]}),(0,m.jsxs)(`div`,{className:y(I.chartTooltipRow,I.chartTooltipSplit),children:[(0,m.jsxs)(`span`,{className:I.chartTooltipLabel,children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:en}}),i(`tokenMiss`)]}),(0,m.jsx)(`strong`,{children:k.miss.toLocaleString()})]}),(0,m.jsxs)(`div`,{className:y(I.chartTooltipRow,I.chartTooltipSplit),children:[(0,m.jsxs)(`span`,{className:I.chartTooltipLabel,children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:nn}}),i(`tokenOutput`)]}),(0,m.jsx)(`strong`,{children:k.output.toLocaleString()})]})]}),u!==null&&p===`model`&&re!==void 0&&(0,m.jsxs)(`div`,{className:y(I.chartTooltip,A),"data-testid":`billing-token-tooltip`,style:{left:`${O.inner(u)/680*100}%`,top:`${O.y(re.total)/200*100}%`},children:[(0,m.jsxs)(`div`,{className:I.chartTooltipHead,children:[(0,m.jsx)(`span`,{className:I.chartTooltipDate,children:re.date}),(0,m.jsx)(`strong`,{children:re.total.toLocaleString()})]}),w.map(e=>{let t=re.models[e.key];return t===void 0?null:(0,m.jsxs)(`div`,{className:I.chartTooltipModel,children:[(0,m.jsxs)(`div`,{className:y(I.chartTooltipRow,I.chartTooltipSplit),children:[(0,m.jsxs)(`span`,{className:I.chartTooltipLabel,children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:e.color}}),e.name]}),(0,m.jsx)(`strong`,{children:t.total.toLocaleString()})]}),(0,m.jsxs)(`div`,{className:I.chartTooltipModelDetail,children:[i(`tokenHitShort`),` `,t.hit.toLocaleString(),` · `,i(`tokenMissShort`),` `,t.miss.toLocaleString(),` · `,i(`tokenOutput`),` `,t.output.toLocaleString()]})]},e.key)})]}),(0,m.jsx)(`div`,{className:I.chartLegend,children:p===`structure`?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:en}}),i(`tokenMiss`)]}),(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:tn}}),i(`tokenHit`)]}),(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:nn}}),i(`tokenOutput`)]})]}):w.map(e=>(0,m.jsxs)(`button`,{type:`button`,className:y(I.chartLegendItem,T===e.key&&I.chartLegendItemActive),"aria-pressed":T===e.key,"data-testid":`billing-token-legend-${e.key}`,onClick:()=>{ee(e.key)},children:[(0,m.jsx)(`span`,{className:I.chartTooltipSwatch,style:{background:e.color}}),e.name]},e.key))})]})]}),(0,m.jsxs)(`section`,{className:I.panel,"data-testid":`billing-token-models`,children:[(0,m.jsx)(`div`,{className:I.panelHead,children:(0,m.jsx)(`h3`,{className:I.panelTitle,children:i(`tokenByModel`)})}),E.length===0?(0,m.jsx)(`div`,{className:I.emptyRow,children:i(`noData`)}):(0,m.jsx)(`div`,{className:I.tableScroll,children:(0,m.jsxs)(`table`,{className:I.modelTable,"data-testid":`billing-token-model-table`,children:[(0,m.jsx)(`thead`,{children:(0,m.jsxs)(`tr`,{children:[(0,m.jsx)(`th`,{children:i(`model`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`inputTokens`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`outputTokens`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`tokenReasoningShort`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`cacheHitRate`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`tokenTotal`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`tokenShare`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`calls`)})]})}),(0,m.jsx)(`tbody`,{children:E.map(e=>(0,m.jsxs)(`tr`,{"data-testid":`billing-token-model`,className:y(v&&I.modelRowFocusable,T===e.key&&I.modelRowActive),"aria-selected":v?T===e.key:void 0,onClick:v?()=>{ee(e.key)}:void 0,tabIndex:v?0:void 0,onKeyDown:v?t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),ee(e.key))}:void 0,children:[(0,m.jsx)(`td`,{children:(0,m.jsx)(`span`,{className:I.modelName,children:e.name})}),(0,m.jsx)(`td`,{className:I.numCol,children:Y(e.input)}),(0,m.jsx)(`td`,{className:I.numCol,children:Y(e.output)}),(0,m.jsx)(`td`,{className:I.numCol,children:e.reasoning>0?Y(e.reasoning):(0,m.jsx)(`span`,{className:I.na,children:`—`})}),(0,m.jsxs)(`td`,{className:I.numCol,children:[e.cacheHitRate.toFixed(1),`%`]}),(0,m.jsx)(`td`,{className:I.numCol,children:Y(e.total)}),(0,m.jsx)(`td`,{className:I.numCol,children:(0,m.jsxs)(`span`,{className:I.tokenModelShareRow,children:[(0,m.jsx)(`span`,{className:I.tokenModelBar,children:(0,m.jsxs)(`span`,{className:I.tokenModelParts,style:{width:`${(e.share*100).toFixed(2)}%`},children:[(0,m.jsx)(`span`,{className:I.tokenModelPartIn,style:{width:`${e.total>0?e.input/e.total*100:0}%`}}),(0,m.jsx)(`span`,{className:I.tokenModelPartOut,style:{width:`${e.total>0?e.output/e.total*100:0}%`}})]})}),(e.share*100).toFixed(1),`%`]})}),(0,m.jsx)(`td`,{className:I.numCol,children:e.calls.toLocaleString()})]},e.key))})]})})]}),D.totalCalls>0&&(0,m.jsxs)(`section`,{className:I.panel,"data-testid":`billing-token-tools`,children:[(0,m.jsx)(`div`,{className:I.panelHead,children:(0,m.jsx)(`h3`,{className:I.panelTitle,children:i(`toolRank`)})}),(0,m.jsx)(`div`,{className:I.tableScroll,children:(0,m.jsxs)(`table`,{className:I.modelTable,"data-testid":`billing-tool-table`,children:[(0,m.jsx)(`thead`,{children:(0,m.jsxs)(`tr`,{children:[(0,m.jsx)(`th`,{children:i(`toolName`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`calls`)}),(0,m.jsx)(`th`,{className:I.numCol,children:i(`tokenShare`)})]})}),(0,m.jsx)(`tbody`,{children:[...D.top,...D.rest].map(([e,t])=>(0,m.jsxs)(`tr`,{"data-testid":`billing-tool-row`,children:[(0,m.jsx)(`td`,{children:(0,m.jsx)(`span`,{className:I.modelName,children:e})}),(0,m.jsx)(`td`,{className:I.numCol,children:t.toLocaleString()}),(0,m.jsxs)(`td`,{className:I.numCol,children:[(t/D.totalCalls*100).toFixed(1),`%`]})]},e))})]})})]}),x.length>0&&(0,m.jsxs)(`section`,{className:I.panel,"data-testid":`billing-panel-roles`,children:[(0,m.jsxs)(`div`,{className:I.panelHead,children:[(0,m.jsx)(`h3`,{className:I.panelTitle,children:i(`roleCost`)}),(0,m.jsx)(`span`,{className:I.panelHint,children:i(`roleHint`)})]}),(0,m.jsx)(`div`,{className:I.shareTrack,"data-testid":`billing-role-track`,children:x.map(e=>(0,m.jsx)(`div`,{className:y(I.shareSeg,e.seg),style:{width:`${e.pct}%`}},e.label))}),(0,m.jsx)(`div`,{className:I.shareLegend,children:x.map(e=>(0,m.jsxs)(`span`,{className:I.shareItem,children:[(0,m.jsx)(`span`,{className:y(I.shareDot,e.seg)}),e.label,(0,m.jsxs)(`span`,{className:I.shareValue,children:[a(e.value),` · `,e.pct.toFixed(1),`%`]})]},e.label))})]})]})}function on(e){return[`date,missInput,cacheHit,output,reasoning,total`,...e.map(e=>`${e.date},${e.miss},${e.hit},${e.output},${e.reasoning},${e.miss+e.hit+e.output}`)].join(`
|
package/lib/index.js
CHANGED
|
@@ -6409,10 +6409,12 @@ async function queryRelayQuotas(ctx, routes) {
|
|
|
6409
6409
|
/**
|
|
6410
6410
|
* usage-stats 工具开关的共享设置契约(node 与 client 两端共用)。
|
|
6411
6411
|
*
|
|
6412
|
-
*
|
|
6413
|
-
*
|
|
6414
|
-
*
|
|
6415
|
-
*
|
|
6412
|
+
* 旧宿主(≤0.1.6)把该开关存设置命名空间;宿主 0.1.7+ 起注册面移除,改存插件
|
|
6413
|
+
* 条目 config 的 volatile 字段(Config schema 投影),写回经 settings.update,
|
|
6414
|
+
* 提交后引用原位更新、`usage_stats` 工具即时注册/注销(无需重载应用)。
|
|
6415
|
+
* client 半区在「设置」Tab 渲染开关并经 /api/billing/usage-tool 写入,node 半区
|
|
6416
|
+
* 按宿主世代选择通道。缺省的默认行为是关闭——避免该工具默认占用模型每次请求
|
|
6417
|
+
* 的上下文(coding 场景通常在仪表盘看用量)。
|
|
6416
6418
|
*/
|
|
6417
6419
|
/** 设置命名空间 id(小写 kebab-case)。 */
|
|
6418
6420
|
const BILLING_SETTINGS_NAMESPACE = "ui-usage-billing";
|
|
@@ -6523,6 +6525,13 @@ function validateSettingsNamespace(value) {
|
|
|
6523
6525
|
const usageBillingSettingsNs = validateSettingsNamespace(BILLING_SETTINGS_NAMESPACE);
|
|
6524
6526
|
/** 该命名空间的 wire schema:`enableUsageStatsTool` 布尔,默认关闭(issue 诉求)。 */
|
|
6525
6527
|
const UsageBillingSettingsSchema = z.object({ [ENABLE_USAGE_STATS_TOOL_FIELD]: z.boolean().default(false) });
|
|
6528
|
+
/**
|
|
6529
|
+
* Loader 挂载时对条目 config 做校验的 Config 声明:`enableUsageStatsTool` 标记
|
|
6530
|
+
* volatile,宿主 0.1.7+ 设置系统据此把它投影为可实时编辑的开关(describe/update)。
|
|
6531
|
+
* schemastery 非严格 object 透传未声明键,其余 config 字段不受影响;未导出 Config
|
|
6532
|
+
* 的旧宿主直接把原始 config 交给 apply,普通布尔形态由读取端兼容。
|
|
6533
|
+
*/
|
|
6534
|
+
const Config = z.object({ [ENABLE_USAGE_STATS_TOOL_FIELD]: z.boolean().default(false).volatile() });
|
|
6526
6535
|
/** 实时定价的后台刷新间隔(毫秒):汇率/模型价低频变化,6 小时一次足够。 */
|
|
6527
6536
|
const PRICING_REFRESH_INTERVAL_MS = 216e5;
|
|
6528
6537
|
/** 历史回放预热的延迟:等宿主启动高峰(插件加载 / 路由挂载)过去再全量折叠,
|
|
@@ -6872,6 +6881,22 @@ function adaptSessionPersistence(raw) {
|
|
|
6872
6881
|
};
|
|
6873
6882
|
}
|
|
6874
6883
|
/**
|
|
6884
|
+
* 读取 usage_stats 工具开关的当前生效值:宿主 0.1.7+ 经 Config 解析后是 volatile
|
|
6885
|
+
* 引用(.get() 即时反映设置写入,无需重载),直连 apply(测试)与未导出 Config 的
|
|
6886
|
+
* 旧宿主组合是普通布尔;缺省/非法值一律回 DEFAULT。
|
|
6887
|
+
* @param config - apply 收到的插件 config。
|
|
6888
|
+
* @returns 开关当前生效值。
|
|
6889
|
+
*/
|
|
6890
|
+
function readUsageStatsToggle(config) {
|
|
6891
|
+
const field = config[ENABLE_USAGE_STATS_TOOL_FIELD];
|
|
6892
|
+
if (typeof field === "boolean") return field;
|
|
6893
|
+
if (typeof field === "object" && field !== null && typeof field.get === "function") {
|
|
6894
|
+
const current = field.get();
|
|
6895
|
+
return typeof current === "boolean" ? current : false;
|
|
6896
|
+
}
|
|
6897
|
+
return false;
|
|
6898
|
+
}
|
|
6899
|
+
/**
|
|
6875
6900
|
* Host plugin body: serve real aggregated usage to the browser dashboard.
|
|
6876
6901
|
* @param ctx - host context carrying webServer and sessionPersistence.
|
|
6877
6902
|
* @param config - optional statsPath override.
|
|
@@ -6879,6 +6904,7 @@ function adaptSessionPersistence(raw) {
|
|
|
6879
6904
|
function apply(ctx, config = {}) {
|
|
6880
6905
|
const trustedHosts = normalizeTrustedHosts(config.trustedHosts);
|
|
6881
6906
|
let usageSettingsScope;
|
|
6907
|
+
let liveSettings;
|
|
6882
6908
|
const cwd = process.cwd();
|
|
6883
6909
|
const dshHome = resolveDshHome();
|
|
6884
6910
|
const snapshotPath = config.snapshotPath ?? join(dshHome, ".dsh-usage-stats.json");
|
|
@@ -7023,131 +7049,113 @@ function apply(ctx, config = {}) {
|
|
|
7023
7049
|
}
|
|
7024
7050
|
}
|
|
7025
7051
|
}), "usage-billing: notify-claim route");
|
|
7026
|
-
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7030
|
-
|
|
7031
|
-
|
|
7032
|
-
|
|
7033
|
-
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
|
|
7045
|
-
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7049
|
-
|
|
7050
|
-
|
|
7051
|
-
|
|
7052
|
-
|
|
7053
|
-
|
|
7054
|
-
|
|
7055
|
-
|
|
7056
|
-
|
|
7057
|
-
|
|
7058
|
-
|
|
7059
|
-
|
|
7060
|
-
|
|
7061
|
-
|
|
7062
|
-
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
|
|
7066
|
-
|
|
7067
|
-
|
|
7068
|
-
|
|
7069
|
-
|
|
7070
|
-
|
|
7071
|
-
|
|
7072
|
-
|
|
7073
|
-
|
|
7074
|
-
|
|
7075
|
-
|
|
7076
|
-
|
|
7077
|
-
|
|
7078
|
-
|
|
7079
|
-
|
|
7080
|
-
|
|
7081
|
-
|
|
7082
|
-
|
|
7083
|
-
async execute(args, exec) {
|
|
7084
|
-
const stats = await aggregator.aggregate();
|
|
7085
|
-
const zero = {
|
|
7086
|
-
range: args.range,
|
|
7087
|
-
cost: 0,
|
|
7088
|
-
calls: 0,
|
|
7089
|
-
input: 0,
|
|
7090
|
-
output: 0
|
|
7091
|
-
};
|
|
7092
|
-
if (args.range === "all") return {
|
|
7093
|
-
range: args.range,
|
|
7094
|
-
cost: stats.total.cost,
|
|
7095
|
-
calls: stats.total.calls,
|
|
7096
|
-
input: stats.total.input,
|
|
7097
|
-
output: stats.total.output
|
|
7098
|
-
};
|
|
7099
|
-
if (args.range === "bySite" || args.range === "relay") return {
|
|
7100
|
-
range: args.range,
|
|
7101
|
-
...sumSiteBuckets(stats.bySite ?? {}, args.range)
|
|
7102
|
-
};
|
|
7103
|
-
if (args.range === "today") {
|
|
7104
|
-
const day = stats.byDay[dayStamp(Date.now())];
|
|
7105
|
-
return day === void 0 ? zero : {
|
|
7106
|
-
range: args.range,
|
|
7107
|
-
cost: day.cost,
|
|
7108
|
-
calls: day.calls,
|
|
7109
|
-
input: day.input,
|
|
7110
|
-
output: day.output
|
|
7111
|
-
};
|
|
7112
|
-
}
|
|
7113
|
-
if (args.range === "month") {
|
|
7114
|
-
const prefix = dayStamp(Date.now()).slice(0, 7);
|
|
7115
|
-
let cost = 0;
|
|
7116
|
-
let calls = 0;
|
|
7117
|
-
let input = 0;
|
|
7118
|
-
let output = 0;
|
|
7119
|
-
for (const [date, day] of Object.entries(stats.byDay)) {
|
|
7120
|
-
if (!date.startsWith(prefix)) continue;
|
|
7121
|
-
cost += day.cost;
|
|
7122
|
-
calls += day.calls;
|
|
7123
|
-
input += day.input;
|
|
7124
|
-
output += day.output;
|
|
7052
|
+
let usageToolDisposer;
|
|
7053
|
+
let usageToolRegister;
|
|
7054
|
+
const syncUsageTool = () => {
|
|
7055
|
+
if (usageToolRegister === void 0) return;
|
|
7056
|
+
if (readUsageStatsToggle(config)) {
|
|
7057
|
+
if (usageToolDisposer === void 0) usageToolDisposer = usageToolRegister();
|
|
7058
|
+
return;
|
|
7059
|
+
}
|
|
7060
|
+
if (usageToolDisposer !== void 0) {
|
|
7061
|
+
usageToolDisposer();
|
|
7062
|
+
usageToolDisposer = void 0;
|
|
7063
|
+
}
|
|
7064
|
+
};
|
|
7065
|
+
ctx.inject(["tools"], (toolsCtx) => {
|
|
7066
|
+
usageToolRegister = () => toolsCtx.tools.register(defineTool({
|
|
7067
|
+
name: "usage_stats",
|
|
7068
|
+
description: "查询本机 DeepSeek Harness 的模型用量与估算费用(人民币,按官方目录价估算,非账单)。range 取值:today=今天,month=本月,session=当前会话,all=累计。",
|
|
7069
|
+
parameters: { range: {
|
|
7070
|
+
type: "string",
|
|
7071
|
+
enum: [
|
|
7072
|
+
"today",
|
|
7073
|
+
"month",
|
|
7074
|
+
"session",
|
|
7075
|
+
"all",
|
|
7076
|
+
"bySite",
|
|
7077
|
+
"relay"
|
|
7078
|
+
],
|
|
7079
|
+
required: true,
|
|
7080
|
+
description: "统计范围:today / month / session / all / bySite / relay"
|
|
7081
|
+
} },
|
|
7082
|
+
output: {
|
|
7083
|
+
schema: {
|
|
7084
|
+
type: "object",
|
|
7085
|
+
additionalProperties: false,
|
|
7086
|
+
properties: {
|
|
7087
|
+
range: {
|
|
7088
|
+
type: "string",
|
|
7089
|
+
required: true
|
|
7090
|
+
},
|
|
7091
|
+
cost: {
|
|
7092
|
+
type: "number",
|
|
7093
|
+
required: true,
|
|
7094
|
+
description: "估算费用(人民币元)"
|
|
7095
|
+
},
|
|
7096
|
+
calls: {
|
|
7097
|
+
type: "number",
|
|
7098
|
+
required: true
|
|
7099
|
+
},
|
|
7100
|
+
input: {
|
|
7101
|
+
type: "number",
|
|
7102
|
+
required: true,
|
|
7103
|
+
description: "输入 tokens"
|
|
7104
|
+
},
|
|
7105
|
+
output: {
|
|
7106
|
+
type: "number",
|
|
7107
|
+
required: true,
|
|
7108
|
+
description: "输出 tokens"
|
|
7125
7109
|
}
|
|
7126
|
-
return {
|
|
7127
|
-
range: args.range,
|
|
7128
|
-
cost,
|
|
7129
|
-
calls,
|
|
7130
|
-
input,
|
|
7131
|
-
output
|
|
7132
|
-
};
|
|
7133
7110
|
}
|
|
7134
|
-
|
|
7135
|
-
|
|
7136
|
-
|
|
7137
|
-
|
|
7111
|
+
},
|
|
7112
|
+
render: (_args, value) => [{
|
|
7113
|
+
type: "text",
|
|
7114
|
+
text: `用量(${value.range}):估算费用 ${formatMoney(value.cost)},调用 ${value.calls} 次,输入 ${formatTokens(value.input)} tokens,输出 ${formatTokens(value.output)} tokens`
|
|
7115
|
+
}]
|
|
7116
|
+
},
|
|
7117
|
+
async execute(args, exec) {
|
|
7118
|
+
const stats = await aggregator.aggregate();
|
|
7119
|
+
const zero = {
|
|
7120
|
+
range: args.range,
|
|
7121
|
+
cost: 0,
|
|
7122
|
+
calls: 0,
|
|
7123
|
+
input: 0,
|
|
7124
|
+
output: 0
|
|
7125
|
+
};
|
|
7126
|
+
if (args.range === "all") return {
|
|
7127
|
+
range: args.range,
|
|
7128
|
+
cost: stats.total.cost,
|
|
7129
|
+
calls: stats.total.calls,
|
|
7130
|
+
input: stats.total.input,
|
|
7131
|
+
output: stats.total.output
|
|
7132
|
+
};
|
|
7133
|
+
if (args.range === "bySite" || args.range === "relay") return {
|
|
7134
|
+
range: args.range,
|
|
7135
|
+
...sumSiteBuckets(stats.bySite ?? {}, args.range)
|
|
7136
|
+
};
|
|
7137
|
+
if (args.range === "today") {
|
|
7138
|
+
const day = stats.byDay[dayStamp(Date.now())];
|
|
7139
|
+
return day === void 0 ? zero : {
|
|
7138
7140
|
range: args.range,
|
|
7139
|
-
|
|
7141
|
+
cost: day.cost,
|
|
7142
|
+
calls: day.calls,
|
|
7143
|
+
input: day.input,
|
|
7144
|
+
output: day.output
|
|
7140
7145
|
};
|
|
7146
|
+
}
|
|
7147
|
+
if (args.range === "month") {
|
|
7148
|
+
const prefix = dayStamp(Date.now()).slice(0, 7);
|
|
7141
7149
|
let cost = 0;
|
|
7142
7150
|
let calls = 0;
|
|
7143
7151
|
let input = 0;
|
|
7144
7152
|
let output = 0;
|
|
7145
|
-
for (const
|
|
7146
|
-
if (
|
|
7147
|
-
cost +=
|
|
7148
|
-
calls +=
|
|
7149
|
-
input +=
|
|
7150
|
-
output +=
|
|
7153
|
+
for (const [date, day] of Object.entries(stats.byDay)) {
|
|
7154
|
+
if (!date.startsWith(prefix)) continue;
|
|
7155
|
+
cost += day.cost;
|
|
7156
|
+
calls += day.calls;
|
|
7157
|
+
input += day.input;
|
|
7158
|
+
output += day.output;
|
|
7151
7159
|
}
|
|
7152
7160
|
return {
|
|
7153
7161
|
range: args.range,
|
|
@@ -7157,8 +7165,48 @@ function apply(ctx, config = {}) {
|
|
|
7157
7165
|
output
|
|
7158
7166
|
};
|
|
7159
7167
|
}
|
|
7160
|
-
|
|
7161
|
-
|
|
7168
|
+
const sessionId = exec.agent?.id;
|
|
7169
|
+
if (sessionId === void 0) throw new Error("usage_stats 的 session 范围需要 agent 会话上下文");
|
|
7170
|
+
const summary = await aggregator.sessionUsageOf(String(sessionId));
|
|
7171
|
+
if (summary !== void 0) return {
|
|
7172
|
+
range: args.range,
|
|
7173
|
+
...summary
|
|
7174
|
+
};
|
|
7175
|
+
let cost = 0;
|
|
7176
|
+
let calls = 0;
|
|
7177
|
+
let input = 0;
|
|
7178
|
+
let output = 0;
|
|
7179
|
+
for (const turn of stats.byTurn ?? []) {
|
|
7180
|
+
if (turn.sessionId !== String(sessionId)) continue;
|
|
7181
|
+
cost += turn.cost;
|
|
7182
|
+
calls += 1;
|
|
7183
|
+
input += turn.input;
|
|
7184
|
+
output += turn.output;
|
|
7185
|
+
}
|
|
7186
|
+
return {
|
|
7187
|
+
range: args.range,
|
|
7188
|
+
cost,
|
|
7189
|
+
calls,
|
|
7190
|
+
input,
|
|
7191
|
+
output
|
|
7192
|
+
};
|
|
7193
|
+
}
|
|
7194
|
+
}));
|
|
7195
|
+
syncUsageTool();
|
|
7196
|
+
ctx.on("loader/volatile-update", syncUsageTool);
|
|
7197
|
+
});
|
|
7198
|
+
ctx.inject(["settings"], (sctx) => {
|
|
7199
|
+
const legacy = sctx.settings;
|
|
7200
|
+
if (typeof legacy.register === "function") {
|
|
7201
|
+
usageSettingsScope = legacy.register(usageBillingSettingsNs, UsageBillingSettingsSchema, { base: { enableUsageStatsTool: readUsageStatsToggle(config) } });
|
|
7202
|
+
return;
|
|
7203
|
+
}
|
|
7204
|
+
const forms = legacy;
|
|
7205
|
+
if (typeof forms.update !== "function") return;
|
|
7206
|
+
liveSettings = {
|
|
7207
|
+
update: (ns, patch) => forms.update(ns, patch),
|
|
7208
|
+
ns: ctx.fiber.entry?.options.id ?? usageBillingSettingsNs
|
|
7209
|
+
};
|
|
7162
7210
|
});
|
|
7163
7211
|
let live = { source: "builtin" };
|
|
7164
7212
|
let pricingSyncedAt = 0;
|
|
@@ -7301,7 +7349,7 @@ function apply(ctx, config = {}) {
|
|
|
7301
7349
|
return;
|
|
7302
7350
|
}
|
|
7303
7351
|
res.writeHead(200, { "content-type": "application/json; charset=utf-8" });
|
|
7304
|
-
const enabled = usageSettingsScope
|
|
7352
|
+
const enabled = usageSettingsScope !== void 0 ? usageSettingsScope.get().enableUsageStatsTool : readUsageStatsToggle(config);
|
|
7305
7353
|
if (req.method === "GET") {
|
|
7306
7354
|
res.end(JSON.stringify({ enabled }));
|
|
7307
7355
|
return;
|
|
@@ -7325,18 +7373,23 @@ function apply(ctx, config = {}) {
|
|
|
7325
7373
|
return;
|
|
7326
7374
|
}
|
|
7327
7375
|
}
|
|
7328
|
-
const
|
|
7329
|
-
if (usageSettingsScope
|
|
7376
|
+
const next = JSON.parse(body === "" ? "{}" : body).enabled === true;
|
|
7377
|
+
if (usageSettingsScope !== void 0) {
|
|
7378
|
+
await usageSettingsScope.update({ enableUsageStatsTool: next });
|
|
7379
|
+
syncUsageTool();
|
|
7380
|
+
} else if (liveSettings !== void 0) {
|
|
7381
|
+
await liveSettings.update(liveSettings.ns, { [ENABLE_USAGE_STATS_TOOL_FIELD]: next });
|
|
7382
|
+
syncUsageTool();
|
|
7383
|
+
} else {
|
|
7330
7384
|
res.end(JSON.stringify({ error: "settings unavailable" }));
|
|
7331
7385
|
return;
|
|
7332
7386
|
}
|
|
7333
|
-
const next = parsed.enabled === true;
|
|
7334
|
-
await usageSettingsScope.update({ enableUsageStatsTool: next });
|
|
7335
7387
|
res.end(JSON.stringify({
|
|
7336
7388
|
ok: true,
|
|
7337
7389
|
enabled: next
|
|
7338
7390
|
}));
|
|
7339
|
-
} catch {
|
|
7391
|
+
} catch (error) {
|
|
7392
|
+
console.warn("[usage-billing] usage-tool toggle write-back failed:", error);
|
|
7340
7393
|
res.end(JSON.stringify({ error: "invalid" }));
|
|
7341
7394
|
}
|
|
7342
7395
|
}
|
|
@@ -7476,4 +7529,4 @@ function apply(ctx, config = {}) {
|
|
|
7476
7529
|
}), "usage-billing: usage-stats route");
|
|
7477
7530
|
}
|
|
7478
7531
|
//#endregion
|
|
7479
|
-
export { adaptSessionPersistence, apply, createFileUsageLedgerStore, guardLoopback, inject, normalizeTrustedHosts, readPiAiProviderRoutes, resolveSubscriptionKeys };
|
|
7532
|
+
export { Config, adaptSessionPersistence, apply, createFileUsageLedgerStore, guardLoopback, inject, normalizeTrustedHosts, readPiAiProviderRoutes, resolveSubscriptionKeys };
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* usage-stats 工具开关的共享设置契约(node 与 client 两端共用)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* 旧宿主(≤0.1.6)把该开关存设置命名空间;宿主 0.1.7+ 起注册面移除,改存插件
|
|
5
|
+
* 条目 config 的 volatile 字段(Config schema 投影),写回经 settings.update,
|
|
6
|
+
* 提交后引用原位更新、`usage_stats` 工具即时注册/注销(无需重载应用)。
|
|
7
|
+
* client 半区在「设置」Tab 渲染开关并经 /api/billing/usage-tool 写入,node 半区
|
|
8
|
+
* 按宿主世代选择通道。缺省的默认行为是关闭——避免该工具默认占用模型每次请求
|
|
9
|
+
* 的上下文(coding 场景通常在仪表盘看用量)。
|
|
8
10
|
*/
|
|
9
11
|
import type { CostCurrency, UserPriceEntry } from './pricing.ts';
|
|
10
12
|
/** 设置命名空间 id(小写 kebab-case)。 */
|
package/lib/types/index.d.ts
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
16
16
|
import type { Context } from '@deepseek-ai/cordis';
|
|
17
17
|
import type { CredentialProvider } from '@deepseek-ai/dsh-credentials';
|
|
18
|
+
import z from '@deepseek-ai/schemastery';
|
|
18
19
|
import { type UsageLedgerStore, type UsagePersistence } from './aggregate.ts';
|
|
19
20
|
import type { CustomBalanceConfig, DeclaredEndpointConfig, SubscriptionPlanConfig } from './pricing-shared.ts';
|
|
20
21
|
import { type IdentifiedSubscriptionPlan, type SubscriptionKeys } from './subscriptions.ts';
|
|
@@ -42,6 +43,23 @@ export declare function normalizeTrustedHosts(hosts: readonly string[] | undefin
|
|
|
42
43
|
* @returns 是否放行;false = 已拒绝并结束响应。
|
|
43
44
|
*/
|
|
44
45
|
export declare function guardLoopback(req: IncomingMessage, res: ServerResponse, trustedHosts?: ReadonlySet<string>): boolean;
|
|
46
|
+
/** 宿主 0.1.7+ 经 Config schema 解析后,volatile 字段在 config 中的稳定引用形态
|
|
47
|
+
* (cosmokit `Volatile<T>` 的最小结构镜像,避免为类型引入直接依赖)。 */
|
|
48
|
+
export interface VolatileToggle {
|
|
49
|
+
/** @returns 当前生效的布尔快照(设置写入后原位更新,无需重载插件)。 */
|
|
50
|
+
get(): boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Loader 挂载时对条目 config 做校验的 Config 声明:`enableUsageStatsTool` 标记
|
|
54
|
+
* volatile,宿主 0.1.7+ 设置系统据此把它投影为可实时编辑的开关(describe/update)。
|
|
55
|
+
* schemastery 非严格 object 透传未声明键,其余 config 字段不受影响;未导出 Config
|
|
56
|
+
* 的旧宿主直接把原始 config 交给 apply,普通布尔形态由读取端兼容。
|
|
57
|
+
*/
|
|
58
|
+
export declare const Config: z<Schemastery.ObjectS<NoInfer<{
|
|
59
|
+
enableUsageStatsTool: z<boolean, boolean, "volatile-defined">;
|
|
60
|
+
}>>, Schemastery.ObjectT<NoInfer<{
|
|
61
|
+
enableUsageStatsTool: z<boolean, boolean, "volatile-defined">;
|
|
62
|
+
}>>, "plain">;
|
|
45
63
|
/** Plugin configuration. */
|
|
46
64
|
export interface UsageBillingConfig {
|
|
47
65
|
/** Absolute path to a `.dsh-usage-stats.json` fallback file. */
|
|
@@ -83,9 +101,10 @@ export interface UsageBillingConfig {
|
|
|
83
101
|
* 例:`['llm.example.com']`。
|
|
84
102
|
*/
|
|
85
103
|
trustedHosts?: string[];
|
|
86
|
-
/** `usage_stats`
|
|
87
|
-
*
|
|
88
|
-
|
|
104
|
+
/** `usage_stats` 工具注入开关(默认 false:不注入)。宿主 0.1.7+ 经 Config
|
|
105
|
+
* 解析后是 volatile 引用(设置写入即时反映),直连 apply(测试)是普通布尔;
|
|
106
|
+
* 读取统一走 readUsageStatsToggle。该工具占用每次请求的上下文,coding 场景多在仪表盘查看。 */
|
|
107
|
+
enableUsageStatsTool?: boolean | VolatileToggle;
|
|
89
108
|
/**
|
|
90
109
|
* 联网搜索请求(`web/deepseek-search-llm-request`,日志只有请求、无用量事件)
|
|
91
110
|
* 的单次费用估算(人民币元)。这类调用直连官方 api.deepseek.com,开放平台照常
|
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": "1.4.
|
|
4
|
+
"version": "1.4.19",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
|
7
7
|
"deepseek",
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
"devDependencies": {
|
|
120
120
|
"@deepseek-ai/cordis": "*",
|
|
121
121
|
"@deepseek-ai/cordis-plugin-include": "^1.0.7",
|
|
122
|
-
"@deepseek-ai/cordis-plugin-loader": "^1.0.
|
|
122
|
+
"@deepseek-ai/cordis-plugin-loader": "^1.0.5",
|
|
123
123
|
"@deepseek-ai/dsh-api-gateway": "0.1.7-rc.1",
|
|
124
124
|
"@deepseek-ai/dsh-api-remotes": "0.1.7-rc.1",
|
|
125
125
|
"@deepseek-ai/dsh-api-session-controller": "0.1.7-rc.1",
|
|
@@ -149,7 +149,7 @@
|
|
|
149
149
|
"@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.1",
|
|
150
150
|
"@deepseek-ai/dsh-user-approval": "0.1.7-rc.1",
|
|
151
151
|
"@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1",
|
|
152
|
-
"@deepseek-ai/schemastery": "^3.18.
|
|
152
|
+
"@deepseek-ai/schemastery": "^3.18.4",
|
|
153
153
|
"@shikijs/langs": "^4.3.1",
|
|
154
154
|
"@testing-library/dom": "^10.4.1",
|
|
155
155
|
"@testing-library/react": "^16.1.0",
|