dsh-cost-meter 1.7.19 → 1.7.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +8 -5
- package/README.md +8 -5
- package/docs/provider-pricing.json +18 -1
- package/lib/backfill.js +12 -5
- package/lib/client.js +5 -6
- package/lib/index.js +31 -5
- package/lib/native-search-billing.js +278 -0
- package/lib/pricing.js +26 -7
- package/lib/session-tree.js +117 -0
- package/lib/store.js +15 -2
- package/lib/typert.host.js +41 -1
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// This file is generated from the src/client/*.js fragments via `node scripts/build.mjs` (esbuild). Do not edit directly.
|
|
2
|
-
window.__ModuleLoader__.load({id:"dsh-cost-meter",factory:xt=>{var Nt={exports:{}},Ze=Nt.exports;Object.defineProperty(Ze,Symbol.toStringTag,{value:"Module"});const De=xt("react"),{Tooltip:X}=xt("@deepseek-ai/dsh-client-ui-primitives"),qe=!1,la=["/* dsh-cost-meter: 会话费用徽章与设置页 */",".cm-root{display:block;text-align:center;max-width:var(--dsh-chat-content-width,720px);width:100%;margin:0 auto;box-sizing:border-box;padding:4px calc(var(--dsh-composer-side-clearance,0px) + 16px) 0;font-size:12px;line-height:20px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}",".cm-chip{display:inline-flex;align-items:center;gap:4px;max-width:180px;padding:0 8px;height:22px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:12px;line-height:22px;color:var(--dsw-alias-label-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}",".cm-foot{display:flex;align-items:center;gap:6px;height:32px;padding:0 8px;border-radius:8px;font-size:12px;color:var(--dsw-alias-label-secondary);white-space:nowrap;overflow:hidden}",".cm-foot:hover{background:var(--dsw-alias-interactive-bg-hover)}",".cm-foot-rail{width:100%;justify-content:center;padding:0;font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary)}",".cm-foot-rail:hover{background:var(--dsw-alias-interactive-bg-hover)}",".cm-num{font-variant-numeric:tabular-nums}",".cm-go-rail{font-size:11px;font-weight:700;color:var(--dsw-alias-label-primary)}",".cm-go-list{display:flex;flex-direction:column;gap:10px}",".cm-go-row{display:flex;align-items:center;gap:8px;font-size:12px}",".cm-go-label{flex:none;width:88px;color:var(--dsw-alias-label-secondary)}",".cm-go-bar{flex:1;height:6px;border-radius:3px;background:var(--dsw-alias-interactive-bg-hover);overflow:hidden}",".cm-go-fill{height:100%;border-radius:3px;background:var(--dsw-alias-brand-primary)}",".cm-go-num{flex:none;min-width:44px;text-align:right;font-weight:600;font-variant-numeric:tabular-nums}",".cm-go-reset{flex:none;max-width:230px;font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}",".cm-go-time{font-size:11px;color:var(--dsw-alias-label-tertiary)}",".cm-go-row.main .cm-go-label{font-weight:600;color:var(--dsw-alias-label-primary)}",".cm-corner{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;width:100%;max-width:var(--dsh-chat-content-width,720px);margin:2px auto 0;box-sizing:border-box;padding:0 calc(var(--dsh-composer-side-clearance,0px) + 16px)}",".cm-corner-chip{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:11px;line-height:20px;color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums}",".cm-corner-chip:hover{background:var(--dsw-alias-interactive-bg-hover)}",".cm-corner-chip.warn{color:var(--dsw-alias-state-warn-primary)}",".cm-corner-chip.over{color:var(--dsw-alias-state-error-primary)}",".cm-qstrip{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:6px;width:100%;max-width:var(--dsh-chat-content-width,720px);margin:0 auto;box-sizing:border-box;padding:0 calc(var(--dsh-composer-side-clearance,0px) + 16px)}",".cm-qchip{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 8px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:11px;line-height:22px;color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;cursor:default}",".cm-qchip:hover{background:var(--dsw-alias-interactive-bg-hover)}",".cm-qchip .cm-qlabel{color:var(--dsw-alias-label-primary);font-weight:600}",".cm-qchip .cm-qbar{display:block;width:44px;height:4px;border-radius:2px;background:var(--dsw-alias-border-l1);overflow:hidden;flex:none}",".cm-qchip .cm-qfill{display:block;height:100%;border-radius:2px;background:var(--dsw-alias-state-ok-primary,#3ba272)}",".cm-qchip .cm-qseg{display:inline-flex;align-items:center;gap:4px}",".cm-qchip .cm-qsep{width:1px;height:12px;background:var(--dsw-alias-border-l1);flex:none}",".cm-qchip .cm-qtext{color:var(--dsw-alias-label-secondary)}",".cm-qchip.warn{color:var(--dsw-alias-state-warn-primary)}",".cm-qchip.warn .cm-qfill{background:var(--dsw-alias-state-warn-primary)}",".cm-qchip.over{color:var(--dsw-alias-state-error-primary)}",".cm-qchip.over .cm-qfill{background:var(--dsw-alias-state-error-primary)}",".cm-qchip.action{cursor:pointer;user-select:none;outline:none}",".cm-qchip.action:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-brand-primary)}",".cm-qchip.action:active{transform:translateY(0.5px)}",".cm-plan-provider{display:flex;flex-direction:column;gap:8px}",".cm-plan-provider + .cm-plan-provider{margin-top:14px}",".cm-plan-provider-name{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600}",".cm-plan-updated{font-size:11px;font-weight:400;color:var(--dsw-alias-label-tertiary)}",".cm-plan-tag{flex:none;margin-left:6px;padding:0 6px;border-radius:999px;border:1px solid var(--dsw-alias-border-l1);font-size:10px;line-height:16px;color:var(--dsw-alias-state-warn-primary)}",".cm-plan-reset,.cm-plan-method{font-size:11px;color:var(--dsw-alias-label-tertiary)}",".cm-qguide{position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:9999;max-width:440px;width:calc(100% - 32px);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;background:var(--dsw-alias-bg-layer-1);box-shadow:0 8px 28px rgba(0,0,0,.18);padding:14px 16px;font-size:13px;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:8px}",".cm-qguide h4{margin:0;font-size:13px;font-weight:600}",".cm-qguide p{margin:0;font-size:12px;line-height:1.6;color:var(--dsw-alias-label-secondary)}",".cm-qguide .cm-buttons{display:flex;gap:8px;justify-content:flex-end}",".cm-section{display:flex;flex-direction:column;gap:20px;padding:4px 2px 24px;font-size:13px;color:var(--dsw-alias-label-primary)}",".cm-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}",".cm-cards-toggle{display:flex;align-items:center;gap:6px;margin:-6px 2px 0 auto;width:fit-content;font-size:12px;color:var(--dsw-alias-label-tertiary);cursor:pointer;user-select:none}",".cm-cards-toggle:hover{color:var(--dsw-alias-label-primary)}",".cm-cards-toggle input{margin:0;cursor:pointer}",".cm-card{border:1px solid var(--dsw-alias-border-l1);border-radius:12px;padding:14px 16px;background:var(--dsw-alias-bg-layer-1)}",".cm-card-title{font-size:12px;color:var(--dsw-alias-label-tertiary);margin:0 0 8px}",".cm-card-value{font-size:20px;line-height:28px;font-weight:600}",".cm-card-sub{font-size:12px;color:var(--dsw-alias-label-tertiary);margin-top:4px}",".cm-h{font-size:13px;font-weight:600;margin:0}",".cm-collapse-h{display:flex;align-items:center;gap:8px;background:none;border:none;padding:0;margin:0;cursor:pointer;color:inherit;font:inherit;text-align:left}",".cm-collapse-h:hover .cm-h{color:var(--dsw-alias-interactive-text-hover,var(--dsw-alias-label-primary))}",".cm-caret{flex:none;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid var(--dsw-alias-label-secondary);transform:rotate(-90deg);transition:transform .15s ease}",".cm-caret.open{transform:rotate(0)}",".cm-collapse-body{display:flex;flex-direction:column;gap:12px;margin-top:12px}",".cm-toolbar{display:flex;justify-content:flex-end;align-items:center;gap:10px}",".cm-toolbar .cm-field{flex-direction:row;align-items:center;gap:8px}",".cm-toolbar .cm-field label{margin:0;font-size:12px;color:var(--dsw-alias-label-tertiary)}",".cm-toolbar .cm-input{min-width:150px;padding:4px 10px}",".cm-tabs-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--dsh-alias-border-l1);padding-bottom:10px}",".cm-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}",".cm-tab{font:inherit;font-size:13px;color:var(--dsw-alias-label-secondary);background:transparent;border:none;border-radius:8px;padding:6px 14px;cursor:pointer;white-space:nowrap}",".cm-tab:hover{background:var(--dsw-alias-interactive-bg-hover)}",".cm-tab.active{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted);font-weight:600}",".cm-tabs-row .cm-msg{padding:2px 10px}",".cm-note{font-size:12px;color:var(--dsw-alias-label-tertiary);margin:0}",".cm-table{width:100%;border-collapse:collapse;font-size:12px}",".cm-table th,.cm-table td{text-align:left;padding:7px 10px;border-bottom:1px solid var(--dsw-alias-border-l1);white-space:nowrap}",".cm-table th{color:var(--dsw-alias-label-tertiary);font-weight:500}",".cm-table td.num,.cm-table th.num{text-align:right;font-variant-numeric:tabular-nums}",".cm-table tr:last-child td{border-bottom:none}",".cm-table tr.cm-row-click{cursor:pointer}",".cm-table tr.cm-row-click:hover td{background:var(--dsw-alias-bg-hover,rgba(127,127,127,.08))}",".cm-sess-title{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}",".cm-sess-id{font-size:11px;font-family:ui-monospace,Consolas,monospace;color:var(--dsw-alias-label-tertiary)}",".cm-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:8px 0}",".cm-scroll{max-height:320px;overflow:auto;border:1px solid var(--dsw-alias-border-l1);border-radius:10px}",".cm-grid{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:12px}",".cm-field{display:flex;flex-direction:column;gap:6px}",".cm-field label{font-size:12px;color:var(--dsw-alias-label-secondary)}",".cm-input{font:inherit;font-size:13px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;padding:6px 10px;outline:none}",".cm-input:focus{border-color:var(--dsw-alias-state-business-primary)}",".cm-input.narrow{max-width:120px}",".cm-range-row{display:flex;align-items:center;gap:10px}",".cm-range{flex:1;min-width:0;accent-color:var(--dsw-alias-state-business-primary)}",".cm-range-value{flex:none;min-width:44px;font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:right}",".cm-check{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--dsw-alias-label-primary);cursor:pointer}",".cm-price-card{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;padding:12px 14px;display:flex;flex-direction:column;gap:10px;background:var(--dsw-alias-bg-layer-1)}",".cm-price-head{display:flex;align-items:center;justify-content:space-between;gap:8px}",".cm-price-name{font-weight:600;font-size:13px}",".cm-price-legacy{font-size:11px;color:var(--dsw-alias-label-tertiary);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:1px 8px}",".cm-price-row{display:grid;grid-template-columns:52px 1fr 1fr 1fr;gap:8px;align-items:center}",".cm-price-row span{font-size:12px;color:var(--dsw-alias-label-tertiary)}",".cm-price-row input{width:100%}",".cm-buttons{display:flex;flex-wrap:wrap;gap:10px;align-items:center}",".cm-btn{font:inherit;font-size:13px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-button-elevated-fill);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;padding:6px 14px;cursor:pointer}",".cm-btn:hover{background:var(--dsw-alias-interactive-bg-hover)}",".cm-btn.primary{background:var(--dsw-alias-state-business-primary);border-color:transparent;color:var(--dsw-alias-label-primary-inverted)}",".cm-btn.primary:hover{opacity:0.88;background:var(--dsw-alias-state-business-primary)}",".cm-btn.danger{color:var(--dsw-alias-state-error-primary)}",".cm-btn.small{padding:3px 10px;font-size:12px}",".cm-msg{font-size:12px;line-height:18px;padding:8px 12px;border-radius:8px;border:1px solid var(--dsw-alias-border-l1)}",".cm-msg.ok{color:var(--dsw-alias-state-success-primary)}",".cm-msg.err{color:var(--dsw-alias-state-error-primary)}",".cm-hint{font-size:12px;color:var(--dsw-alias-label-tertiary)}",".cm-budget{border:1px solid var(--dsw-alias-border-l1);border-radius:12px;padding:14px 16px;background:var(--dsw-alias-bg-layer-1);display:flex;flex-direction:column;gap:10px}",".cm-peak-alert{position:fixed;z-index:9999;width:340px;max-width:calc(100vw - 32px);padding:16px;border-radius:14px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);box-shadow:0 14px 36px rgba(0,0,0,.22);display:flex;flex-direction:column;gap:8px;font-size:12px;animation:cm-peak-alert-in .22s cubic-bezier(.2,.8,.2,1)}",".cm-peak-alert.cm-peak-alert-corner{right:20px;bottom:20px}",".cm-peak-alert.cm-peak-alert-center{top:50%;left:50%;transform:translate(-50%,-50%);animation-name:cm-peak-alert-in-center}",".cm-peak-alert-peak{border-top:3px solid var(--dsw-alias-state-warn-primary)}",".cm-peak-alert-offpeak{border-top:3px solid var(--dsw-alias-state-info-primary,#3b82f6)}",".cm-peak-alert-badge{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.4px;text-transform:uppercase}",'.cm-peak-alert-badge::before{content:"";width:8px;height:8px;border-radius:50%;background:currentColor;box-shadow:0 0 0 4px color-mix(in srgb,currentColor 16%,transparent)}',".cm-peak-alert-peak .cm-peak-alert-badge{color:var(--dsw-alias-state-warn-primary)}",".cm-peak-alert-offpeak .cm-peak-alert-badge{color:var(--dsw-alias-state-info-primary,#3b82f6)}",".cm-peak-alert-title{font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary)}",".cm-peak-alert-body{color:var(--dsw-alias-label-secondary);line-height:1.55}",".cm-peak-alert-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}",".cm-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}","@keyframes cm-peak-alert-in{from{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}","@keyframes cm-peak-alert-in-center{from{opacity:0;transform:translate(-50%,calc(-50% + 10px))}to{opacity:1;transform:translate(-50%,-50%)}}",".cm-budget-head{display:flex;align-items:center;justify-content:space-between;gap:8px}",".cm-budget-bar{height:8px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);overflow:hidden}",".cm-budget-fill{height:100%;border-radius:999px;background:var(--dsw-alias-state-business-primary);transition:width .3s ease}",".cm-budget-fill.warn{background:var(--dsw-alias-state-warn-primary)}",".cm-budget-fill.over{background:var(--dsw-alias-state-error-primary)}",".cm-ug{display:flex;flex-direction:column;gap:12px}",".cm-ug-total{font-size:13px;color:var(--dsw-alias-label-primary)}",".cm-ug-grid{display:grid;grid-auto-flow:column;grid-template-rows:repeat(7,auto);gap:3px;width:100%}",".cm-ug-cell{width:100%;aspect-ratio:1/1;border-radius:3px;box-sizing:border-box;background:color-mix(in srgb,var(--dsw-alias-label-primary) 8%,transparent);border:1px solid var(--dsw-alias-border-l1)}",".cm-ug-cell.l1{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 25%,var(--dsw-alias-bg-layer-3));border-color:transparent}",".cm-ug-cell.l2{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 50%,var(--dsw-alias-bg-layer-3));border-color:transparent}",".cm-ug-cell.l3{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 75%,var(--dsw-alias-bg-layer-3));border-color:transparent}",".cm-ug-cell.l4{background:var(--dsw-alias-state-business-primary);border-color:transparent}",".cm-ug-cell.today{outline:1px solid var(--dsw-alias-label-secondary);outline-offset:1px}",".cm-ug-months{display:grid;grid-auto-flow:column;gap:3px;width:100%;font-size:10px;color:var(--dsw-alias-label-tertiary);margin-top:4px}",".cm-ug-monthc{white-space:nowrap}",".cm-budget-line{font-size:13px;color:var(--dsw-alias-label-secondary)}",".cm-budget-line.over{color:var(--dsw-alias-state-error-primary)}",".cm-peak-strip{display:flex;align-items:center;gap:6px;margin-top:4px;min-width:0}",".cm-peak-track{position:relative;display:flex;flex:1;height:6px;min-width:0;border-radius:999px;overflow:hidden;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3)}",".cm-peak-segment{height:100%;flex:1}",".cm-peak-high{background:#ff9800}",".cm-peak-low{background:var(--dsw-alias-state-business-primary)}",".cm-peak-marker{position:absolute;top:0;left:50%;width:2px;height:100%;background:var(--dsw-alias-bg-base);box-shadow:0 0 0 1px var(--dsw-alias-label-tertiary);transform:translateX(-50%);transition:left .4s ease;z-index:2}",".cm-peak-chip{font-size:11px;font-weight:600;line-height:1.2;white-space:nowrap;color:var(--dsw-alias-label-secondary)}",".cm-peak-strip.peak .cm-peak-chip{color:#ff9800}",".cm-peak-strip.off .cm-peak-chip{color:var(--dsw-alias-state-business-primary)}",".cm-peak-strip.weekend .cm-peak-chip{color:#34a853}",".cm-peak-classic{position:relative;display:flex;flex-direction:column;gap:5px;margin-top:6px;min-width:0}",".cm-peak-classic .cm-peak-track{flex:none;height:8px}",".cm-peak-classic-marker{position:absolute;top:0;left:50%;width:4px;height:12px;background:var(--dsw-alias-bg-base);border:1.5px solid #ff9800;box-shadow:0 0 0 1px var(--dsw-alias-bg-base),0 0 0 2px var(--dsw-alias-label-tertiary);transform:translateX(-50%);transition:left .4s ease;z-index:2;border-radius:2px}",'.cm-peak-classic-marker::after{content:"";position:absolute;top:-7px;left:50%;transform:translateX(-50%);border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid #ff9800}',".cm-peak-classic.off .cm-peak-classic-marker{border-color:var(--dsw-alias-state-business-primary)}",".cm-peak-classic.off .cm-peak-classic-marker::after{border-top-color:var(--dsw-alias-state-business-primary)}",".cm-peak-classic-chip{align-self:flex-start;font-size:11px;font-weight:600;line-height:1.4;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:2px 8px;white-space:nowrap;color:var(--dsw-alias-label-secondary)}",".cm-peak-classic.peak .cm-peak-classic-chip{color:#ff9800}",".cm-peak-classic.off .cm-peak-classic-chip{color:var(--dsw-alias-state-business-primary)}",".cm-peak-classic.weekend .cm-peak-classic-chip{color:#34a853}",".cm-peak-classic.weekend .cm-peak-classic-marker{border-color:#34a853}",".cm-peak-classic.weekend .cm-peak-classic-marker::after{border-top-color:#34a853}",".cm-peak-rail{display:flex;flex-direction:column;align-items:center;gap:3px;width:40px;box-sizing:border-box}",".cm-peak-rail-track{position:relative;display:flex;flex-direction:column;width:6px;height:56px;border-radius:999px;overflow:hidden;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3)}",".cm-peak-rail-segment{width:100%;flex:1}",".cm-peak-rail-high{background:#ff9800}",".cm-peak-rail-low{background:var(--dsw-alias-state-business-primary)}",".cm-peak-rail-marker{position:absolute;left:0;top:50%;width:100%;height:2px;background:var(--dsw-alias-bg-base);box-shadow:0 0 0 1px var(--dsw-alias-label-tertiary);transform:translateY(-50%);transition:top .4s ease;z-index:2}",".cm-peak-rail-label{font-size:10px;font-weight:600;line-height:1.2;white-space:nowrap;color:var(--dsw-alias-label-secondary)}",".cm-peak-rail.peak .cm-peak-rail-label{color:#ff9800}",".cm-peak-rail.off .cm-peak-rail-label{color:var(--dsw-alias-state-business-primary)}",".cm-peak-rail.weekend .cm-peak-rail-label{color:#34a853}",".cm-peak-rail-classic{display:flex;flex-direction:column;align-items:center;gap:3px;width:40px;box-sizing:border-box}",".cm-peak-rail-classic-track{position:relative;display:flex;flex-direction:column;width:14px;height:56px;border-radius:999px;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3)}",".cm-peak-rail-classic-segment{position:relative;width:100%;flex:1;overflow:hidden}",".cm-peak-rail-classic-segment.peak{background:#ff9800;border-radius:999px 999px 0 0}",".cm-peak-rail-classic-segment.off{background:var(--dsw-alias-state-business-primary);border-radius:0 0 999px 999px}",".cm-peak-rail-classic-marker{position:absolute;left:50%;top:50%;width:12px;height:4px;background:var(--dsw-alias-bg-base);border:1.5px solid #ff9800;box-shadow:0 0 0 1px var(--dsw-alias-bg-base),0 0 0 2px var(--dsw-alias-label-tertiary);transform:translate(-50%,-50%);transition:top .4s ease;z-index:2;border-radius:2px}",".cm-peak-rail-classic.off .cm-peak-rail-classic-marker{border-color:var(--dsw-alias-state-business-primary)}",".cm-peak-rail-classic-label{font-size:10px;font-weight:600;line-height:1.2;white-space:nowrap}",".cm-peak-rail-classic.peak .cm-peak-rail-classic-label{color:#ff9800}",".cm-peak-rail-classic.off .cm-peak-rail-classic-label{color:var(--dsw-alias-state-business-primary)}",".cm-peak-rail-classic.weekend .cm-peak-rail-classic-marker{border-color:#34a853}",".cm-peak-rail-classic.weekend .cm-peak-rail-classic-label{color:#34a853}",".cm-grid-group{grid-column:1 / -1;margin-top:8px;font-size:12px;font-weight:600;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:4px}",".cm-grid-group:first-child{margin-top:0}",".cm-peak-preview{margin-top:8px}",".cm-toggle-btn{background:none;border:none;padding:0;font-size:12px;font-weight:600;color:var(--dsw-alias-state-business-primary);cursor:pointer}",".cm-toggle-btn:hover{text-decoration:underline}",".cm-collapsed-note{margin-top:4px}",".cm-catalog-vendor{margin-top:10px;font-size:12px;font-weight:600;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:2px;display:flex;align-items:center;justify-content:space-between;gap:8px}",".cm-vendor-toggle{cursor:pointer;user-select:none}",".cm-vendor-toggle:hover{color:var(--dsw-alias-label-secondary)}",".cm-vendor-display{display:inline-flex;align-items:center;gap:4px;font-weight:400;font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap}",".cm-catalog-family{margin:6px 0 2px;font-size:11px;font-weight:600;color:var(--dsw-alias-label-tertiary)}",".cm-catalog-row{display:flex;align-items:center;gap:8px;padding:4px 0;border-top:1px solid var(--dsw-alias-border-l1);font-size:12px}",".cm-catalog-mounted{display:flex;flex-direction:column;gap:4px;padding:6px 0;border-top:1px solid var(--dsw-alias-border-l1)}",".cm-catalog-id{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}",".cm-catalog-price{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:11px}",".cm-catalog-tag{font-size:10px;padding:1px 6px;border-radius:999px;border:1px solid var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary);white-space:nowrap}",".cm-mstats-tabs{display:flex;gap:8px;margin-bottom:8px}",".cm-mstats-tab{background:none;border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:2px 12px;font-size:12px;color:var(--dsw-alias-label-secondary);cursor:pointer}",".cm-mstats-tab.active{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-bg-base);font-weight:600}",".cm-mstats-h{margin:10px 0 4px;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary)}",".cm-mstats-row{display:grid;grid-template-columns:minmax(90px,170px) 1fr auto;gap:8px;align-items:center;font-size:11px;line-height:1.7}",".cm-mstats-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary)}",".cm-mstats-barbg{position:relative;height:10px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);overflow:hidden;display:flex}",".cm-mstats-bar{height:100%;min-width:0}",".cm-mstats-bar.cost{background:#ff9800;border-radius:999px}",".cm-mstats-bar.hit{background:#34a853;border-radius:999px}",".cm-mstats-bar.value{background:#a142f4;border-radius:999px}",".cm-mstats-seg{height:100%;min-width:0}",".cm-mstats-seg.in{background:var(--dsw-alias-state-business-primary)}",".cm-mstats-seg.cache{background:#ff9800}",".cm-mstats-seg.out{background:#34a853}",".cm-mstats-val{white-space:nowrap;color:var(--dsw-alias-label-secondary)}",".cm-mstats-legend{display:flex;gap:12px;font-size:10px;color:var(--dsw-alias-label-tertiary);margin:2px 0 4px}",".cm-mstats-dot{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:3px}",".cm-mstats-note{margin-top:10px;font-size:10px;line-height:1.6;color:var(--dsw-alias-label-tertiary)}",".cm-match-row{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:12px;flex-wrap:wrap}",".cm-match-row .cm-input{flex:1;min-width:160px}",".cm-budget-controls{display:grid;grid-template-columns:repeat(2,minmax(180px,1fr));gap:12px}",".cm-bbox{border:1px solid var(--dsw-alias-border-l1);border-radius:12px;padding:8px 10px;background:var(--dsw-alias-bg-layer-1);display:flex;flex-direction:column;gap:6px;min-width:148px;box-sizing:border-box}",".cm-bbox.rail{padding:6px;min-width:0;width:40px;align-items:center;justify-content:center;border-radius:10px}",".cm-bbox.warn{border-color:var(--dsw-alias-state-warn-primary)}",".cm-bbox.over{border-color:var(--dsw-alias-state-error-primary)}",".cm-bbox-head{display:flex;align-items:center;justify-content:space-between;gap:8px}",".cm-bbox-label{font-size:12px;font-weight:600;color:var(--dsw-alias-label-primary)}",".cm-bbox-pct{font-size:12px;font-weight:600;color:var(--dsw-alias-label-primary)}",".cm-bbox.warn .cm-bbox-pct{color:var(--dsw-alias-state-warn-primary)}",".cm-bbox.over .cm-bbox-pct{color:var(--dsw-alias-state-error-primary)}",".cm-bbox-bar{height:6px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);overflow:hidden}",".cm-bbox-bar.segments{display:flex;height:8px}",".cm-bbox-bar.segments .cm-bbox-fill{flex:none;border-radius:0;height:100%}",".cm-bbox-bar.segments .cm-bbox-fill:first-child{border-radius:999px 0 0 999px}",".cm-bbox-bar.segments .cm-bbox-seg-today{flex:none;height:100%;background:#ff9800}",".cm-bbox-bar.segments .cm-bbox-seg-spent{flex:none;height:100%;background:var(--dsw-alias-interactive-bg-hover);border-radius:0 999px 999px 0}",".cm-bbox-bar.segments.rev .cm-bbox-fill{border-radius:0 999px 999px 0}",".cm-bbox-bar.segments.rev .cm-bbox-fill:first-child{border-radius:999px 0 0 999px}",".cm-bbox-bar.segments.rev .cm-bbox-fill:last-child{border-radius:0 999px 999px 0}",".cm-bbox-bar.segments.rev .cm-bbox-seg-today:first-child{border-radius:999px 0 0 999px}",".cm-bbox-bar.segments.rev .cm-bbox-seg-today:last-child{border-radius:0 999px 999px 0}",".cm-bbox-bar.segments.rev .cm-bbox-seg-spent{border-radius:0}",".cm-bbox-bar.segments.rev .cm-bbox-seg-spent:last-child{border-radius:0 999px 999px 0}",".cm-dir-row{display:flex;align-items:center;gap:8px;margin-top:6px}",".cm-dir-label{flex:1 1 40%;font-size:12px;color:var(--dsw-alias-label-secondary)}",".cm-dir-row .cm-input{flex:1 1 60%;width:auto}",".cm-bbox-fill{height:100%;border-radius:999px;background:var(--dsw-alias-state-business-primary)}",".cm-bbox-pct.cm-bal-amt{color:var(--dsw-alias-state-business-primary)}",".cm-bal-link{flex:none;display:inline-flex;align-items:center;padding:1px 5px;border-radius:4px;font-size:12px;line-height:16px;color:var(--dsw-alias-label-tertiary);text-decoration:none;outline:none}",".cm-bal-link:hover{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-hover)}",".cm-bal-link:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-brand-primary)}",".cm-bbox.warn .cm-bbox-fill{background:var(--dsw-alias-state-warn-primary)}",".cm-bbox.over .cm-bbox-fill{background:var(--dsw-alias-state-error-primary)}",".cm-bbox-line{font-size:12px;color:var(--dsw-alias-label-tertiary)}",".cm-bbox-rail{font-size:11px;font-weight:600;color:var(--dsw-alias-label-primary)}",".cm-bbox.warn .cm-bbox-rail{color:var(--dsw-alias-state-warn-primary)}",".cm-bbox.over .cm-bbox-rail{color:var(--dsw-alias-state-error-primary)}",".cm-bbox-pair{display:flex;flex-direction:column;gap:0;padding:2px 10px}",".cm-bbox-pair .cm-bbox-section{display:flex;flex-direction:column;gap:4px;padding:4px 0}",".cm-bbox-pair .cm-bbox-bar{height:4px}",".cm-bbox-divider{height:1px;background:var(--dsw-alias-border-l1);margin:0}",".cm-bbox-section.warn .cm-bbox-pct{color:var(--dsw-alias-state-warn-primary)}",".cm-bbox-section.over .cm-bbox-pct{color:var(--dsw-alias-state-error-primary)}",".cm-bbox-section.warn .cm-bbox-fill{background:var(--dsw-alias-state-warn-primary)}",".cm-bbox-section.over .cm-bbox-fill{background:var(--dsw-alias-state-error-primary)}",".cm-bbox.clickable,.cm-foot.clickable{cursor:pointer}",".cm-bbox.clickable:hover{border-color:var(--dsw-alias-state-business-primary)}",".cm-bbox.clickable:focus-visible,.cm-foot.clickable:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}","@keyframes cm-click-refresh-pulse{0%,100%{opacity:.55}50%{opacity:1}}",".cm-bbox.clickable.busy,.cm-foot.clickable.busy{animation:cm-click-refresh-pulse 1.1s ease-in-out infinite}",".cm-mm{padding:8px 10px;gap:4px}",".cm-mm-title{font-size:12px;font-weight:600;color:var(--dsw-alias-label-primary)}",".cm-mm-row{display:flex;align-items:center;gap:8px;padding:2px 0}",".cm-mm-row .cm-bbox-label{flex:none;width:auto;min-width:22px;max-width:115px;font-weight:400;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:keep-all}",".cm-mm-row .cm-bbox-bar{flex:1;min-width:40px;height:6px}",".cm-mm-row .cm-bbox-pct{flex:none;min-width:2.4em;text-align:right;font-variant-numeric:tabular-nums}",".cm-mm-row.warn .cm-bbox-label,.cm-mm-row.warn .cm-bbox-pct{color:var(--dsw-alias-state-warn-primary)}",".cm-mm-row.over .cm-bbox-label,.cm-mm-row.over .cm-bbox-pct{color:var(--dsw-alias-state-error-primary)}",".cm-mm-row.warn .cm-bbox-fill{background:var(--dsw-alias-state-warn-primary)}",".cm-mm-row.over .cm-bbox-fill{background:var(--dsw-alias-state-error-primary)}",".cm-mm-row.wide .cm-bbox-label{width:auto;max-width:64px;flex:0 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}",".cm-mm-row.wide .cm-mm-text{flex:1;min-width:0;font-size:12px;color:var(--dsw-alias-label-secondary);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}",".cm-bal-line{font-size:13px;color:var(--dsw-alias-label-secondary)}",".cm-bal-line.warn{color:var(--dsw-alias-state-warning-primary,#b45309)}",".cm-bal-line.err,.cm-bal-err{color:var(--dsw-alias-state-error-primary)}",".cm-footer-stack{display:flex;flex-direction:column;gap:6px;width:100%;align-items:stretch;box-sizing:border-box}",".cm-footer-stack.rail{align-items:center}",".cm-footer-stack .cm-bbox{width:100%;min-width:0}",".cm-footer-stack .cm-foot{width:100%;box-sizing:border-box}",".cm-footer-stack.compact .cm-bbox{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px;row-gap:2px;align-items:center}",".cm-footer-stack.compact .cm-bbox>*{grid-column:1/-1}",".cm-footer-stack.compact .cm-bbox>.cm-mm-row{grid-column:auto}",".cm-footer-stack.compact .cm-mm-row{min-width:0;gap:4px;flex-wrap:nowrap}",".cm-footer-stack.compact .cm-mm-row .cm-bbox-label{flex:0 1 auto;min-width:0;max-width:45%;width:auto}",".cm-footer-stack.compact .cm-mm-row .cm-bbox-bar{min-width:0;flex:1 1 0}",".cm-footer-stack.simple{gap:0;max-height:38vh;max-height:min(38dvh,320px);overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;border:1px solid var(--dsw-alias-border-l1);border-radius:10px;background:var(--dsw-alias-bg-layer-1)}",".cm-footer-stack.simple>*{flex-shrink:0}",".cm-footer-stack.simple:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}",".cm-footer-stack.simple .cm-bbox{border:0;border-radius:0;padding:5px 8px;gap:3px;background:transparent}",".cm-footer-stack.simple .cm-bbox+.cm-bbox{border-top:1px solid var(--dsw-alias-border-l1)}",".cm-footer-stack.simple .cm-mm-title{font-size:11px;line-height:16px;margin:0}",".cm-footer-stack.simple .cm-mm-row{gap:6px;min-height:16px;line-height:16px;margin:0}",".cm-footer-stack.simple .cm-bbox-pct{font-size:12px;line-height:18px}",".cm-footer-stack.simple .cm-bbox-bar{height:4px}",".cm-footer-stack.simple .cm-bbox-line{display:none}",".cm-footer-stack.simple .cm-foot{height:26px;padding:0 8px}",".cm-footer-stack.simple .cm-peak-classic{margin-top:2px;gap:2px}",".cm-footer-stack.simple .cm-peak-classic-chip{padding:0 4px;border:0;background:transparent}",".cm-simple-summary{position:sticky;top:0;z-index:1;background:var(--dsw-alias-bg-layer-1);display:flex;justify-content:space-between;align-items:center;gap:8px;padding:5px 8px;font-size:12px;font-weight:600;border-bottom:1px solid var(--dsw-alias-border-l1)}",".cm-footer-stack.simple.rail{border:0;background:transparent}",".cm-footer-stack.simple.rail .cm-bbox{padding:4px 2px}",".cm-footer-stack.simple .cm-peak-rail-track,.cm-footer-stack.simple .cm-peak-rail-classic-track{height:28px}","@media (max-width:640px){.cm-cards{grid-template-columns:1fr}.cm-grid{grid-template-columns:1fr}.cm-budget-controls{grid-template-columns:1fr}}"].join(`
|
|
3
|
-
`),St="dsh-cost-meter/client.css";if(typeof document<"u"&&document.querySelector("style[data-plugin-css="+JSON.stringify(St)+"]")===null){const t=document.createElement("style");t.dataset.plugin="dsh-cost-meter",t.dataset.pluginCss=St,t.textContent=la,document.head.appendChild(t)}const Se={zh:{sessionCostTitle:"本会话费用(按每次调用实际时刻精确计费)",sessionDetailTokens:"输入 {input} · 缓存 {cache} · 输出 {output}",sessionDetailCache:"缓存:读 {read} · 写 {write}(写入按命中价计费)",cost:"费用 {amount}",sessionLine:"本会话 {amount} · 输入 {input} · 缓存 {cache} · 输出 {output}",balanceQueryFailed:"余额查询失败:{message}",unknownError:"未知错误",balance:"余额",queryFailed:"查询失败",balanceTitle:"DeepSeek 开放平台账户余额",reconcileLabel:"官方余额变动与本地账本交叉对账(偏差超阈时提示)",totalBalance:"总余额 {amount}",grantedToppedUp:"赠送 {granted} · 充值 {toppedUp}",updatedAt:"更新时间 {time}",budgetOf:"预算({period})",usedOf:"已用 {used} / {amount}",todayShare:"今日 {amount} · 占预算 {pct}",monthTotal:"本月 {month} · 累计 {total}",budget:"预算",todayCostTitle:"今日费用(按官方价格精确计费)",callsTokens:"调用 {calls} 次 · 输入 {input} · 缓存 {cache} · 输出 {output}",monthCost:"本月 {amount}",totalCost:"累计 {amount}",today:"今日",periodDay:"今日",periodMonth:"本月",periodAll:"累计",periodCustomRange:"自定义区间",noHistory:"暂无历史记录。开始对话后,费用将按天汇总在这里。",colDate:"日期",colCalls:"调用",colInTok:"输入 tok",colCacheTok:"缓存 tok",colOutTok:"输出 tok",colCost:"费用",noSessionsToday:"今日暂无会话记录。",colSession:"会话",enableBudget:"启用预算",budgetAmountLabel:"预算额度(按显示币种)",budgetPeriodLabel:"预算周期",startDate:"开始日期",endDate:"结束日期(留空 = 今日)",rangeText:"统计区间:{range}",budgetDisabledNote:"未启用预算。启用后此处显示预算额度、已用金额与已用百分比(按当前币种换算);周期可选今日/本月/累计或自定义日期区间。",budgetStatus:"{period}预算 {amount} · 已用 {used} · {pct}%",overLimit:"(已超出)",nearLimit:"(接近上限)",legacyModel:"旧模型",defaultFallback:"默认回退",remove:"移除",tierBase:"基础",tierOffPeak:"谷时",tierPeak:"峰时",balanceRefreshFailed:"余额刷新失败:{message}",balanceLine:"总余额 {total} · 赠送 {granted} · 充值 {toppedUp} · 更新于 {time}",balanceQueryFailedHint:"余额查询失败:{message}(使用 设置→模型 中配置的 API Key)",balanceNotQueried:"未查询余额",accountBalance:"官方账户余额",refreshing:"刷新中…",refreshBalance:"刷新余额",customBalanceTitle:"自定义 Provider 余额",customBalanceMultiNote:"支持配置多个自定义提供商(最多 8 条),每条独立的请求与解析规则、独立开关与显示位置、独立刷新间隔;升级前的单条配置已自动迁移为第 1 条。",customBalanceAdd:"添加配置",aliyunBalanceAdd:"添加千问 / 阿里云余额",aliyunBalanceNote:"查询阿里云中国站资金账户可用金,按接口币种显示。使用 RAM AccessKey(需 bss:DescribeBillingAccount 权限),不是千问模型 API Key;共享同一组阿里云凭据。前两项必填,Security Token 仅 STS 临时凭据需要。密钥只存入凭据库。",customBalanceRemove:"删除",customBalanceEmpty:"尚未配置自定义 Provider 余额,点击「添加配置」新建。",customBalanceConfigNote:"配置自定义 Provider 的余额查询请求与解析规则。请求头支持 {{ENV_VAR}} 占位符,从 DSH 凭据库或环境变量解析;extract 规则支持点路径、数字常量与 add / subtract / divide 运算(NewApi 等 quota 端点用 divide 按 500000 换算美元)。",customBalanceLabelZh:"中文名称",customBalanceLabelEn:"英文名称",customBalanceUrl:"请求 URL",customBalanceMethod:"请求方法",customBalanceHeaders:"请求头 (JSON)",customBalanceExtract:"解析规则 (JSON)",customBalanceDisplayLabel:"自定义余额显示位置",customBalanceRefreshInterval:"刷新间隔 (分钟)",customBalanceUnitLabel:"余额币种",balanceBarRemaining:"余额 {amount}",balanceBarToday:"当日已用 {amount}",balanceBarSpent:"已用 {amount}",balanceShowProgressBar:"余额进度条 (蓝=余额,橙=当日,灰=已用)",barDirectionsTitle:"进度条方向",barDirectionsHint:"各组进度条可独立选择填充方向:「剩余方向」满条起步、随消耗递减;「已用方向」空条起步、随消耗填满。",barDirection_balance:"余额条(官方/自定义)",barDirection_budget:"预算条",barDirection_go:"Go 额度条",barDirection_plan:"Plan / Codex 额度条",barDirectionRemaining:"剩余方向(满 → 空)",barDirectionUsed:"已用方向(空 → 满)",balanceBudgetCapLabel:"额度上限 (可选)",balanceBudgetCapHint:"留空则优先使用 API 返回的 max_budget;仍无则显示整条浅蓝",customBalanceInvalidJson:"JSON 格式无效",customBalanceHeadersVarNote:"值支持 {{VAR_NAME}} 占位符,从 DSH 凭据库/环境变量解析,不落盘。变量名参考 <ROUTE>_API_KEY:<ROUTE> 为模型页 Provider ID 大写、非字母数字换下划线,如 openai→OPENAI_API_KEY、abc23-d→ABC23_D_API_KEY;同名即共用同一把密钥。",customBalanceAllowedHosts:"凭据白名单 (逗号分隔)",customBalanceAllowedHostsHint:"请求头带密钥时仅放行列表内主机,留空则放行并警告,防导入他人配置外带密钥。",customBalanceCredentialsTitle:"凭据输入",customBalanceCredentialsHint:"为上方 {{VAR}} 占位符存入密钥(write-only,只写凭据库,不回显):",customBalanceNoPlaceholders:'请求头还没有 {{VAR}} 占位符:填入如 "Authorization": "Bearer {{MY_API_KEY}}" 后这里会出现凭据输入框。',enable:"启用",customBalanceOpenConfig:"展开配置",customBalanceCollapseConfig:"收起配置",customBalanceLine:"剩余 {remaining} · 已用 {spend} / 额度 {maxBudget} · 更新于 {time}",customBalanceRemaining:"剩余 {amount}",refreshCustomBalance:"刷新自定义余额",customBalanceRefreshFailed:"自定义余额刷新失败:{message}",goQuotaTitle:"OpenCode Go 订阅额度",goQuotaRowLabel:"Go",goWindowRolling:"滚动 5 小时",goWindowWeekly:"本周",goWindowMonthly:"本月",goResetAt:"重置:{time}",resetReached:"已到重置时间",resetDays:"剩余 {d}天{h}小时",resetHours:"剩余 {h}小时{m}分",resetMinutes:"剩余 {m}分钟",quotaUsed:"已用 {pct}%",quotaRemaining:"剩余 {pct}%",goQuotaPercent:"{percent}%",goQuotaFetchedAt:"更新于 {time}",goQuotaDisplayLabel:"Go 额度显示位置",goQuotaRefreshIntervalLabel:"Go 额度刷新间隔(分钟)",goQuotaRefreshMinutesUnit:"分钟",goQuotaKeyLabel:"OpenCode Go API Key(可选,留空自动发现)",goMainLabel:"Go 额度主档位",goDetailLabel:"Go 图框详细信息",credentialConfiguredOf:"已配置(来源:{source})",credentialNotConfigured:"未配置",credentialSave:"保存",credentialClear:"清除",credentialSaving:"保存中…",credentialInputHint:"密钥只写入 DSH 凭据库,不保存在账本里,也不会回显。",secretMigrationPending:"以下密钥仍以明文留在本地账本,未能自动迁入凭据库。请导出对应环境变量后重启:",budgetDetailLabel:"预算图框详细信息",refreshGoQuota:"刷新额度",goQuotaNotQueried:"未查询额度",enableGoQuota:"启用 OpenCode Go 额度",codingPlansTitle:"Coding Plan 额度",codingPlansNote:"按厂商查询 coding plan 订阅额度(各家独立开关与凭据)。凭据只发送到对应厂商的官方端点;Key 留空时按环境变量与 CLI 登录态自动发现。",codingPlansOpen:"展开 Coding Plan 额度配置",codingPlansCollapse:"折叠 Coding Plan 额度",codingPlansCollapsedHint:"默认收起;展开后可为各家启用、填 Key 并查询额度,展开/收起状态会被记住。",codingPlanAnthropic:"Anthropic(Claude Pro/Max)",codingPlanZai:"Z.ai / 智谱 GLM Coding Plan",codingPlanMinimax:"MiniMax Token Plan",codingPlanMinimaxTitle:"MiniMax Plan",codingPlanRemain5h:"5h",codingPlanRemain7d:"7d",balanceRechargeLink:"打开 DeepSeek 充值页(platform.deepseek.com/usage)",codexQuotaTitle:"ChatGPT (Codex) 周额度",enableCodingPlan:"启用额度查询",codingPlanDisplayLabel:"显示位置",codingPlanDisplayNote:"选「主页面侧边栏 / 两者」后,该厂商额度以图框卡片常驻侧边栏(与 Go 额度/余额同款,收起窄栏显示百分比)。",codingPlanKeyLabel:"API Key(可选,留空自动发现)",codingPlanRefreshIntervalLabel:"刷新间隔(分钟)",refreshCodingPlan:"刷新",codingPlanNotQueried:"未查询额度",gatewayQuotaTitle:"CLIProxyAPI 网关额度",gatewayQuotaNote:"只读查询网关 Provider 额度;Management Key 仅写入凭据库。",gatewaySourceAdd:"添加来源",gatewaySourceRemove:"删除来源",gatewaySourceEmpty:"尚未配置网关来源",gatewaySourceEnabled:"启用来源",gatewaySourceLabel:"来源名称",gatewaySourceBaseURL:"Base URL",gatewaySourceDisplay:"显示位置",gatewaySourceAllowlist:"允许的 Host",gatewaySourceCredential:"Management Key(只写)",gatewaySourceStatus:"状态",gatewaySourceUnsupported:"不支持的 Provider",gatewaySourceUnknown:"未知",gatewaySourceNoAccounts:"未发现账号",gatewaySourceRefreshing:"刷新中…",gatewaySourceFetchedAt:"抓取于 {time}",codingPlanDisabledNote:"未启用。开启后将按刷新间隔查询该厂商的 coding plan 额度并显示在这里。",goQuotaDisabledNote:"未启用额度。开启后将读取 OpenCode Go 订阅额度(滚动 5 小时 / 本周 / 本月)并显示在侧边栏图框、设置页与右下角;没有 Go 订阅时会在这里提示原因。",cornerLabel:"右下角显示(dock)",cornerEnabledLabel:"在右下角显示 OpenCode Go 额度 / 预算",cornerGoRolling:"滚动 5 小时额度",cornerGoWeekly:"本周额度",cornerGoMonthly:"本月额度",cornerBudget:"预算已用%",goShortRolling:"5h",goShortWeekly:"周",goShortMonthly:"月",goShortDaily:"日",budgetShort:"预算",ledgerReadFailed:"账本读取失败:{message}",readingLedger:"正在读取账本…",ledgerUnavailable:"账本不可用",syncFailed:"同步失败:{message}",historyCleared:"历史记录已清除。",clearFailed:"清除失败:{message}",peakOff:"峰谷计价已关闭,按基础价格计费",peakNotEffective:"尚未生效(生效时间:{time}),当前按基础价格计费",peakActive:"当前处于峰时段,按峰时价计费",peakNotice:"当前为 DeepSeek 峰时高价时段,按峰时价计费",offPeakActive:"当前处于谷时段,按谷时价计费",weekendAllOffPeak:"周末时段——全谷价(周六及周日全天按谷时价计费)",weekendChip:"周末时段——全谷价",weekendShort:"周末全谷",weekendRuleNote:"2026-08-23(周日)00:00 起,周末(周六及周日,北京时间)全天不再区分峰谷,统一按谷时价格计费;生效前的费用仍按原规则结算。",peakShort:"峰时",offPeakShort:"平价",peakStyleLabel:"峰谷时段条样式",peakStyleCompact:"简洁(单行紧凑)",peakStyleClassic:"经典(分段与胶囊芯片)",peakAlertLabel:"峰/谷切换前弹窗提醒",peakAlertAheadLabel:"提前提醒(分钟,1-30)",peakAlertTargetLabel:"提醒类型",peakAlertTargetPeak:"进入峰时",peakAlertTargetOffPeak:"进入谷时",peakAlertTargetBoth:"峰和谷",peakAlertTitlePeak:"即将进入峰时",peakAlertTitleOffPeak:"即将进入谷时",peakAlertBody:"约 {time} 后计费档位切换为{phase}价,请注意本时段调用成本。",peakAlertPhasePeak:"峰时",peakAlertPhaseOffPeak:"谷时",peakAlertBtn:"知道了",peakAlertBadgePeak:"峰价提醒",peakAlertBadgeOffPeak:"谷价提醒",peakAlertPositionLabel:"弹窗位置",peakAlertPositionCorner:"右下角",peakAlertPositionCenter:"屏幕中心",peakAlertWebNotifyLabel:"同步发送系统通知",peakAlertWebNotifyHint:"开关后请在浏览器地址栏允许通知权限,才能在页面最小化/切走时收到提醒。",peakAlertPreviewLabel:"预览弹窗",peakAlertPreviewPeak:"预览 进入峰",peakAlertPreviewOffPeak:"预览 进入谷",peakAlertPreviewTag:"(预览)",peakPanelTitle:"峰谷计价与提示",peakNoticeHiddenHint:"提示已隐藏:需启用峰谷计价并开启「峰时高价时段显著提示」。",groupGeneral:"常规",groupMoney:"金额与币种",groupSidebar:"侧边栏显示",sidebarSimple:"简化侧栏显示",sidebarSimpleNote:"压缩卡片和明细,保留金额、额度与悬停详情;面板最多占屏幕高度的 38%,超出后可滚动。关闭后恢复原有布局。",sidebarSimpleTitle:"试试更轻巧的侧栏",sidebarSimpleBody:"简化显示可以为会话列表留出更多空间。要现在开启吗?之后可在「设置 → 费用 → 显示」中切换。",sidebarSimpleOn:"开启简化显示",sidebarSimpleOff:"保留当前显示",sidebarSimpleError:"保存失败,请重试。",sidebarStyleLabel:"侧边栏进度条样式",sidebarStyleStandard:"标准",sidebarStyleCompact:"紧凑(两列)",restorePriceMatches:"恢复已移除的模型 ({count})",removePriceMatchHint:"移除会清除手动映射并隐藏此行,可恢复;不会删除用量记录,后续按自动匹配规则计价。",groupCorner:"右下角角标",groupDetail:"图框详细信息",catalogTitle:"拓展价格表",catalogNote:"内置各厂商、按模型家族分类的参考价格目录(只读)。挂载 = 把条目复制进上方可编辑价格表并参与计费;DeepSeek 模型可取消挂载(回退默认价,目录中仍可重新挂载)。",catalogOpen:"展开拓展价格表",catalogCollapse:"收起拓展价格表",mountBtn:"挂载",unmountBtn:"取消挂载",mountedTag:"已挂载",catalogUnpriced:"未核价",catalogDeepseekNote:"DeepSeek 模型支持峰谷两档;取消挂载后按默认价计费且不再被自动匹配命中。",modelStatsTitle:"按模型统计(token 与费用)",modelStatsToday:"今日",modelStatsHistory:"近 90 天",modelStatsCostH:"费用排行",modelStatsTokensH:"Token 消耗",modelStatsHitH:"缓存命中率",modelStatsHitUnreported:"未上报?",modelStatsHitUnreportedTip:"该模型累计多次长上下文调用而缓存命中恒为 0:大概率是中转/代理层剥掉了用量里的缓存字段(或中转请求导致缓存真实未命中),命中率无法统计,且金额按全未命中价计(为上界)。直连官方 API 可恢复准确的缓存命中与更低的金额。",modelStatsValueH:"性价比 · 每美元 token 数",modelStatsInput:"输入",modelStatsCache:"缓存",modelStatsOutput:"输出",modelStatsEmpty:"该时段暂无用量数据。",modelStatsBlended:"综合单价 {price}/M",modelStatsNote:"口径:缓存命中率 = 缓存读 ÷ (缓存读 + 非缓存输入);「未上报?」= 用量疑似未含缓存字段(常见于中转/代理链路),命中率无法统计且金额按全未命中价计(上界);综合单价 = 费用 ÷ 总 token × 1M(USD/M tokens);性价比 = 总 token ÷ 费用,越高越好;费用为账本按每次调用实际时刻计费的美元值。",modelStatsLegacy:"未分模型(早期数据 · 按当时记录计费)",sessionLineSplit:"本会话 {amount}(API)· Plan 等值 {planAmount} · 输入 {input} · 缓存 {cache} · 输出 {output}",costChipPlan:"费用 {amount}(+Plan)",sessionDetailPlan:"Plan 订阅额度消耗(等值){amount}",planStatsTitle:"Token Plan 用量统计(每 1% 与满窗估算)",planStatsEmpty:"暂无已启用的 Coding Plan 额度数据;在「额度」标签启用并成功刷新后,这里会显示各窗口的每 1% 额度与满窗用量估算。",planStatsWindow:"窗口",planStatsPercent:"已用 %",planStatsLocal:"本周期实际(本地账本)",planStatsPer1:"每 1% 额度 ≈",planStatsFull:"满窗 100% ≈",planStatsResets:"重置 {time}",planStatsMethodSample:"采样差分",planStatsMethodLive:"当前用量折算",planStatsMethodNone:"样本不足",planStatsMethodSampleAt:"{method}(基准 {time})",planStatsConfidenceLow:"读数精度受限",planStatsCurveTitle:"Plan 用量曲线(按采样区间聚合)",planStatsDaily:"每日",planStatsWeekly:"每周",planStatsMonthly:"每月",planStatsCurveEmpty:"采样区间尚不足(至少两次成功刷新且百分比有变化),曲线会在持续使用后逐步成形。",planStatsBarTip:"{date}:满窗估计 ≈ {full}(每 1% ≈ {per1})· 实际 {tokens} / {cost} · {intervals} 个采样区间",planStatsNote:"口径:「金额」为目录 API 价等值——订阅渠道耗套餐额度,预算只计 API;估算只统计 dsh 内调用,服务端「已用%」为全账号口径。每 1%/满窗取可信采样段差分(短段波动大,标注「精度受限」)。5 小时窗滚动,周/月按本地日历。",billingClassLabel:"计费方式",billingClassPlan:"Plan 订阅",catalogDisplayLabel:"在费用设置直接显示",catalogDisplayHint:"只决定该模型价格卡是否在费用设置「价格表」区直接显示,不影响挂载状态与计费;不直接显示时已挂载模型在拓展价格表内展开厂商后可编辑。",priceTableDisplayHint:"各模型是否在「价格表」区直接显示,可在下方拓展价格表中逐模型用「在费用设置直接显示」开关切换;DeepSeek 模型默认直接显示,第三方模型挂载后默认收入拓展表。",catalogCustomModels:"手动新增模型",priceMatchLabel:"未知模型名自动匹配",priceMatchAuto:"自动(去后缀 / 前缀 / 家族相似)",priceMatchExact:"仅精确匹配",priceMatchNote:"自动匹配顺序:精确 → 手动指定 → 去日期/版本后缀 → 前缀 → 家族相似;未命中时 DeepSeek 回退默认价,其他 provider 不计价。",unmatchedTitle:"最近出现但未命中价格的模型",unmatchedHint:"按当前匹配模式未命中价格条目(含跨厂商兑底后仍按默认价兜底的);为其指定条目写入手动匹配覆盖,选择「默认价」即回退 DeepSeek 默认价。本地推理来源(lmstudio / ollama / vLLM 等)的模型已自动按零消耗处理;如需计费,可在此为其指定价格条目。",overrideTargetDefault:"DeepSeek 默认价",overrideRemove:"移除",overrideTargetLocal:"本地模型(零消耗)",matchedTitle:"本月已命中价格的模型",matchedHint:"以下模型已自动命中价格条目。在行内选择目标即可改挂其它条目,或选择「本地模型(零消耗)」把该模型标记为本地来源——token 照常统计、费用按 0 计,历史金额即时归零。写入后该行转入上方手动指定区。",matchedKeepAuto:"保持自动命中",overrideNone:"暂无手动匹配覆盖。",mountedSuffix:"已挂载(参与计费)",flatInput:"输入",flatCached:"缓存",flatOutput:"输出",deepseekMountedHeader:"DeepSeek 价格表(已挂载)",codingPlanKimi:"Kimi / Moonshot",codingPlanOpenrouter:"OpenRouter",codingPlanSiliconflow:"SiliconFlow 硅基流动",codingPlanCommandcode:"CommandCode",codingPlanScnet:"SCNet 超算互联网 Token Plan",codingPlanVolcengine:"火山方舟 Volcano Ark Coding Plan",codingPlanQwen:"千问 Qwen Token Plan",qwenPlanCreditsLabel:"月度 Credits 额度(个人版 Lite 5 万 / 标准版 50 万,以订阅页为准)",qwenPlanStartLabel:"订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)",qwenRatesLabel:"Credits 抵扣率覆盖(可选;每百万 token 抵扣的 Credits,留空用内置表)",qwenRatesModelPlaceholder:"模型名,如 qwen3.8-max-preview",qwenRatePlaceholder:"费率",qwenRate_input:"输入",qwenRate_cachedInput:"缓存读",qwenRate_output:"输出",qwenRateDraftNote:"待填齐三项正数后自动保存;全部清空恢复内置表。",qwenRatesAdd:"添加",qwenLocalNote:"按本地账本估算,实际 Credits 以控制台为准。仅统计 qwen、qwen-tokenplan、qianwen-tokenplan、qwen-token-plan、qianwen-token-plan 订阅渠道(支持 llm- 前缀),显式分类为 API 的调用不计;qianwen 按量渠道不计。内置表以外的模型需手动指定抵扣率。",scnetPlanCreditsLabel:"本地估算月度 Credits 额度(基础 60,000 / 标准 240,000 / 高级 600,000)",scnetPlanStartLabel:"订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)",scnetLocalNote:"可接入外部控制台快照(以采集时间为准,最长保留 24 小时)。没有有效快照时,按官方 Credits 抵扣表由本地账本估算;本地估算不覆盖其他工具的调用和未收录模型,实际用量以控制台为准。",volcengineAccessKeyIdLabel:"火山引擎 AccessKey ID",volcengineSecretAccessKeyLabel:"火山引擎 SecretAccessKey",volcengineNote:"火山方舟管控面需 AK/SK 签名(非 ARK_API_KEY Bearer):在火山引擎控制台 IAM 创建子用户并授予 ArkReadOnlyAccess + BillingCenterReadOnlyAccess,填写 AccessKeyID 与 SecretAccessKey;也可在环境变量导出 VOLC_ACCESSKEY / VOLC_SECRETKEY 自动发现(官方 SDK 约定);凭据仅发往 open.volcengineapi.com。",volcengineAccessKeyPlaceholder:"AK...",volcengineSecretPlaceholder:"SK...",countdownHoursOnly:"{h}小时",countdownHourMinute:"{h}小时{m}分",countdownMinute:"{m}分钟",nextOffPeakIn:"{time}后进入平价",nextPeakIn:"{time}后进入高峰",peakSummary:"峰时段(UTC):{windows};生效时间:{time}。{status}",noPeakWindows:"未配置峰谷时段。{status}",unknown:"未知",cardToday:"今日费用",cardMonth:"本月费用",cardTotal:"累计费用",cardTotalSub:"自账本建立以来 · 调用 {calls} 次",cardsFootnote:"口径说明:金额为最近一次落盘快照(2 秒防抖;正常关闭会先强制落盘再退出),与官方实时账单存在分钟级时差属预期;tokens 列为输入+输出+缓存+推理的合计——推理 tokens 由 API 单独上报且不计费(官方账单将其并入「输出」列展示),对账请以金额为准。",timezoneHint:"时区提示:「今日/本月」按宿主机时区 {host} 取日界,与当前浏览器({browser})不同——宿主机跨日界的时刻与本地不一致,你本地午夜后的调用会被记到前一日(并非漏计;官方余额对账也会因此提示偏差)。可在宿主机上以本地时区运行 dsh 使两者一致。",todaySessions:"今日会话",historyExpandHint:"点击日期行可展开当日会话明细",historySessionsLoading:"会话明细加载中…",historyNoSessions:"该日无会话明细(早期数据或会话日志已清理)",historySessionsError:"会话明细加载失败",sessionRankTitle:"按会话统计(全部历史)",sessionRankHint:"不按日期分组,全部历史会话;排序与条数可切换",sessionRankEmpty:"暂无会话数据",sessionRankLoading:"会话排行加载中…",sessionRankError:"会话排行加载失败",sessionRankLimit:"显示条数",showSessionIdLabel:"会话列表附显会话 ID",cardsTogglePlanTotal:"金额含 Plan 总额",cardsTogglePlanTotalHint:"开启后所有金额按含 Plan 订阅等值的总费用展示;关闭(默认)仅计真金白银 API 渠道",hideOfficialBalanceLabel:"隐藏官方账户余额(开启后侧边栏与设置页不再显示官方余额)",hideTodayCostLabel:"隐藏今日消耗金额(开启后侧边栏/预算明细/概览卡片不再显示今日费用)",sessionRankSort:"排序",sessionSortCostDesc:"费用 高→低",sessionSortCostAsc:"费用 低→高",sessionSortTimeDesc:"时间 新→旧",sessionSortTimeAsc:"时间 旧→新",sessionSortRecent:"实时顺序",history:"历史记录",usageTitle:"Token 用量统计",usageTotal:"累计 {tokens} tokens · 输入 {input} · 缓存 {cache} · 输出 {output} · {calls} 次调用",usageDay:"{date}:共 {tokens} tokens(输入 {input} · 缓存 {cache} · 输出 {output})· {calls} 次调用 · {cost}",usageEmpty:"暂无历史数据,开始对话后每日用量会汇总在这里",usageSectionLabel:"用量",usagePositionLabel:"Token 用量统计位置",usagePositionCost:"费用设置",usagePositionGeneral:"通用设置",usagePositionSection:"独立分节(用量)",displaySettings:"显示设置",tabOverview:"概览",tabQuotas:"额度",tabUsage:"用量",tabPricing:"价格",tabDisplay:"显示",historyDataTitle:"历史数据",positionLabel:"会话费用显示位置",positionDock:"输入区下方",positionHeader:"会话标题栏",off:"关闭",quotaStripGroup:"输入框上方额度横条",quotaStripEnable:"启用额度横条(输入框上方一条横排显示)",quotaStripShowBudget:"横条含预算已用%",quotaStripShowGo:"横条含 Go 额度",quotaStripShowPlans:"横条含 Coding Plan 额度",quotaStripNote:"横条悬停可见各窗口重置时刻与更新时间;无可用额度数据时自动隐藏。",quotaStripGuideTitle:"新增:输入框上方额度横条",quotaStripGuideBody:"可以在输入框上方用一条横条实时查看预算与多家订阅额度(OpenCode Go / Coding Plan)的用量百分比。要现在开启吗?可随时在「设置 → 显示设置」中更改。",quotaStripGuideOn:"开启横条",quotaStripGuideOff:"暂不开启",clickToRefresh:"点击立即刷新",balanceClickGuideTitle:"新增:余额图框点击刷新",balanceClickGuideBody:"现在点击侧边栏的官方余额 / 自定义余额 / Coding Plan 图框,即可立即刷新最新数据,无需等待自动刷新间隔或进入设置页;刷新中会有呼吸闪烁,失败时保持原值并在悬停提示中说明原因。",balanceClickGuideOk:"知道了",sidebarLabel:"当日费用显示",sidebarOn:"侧边栏底部",currencyLabel:"货币单位",currencyCny:"人民币 CNY",currencyUsd:"美元 USD",currencyEur:"欧元 EUR",symbolLabel:"货币符号",rateLabel:"汇率(1 美元 = ? 目标币种)",decimalsLabel:"小数位数",balanceDisplayLabel:"余额显示位置",balanceSidebar:"主页面侧边栏",balanceSettings:"设置页",balanceBoth:"两者都显示",refreshIntervalLabel:"余额刷新间隔(分钟)",peakEnabledLabel:"启用 DeepSeek 峰谷时段价格",peakNoticeLabel:"峰时高价时段显著提示(侧边栏预算框/今日费用;设置页峰谷面板内预览)",badgeNote:"会话徽章为按每次调用实际时刻精确计费(含峰谷档位;峰谷时代分界 2026-08-16 16:00 UTC 之前按当时基础价),与账本当日/月度/累计同口径。输入/缓存/输出 token 分开统计,缓存读写按命中价计费。",priceTableTitle:"价格表(美元 / 1M tokens)",pricingCurrencyLabel:"官方价格币种",pricingCurrencyUsd:"美元(英文官方页)",pricingCurrencyCny:"人民币(中文官方页)",pricingCurrencyNote:"决定「从官方文档同步价格」抓取哪个语言的官方页。切换并同步后,历史账目会按新价目整体重算(日志覆盖不全的会话保持原口径),历史与官方账单同基准;重算在后台进行,完成后有提示。",priceTableNote:"价格按调用时间选择:Flash 新价自北京时间 2026-09-10 12:00 生效,V4 Pro 自 09-14 12:00 转按 Flash 计价;此前的历史价保留。工作日高峰为 09–12、14–18 时,峰价为谷价两倍,周末全天谷价。缓存写入按命中价计费。所有设置修改后自动保存。",datedPriceNote:"这里显示当前适用价格。手工编辑会取消此条后续预定调价,已发生的历史价格仍保留。",defaultModelId:"default(未匹配模型时回退)",newModelPlaceholder:"新模型 ID(如 deepseek-v4-pro)",addModel:"添加模型",dataSync:"数据与同步",saving:"保存中…",autoSaveFailed:"自动保存失败:{message}",autoSavedAt:"已自动保存 {time}",autoSaveHint:"配置修改后自动保存",confirmFetch:"确认用官方文档价格覆盖价格表?",apply:"应用",cancel:"取消",syncFromDocs:"从官方文档同步价格",syncScopeNote:"同步范围说明:「从官方文档同步价格」仅更新 DeepSeek 官方模型价(含峰谷档);第三方厂商的扩展目录价(z-ai / Kimi / Qwen / Volcano 等)不随该按钮变化,随插件版本发布维护,如有滞后可在「拓展价格表」挂载后编辑,或经「模型名匹配」为任意模型手动指定价格。",confirmReset:"确认清除全部历史?",importLegacy:"导入安装前历史",confirmImportLegacy:"确认导入?将回放全部会话日志,只补账本缺失的日期与会话,不影响已有记录。",legacyImportFailed:"导入安装前历史失败:{message}",legacyImportNote:"插件首次启动后会自动导入一次安装前历史;此处可手动重跑(如后续拷入了旧日志)。金额按当前价目表回推,已清理的日志无法回放,同一会话跨安装时刻时其安装前用量不计入。",confirmClear:"确认清除",clearAllHistory:"清除全部历史",lastSync:"最近同步:{time}",neverSynced:"从未(使用内置价格)",source:";来源:{source}",sourceOfficial:"官方文档",sourceBundled:"内置默认",languageLabel:"界面语言",localeAuto:"跟随浏览器(自动)",localeZh:"简体中文",localeEn:"English",sectionLabel:"费用",rpcFailed:"{method} 调用失败",rpcSyncFailed:"同步调用失败",rpcBalanceFailed:"余额刷新调用失败"},en:{sessionCostTitle:"Cost of this session (billed exactly at each call time)",sessionDetailTokens:"Input {input} · Cache {cache} · Output {output}",sessionDetailCache:"Cache: read {read} · write {write} (writes billed at the hit price)",cost:"Cost {amount}",sessionLine:"This session {amount} · Input {input} · Cache {cache} · Output {output}",balanceQueryFailed:"Balance query failed: {message}",unknownError:"Unknown error",balance:"Balance",queryFailed:"Query failed",balanceTitle:"DeepSeek open-platform account balance",reconcileLabel:"Cross-check official balance changes against the local ledger (warn when they diverge)",totalBalance:"Total {amount}",grantedToppedUp:"Granted {granted} · Topped-up {toppedUp}",updatedAt:"Updated {time}",budgetOf:"Budget ({period})",usedOf:"Used {used} / {amount}",todayShare:"Today {amount} · {pct} of budget",monthTotal:"This month {month} · All time {total}",budget:"Budget",todayCostTitle:"Today's cost (billed exactly at official prices)",callsTokens:"Calls {calls} · Input {input} · Cache {cache} · Output {output}",monthCost:"This month {amount}",totalCost:"All time {amount}",today:"Today",periodDay:"Today",periodMonth:"This month",periodAll:"All time",periodCustomRange:"Custom range",noHistory:"No history yet. Once you start chatting, costs are aggregated here per day.",colDate:"Date",colCalls:"Calls",colInTok:"In tok",colCacheTok:"Cache tok",colOutTok:"Out tok",colCost:"Cost",noSessionsToday:"No sessions recorded today.",colSession:"Session",enableBudget:"Enable budget",budgetAmountLabel:"Budget amount (in display currency)",budgetPeriodLabel:"Budget period",startDate:"Start date",endDate:"End date (empty = today)",rangeText:"Range: {range}",budgetDisabledNote:"Budget is disabled. Once enabled, this panel shows the budget limit, the amount used and the used percentage (converted to the display currency); the period can be today / this month / all time / a custom date range.",budgetStatus:"{period} budget {amount} · Used {used} · {pct}%",overLimit:" (over limit)",nearLimit:" (near limit)",legacyModel:"Legacy",defaultFallback:"Default fallback",remove:"Remove",tierBase:"Base",tierOffPeak:"Off-peak",tierPeak:"Peak",balanceRefreshFailed:"Balance refresh failed: {message}",balanceLine:"Total {total} · Granted {granted} · Topped-up {toppedUp} · Updated {time}",balanceQueryFailedHint:"Balance query failed: {message} (uses the API key configured in Settings → Models)",balanceNotQueried:"Balance not queried",accountBalance:"Account balance",refreshing:"Refreshing…",refreshBalance:"Refresh balance",customBalanceTitle:"Custom provider balance",customBalanceMultiNote:"Configure multiple custom providers (up to 8): each entry has its own request & extract rules, enable switch, display position and refresh interval; your previous single entry was migrated to #1 automatically.",customBalanceAdd:"Add entry",aliyunBalanceAdd:"Add Qianwen / Alibaba Cloud balance",aliyunBalanceNote:"Queries available funds for an Alibaba Cloud China account in the returned currency. Uses shared RAM AccessKey credentials with bss:DescribeBillingAccount permission, not a Qianwen model API key. The first two fields are required; Security Token is only for temporary STS credentials. Secrets stay in the credential store.",customBalanceRemove:"Remove",customBalanceEmpty:'No custom provider balance configured yet — click "Add entry" to create one.',customBalanceConfigNote:"Configure the balance query request and extract rules. Headers support {{ENV_VAR}} placeholders resolved from DSH credentials or environment variables; extract rules accept dot paths, numeric constants, and add / subtract / divide operations (use divide with 500000 for NewApi-style quota endpoints).",customBalanceLabelZh:"Chinese name",customBalanceLabelEn:"English name",customBalanceUrl:"Request URL",customBalanceMethod:"HTTP method",customBalanceHeaders:"Headers (JSON)",customBalanceExtract:"Extract rules (JSON)",customBalanceDisplayLabel:"Custom balance display",customBalanceRefreshInterval:"Refresh interval (minutes)",customBalanceUnitLabel:"Balance currency",balanceBarRemaining:"Balance {amount}",balanceBarToday:"Today {amount}",balanceBarSpent:"Spent {amount}",balanceShowProgressBar:"Balance progress bar (blue=balance, orange=today, gray=spent)",barDirectionsTitle:"Progress bar direction",barDirectionsHint:'Each group of bars can independently choose its fill direction: "Remaining" starts full and drains with usage; "Used" starts empty and fills up.',barDirection_balance:"Balance bars (official/custom)",barDirection_budget:"Budget bar",barDirection_go:"Go quota bar",barDirection_plan:"Plan / Codex quota bars",barDirectionRemaining:"Remaining (full → empty)",barDirectionUsed:"Used (empty → full)",balanceBudgetCapLabel:"Budget cap (optional)",balanceBudgetCapHint:"Leave empty to use API max_budget; if still missing, show full light-blue bar",customBalanceInvalidJson:"Invalid JSON",customBalanceHeadersVarNote:"Values support {{VAR_NAME}} placeholders resolved from the DSH credential store or env, never written to disk. The name follows <ROUTE>_API_KEY, where <ROUTE> is the Models-page Provider ID uppercased with non-alphanumerics replaced by underscores, e.g. openai→OPENAI_API_KEY, abc23-d→ABC23_D_API_KEY; sharing a name shares the same key.",customBalanceAllowedHosts:"Allowed hosts (comma-separated)",customBalanceAllowedHostsHint:"When headers carry credentials only listed hosts are allowed; leave empty to allow with a warning. Protects keys when importing someone else's config.",customBalanceCredentialsTitle:"Credential input",customBalanceCredentialsHint:"Store the key for each {{VAR}} placeholder above (write-only: stored in the DSH credential store, never echoed back):",customBalanceNoPlaceholders:'No {{VAR}} placeholders in the headers yet — add e.g. "Authorization": "Bearer {{MY_API_KEY}}" and a credential input will appear here.',enable:"Enable",customBalanceOpenConfig:"Expand config",customBalanceCollapseConfig:"Collapse config",customBalanceLine:"Remaining {remaining} · Spent {spend} / Budget {maxBudget} · Updated {time}",customBalanceRemaining:"Remaining {amount}",refreshCustomBalance:"Refresh custom balance",customBalanceRefreshFailed:"Custom balance refresh failed: {message}",goQuotaTitle:"OpenCode Go subscription quota",goQuotaRowLabel:"Go",goWindowRolling:"Rolling 5h",goWindowWeekly:"Weekly",goWindowMonthly:"Monthly",goResetAt:"Resets: {time}",resetReached:"Reset time reached",resetDays:"{d}d {h}h left",resetHours:"{h}h {m}m left",resetMinutes:"{m}m left",quotaUsed:"{pct}% used",quotaRemaining:"{pct}% remaining",goQuotaPercent:"{percent}%",goQuotaFetchedAt:"Updated {time}",goQuotaDisplayLabel:"Go quota display position",goQuotaRefreshIntervalLabel:"Go quota refresh interval (minutes)",goQuotaRefreshMinutesUnit:"min",goQuotaKeyLabel:"OpenCode Go API key (optional; empty = auto-detect)",goMainLabel:"Go quota primary window",goDetailLabel:"Go box details",credentialConfiguredOf:"Configured (source: {source})",credentialNotConfigured:"Not configured",credentialSave:"Save",credentialClear:"Clear",credentialSaving:"Saving…",credentialInputHint:"The key is written to the DSH credential store only — it is never saved in the ledger and never echoed back.",secretMigrationPending:"These credentials are still stored in plaintext in the local ledger and could not be migrated automatically. Export the matching environment variables and restart:",budgetDetailLabel:"Budget box details",refreshGoQuota:"Refresh quota",goQuotaNotQueried:"Quota not queried",enableGoQuota:"Enable OpenCode Go quota",codingPlansTitle:"Coding plan quotas",codingPlansNote:"Query coding plan subscription quotas per vendor (independent enable switch and credentials per vendor). Credentials are only sent to the vendor's official endpoint; leave the key empty to auto-detect from environment variables and CLI logins.",codingPlansOpen:"Expand Coding Plan quotas",codingPlansCollapse:"Collapse Coding Plan quotas",codingPlansCollapsedHint:"Collapsed by default; expand to enable providers, enter keys and query quotas. The open/closed state is remembered.",codingPlanAnthropic:"Anthropic (Claude Pro/Max)",codingPlanZai:"Z.ai / Zhipu GLM Coding Plan",codingPlanMinimax:"MiniMax Token Plan",codingPlanMinimaxTitle:"MiniMax Plan",codingPlanRemain5h:"5h",codingPlanRemain7d:"7d",balanceRechargeLink:"Open DeepSeek top-up page (platform.deepseek.com/usage)",codexQuotaTitle:"ChatGPT (Codex) weekly quota",enableCodingPlan:"Enable quota queries",codingPlanDisplayLabel:"Display position",codingPlanDisplayNote:`With "Main sidebar / Both" selected, this vendor's quota shows as a card in the sidebar (same box style as the Go quota / balance; the collapsed rail shows percentages).`,codingPlanKeyLabel:"API key (optional; empty = auto-detect)",codingPlanRefreshIntervalLabel:"Refresh interval (minutes)",refreshCodingPlan:"Refresh",codingPlanNotQueried:"Quota not queried",gatewayQuotaTitle:"CLIProxyAPI gateway quotas",gatewayQuotaNote:"Read-only gateway provider quotas; management keys are write-only.",gatewaySourceAdd:"Add source",gatewaySourceRemove:"Remove source",gatewaySourceEmpty:"No gateway source configured",gatewaySourceEnabled:"Enable source",gatewaySourceLabel:"Source label",gatewaySourceBaseURL:"Base URL",gatewaySourceDisplay:"Display",gatewaySourceAllowlist:"Allowed hosts",gatewaySourceCredential:"Management key (write-only)",gatewaySourceStatus:"Status",gatewaySourceUnsupported:"Unsupported providers",gatewaySourceUnknown:"Unknown",gatewaySourceNoAccounts:"No accounts",gatewaySourceRefreshing:"Refreshing…",gatewaySourceFetchedAt:"fetched {time}",codingPlanDisabledNote:"Disabled. Enable it to query this vendor's coding plan quota on the refresh interval and show it here.",goQuotaDisabledNote:"Quota disabled. Enable it to read the OpenCode Go subscription quota (rolling 5h / weekly / monthly) and show it in the sidebar box, Settings page and bottom-right corner; if you have no Go subscription, the reason will be shown here.",cornerLabel:"Bottom-right (dock) display",cornerEnabledLabel:"Show OpenCode Go quota / budget at the bottom-right",cornerGoRolling:"Rolling-5h quota",cornerGoWeekly:"Weekly quota",cornerGoMonthly:"Monthly quota",cornerBudget:"Budget used %",goShortRolling:"5h",goShortWeekly:"Wk",goShortMonthly:"Mo",goShortDaily:"Daily",budgetShort:"Budget",ledgerReadFailed:"Ledger read failed: {message}",readingLedger:"Reading ledger…",ledgerUnavailable:"Ledger unavailable",syncFailed:"Sync failed: {message}",historyCleared:"History cleared.",clearFailed:"Clear failed: {message}",peakOff:"Peak/off-peak pricing is off; base prices are used",peakNotEffective:"Not yet effective (effective at {time}); base prices are currently used",peakActive:"Peak hour now; peak prices apply",peakNotice:"DeepSeek peak-hour pricing is active; current calls are billed at peak prices",offPeakActive:"Off-peak now; off-peak prices apply",weekendAllOffPeak:"Weekend — all off-peak (Sat & Sun billed at off-peak prices all day)",weekendChip:"Weekend — all off-peak",weekendShort:"Weekend",weekendRuleNote:"From Aug 23, 2026 00:00 (Beijing time), weekends (Saturday & Sunday) are billed entirely at off-peak prices; charges before that still follow the previous rules.",peakShort:"Peak",offPeakShort:"Off-peak",peakStyleLabel:"Peak period strip style",peakStyleCompact:"Compact (one-line)",peakStyleClassic:"Classic (segments & chip)",peakAlertLabel:"Popup alert before peak/off-peak switch",peakAlertAheadLabel:"Lead time (minutes, 1-30)",peakAlertTargetLabel:"Alert type",peakAlertTargetPeak:"Entering peak",peakAlertTargetOffPeak:"Entering off-peak",peakAlertTargetBoth:"Both",peakAlertTitlePeak:"Entering peak hours soon",peakAlertTitleOffPeak:"Entering off-peak hours soon",peakAlertBody:"Billing switches to {phase} pricing in about {time}; mind your call costs in this window.",peakAlertPhasePeak:"peak",peakAlertPhaseOffPeak:"off-peak",peakAlertBtn:"Got it",peakAlertBadgePeak:"Peak alert",peakAlertBadgeOffPeak:"Off-peak alert",peakAlertPositionLabel:"Popup position",peakAlertPositionCorner:"Bottom-right",peakAlertPositionCenter:"Screen center",peakAlertWebNotifyLabel:"Also send a system notification",peakAlertWebNotifyHint:"When enabled, allow notification permission in the browser address bar so you get alerted even when the page is minimized or backgrounded.",peakAlertPreviewLabel:"Preview the popup",peakAlertPreviewPeak:"Preview entering peak",peakAlertPreviewOffPeak:"Preview entering off-peak",peakAlertPreviewTag:" (preview)",peakPanelTitle:"Peak/off-peak pricing & notice",peakNoticeHiddenHint:"Notice hidden: enable peak/off-peak pricing and the “prominent notice” toggle.",groupGeneral:"General",groupMoney:"Money & currency",groupSidebar:"Sidebar display",sidebarSimple:"Simplify the sidebar",sidebarSimpleNote:"Condense cards and details while keeping amounts, quotas and hover details. The panel uses at most 38% of the viewport height and scrolls as needed. Turn off to restore your layout.",sidebarSimpleTitle:"A lighter sidebar",sidebarSimpleBody:"Simple display leaves more room for conversations. Enable it now? You can change it in Settings → Cost → Display anytime.",sidebarSimpleOn:"Enable simple display",sidebarSimpleOff:"Keep current display",sidebarSimpleError:"Could not save. Please retry.",sidebarStyleLabel:"Sidebar progress style",sidebarStyleStandard:"Standard",sidebarStyleCompact:"Compact (2 columns)",restorePriceMatches:"Restore removed models ({count})",removePriceMatchHint:"Remove clears the override and hides the row until restored. Usage records are kept; automatic price matching applies.",groupCorner:"Corner chips",groupDetail:"Box details",catalogTitle:"Extended price catalog",catalogNote:"A built-in, read-only reference catalog grouped by vendor and model family. Mounting copies an entry into the editable price table above so it is used for billing; DeepSeek models can be unmounted (they fall back to the default price and can be re-mounted here).",catalogOpen:"Expand extended price catalog",catalogCollapse:"Collapse extended price catalog",mountBtn:"Mount",unmountBtn:"Unmount",mountedTag:"Mounted",catalogUnpriced:"Unpriced",catalogDeepseekNote:"DeepSeek models support peak/off-peak tiers; once unmounted they bill at the default price and are no longer hit by auto-matching.",modelStatsTitle:"Per-model statistics (tokens & cost)",modelStatsToday:"Today",modelStatsHistory:"Last 90 days",modelStatsCostH:"Cost ranking",modelStatsTokensH:"Token usage",modelStatsHitH:"Cache hit rate",modelStatsHitUnreported:"unreported?",modelStatsHitUnreportedTip:"This model has many long-context calls but zero cache hits: most likely a relay/proxy strips the cache fields from usage (or the relay genuinely breaks the prefix cache). The hit rate cannot be computed and the cost is priced as all-cache-miss (an upper bound). Connecting directly to the official API restores accurate cache hits and lower costs.",modelStatsValueH:"Value · tokens per USD",modelStatsInput:"Input",modelStatsCache:"Cache",modelStatsOutput:"Output",modelStatsEmpty:"No usage data for this period.",modelStatsBlended:"blended {price}/M",modelStatsNote:'Cache hit rate = cache reads ÷ (reads + non-cached input); "unreported?" = usage carries no cache fields (common behind relays), cost priced as all-miss (upper bound); blended = cost ÷ tokens × 1M; value = tokens ÷ cost (higher better). Costs are USD as billed.',billingClassLabel:"Billing class",billingClassPlan:"Plan subscription",modelStatsLegacy:"Unattributed (early data · billed as recorded)",sessionLineSplit:"This session {amount} (API) · Plan equiv. {planAmount} · Input {input} · Cache {cache} · Output {output}",costChipPlan:"Cost {amount} (+Plan)",sessionDetailPlan:"Plan subscription quota usage (equiv.) {amount}",planStatsTitle:"Token Plan usage stats (per-1% & full-window estimates)",planStatsEmpty:"No enabled coding-plan quota data yet; enable and successfully refresh a provider under the Quotas tab to see per-1% and full-window usage estimates here.",planStatsWindow:"Window",planStatsPercent:"Used %",planStatsLocal:"This period actual (local ledger)",planStatsPer1:"Per 1% quota ≈",planStatsFull:"Full window (100%) ≈",planStatsResets:"resets {time}",planStatsMethodSample:"sample delta",planStatsMethodLive:"current usage ratio",planStatsMethodNone:"not enough samples",planStatsMethodSampleAt:"{method} (as of {time})",planStatsConfidenceLow:"low reading precision",planStatsCurveTitle:"Plan usage curves (aggregated from sample intervals)",planStatsDaily:"Daily",planStatsWeekly:"Weekly",planStatsMonthly:"Monthly",planStatsCurveEmpty:"Not enough sample intervals yet (at least two successful refreshes with a percent change); the curves will take shape with continued use.",planStatsBarTip:"{date}: full-window est. ≈ {full} (per 1% ≈ {per1}) · actual {tokens} / {cost} · {intervals} sample interval(s)",planStatsNote:'Scope: amounts are catalog-price equivalents — plans consume quota, budget counts API only. Estimates cover dsh-made calls only; server "used %" covers the whole account. Per-1%/full-window from trustworthy sample deltas (short segments fluctuate, tagged low-precision). 5h window rolling, week/month local calendar.',catalogDisplayLabel:"Show directly in Cost settings",catalogDisplayHint:"Only decides whether this model's price card appears directly in the Cost settings price table; mounting and billing are unaffected. When hidden, the mounted model stays editable inside the expanded vendor section of this catalog.",priceTableDisplayHint:"Use the per-model “Show directly in Cost settings” toggle in the extended price catalog below to choose which models appear here; DeepSeek models default to direct display, third-party models default to the catalog once mounted.",catalogCustomModels:"Custom models",priceMatchLabel:"Auto-match unknown model names",priceMatchAuto:"Auto (strip suffix / prefix / family similarity)",priceMatchExact:"Exact match only",priceMatchNote:"Match order: exact → manual override → strip date/version suffix → prefix → family similarity. Unmatched DeepSeek ids fall back to the default price; other providers stay unpriced.",unmatchedTitle:"Recently seen models without a price hit",unmatchedHint:"No price entry hit under the current match mode (incl. cross-vendor fallback), or fell back to the DeepSeek default. Pick which entry each bills against (saved as a manual override); “Default price” = DeepSeek default. Local-runtime models (lmstudio / ollama / vLLM / …) are zero-cost automatically; assign an entry here to bill them.",overrideTargetDefault:"DeepSeek default price",overrideRemove:"Remove",overrideTargetLocal:"Local model (zero cost)",matchedTitle:"Models matched this month",matchedHint:"These models already auto-matched a price entry. Pick a target to re-map them, or pick “Local model (zero cost)” to mark them as local — tokens are still counted, cost is 0, and their historical amounts are zeroed immediately. Overridden rows move to the manual list above.",matchedKeepAuto:"Keep auto match",overrideNone:"No manual match overrides.",mountedSuffix:"Mounted (billed)",flatInput:"Input",flatCached:"Cached",flatOutput:"Output",deepseekMountedHeader:"DeepSeek price table (mounted)",codingPlanKimi:"Kimi / Moonshot",codingPlanOpenrouter:"OpenRouter",codingPlanSiliconflow:"SiliconFlow",codingPlanCommandcode:"CommandCode",codingPlanScnet:"SCNet Token Plan",codingPlanVolcengine:"Volcano Ark Coding Plan",codingPlanQwen:"Qwen Token Plan (qianwenai.com)",qwenPlanCreditsLabel:"Monthly credits quota (personal Lite 50K / Standard 500K; see your plan page)",qwenPlanStartLabel:"Plan start date (optional, YYYY-MM-DD; empty = calendar month)",qwenRatesLabel:"Credits rate overrides (optional; credits deducted per 1M tokens; empty = built-in table)",qwenRatesModelPlaceholder:"Model name, e.g. qwen3.8-max-preview",qwenRatePlaceholder:"rate",qwenRate_input:"Input",qwenRate_cachedInput:"Cached input",qwenRate_output:"Output",qwenRateDraftNote:"Enter all three positive rates to save automatically; clear all to restore the built-in table.",qwenRatesAdd:"Add",qwenLocalNote:"Local estimate; the console is authoritative. Only qwen, qwen-tokenplan, qianwen-tokenplan, qwen-token-plan and qianwen-token-plan subscription providers count (llm- prefix supported). Explicit API classifications and the qianwen pay-as-you-go provider are excluded. Add rates above for models outside the built-in table.",scnetPlanCreditsLabel:"Monthly credits quota for local estimates (Basic 60,000 / Standard 240,000 / Pro 600,000)",scnetPlanStartLabel:"Plan start date (optional, YYYY-MM-DD; empty = calendar month)",scnetLocalNote:"Supports external console snapshots with their original capture time (up to 24 hours old). Without a valid snapshot, credits are estimated from the local ledger using the official deduction table. Local estimates exclude other tools and unlisted models; the console remains the reference for actual usage.",volcengineAccessKeyIdLabel:"Volcengine AccessKey ID",volcengineSecretAccessKeyLabel:"Volcengine SecretAccessKey",volcengineNote:"Volcano Ark control-plane requires AK/SK HMAC signature (not ARK_API_KEY Bearer): create an IAM sub-user with ArkReadOnlyAccess + BillingCenterReadOnlyAccess and enter AccessKeyID and SecretAccessKey; or export VOLC_ACCESSKEY / VOLC_SECRETKEY (official SDK env) for auto-discovery; credentials are only sent to open.volcengineapi.com.",volcengineAccessKeyPlaceholder:"AK...",volcengineSecretPlaceholder:"SK...",countdownHoursOnly:"{h}h",countdownHourMinute:"{h}h {m}m",countdownMinute:"{m}m",nextOffPeakIn:"Off-peak in {time}",nextPeakIn:"Peak in {time}",peakSummary:"Peak hours (UTC): {windows}; effective: {time}. {status}",noPeakWindows:"No peak windows configured. {status}",unknown:"unknown",cardToday:"Today",cardMonth:"This month",cardTotal:"All time",cardTotalSub:"Since the ledger was created · Calls {calls}",cardsFootnote:"Amounts reflect the latest ledger snapshot (2s debounce; clean shutdown flushes first), so minute-level lag vs the live official bill is expected. Token columns sum input+output+cache+reasoning; reasoning tokens are unbilled (the official bill folds them into output) — reconcile by amount.",timezoneHint:"Timezone notice: today/this-month key by the host's timezone {host}, which differs from this browser ({browser}) — calls after your local midnight land on the previous day (not lost). Run dsh in your local timezone to align.",todaySessions:"Today's sessions",historyExpandHint:"Click a date row to expand its session details",historySessionsLoading:"Loading session details…",historyNoSessions:"No session details for this day (early data or session logs cleaned)",historySessionsError:"Failed to load session details",sessionRankTitle:"By session (all history)",sessionRankHint:"All historical sessions, not grouped by date; sort and row count are switchable",sessionRankEmpty:"No session data yet",sessionRankLoading:"Loading session ranking…",sessionRankError:"Failed to load session ranking",sessionRankLimit:"Rows",showSessionIdLabel:"Show session IDs in session lists",cardsTogglePlanTotal:"Include plan totals",cardsTogglePlanTotalHint:"When on, every amount shows total equivalent cost including plan subscriptions; off (default) counts real-money API channels only",hideOfficialBalanceLabel:"Hide official account balance (balance UI removed from sidebar and settings)",hideTodayCostLabel:"Hide today's cost (today's amount removed from sidebar, budget details and overview card)",sessionRankSort:"Sort",sessionSortCostDesc:"Cost high→low",sessionSortCostAsc:"Cost low→high",sessionSortTimeDesc:"Time new→old",sessionSortTimeAsc:"Time old→new",sessionSortRecent:"Recent order",history:"History",usageTitle:"Token usage stats",usageTotal:"All-time {tokens} tokens · input {input} · cache {cache} · output {output} · {calls} calls",usageDay:"{date}: {tokens} tokens (input {input} · cache {cache} · output {output}) · {calls} calls · {cost}",usageEmpty:"No history yet — daily usage will accumulate here",usageSectionLabel:"Usage",usagePositionLabel:"Token usage stats position",usagePositionCost:"Cost settings",usagePositionGeneral:"General settings",usagePositionSection:"Own section (Usage)",displaySettings:"Display settings",tabOverview:"Overview",tabQuotas:"Quotas",tabUsage:"Usage",tabPricing:"Pricing",tabDisplay:"Display",historyDataTitle:"History data",positionLabel:"Session cost display position",positionDock:"Below the composer",positionHeader:"Session title bar",off:"Off",quotaStripGroup:"Quota strip above the input",quotaStripEnable:"Enable the quota strip (one row above the input box)",quotaStripShowBudget:"Strip includes budget used %",quotaStripShowGo:"Strip includes the Go quota",quotaStripShowPlans:"Strip includes coding plan quotas",quotaStripNote:"Hover a chip for reset times and the last refresh; the strip hides itself when there is no quota data.",quotaStripGuideTitle:"New: quota strip above the input",quotaStripGuideBody:"Show budget and subscription quotas (OpenCode Go / coding plans) as one compact strip above the input box. Enable it now? You can change this anytime in Settings → Display.",quotaStripGuideOn:"Enable the strip",quotaStripGuideOff:"Not now",clickToRefresh:"Click to refresh now",balanceClickGuideTitle:"New: click the balance box to refresh",balanceClickGuideBody:"Click the official balance / custom balance / coding-plan box in the sidebar to fetch the latest data immediately — no need to wait for the auto-refresh interval or open Settings. While refreshing the box pulses; on failure the previous value is kept and the reason appears in the hover tooltip.",balanceClickGuideOk:"Got it",sidebarLabel:"Today cost display",sidebarOn:"Sidebar footer",currencyLabel:"Currency",currencyCny:"Chinese Yuan (CNY)",currencyUsd:"US Dollar (USD)",currencyEur:"Euro (EUR)",symbolLabel:"Currency symbol",rateLabel:"Exchange rate (1 USD = ? target currency)",decimalsLabel:"Decimal places",balanceDisplayLabel:"Balance display position",balanceSidebar:"Main sidebar",balanceSettings:"Settings page",balanceBoth:"Both",refreshIntervalLabel:"Balance refresh interval (minutes)",peakEnabledLabel:"Use DeepSeek peak-hour prices",peakNoticeLabel:"Prominent notice during peak hours (sidebar budget box, today's cost; previewed in the Settings peak panel)",badgeNote:"The session badge is billed exactly at each call's actual time (peak/off-peak tiers; calls before the 2026-08-16 16:00 UTC boundary are billed at the base prices of that era), consistent with the ledger's today/month/all-time figures. Input/cache/output tokens are counted separately; cache reads and writes are billed at the cache-hit price.",priceTableTitle:"Price table (USD / 1M tokens)",pricingCurrencyLabel:"Official price currency",pricingCurrencyUsd:"USD (English official page)",pricingCurrencyCny:"CNY (Chinese official page)",pricingCurrencyNote:'Which language of the official pricing page "Sync" fetches. After re-syncing, history is re-costed on the new table (sessions without full log coverage keep their basis); the recompute runs in the background.',priceTableNote:"Prices follow the call timestamp: new Flash rates start at 04:00 UTC Sep 10, 2026; V4 Pro switches to Flash rates at 04:00 UTC Sep 14. Earlier rates remain available for historical calls. Weekday peak hours are 01–04 and 06–10 UTC, at twice off-peak rates; weekends are off-peak. Cache writes use the cache-hit rate. Auto-saved.",datedPriceNote:"Current rates are shown here. Editing cancels any future scheduled change for this entry; earlier historical rates are retained.",defaultModelId:"default (fallback for unmatched models)",newModelPlaceholder:"New model ID (e.g. deepseek-v4-pro)",addModel:"Add model",dataSync:"Data & sync",saving:"Saving…",autoSaveFailed:"Auto-save failed: {message}",autoSavedAt:"Auto-saved {time}",autoSaveHint:"Settings are auto-saved",confirmFetch:"Overwrite the price table with prices from the official docs?",apply:"Apply",cancel:"Cancel",syncFromDocs:"Sync prices from official docs",syncScopeNote:'Sync scope: "Sync prices from official docs" only updates DeepSeek official prices (incl. peak/off-peak tiers). Third-party catalog prices (z-ai / Kimi / Qwen / Volcano etc.) change only per plugin release; to adjust, mount them in the extended catalog and edit, or match by model name.',confirmReset:"Clear all history?",importLegacy:"Import pre-install history",confirmImportLegacy:"Confirm import? Replays all session logs and only fills dates/sessions missing from the ledger; existing records are untouched.",legacyImportFailed:"Failed to import pre-install history: {message}",legacyImportNote:"Pre-install history is imported automatically once on first launch; this button re-runs it manually (e.g. after copying in old logs). Costs are estimated with the current price catalog; cleaned logs cannot be replayed, and for a session spanning the install moment its pre-install usage is not counted.",confirmClear:"Confirm clear",clearAllHistory:"Clear all history",lastSync:"Last sync: {time}",neverSynced:"Never (bundled prices)",source:"; Source: {source}",sourceOfficial:"Official docs",sourceBundled:"Bundled",languageLabel:"Language",localeAuto:"Follow browser (auto)",localeZh:"Simplified Chinese",localeEn:"English",sectionLabel:"Cost",rpcFailed:"{method} call failed",rpcSyncFailed:"Sync call failed",rpcBalanceFailed:"Balance refresh call failed"}};function ra(){return(typeof navigator<"u"&&typeof navigator.language=="string"?navigator.language:"").toLowerCase().startsWith("zh")?"zh":"en"}function Q(t){return t==="zh"||t==="en"?t:ra()}function V(t){const s=t==="zh"?Se.zh:Se.en;return(o,n)=>{let a=s[o]??Se.en[o]??o;if(n)for(const r of Object.keys(n))a=a.split("{"+r+"}").join(String(n[r]));return a}}const He={day:"periodDay",month:"periodMonth",all:"periodAll",custom:"periodCustom"};function Y(t,s){throw new Error("dsh-cost-meter: 服务端数据非法 ("+t+": "+s+")")}function W(t,s){return(typeof t!="number"||!Number.isFinite(t))&&Y(s,"number"),t}function Xe(t,s){return typeof t!="string"&&Y(s,"string"),t}const Ue=(t,s,o)=>typeof t=="string"&&s.includes(t)?t:o;function ia(t,s){return typeof t!="boolean"&&Y(s,"boolean"),t}function Ie(t,s){const o={};if(t!==null&&typeof t=="object"&&!Array.isArray(t))for(const n of Object.keys(t)){const a=t[n];if(a===null||typeof a!="object"||Array.isArray(a))continue;const r=l=>typeof l=="number"&&Number.isFinite(l)&&l>=0?l:0;o[n]={input:r(a.input),output:r(a.output),cacheRead:r(a.cacheRead),cacheWrite:r(a.cacheWrite),reasoning:r(a.reasoning),cost:r(a.cost),apiCost:a.apiCost===void 0?r(a.cost):r(a.apiCost)}}return o}function ca(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{id:Xe(t.id,s+".id"),provider:typeof t.provider=="string"?t.provider:"",model:typeof t.model=="string"?t.model:"",input:W(t.input,s+".input"),output:W(t.output,s+".output"),cacheRead:W(t.cacheRead,s+".cacheRead"),cacheWrite:W(t.cacheWrite,s+".cacheWrite"),reasoning:t.reasoning===void 0?0:W(t.reasoning,s+".reasoning"),calls:W(t.calls,s+".calls"),cost:W(t.cost,s+".cost"),apiCost:t.apiCost===void 0?void 0:W(t.apiCost,s+".apiCost"),byModel:Ie(t.byModel,s+".byModel"),byProviderModel:Ie(t.byProviderModel,s+".byProviderModel")}}function Qe(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o={date:Xe(t.date,s+".date"),input:W(t.input,s+".input"),output:W(t.output,s+".output"),cacheRead:W(t.cacheRead,s+".cacheRead"),cacheWrite:W(t.cacheWrite,s+".cacheWrite"),reasoning:t.reasoning===void 0?0:W(t.reasoning,s+".reasoning"),calls:W(t.calls,s+".calls"),cost:W(t.cost,s+".cost"),apiCost:t.apiCost===void 0?void 0:W(t.apiCost,s+".apiCost"),byModel:Ie(t.byModel,s+".byModel"),byProviderModel:Ie(t.byProviderModel,s+".byProviderModel"),sessions:[]};return t.sessions!==void 0&&(Array.isArray(t.sessions)||Y(s+".sessions","array"),o.sessions=t.sessions.map((n,a)=>ca(n,s+".sessions["+a+"]"))),o}function et(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o={cacheHit:W(t.cacheHit,s+".cacheHit"),cacheMiss:W(t.cacheMiss,s+".cacheMiss"),output:W(t.output,s+".output")};t.offPeak!==void 0&&(o.offPeak={cacheHit:W(t.offPeak.cacheHit,s+".offPeak.cacheHit"),cacheMiss:W(t.offPeak.cacheMiss,s+".offPeak.cacheMiss"),output:W(t.offPeak.output,s+".offPeak.output")}),t.peak!==void 0&&(o.peak={cacheHit:W(t.peak.cacheHit,s+".peak.cacheHit"),cacheMiss:W(t.peak.cacheMiss,s+".peak.cacheMiss"),output:W(t.peak.output,s+".peak.output")}),t.legacyBase!==void 0&&(o.legacyBase={cacheHit:W(t.legacyBase.cacheHit,s+".legacyBase.cacheHit"),cacheMiss:W(t.legacyBase.cacheMiss,s+".legacyBase.cacheMiss"),output:W(t.legacyBase.output,s+".legacyBase.output")}),t.legacy!==void 0&&(o.legacy=ia(t.legacy,s+".legacy")),t.rateHistory!==void 0&&((!Array.isArray(t.rateHistory)||t.rateHistory.length>16)&&Y(s+".rateHistory","price history"),o.rateHistory=t.rateHistory.map((n,a)=>((!n||typeof n.before!="string"||!Number.isFinite(Date.parse(n.before)))&&Y(s+".rateHistory","dated price"),{...et({...n,rateHistory:void 0},s+".rateHistory."+a),before:n.before})));for(const n of["billingMode","sourceUrl","checkedAt","notes"])typeof t[n]=="string"&&(o[n]=t[n]);return o}function da(t,s){const o=a=>a==null?void 0:{...a.adapter==="aliyun"?{adapter:"aliyun"}:{},enabled:a.enabled===!0,label:typeof a.label=="string"?a.label:"",labelEn:typeof a.labelEn=="string"?a.labelEn:"",display:Ue(a.display,["sidebar","settings","off"],"both"),unit:a.unit==="CNY"||a.unit==="EUR"?a.unit:"USD",refreshMinutes:typeof a.refreshMinutes=="number"&&Number.isFinite(a.refreshMinutes)?a.refreshMinutes:15,request:a.request&&typeof a.request=="object"?a.request:{url:""},extract:a.extract&&typeof a.extract=="object"?a.extract:{},allowedHosts:Array.isArray(a?.allowedHosts)?a.allowedHosts.filter(r=>typeof r=="string"):[]};(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const n={};if(t.prices!==null&&typeof t.prices=="object"&&t.prices.models!==null&&typeof t.prices.models=="object")for(const a of Object.keys(t.prices.models))n[a]=et(t.prices.models[a],s+".prices.models."+a);return{locale:t.locale==="zh"||t.locale==="en"||t.locale==="auto"?t.locale:"auto",position:t.position==="header"||t.position==="off"?t.position:"dock",sidebar:t.sidebar!==!1,showSessionId:t.showSessionId===!0,hideOfficialBalance:t.hideOfficialBalance===!0,hideTodayCost:t.hideTodayCost===!0,showTotalWithPlan:t.showTotalWithPlan===!0,sidebarSimple:t.sidebarSimple===!0,sidebarSimplePromptSeen:t.sidebarSimplePromptSeen===!0,sidebarStyle:t.sidebarStyle==="compact"?"compact":"standard",priceMatchDismissed:Array.isArray(t.priceMatchDismissed)?t.priceMatchDismissed.filter(a=>typeof a=="string"):[],pricingCurrency:t.pricingCurrency==="CNY"?"CNY":"USD",currency:typeof t.currency=="string"?t.currency:"CNY",symbol:typeof t.symbol=="string"?t.symbol:"¥",decimals:W(t.decimals,s+".decimals"),exchangeRate:W(t.exchangeRate,s+".exchangeRate"),peakEnabled:t.peakEnabled===!0,peakEffectiveAt:typeof t.peakEffectiveAt=="string"?t.peakEffectiveAt:"",peakWindows:Array.isArray(t.peakWindows)?t.peakWindows.map((a,r)=>({start:W(a.start,s+".peakWindows["+r+"].start"),end:W(a.end,s+".peakWindows["+r+"].end")})):[],peakNotice:t.peakNotice!==!1,peakAlertEnabled:t.peakAlertEnabled!==!1,peakAlertAhead:Number.isFinite(t.peakAlertAhead)&&t.peakAlertAhead>=1&&t.peakAlertAhead<=30?t.peakAlertAhead:2,peakAlertTarget:t.peakAlertTarget==="peak"||t.peakAlertTarget==="offpeak"?t.peakAlertTarget:"both",peakAlertPosition:t.peakAlertPosition==="center"?"center":"corner",peakAlertWebNotify:t.peakAlertWebNotify===!0,peakStyle:t.peakStyle==="classic"?"classic":"compact",priceMatch:t.priceMatch==="exact"?"exact":"auto",priceOverrides:(()=>{const a={};if(t.priceOverrides!==null&&typeof t.priceOverrides=="object"&&!Array.isArray(t.priceOverrides))for(const[r,l]of Object.entries(t.priceOverrides))typeof r=="string"&&typeof l=="string"&&(a[r]=l);return a})(),priceTableDisplay:(()=>{const a={};if(t.priceTableDisplay!==null&&typeof t.priceTableDisplay=="object"&&!Array.isArray(t.priceTableDisplay))for(const[r,l]of Object.entries(t.priceTableDisplay))typeof r=="string"&&(a[r]=l===!0);return a})(),codingPlans:(()=>{const a={};if(t.codingPlans!==null&&typeof t.codingPlans=="object"&&!Array.isArray(t.codingPlans))for(const r of Object.keys(t.codingPlans)){const l=t.codingPlans[r];l===null||typeof l!="object"||Array.isArray(l)||(a[r]={enabled:l.enabled===!0,display:l.display==="sidebar"||l.display==="both"||l.display==="off"?l.display:"settings",refreshMinutes:typeof l.refreshMinutes=="number"&&Number.isFinite(l.refreshMinutes)?l.refreshMinutes:15,apiKey:typeof l.apiKey=="string"?l.apiKey:"",...typeof l.planCredits=="number"&&Number.isFinite(l.planCredits)&&l.planCredits>0?{planCredits:l.planCredits}:{},...typeof l.planStart=="string"?{planStart:l.planStart}:{},...l.rates!==null&&typeof l.rates=="object"&&!Array.isArray(l.rates)?{rates:l.rates}:{},...typeof l.accessKeyId=="string"?{accessKeyId:l.accessKeyId}:{},...typeof l.secretAccessKey=="string"?{secretAccessKey:l.secretAccessKey}:{}})}return a})(),prices:{models:n,default:et(t.prices?.default??{cacheHit:0,cacheMiss:0,output:0},s+".prices.default"),providers:t.prices?.providers&&typeof t.prices.providers=="object"?t.prices.providers:{},currency:typeof t.prices?.currency=="string"&&t.prices.currency.length>0?t.prices.currency:void 0},historyDays:W(t.historyDays,s+".historyDays"),fetchedAt:t.fetchedAt===null||t.fetchedAt===void 0?null:Xe(t.fetchedAt,s+".fetchedAt"),priceSource:typeof t.priceSource=="string"?t.priceSource:"bundled",budget:{enabled:t.budget?.enabled===!0,amount:typeof t.budget?.amount=="number"&&Number.isFinite(t.budget.amount)?t.budget.amount:100,period:t.budget?.period==="day"||t.budget?.period==="all"||t.budget?.period==="custom"?t.budget.period:"month",customStart:typeof t.budget?.customStart=="string"?t.budget.customStart:null,customEnd:typeof t.budget?.customEnd=="string"?t.budget.customEnd:null,detail:t.budget?.detail!==!1},balance:{display:Ue(t.balance?.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof t.balance?.refreshMinutes=="number"&&Number.isFinite(t.balance.refreshMinutes)?t.balance.refreshMinutes:5,showProgressBar:t.balance?.showProgressBar===!0,budgetCap:typeof t.balance?.budgetCap=="number"&&Number.isFinite(t.balance.budgetCap)&&t.balance.budgetCap>0?t.balance.budgetCap:null,clickHintSeen:t.balance?.clickHintSeen===!0},goQuota:{enabled:t.goQuota?.enabled!==!1,display:Ue(t.goQuota?.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof t.goQuota?.refreshMinutes=="number"&&Number.isFinite(t.goQuota.refreshMinutes)?t.goQuota.refreshMinutes:15,apiKey:typeof t.goQuota?.apiKey=="string"?t.goQuota.apiKey:"",main:t.goQuota?.main==="weekly"||t.goQuota?.main==="monthly"?t.goQuota.main:"rolling",detail:t.goQuota?.detail!==!1},customBalance:o(t.customBalance),gatewayQuotas:(()=>{const a=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:t.gatewayQuotas?.sources;return{sources:Array.isArray(a)?a.slice(0,4).filter(l=>l!==null&&typeof l=="object"&&!Array.isArray(l)).map(l=>({id:typeof l.id=="string"?l.id.slice(0,48):"",type:"cliproxyapi",label:typeof l.label=="string"?l.label.slice(0,80):"",baseURL:typeof l.baseURL=="string"?l.baseURL:"",enabled:l.enabled!==!1,display:Ue(l.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof l.refreshMinutes=="number"&&Number.isFinite(l.refreshMinutes)?Math.min(1440,Math.max(1,Math.floor(l.refreshMinutes))):15,includeProviders:Array.isArray(l.includeProviders)?[...new Set(l.includeProviders.filter(i=>typeof i=="string").map(i=>i.toLowerCase()).filter(i=>at.includes(i)))]:at,allowedHosts:Array.isArray(l.allowedHosts)?l.allowedHosts.filter(i=>typeof i=="string").slice(0,16):[],allowInsecureHttp:l.allowInsecureHttp===!0,keyVar:typeof l.keyVar=="string"?l.keyVar:""})):[]}})(),customBalances:(()=>{if(Array.isArray(t.customBalances))return t.customBalances.filter(r=>r!==null&&typeof r=="object").slice(0,8).map(o).filter(Boolean);const a=o(t.customBalance);return a?[a]:[]})(),corner:{enabled:t.corner?.enabled===!0,goRolling:t.corner?.goRolling!==!1,goWeekly:t.corner?.goWeekly!==!1,goMonthly:t.corner?.goMonthly!==!1,budget:t.corner?.budget!==!1},quotaStrip:{enabled:t.quotaStrip?.enabled===!0,budget:t.quotaStrip?.budget!==!1,go:t.quotaStrip?.go!==!1,plans:t.quotaStrip?.plans!==!1,promptSeen:t.quotaStrip?.promptSeen===!0},usage:{position:t.usage?.position==="general"||t.usage?.position==="section"?t.usage.position:"cost"},barDirections:(()=>{const a=t.barDirections!==null&&typeof t.barDirections=="object"&&!Array.isArray(t.barDirections)?t.barDirections:{},r=(l,i)=>a[l]==="remaining"||a[l]==="used"?a[l]:i;return{balance:r("balance","remaining"),budget:r("budget","used"),go:r("go","used"),plan:r("plan","used")}})(),planBilling:{providers:(()=>{const a={};if(t.planBilling?.providers!==null&&typeof t.planBilling?.providers=="object"&&!Array.isArray(t.planBilling.providers))for(const[r,l]of Object.entries(t.planBilling.providers))typeof r=="string"&&(l==="auto"||l==="plan"||l==="api")&&(a[r]=l);return a})(),models:(()=>{const a={};if(t.planBilling?.models!==null&&typeof t.planBilling?.models=="object"&&!Array.isArray(t.planBilling.models))for(const[r,l]of Object.entries(t.planBilling.models))typeof r=="string"&&r.length>0&&(l==="plan"||l==="api")&&(a[r]=l);return a})()}}}const he=t=>typeof t=="number"&&Number.isFinite(t)?t:null,te=t=>he(t)??0,ua={status:"off",message:"",fetchedAt:0,currency:"",totalBalance:0,grantedBalance:0,toppedUpBalance:0},ma={status:"off",message:"",fetchedAt:0,rolling:null,weekly:null,monthly:null},Ct=(t=null)=>({status:"off",message:"",fetchedAt:0,label:"",unit:"USD",remaining:0,maxBudget:null,spend:null,index:t});function pa(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{status:t.status==="ok"||t.status==="error"?t.status:"off",message:typeof t.message=="string"?t.message:"",fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:0,currency:typeof t.currency=="string"?t.currency:"",totalBalance:te(t.totalBalance),grantedBalance:te(t.grantedBalance),toppedUpBalance:te(t.toppedUpBalance)}}function tt(t,s){return t==null?null:((typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{percent:te(t.percent),resetsAt:typeof t.resetsAt=="string"?t.resetsAt:""})}function fa(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{status:t.status==="ok"||t.status==="error"?t.status:"off",message:typeof t.message=="string"?t.message:"",fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:0,rolling:t.rolling===void 0||t.rolling===null?null:tt(t.rolling,s+".rolling"),weekly:t.weekly===void 0||t.weekly===null?null:tt(t.weekly,s+".weekly"),monthly:t.monthly===void 0||t.monthly===null?null:tt(t.monthly,s+".monthly")}}function At(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{status:t.status==="ok"||t.status==="error"?t.status:"off",message:typeof t.message=="string"?t.message:"",fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:0,label:typeof t.label=="string"?t.label:"",unit:typeof t.unit=="string"?t.unit:"USD",remaining:te(t.remaining),maxBudget:he(t.maxBudget),spend:he(t.spend),index:typeof t.index=="number"&&Number.isFinite(t.index)&&t.index>=0?Math.floor(t.index):null}}const ga=new Set(["ok","partial","unknown","error","stale","unsupported","capability_missing"]),ba=new Set(["off","loading","ok","partial","stale","error"]),at=["antigravity","claude","codex","kimi","xai","workbuddy"],Pt={antigravity:"Antigravity",claude:"Claude",codex:"Codex",kimi:"Kimi",xai:"xAI",workbuddy:"WorkBuddy"};function ha(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o=(l,i="")=>typeof l=="string"?l:i,n=l=>he(l),a=l=>l!==null&&typeof l=="object"&&!Array.isArray(l)?{id:o(l.id),label:o(l.label),...n(l.percent)===null?{}:{percent:n(l.percent)},resetsAt:o(l.resetsAt),periodHours:n(l.periodHours),scope:o(l.scope)}:null,r=l=>l!==null&&typeof l=="object"&&!Array.isArray(l)?{unit:o(l.unit,"credits"),used:n(l.used),remaining:n(l.remaining),limit:n(l.limit),fetchedAt:o(l.fetchedAt),packages:Array.isArray(l.packages)?l.packages.filter(i=>i!==null&&typeof i=="object"&&!Array.isArray(i)).map(i=>({id:o(i.id),label:o(i.label),used:n(i.used),remaining:n(i.remaining),limit:n(i.limit),startsAt:o(i.startsAt),resetsAt:o(i.resetsAt)})):[]}:void 0;return{id:o(t.id),type:"cliproxyapi",label:o(t.label),status:ba.has(t.status)?t.status:"error",message:o(t.message),fetchedAt:n(t.fetchedAt)??0,attemptedAt:n(t.attemptedAt)??0,serverVersion:o(t.serverVersion),keyConfigured:t.keyConfigured===!0,keySource:o(t.keySource,"none"),accounts:Array.isArray(t.accounts)?t.accounts.filter(l=>l!==null&&typeof l=="object"&&!Array.isArray(l)).slice(0,16).map(l=>({id:o(l.id),provider:o(l.provider,"unknown"),label:o(l.label,"unknown"),status:ga.has(l.status)?l.status:"unknown",message:o(l.message),plan:o(l.plan),windows:Array.isArray(l.windows)?l.windows.map(a).filter(Boolean):[],credits:r(l.credits)})):[],unsupportedProviders:Array.isArray(t.unsupportedProviders)?t.unsupportedProviders.filter(l=>typeof l=="string").slice(0,32):[]}}function ya(t){if(t===null||typeof t!="object"||Array.isArray(t))return null;const s={};if(t.providers!==null&&typeof t.providers=="object"&&!Array.isArray(t.providers))for(const[o,n]of Object.entries(t.providers)){if(n===null||typeof n!="object"||Array.isArray(n))continue;const a={},r={};if(n.windows!==null&&typeof n.windows=="object"&&!Array.isArray(n.windows))for(const[l,i]of Object.entries(n.windows))i===null||typeof i!="object"||Array.isArray(i)||(a[l]={percent:te(i.percent),resetsAt:typeof i.resetsAt=="string"?i.resetsAt:"",localTokens:te(i.localTokens),localCost:te(i.localCost),method:i.method==="sample"||i.method==="live"?i.method:"none",sampleAt:he(i.sampleAt),confidence:i.confidence==="high"||i.confidence==="low"?i.confidence:null,per1Tokens:he(i.per1Tokens),per1Cost:he(i.per1Cost),fullTokens:he(i.fullTokens),fullCost:he(i.fullCost),sampleCount:te(i.sampleCount)});if(n.intervals!==null&&typeof n.intervals=="object"&&!Array.isArray(n.intervals))for(const[l,i]of Object.entries(n.intervals))Array.isArray(i)&&(r[l]=i.filter(d=>d!==null&&typeof d=="object"&&!Array.isArray(d)).map(d=>({t0:te(d.t0),t1:te(d.t1),tokens:te(d.tokens),cost:te(d.cost),pct:te(d.pct),per1Tokens:te(d.per1Tokens),per1Cost:te(d.per1Cost)})));s[o]={windows:a,intervals:r}}return{generatedAt:te(t.generatedAt),providers:s}}function Mt(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{today:Qe(t.today,s+".today"),month:Qe(t.month,s+".month"),total:Qe(t.total,s+".total"),budgetUsed:typeof t.budgetUsed=="number"&&Number.isFinite(t.budgetUsed)?t.budgetUsed:void 0,balance:t.balance==null?ua:pa(t.balance,s+".balance"),goQuota:t.goQuota==null?ma:fa(t.goQuota,s+".goQuota"),customBalance:t.customBalance==null?Ct():At(t.customBalance,s+".customBalance"),customBalances:Array.isArray(t.customBalances)?t.customBalances.filter(o=>o!==null&&typeof o=="object").map((o,n)=>At(o,s+".customBalances["+n+"]")):[],gatewayQuotas:Array.isArray(t.gatewayQuotas)?t.gatewayQuotas.filter(o=>o!==null&&typeof o=="object"&&!Array.isArray(o)).map((o,n)=>ha(o,s+".gatewayQuotas["+n+"]")):[],customVarStatus:t.customVarStatus!==null&&typeof t.customVarStatus=="object"&&!Array.isArray(t.customVarStatus)?Object.fromEntries(Object.entries(t.customVarStatus).filter(([,o])=>o!==null&&typeof o=="object").map(([o,n])=>[o,{configured:n.configured===!0,source:typeof n.source=="string"?n.source:""}])):{},codingPlans:t.codingPlans!==null&&typeof t.codingPlans=="object"&&!Array.isArray(t.codingPlans)?t.codingPlans:{},planStats:ya(t.planStats),history:Array.isArray(t.history)?t.history.map((o,n)=>Qe(o,s+".history["+n+"]")):[],config:da(t.config,s+".config"),reconcile:t.reconcile===null||t.reconcile===void 0?void 0:{ok:t.reconcile.ok===!0,message:typeof t.reconcile.message=="string"?t.reconcile.message:""},priceCatalog:t.priceCatalog!==null&&typeof t.priceCatalog=="object"&&!Array.isArray(t.priceCatalog)?t.priceCatalog:null,meta:{now:typeof t.meta?.now=="number"?t.meta.now:Date.now(),timezoneOffsetMinutes:typeof t.meta?.timezoneOffsetMinutes=="number"?t.meta.timezoneOffsetMinutes:0,timezone:typeof t.meta?.timezone=="string"?t.meta.timezone:"",dayKey:typeof t.meta?.dayKey=="string"?t.meta.dayKey:"",monthKey:typeof t.meta?.monthKey=="string"?t.meta.monthKey:""}}}function ka(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o={ok:t.ok===!0,message:typeof t.message=="string"?t.message:""};return t.state!==void 0&&t.state!==null&&(o.state=Mt(t.state,s+".state")),o}function ie(t){return{parse:t}}const nt=ie(Mt),wa=ie(t=>((t===null||typeof t!="object"||Array.isArray(t))&&Y("patch","object"),t)),ye=ie(ka),va=ie(t=>(typeof t!="string"&&Y("provider","string"),t)),xa=ie(t=>{if(t!=null)return(typeof t!="number"||!Number.isInteger(t)||t<0||t>7)&&Y("index","0-7 integer"),t}),Na=ie(t=>(typeof t!="string"&&Y("date","string"),t)),Sa=ie(t=>((t===null||typeof t!="object"||Array.isArray(t))&&Y("day","object"),t)),Ca=ie(t=>(Number.isFinite(Number(t))||Y("limit","number"),Number(t))),Tt=ie(t=>(typeof t!="string"&&Y("sort","string"),t)),Aa=ie(t=>((t===null||typeof t!="object"||Array.isArray(t))&&Y("topSessions","object"),t)),Bt=ie(t=>(typeof t!="string"&&Y("target","string"),t)),Pa=ie(t=>(typeof t!="string"&&Y("value","string"),t)),Ma={package:"dsh-cost-meter",descriptors:[{id:"dsh-cost-meter#costMeter/getState",service:"costMeter",namespace:"costMeter",method:"getState",invocation:{kind:"direct"},parameters:[],result:{mode:"strict",typeSymbol:"dsh-cost-meter#CostState",schema:nt}},{id:"dsh-cost-meter#costMeter/updateConfig",service:"costMeter",namespace:"costMeter",method:"updateConfig",invocation:{kind:"direct"},parameters:[{name:"patch",wire:"patch",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#ConfigPatch",schema:wa}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#CostState",schema:nt}},{id:"dsh-cost-meter#costMeter/fetchPrices",service:"costMeter",namespace:"costMeter",method:"fetchPrices",invocation:{kind:"direct"},parameters:[],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/refreshBalance",service:"costMeter",namespace:"costMeter",method:"refreshBalance",invocation:{kind:"direct"},parameters:[],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/refreshGoQuota",service:"costMeter",namespace:"costMeter",method:"refreshGoQuota",invocation:{kind:"direct"},parameters:[],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/refreshCustomBalance",service:"costMeter",namespace:"costMeter",method:"refreshCustomBalance",invocation:{kind:"direct"},parameters:[{name:"index",wire:"index",source:"json",acceptsUndefined:!0,codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CustomBalanceIndex",schema:xa}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/refreshCodingPlan",service:"costMeter",namespace:"costMeter",method:"refreshCodingPlan",invocation:{kind:"direct"},parameters:[{name:"provider",wire:"provider",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CodingPlanProvider",schema:va}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/refreshGatewayQuota",service:"costMeter",namespace:"costMeter",method:"refreshGatewayQuota",invocation:{kind:"direct"},parameters:[{name:"sourceId",wire:"sourceId",source:"json",acceptsUndefined:!0,codec:{mode:"strict",typeSymbol:"dsh-cost-meter#GatewayQuotaSourceId",schema:ie(t=>{if(t!=null)return(typeof t!="string"||t.length>48||!/^[a-z0-9][a-z0-9_-]*$/.test(t))&&Y("sourceId","gateway source id"),t})}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/resetHistory",service:"costMeter",namespace:"costMeter",method:"resetHistory",invocation:{kind:"direct"},parameters:[],result:{mode:"strict",typeSymbol:"dsh-cost-meter#CostState",schema:nt}},{id:"dsh-cost-meter#costMeter/importLegacyHistory",service:"costMeter",namespace:"costMeter",method:"importLegacyHistory",invocation:{kind:"direct"},parameters:[],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/getDaySessions",service:"costMeter",namespace:"costMeter",method:"getDaySessions",invocation:{kind:"direct"},parameters:[{name:"date",wire:"date",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#DayKey",schema:Na}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#DayRecord",schema:Sa}},{id:"dsh-cost-meter#costMeter/getTopSessions",service:"costMeter",namespace:"costMeter",method:"getTopSessions",invocation:{kind:"direct"},parameters:[{name:"limit",wire:"limit",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionLimit",schema:Ca}},{name:"sort",wire:"sort",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionSort",schema:Tt},acceptsUndefined:!0},{name:"dir",wire:"dir",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionSortDir",schema:Tt},acceptsUndefined:!0}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#TopSessions",schema:Aa}},{id:"dsh-cost-meter#costMeter/setCredential",service:"costMeter",namespace:"costMeter",method:"setCredential",invocation:{kind:"direct"},parameters:[{name:"target",wire:"target",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CredentialTarget",schema:Bt}},{name:"value",wire:"value",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CredentialValue",schema:Pa}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}},{id:"dsh-cost-meter#costMeter/clearCredential",service:"costMeter",namespace:"costMeter",method:"clearCredential",invocation:{kind:"direct"},parameters:[{name:"target",wire:"target",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CredentialTarget",schema:Bt}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:ye}}]};function Ta(t,s){const o=s?.models??{};return typeof t=="string"&&t.length>0&&o[t]!==void 0?o[t]:s?.default??{cacheHit:0,cacheMiss:0,output:0}}function Fe(t){if(t===null||typeof t!="object")return;const s=l=>{const i=t[l];return typeof i=="number"&&Number.isFinite(i)&&i>=0?i:void 0},o=s("cacheMiss")??s("input")??0,a={cacheHit:s("cacheHit")??s("cachedInput")??s("cacheRead")??o,cacheMiss:o,output:s("output")??0},r=s("reasoning");return r!==void 0&&(a.reasoning=r),a}function Ba(t){const s=Fe(t);if(s===void 0)return null;for(const o of["offPeak","peak","legacyBase"]){const n=Fe(t[o]);n!==void 0&&(s[o]=n)}return Array.isArray(t.rateHistory)&&(s.rateHistory=t.rateHistory.slice(0,16).map(o=>{const n={...Fe(o),before:o.before};for(const a of["offPeak","peak"]){const r=Fe(o[a]);r!==void 0&&(n[a]=r)}return n})),s}function _e(t,s=Date.now()){if(!t||!Number.isFinite(s)||!Array.isArray(t.rateHistory))return t;let o=null,n=1/0;for(const l of t.rateHistory){const i=Date.parse(l.before);s<i&&i<n&&(o=l,n=i)}if(!o)return t;const{before:a,...r}=o;return{...t,...r}}const Dt=Date.parse("2026-08-22T16:00:00Z");function We(t){if(!Number.isFinite(t)||t<Dt)return null;const s=Math.floor((t+8*36e5)/864e5),o=(s+4)%7;if(o!==6&&o!==0)return null;const n=o===6?s:s-1;return{start:Math.max(n*864e5-8*36e5,Dt),end:(n+2)*864e5-8*36e5}}function Rt(t,s,o){if(!Array.isArray(o)||o.length===0||We(t)!==null||Number.isFinite(s)&&t<s)return!1;const n=new Date(t).getUTCHours();return o.some(a=>{const r=Number(a.start),l=Number(a.end);return!Number.isFinite(r)||!Number.isFinite(l)?!1:r<l?n>=r&&n<l:n>=r||n<l})}const Da=Date.parse("2026-08-16T16:00:00Z");function Lt(t,s,o){const n=_e(t,s)??{cacheHit:0,cacheMiss:0,output:0},a=l=>({cacheHit:l.cacheHit,cacheMiss:l.cacheMiss,output:l.output,reasoning:l.reasoning??0});if(Number.isFinite(s)&&s<Da){const l=n.legacyBase;return a(l===void 0?n:l)}if(o?.enabled!==!0)return a(n);const r=typeof o.effectiveAtMs=="number"&&Number.isFinite(o.effectiveAtMs)?o.effectiveAtMs:void 0;if(Rt(s,r,o.windows)){const l=n.peak;return a(l===void 0?n:l)}if(r!==void 0&&s>=r){const l=n.offPeak;return a(l===void 0?n:l)}return a(n)}function Ot(t,s){const o=Math.max(0,Number(t.input)||0),n=Math.max(0,Number(t.output)||0),a=Math.max(0,Number(t.cacheRead)||0),r=Math.max(0,Number(t.cacheWrite)||0),l=Math.max(0,Number(t.reasoning)||0);return(o*s.cacheMiss+n*s.output+(a+r)*s.cacheHit+l*(s.reasoning??0))/1e6}function Et(t,s,o){const n=Number(t);if(!Number.isFinite(n)||n<0||n===0)return 0;if(s!=="CNY")return n;const a=Number(o);return!Number.isFinite(a)||a<=0?n:n/a}function ae(t,s){const o=t?.barDirections,n=s==="balance"?"remaining":"used";if(o===null||typeof o!="object"||Array.isArray(o))return n;const a=o[s];return a==="remaining"||a==="used"?a:n}function ce(t,s){if(t==null||!Number.isFinite(Number(t)))return{width:0,label:null};const o=Math.max(0,Math.min(100,Number(t))),n=s==="remaining"?Math.round((100-o)*10)/10:Math.round(o*10)/10;return{width:n,label:n}}function de(t,s){const o=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$",n=Number(s?.decimals),a=Math.max(0,Math.min(10,Number.isFinite(n)?Math.floor(n):2));let r=a;t>0&&t<Math.pow(10,-a)&&(r=a+2);const l=t.toFixed(r),i=l.includes(".")?l.replace(/0+$/,"").replace(/\.$/,""):l;return o+i}function $(t,s){const o=Number(s?.exchangeRate),n=t*(Number.isFinite(o)&&o>0?o:1);return de(n,s)}function H(t){const s=Math.max(0,Number(t)||0),o=n=>n>=100?String(Math.round(n)):String(Math.round(n*10)/10);return s<1e3?String(Math.round(s)):s>=999500?o(s/1e6)+"M":s<1e6?o(s/1e3)+"K":o(s/1e6)+"M"}function ue(t){return String(t??"").toLowerCase().replace(/\([^)]*\)/g," ").replace(/([^)]*)/g," ").replace(/[^a-z0-9]+/g,"")}function Ae(t,s){if(typeof t!="string"||t.length===0)return null;const o=Array.isArray(s)?s.filter(N=>typeof N=="string"&&N.length>0):[];if(o.length===0)return null;const n=N=>String(N).toLowerCase().replace(/[-@]\d{4}-?\d{2}-?\d{2}$/,"").replace(/[-@]v\d+(\.\d+)*$/,""),a=o.find(N=>N===t);if(a!==void 0)return a;const r=ue(t);if(r.length===0)return null;const l=o.find(N=>ue(N)===r);if(l!==void 0)return l;let i=null,d=0;for(const N of o){const P=ue(N);if(!(P.length<4||P===r)&&r.includes(P)&&P.length>d){const M=r.indexOf(P);if(/^\d{1,2}$/.test(r.slice(M+P.length)))continue;i=N,d=P.length}}if(i!==null)return i;const b=n(t),u=o.find(N=>n(N)===b);if(u!==void 0)return u;let v=null;for(const N of o){const P=n(N);if(P.length===0||P===b)continue;const M=b.slice(P.length);if(b.startsWith(P)&&/^[-_./:]/.test(M)){if(/^\d{1,2}$/.test(M.replace(/^[-_./:]+/,"")))continue;(v===null||n(v).length<P.length)&&(v=N)}}if(v!==null)return v;const g=N=>n(N).split(/[-_./:]+/).filter(Boolean),h=g(t);if(h.length<2)return null;let p=null,x=0;for(const N of o){const P=g(N);let M=0;for(;M<h.length&&M<P.length&&h[M]===P[M];)M+=1;M<h.length&&M<P.length&&/^\d+$/.test(h[M])&&/^\d+$/.test(P[M])||M>=2&&M===P.length&&M<h.length&&h.slice(M).every(w=>/^\d{1,2}$/.test(w))||M>=2&&M<h.length&&M<P.length&&(/^\d{1,2}$/.test(h[M])&&/^[a-z]/.test(P[M])||/^\d{1,2}$/.test(P[M])&&/^[a-z]/.test(h[M]))||M>=2&&(M>x||M===x&&p!==null&&N.length<p.length)&&(p=N,x=M)}return p}const Ra=new Set(["lmstudio","ollama","jan","gpt4all","koboldcpp","llamacpp","llama-cpp","localai","vllm","sglang","tabbyapi","lmdeploy","oobabooga","text-generation-webui","llama-server"]),La=["lmstudio:","lmstudio/","ollama:","ollama/","jan:","jan/","gpt4all:","gpt4all/","koboldcpp:","koboldcpp/","llamacpp:","llamacpp/","llama-cpp:","llama-cpp/","localai:","localai/","vllm:","vllm/","sglang:","sglang/","tabbyapi:","tabbyapi/","lmdeploy:","oobabooga/","text-generation-webui/","llama-server:","gguf:","local:"];function Oa(t,s){if(typeof t=="string"&&Ra.has(t))return!0;const o=typeof s=="string"?s.toLowerCase():"";return La.some(n=>o.startsWith(n))}function st(t,s,o){const n=o?.prices??{},a=o?.priceMatch==="exact"?"exact":"auto",r=o?.priceOverrides&&typeof o.priceOverrides=="object"?o.priceOverrides:{};let l=String(t??"").trim().toLowerCase();l.startsWith("llm-")&&(l=l.slice(4)),l===""&&(l="deepseek");let i=l,d=s;const b=r[l+":"+s];if(b==="__local__")return{entry:null,priced:!1,billingMode:"flat",matched:!0};if(typeof b=="string"&&b.length>0){const g=b.indexOf(":");if(g>0&&b.slice(g+1).length>0?(i=b.slice(0,g).trim().toLowerCase(),d=b.slice(g+1)):d=b,i==="deepseek"&&d==="__default__")return{entry:n.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}if(Oa(i,d))return{entry:null,priced:!1,billingMode:"flat",matched:!1};if(i==="deepseek"||i.includes("deepseek")){const g=n.models??{},h=g[d]!==void 0?d:a==="auto"?Ae(d,Object.keys(g)):null;if(h!==null)return{entry:g[h],priced:!0,billingMode:"deepseek-peak",matched:!0};if(a==="auto"){let p=null,x=-1,N="flat";for(const[P,M]of Object.entries(n.providers??{})){const w=M?.models??{},S=Ae(d,Object.keys(w));if(S===null||w[S]?.unpriced===!0)continue;const m=(S===d||ue(S)===ue(d)?1e3:0)+ue(S).length;m>x&&(p=w[S],x=m,N=w[S]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(p!==null)return{entry:p,priced:!0,billingMode:N,matched:!0}}return{entry:n.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}const u=n.providers?.[i]?.models??{},v=u[d]!==void 0?d:a==="auto"?Ae(d,Object.keys(u)):null;if(v!==null)return{entry:u[v],priced:u[v]?.unpriced!==!0,billingMode:"flat",matched:!0};if(a==="auto"){const g=n.models??{},h=Ae(d,Object.keys(g));if(h!==null)return{entry:g[h],priced:!0,billingMode:"deepseek-peak",matched:!0};let p=null,x=-1,N="flat";for(const[P,M]of Object.entries(n.providers??{})){if(P===i)continue;const w=M?.models??{},S=Ae(d,Object.keys(w));if(S===null||w[S]?.unpriced===!0)continue;const m=(S===d||ue(S)===ue(d)?1e3:0)+ue(S).length;m>x&&(p=w[S],x=m,N=w[S]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(p!==null)return{entry:p,priced:!0,billingMode:N,matched:!0}}if(l!=="deepseek"&&!l.includes("deepseek")&&typeof b=="string"&&b.length>0&&!b.includes(":")){const g=n.models??{},h=g[b]!==void 0?b:a==="auto"?Ae(b,Object.keys(g)):null;if(h!==null)return{entry:g[h],priced:!0,billingMode:"deepseek-peak",matched:!0}}return{entry:null,priced:!1,billingMode:"flat",matched:!1}}function Ea(t){const s=Number(t?.calls)||0,o=Number(t?.input)||0,n=Number(t?.cacheRead)||0;return s>=3&&o>=1e5&&n===0}function jt(t,s){return!t||!s?0:typeof t.cost=="number"&&Number.isFinite(t.cost)?t.cost:lt(t,s).total}function ja(t){if(t===null||typeof t!="object")return 0;const s=Number(t.cost)||0,o=t.apiCost===void 0||t.apiCost===null?s:Number(t.apiCost);return Number.isFinite(o)&&o>=0?Math.min(o,s):s}function z(t,s){return s!==null&&typeof s=="object"&&s.showTotalWithPlan===!0?Number(t?.cost)||0:ja(t)}const qa={go:["go","zen","opencode","opencode-go"],qwen:["qwen","qwen-tokenplan","qianwen-tokenplan","qwen-token-plan","qianwen-token-plan"],scnet:["scnet","scnet-tokenplan","scnet-token-plan"]},qt=["anthropic","zai","minimax","kimi","openrouter","siliconflow","commandcode","scnet","volcengine","qwen","go"];function Ha(t){const s=String(t??"").trim().toLowerCase().replace(/^llm-/,"");if(s.length===0)return null;for(const[o,n]of Object.entries(qa))if(n.includes(s))return o;return qt.includes(s)?s:null}function Ua(t){const s=new Set,o=t?.codingPlans;if(o!==null&&typeof o=="object")for(const n of qt)n!=="go"&&o[n]?.enabled===!0&&s.add(n);return t?.goQuota?.enabled===!0&&s.add("go"),s}function Ia(t,s,o){const n=String(t??"").trim().toLowerCase();if(n.length>0&&n!=="deepseek"&&!n.includes("deepseek"))return!1;const a=ue(s);if(a.length===0)return!1;const r=o?.prices,l=r?.models??{};for(const i of Object.keys(l))if(ue(i)===a)return!1;for(const i of Object.values(r?.providers??{}))for(const d of Object.keys(i?.models??{}))if(ue(d)===a)return!0;return!1}function ot(t,s,o){let n=Ha(t);if(n===null&&Ia(t,s,o)&&(n="go"),n===null)return"api";const a=o?.planBilling?.models;if(a!==null&&typeof a=="object"){const l=a[t+":"+s];if(l==="plan"||l==="api")return l;const i=a[n+":"+s];if(i==="plan"||i==="api")return i}const r=o?.planBilling?.providers?.[n];return r==="plan"||r==="api"?r:Ua(o).has(n)?"plan":"api"}function lt(t,s){if(!t||!s)return{total:0,api:0};const o={enabled:s.peakEnabled===!0,effectiveAtMs:Date.parse(s.peakEffectiveAt||""),windows:s.peakWindows},n=Date.now(),a=t.byProviderModel??t.byModel??{};let r=0,l=0;for(const v of Object.keys(a)){const g=v.indexOf(":"),h=g>0?v.slice(0,g):"deepseek",p=g>0?v.slice(g+1):v,x=st(h,p,s);if(x.priced){const N=Ot(a[v],Lt(Ba(x.entry),n,{...o,enabled:x.billingMode==="deepseek-peak"&&o.enabled})),P=Et(N,x.billingMode==="deepseek-peak"&&s.prices?.currency==="CNY"?"CNY":"USD",s.exchangeRate);r+=P,ot(h,p,s)==="api"&&(l+=P)}}const i={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0};for(const v of Object.keys(a))i.input+=a[v].input??0,i.output+=a[v].output??0,i.cacheRead+=a[v].cacheRead??0,i.cacheWrite+=a[v].cacheWrite??0,i.reasoning+=a[v].reasoning??0;const d={input:Math.max(0,(t.input??0)-i.input),output:Math.max(0,(t.output??0)-i.output),cacheRead:Math.max(0,(t.cacheRead??0)-i.cacheRead),cacheWrite:Math.max(0,(t.cacheWrite??0)-i.cacheWrite),reasoning:Math.max(0,(t.reasoning??0)-i.reasoning)},b=Ot(d,Lt(Ta("default",s.prices),n,o)),u=Et(b,s.prices?.currency==="CNY"?"CNY":"USD",s.exchangeRate);return r+=u,l+=u,{total:r,api:l}}function Ht(t,s){if(!t||!s)return!1;const o=t.byProviderModel??{};for(const n of Object.keys(o)){const a=n.indexOf(":"),r=a>0?n.slice(0,a):"deepseek",l=a>0?n.slice(a+1):n;if(ot(r,l,s)==="plan")return!0}return!1}function Ut(t){return(t?.input??0)+(t?.cacheRead??0)+(t?.cacheWrite??0)}function rt(t){const s=Math.abs(Math.round(Number(t)||0)),o=Math.floor(s/60),n=s%60;return"UTC"+(Number(t)<0?"-":"+")+o+(n>0?":"+String(n).padStart(2,"0"):"")}function Qa(t){const s=t?.meta,o=Number(s?.timezoneOffsetMinutes);if(!Number.isFinite(o))return null;const n=-new Date().getTimezoneOffset();if(n===o)return null;const a=typeof s?.timezone=="string"&&s.timezone.length>0?s.timezone:"";return{hostLabel:a?a+" ("+rt(o)+")":rt(o),browserLabel:rt(n)}}function Fa(t){let s=t;const o=new Set;return{getSnapshot:()=>s,subscribe:n=>(o.add(n),()=>{o.delete(n)}),set:n=>{if(n!==s){s=n;for(const a of[...o])a()}}}}const{createElement:e,Fragment:q,useState:O,useEffect:oe,useRef:Ce}=De;function Pe({target:t,configured:s,source:o,t:n,api:a,placeholder:r,disabled:l}){const[i,d]=O(""),[b,u]=O(!1),[v,g]=O(null),h=l===!0||b,p=async()=>{const N=i.trim();if(!(N.length===0||h)){u(!0),g(null);try{const P=await a.setCredential(t,N);d(""),g({kind:"ok",text:P?.message??n("credentialSave")})}catch(P){g({kind:"err",text:String(P?.message??P)})}finally{u(!1)}}},x=async()=>{if(!h){u(!0),g(null);try{const N=await a.clearCredential(t);d(""),g({kind:"ok",text:N?.message??n("credentialClear")})}catch(N){g({kind:"err",text:String(N?.message??N)})}finally{u(!1)}}};return e("div",{className:"cm-field"},e("input",{className:"cm-input",type:"password",value:i,placeholder:typeof r=="string"?r:"",disabled:h,autoComplete:"off",onChange:N=>d(N.target.value)}),e("div",{className:"cm-buttons"},e("button",{className:"cm-btn small",onClick:p,disabled:h||i.trim().length===0},n(b?"credentialSaving":"credentialSave")),s===!0?e("button",{className:"cm-btn small",onClick:x,disabled:h},n("credentialClear")):null),e("span",{className:"cm-hint"},s===!0?n("credentialConfiguredOf",{source:typeof o=="string"&&o.length>0?o:"unknown"}):n("credentialNotConfigured")),e("span",{className:"cm-hint"},n("credentialInputHint")),je(v))}function _a({pending:t,t:s}){return!Array.isArray(t)||t.length===0?null:e("div",{className:"cm-msg err"},e("div",null,s("secretMigrationPending")),e("div",null,t.join("、")))}function it({size:t=16,className:s}){return e("svg",{width:t,height:t,className:s,viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},e("path",{d:"M4 4H12A2 2 0 0 1 14 6V11.5A2 2 0 0 1 12 13.5H4A2 2 0 0 1 2 11.5V6A2 2 0 0 1 4 4ZM4 5.3H12A0.7 0.7 0 0 1 12.7 6V11.5A0.7 0.7 0 0 1 12 12.2H4A0.7 0.7 0 0 1 3.3 11.5V6A0.7 0.7 0 0 1 4 5.3Z",fill:"currentColor",fillRule:"evenodd"}),e("path",{d:"M3.3 5.3H12.7V7.1H3.3Z",fill:"currentColor"}),e("path",{d:"M8 2.8A1.3 1.3 0 1 0 8 5.4A1.3 1.3 0 1 0 8 2.8Z",fill:"currentColor"}))}function ct(t,s){const o=Ce(!1),n=Ce(""),a=s!==null&&typeof s=="object"?[s.input,s.cacheRead,s.cacheWrite,s.output,s.reasoning,s.cost].map(r=>String(r??0)).join("|"):"";oe(()=>{if(!o.current){o.current=!0,n.current=a;return}if(a===""||a===n.current)return;n.current=a;const r=setTimeout(()=>{t.api?.reload?.()},800);return()=>clearTimeout(r)},[a])}function Wa(t){const s=t.useProjection?t.useProjection("costUsage"):void 0,o=t.useCost?t.useCost(b=>b):void 0;ct(t,s);const n=o?.state?.config;if(!s||!n||Ut(s)+(s?.output??0)===0)return null;const a=V(Q(n.locale));let r=0,l=jt(s,n);if(n.showTotalWithPlan!==!0&&Ht(s,n)){const b=lt(s,n);r=Math.max(0,b.total-b.api),r>0&&(l=b.api)}const i=Ut(s),d=[a("sessionCostTitle"),a("sessionDetailTokens",{input:H(s?.input??0),cache:H((s?.cacheRead??0)+(s?.cacheWrite??0)),output:H(s?.output??0)}),a("sessionDetailCache",{read:H(s?.cacheRead??0),write:H(s?.cacheWrite??0)}),a("cost",{amount:$(l,n)}),...r>0?[a("sessionDetailPlan",{amount:$(r,n)})]:[]].join("; ");return e(X,{label:d,side:"top",delayMs:500},e("div",{className:"cm-chip"},r>0?a("costChipPlan",{amount:$(l,n)}):a("cost",{amount:$(l,n)})))}function za(t){const s=t.useProjection?t.useProjection("costUsage"):void 0,o=t.useCost?t.useCost(u=>u):void 0;ct(t,s);const n=o?.state?.config;if(!s||!n)return null;const a=s.input??0,r=(s.cacheRead??0)+(s.cacheWrite??0),l=s.output??0;if(a+r+l===0)return null;const i=V(Q(n.locale));let d=0,b=jt(s,n);if(n.showTotalWithPlan!==!0&&Ht(s,n)){const u=lt(s,n);d=Math.max(0,u.total-u.api),d>0&&(b=u.api)}return e("div",{className:"cm-root"},d>0?i("sessionLineSplit",{amount:$(b,n),planAmount:$(d,n),input:H(a),cache:H(r),output:H(l)}):i("sessionLine",{amount:$(b,n),input:H(a),cache:H(r),output:H(l)}))}const Ga={USD:"$",CNY:"¥",EUR:"€"};function ke(t,s,o){const n=typeof o=="string"?o.toUpperCase():"",a=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$";return de(t,{symbol:Ga[n]??a,decimals:Math.max(2,Math.min(10,Math.floor(Number(s?.decimals)||2)))})}function It(t,s){const o=Number(t?.balance?.budgetCap);if(Number.isFinite(o)&&o>0)return o;const n=Number(s?.maxBudget);return Number.isFinite(n)&&n>0?n:null}function Ka(t){const s=t.today,o=s?.byProviderModel;if(o===null||typeof o!="object"||Object.keys(o).length===0)return Number(s?.cost)||0;let n=0;for(const[a,r]of Object.entries(o)){const l=a.indexOf(":");let i=l>=0?a.slice(0,l):a;i.startsWith("llm-")&&(i=i.slice(4)),!(i!=="deepseek"&&i!=="deepseek-official")&&(n+=Number(r?.cost)||0)}return n}function Qt(t,s,o,n,a=null){const r=o==="official"?Ka(t):Number(t.today?.cost)||0;if(o==="custom"){if(zt(s,n,a)==="USD")return r;const d=Number(s?.exchangeRate);return r*(Number.isFinite(d)&&d>0?d:1)}const l=Number(s?.exchangeRate);return r*(Number.isFinite(l)&&l>0?l:1)}function Ft({remaining:t,spend:s,todayUsed:o,cap:n}){if(n===null||n<=0)return{remainingPct:100,todayPct:0,spentPct:0,hasCap:!1,pastSpend:0,today:0};const a=Math.max(0,Number(t)||0),r=Math.max(0,Number(s)||0),l=Math.max(0,Math.min(r,Number(o)||0)),i=Math.max(0,r-l),d=Math.max(0,Math.min(100,a/n*100)),b=Math.max(0,Math.min(100-d,l/n*100)),u=Math.max(0,Math.min(100-d-b,i/n*100));return{remainingPct:d,todayPct:b,spentPct:u,hasCap:!0,pastSpend:i,today:l}}function dt(t,s,o=null,n=null){const a=o??t.customBalance,r=It(s,a),l=Number(a?.remaining)||0,i=Number(a?.spend)||0,d=Qt(t,s,"custom",a,n);return{cap:r,...Ft({remaining:l,spend:i,todayUsed:d,cap:r})}}function Va(t,s){const o=t.balance,n=It(s,null),a=Number(o?.totalBalance)||0,r=Qt(t,s,"official",null),l=n!==null?Math.max(0,n-a):0;return{cap:n,...Ft({remaining:a,spend:l,todayUsed:r,cap:n})}}function ut(t){const{segments:s,direction:o="remaining"}=t,{remainingPct:n,todayPct:a,spentPct:r}=s,l=[];n>0&&l.push(e("div",{className:"cm-bbox-fill",style:{width:n+"%"}})),a>0&&l.push(e("div",{className:"cm-bbox-seg-today",style:{width:a+"%"}})),r>0&&l.push(e("div",{className:"cm-bbox-seg-spent",style:{width:r+"%"}})),l.length===0&&l.push(e("div",{className:"cm-bbox-fill",style:{width:"100%"}}));const i=o==="used"?[...l].reverse():l;return e("div",{className:"cm-bbox-bar segments"+(o==="used"?" rev":"")},...i)}function _t(t,s,o,n,a){const r=[t("balanceBarRemaining",{amount:n})];return o.today>0&&r.push(t("balanceBarToday",{amount:s(o.today)})),o.pastSpend>0&&r.push(t("balanceBarSpent",{amount:s(o.pastSpend)})),a!==null&&a>0&&r.push(t("balanceBudgetCapLabel")+": "+s(a)),r.join(" · ")}function we(t){const[s,o]=O(!1),[n,a]=O(null);return{busy:s,err:n,run:()=>{s||typeof t!="function"||(o(!0),a(null),Promise.resolve().then(t).catch(l=>{a(l?.message??String(l))}).finally(()=>{o(!1)}))}}}const me=(t,s)=>({role:"button",tabIndex:0,"aria-busy":t?"true":"false",onClick:s,onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),s())}});function fe(t,s){const o=[t("clickToRefresh")];return s.busy&&o.push(t("refreshing")),s.err&&o.push("⚠ "+t("balanceRefreshFailed",{message:s.err})),o}const Ya="https://platform.deepseek.com/usage";function Wt(t){return e("a",{className:"cm-bal-link",href:Ya,target:"_blank",rel:"noreferrer noopener",title:t("balanceRechargeLink"),"aria-label":t("balanceRechargeLink"),onClick:s=>s.stopPropagation(),onKeyDown:s=>s.stopPropagation()},"↗")}function Ja(t){const{state:s,wide:o,api:n}=t,a=s.balance,r=V(Q(s.config?.locale)),l=we(n?()=>n.refreshBalance():null);if(!a||a.status==="off")return null;if(a.status==="error")return e(X,{label:[r("balanceQueryFailed",{message:a.message||r("unknownError")}),...fe(r,l)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(l.busy?" busy":""),...me(l.busy,l.run)},o?e(q,null,r("balance")," ",e("span",{className:"cm-num"},r("queryFailed"))):"⚠"));const i=[r("balanceTitle"),r("totalBalance",{amount:ke(a.totalBalance,s.config,a.currency)}),r("grantedToppedUp",{granted:ke(a.grantedBalance,s.config,a.currency),toppedUp:ke(a.toppedUpBalance,s.config,a.currency)}),r("updatedAt",{time:a.fetchedAt>0?new Date(a.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...fe(r,l)].join("; ");return e(X,{label:i,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(l.busy?" busy":""),...me(l.busy,l.run)},o?e(q,null,r("balance")," ",e("span",{className:"cm-num"},ke(a.totalBalance,s.config,a.currency))," ",Wt(r),s.reconcile?.ok===!1?" ⚠":""):e(it,{size:16})))}function $a(t){const{state:s,wide:o,api:n}=t,a=s.config,r=s.balance,l=V(Q(a?.locale)),i=we(n?()=>n.refreshBalance():null);if(!r||r.status!=="ok")return null;const d=Va(s,a),b=ke(r.totalBalance,a,r.currency),u=h=>ke(h,a,r.currency),v=[l("balanceTitle"),_t(l,u,d,b,d.cap),l("grantedToppedUp",{granted:ke(r.grantedBalance,a,r.currency),toppedUp:ke(r.toppedUpBalance,a,r.currency)}),l("updatedAt",{time:r.fetchedAt>0?new Date(r.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...fe(l,i)].join("; "),g=e(q,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},l("balance")),e("span",{className:"cm-bbox-pct cm-num cm-bal-amt"},b),Wt(l)),e(ut,{segments:d,direction:ae(a,"balance")}));return e(X,{label:v,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(o?"":" rail")+(i.busy?" busy":""),...me(i.busy,i.run)},o?g:e("div",{className:"cm-bbox-rail cm-num"},Math.round(d.remainingPct)+"%")))}function ze(t,s){const o=typeof t?.label=="string"?t.label:"",n=typeof t?.labelEn=="string"?t.labelEn:"";return s==="en"?n||o||"Custom balance":o||n||"自定义余额"}function zt(t,s,o){if((o??t?.customBalance)?.adapter==="aliyun"&&["CNY","USD","EUR"].includes(s?.unit))return s.unit;const n=o?.unit??t?.customBalance?.unit;return n==="CNY"||n==="EUR"||n==="USD"?n:s?.unit==="CNY"||s?.unit==="EUR"?s.unit:"USD"}function ve(t,s,o,n){const a=zt(s,o,n),r=Math.max(2,Math.min(6,Math.floor(Number(s?.decimals)||4))),l=a==="CNY"?"¥":a==="EUR"?"€":"$",i=Number(t);if(!Number.isFinite(i))return"—";let d=i.toFixed(r);return d.includes(".")&&(d=d.replace(/0+$/,"").replace(/\.$/,"")),l+d}function mt(t,s,o,n,a=null){const r=ve(t.remaining,s,t,a),l=g=>ve(g,s,t,a);if(n&&s.balance?.showProgressBar===!0){const g=dt(n,s,t,a);return[_t(o,l,g,r,g.cap),o("updatedAt",{time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"})].join(" · ")}const i=t.spend!==null?ve(t.spend,s,t,a):"—",d=t.maxBudget!==null?ve(t.maxBudget,s,t,a):"—",b=Number(s?.balance?.budgetCap),u=Number.isFinite(b)&&b>0?o("balanceBudgetCapLabel")+": "+ve(b,s,t,a):"",v=t.maxBudget!==null&&t.spend!==null?o("customBalanceLine",{remaining:r,spend:i,maxBudget:d,time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"}):o("customBalanceRemaining",{amount:r});return u?v+" · "+u:v}function Za(t,s,o,n,a){const r=ze(a??s.customBalance??{},Q(s?.locale)),l=ve(n.remaining,s,n,a),i=dt(t,s,n,a);return{level:"ok",rail:Math.round(i.remainingPct)+"%",body:e(q,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},r),e("span",{className:"cm-bbox-pct cm-num cm-bal-amt"},l)),e(ut,{segments:i,direction:ae(s,"balance")}))}}function pt(t,s){const o=s?.customBalances??[],n=Array.isArray(t?.customBalances)?t.customBalances:[],a=[];return o.forEach((r,l)=>{if(r?.enabled!==!0||r.display!=="sidebar"&&r.display!=="both")return;const i=n.find(d=>d.index===l)??(n.length===1&&o.length===1?n[0]:null);a.push({index:l,entry:r,snapshot:i})}),a.length===0&&n.length===0&&s?.customBalance?.enabled===!0&&(s.customBalance.display==="sidebar"||s.customBalance.display==="both")&&t?.customBalance?.status&&t.customBalance.status!=="off"&&a.push({index:null,entry:s.customBalance,snapshot:t.customBalance}),a}function Xa(t){const{state:s,wide:o,api:n}=t,a=s.config,r=V(Q(a?.locale)),l=pt(s,a);return l.length===0?null:e(q,null,l.map(({index:i,entry:d,snapshot:b})=>e(en,{key:"cb-"+i,state:s,wide:o,api:n,t:r,index:i,entry:d,snapshot:b})))}function en(t){const{state:s,wide:o,api:n,t:a,index:r,entry:l,snapshot:i}=t,d=s.config;if(i==null||i.status!=="ok")return null;const b=we(n?()=>n.refreshCustomBalance(r):null),u=Za(s,d,a,i,l),v=[mt(i,d,a,s,l),...fe(a,b)].join(" · ");return e(X,{label:v,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(u.level==="ok"?"":" "+u.level)+(o?"":" rail")+(b.busy?" busy":""),...me(b.busy,b.run)},o?u.body:e("div",{className:"cm-bbox-rail cm-num"},u.rail)))}function tn(t){const{state:s,wide:o,api:n}=t,a=s.config,r=V(Q(a?.locale)),l=pt(s,a);return l.length===0?null:e(q,null,l.map(({index:i,entry:d,snapshot:b})=>e(an,{key:"cbr-"+i,state:s,wide:o,api:n,t:r,index:i,entry:d,snapshot:b})))}function an(t){const{state:s,wide:o,api:n,t:a,index:r,entry:l,snapshot:i}=t,d=s.config,b=i??Ct(r);if(b.status==="off")return null;const u=we(n?()=>n.refreshCustomBalance(r):null),v=ze(l??d.customBalance??{},Q(d?.locale));if(b.status==="error")return e(X,{label:[b.message||a("unknownError"),...fe(a,u)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(u.busy?" busy":""),...me(u.busy,u.run)},o?e(q,null,v," ",e("span",{className:"cm-num"},a("queryFailed"))):"⚠"));const g=ve(b.remaining,d,b,l),h=[mt(b,d,a,s,l),...fe(a,u)].join(" · ");return e(X,{label:h,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(u.busy?" busy":""),...me(u.busy,u.run)},o?e(q,null,v," ",e("span",{className:"cm-num"},g)):e(it,{size:16})))}function nn(t){const o=(t.useCost?t.useCost(p=>p):void 0)?.state;if(!o)return null;const n=o.config,a=V(Q(n?.locale)),r=n.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},l=o.goQuota,i=n?.goQuota?.enabled!==!1&&l?.status==="ok",d=p=>p!==null&&typeof p?.percent=="number"?Math.round(Math.max(0,Math.min(100,p.percent))):null,b=[],u=(p,x,N,P)=>{if(!p||!i)return;const M=d(x);if(M===null)return;const w=typeof x.resetsAt=="string"&&x.resetsAt.length>0?a("goResetAt",{time:new Date(x.resetsAt).toLocaleString()}):"";b.push({key:N,text:a(N)+" "+M+"%",tip:a(P)+": "+M+"%"+(w?" · "+w:""),level:M>=100?"over":M>=80?"warn":"ok"})},v=n?.goQuota?.main==="weekly"||n?.goQuota?.main==="monthly"?n.goQuota.main:"rolling",g=[v,...["rolling","weekly","monthly"].filter(p=>p!==v)],h=p=>p==="rolling"?["goRolling",l?.rolling,"goShortRolling","cornerGoRolling"]:p==="weekly"?["goWeekly",l?.weekly,"goShortWeekly","cornerGoWeekly"]:["goMonthly",l?.monthly,"goShortMonthly","cornerGoMonthly"];for(const p of g){const[x,N,P,M]=h(p);u(r[x]===!0,N,P,M)}if(r.budget===!0){const p=n.budget??{enabled:!1,amount:100,period:"month"};if(p.enabled===!0){const x=Number(n.exchangeRate),P=(o.budgetUsed??(p.period==="day"?z(o.today,n):p.period==="all"?z(o.total,n):z(o.month,n)))*(Number.isFinite(x)&&x>0?x:1),M=Math.max(0,Number(p.amount)||0),w=M>0?Math.min(999,P/M*100):null;if(w!==null){const S=w>=100?"over":w>=80?"warn":"ok";b.push({key:"budget",text:a("budgetShort")+" "+w.toFixed(1)+"%",tip:a("budgetOf",{period:a(He[p.period]??"periodMonth")})+" · "+a("usedOf",{used:de(P,n),amount:de(M,n)}),level:S})}}}return b.length===0?null:e("div",{className:"cm-corner"},b.map(p=>e(X,{key:p.key,label:p.tip,side:"top",delayMs:500},e("span",{className:"cm-corner-chip"+(p.level==="ok"?"":" "+p.level)},p.text))))}function Ge(t,s){if(!Array.isArray(s)||s.length===0||!Number.isFinite(t))return null;const o=(d,b)=>{const u=new Date(t);return u.setUTCDate(u.getUTCDate()+d),u.setUTCHours(b,0,0,0),u.getTime()},n=[];for(let d=-4;d<=4;d+=1)for(const b of s){const u=Number(b?.start),v=Number(b?.end);if(!Number.isFinite(u)||!Number.isFinite(v))continue;const g={at:o(d,u),intoPeak:!0},h={at:o(v<=u?d+1:d,v),intoPeak:!1};We(g.at)===null&&n.push(g),We(h.at)===null&&n.push(h)}let a=null,r=null;for(const d of n)d.at<=t&&(a===null||d.at>a.at)&&(a=d),d.at>t&&(r===null||d.at<r.at)&&(r=d);const l=We(t);return l!==null?r===null?null:{inPeak:!1,weekend:!0,prevAtMs:l.start,nextAtMs:r.at,nextIntoPeak:r.intoPeak}:a===null||r===null?null:{inPeak:Rt(t,void 0,s),weekend:!1,prevAtMs:a.at,nextAtMs:r.at,nextIntoPeak:r.intoPeak}}function Ke(t,s){if(!t||t.peakNotice===!1||t.peakEnabled!==!0)return null;const o=Date.parse(t.peakEffectiveAt||"");if(Number.isFinite(o)&&s<o)return null;const n=Array.isArray(t.peakWindows)?t.peakWindows:[];return Ge(s,n)}function Ve(t){return t.weekend===!0?{short:"weekendShort",chip:"weekendChip",notice:"weekendAllOffPeak"}:t.inPeak?{short:"peakShort",chip:"peakShort",notice:"peakNotice"}:{short:"offPeakShort",chip:"offPeakShort",notice:"offPeakActive"}}function ge(t,s,o){const n=Math.max(0,t.nextAtMs-s),a=Math.max(1,Math.ceil(n/6e4)),r=Math.floor(a/60),l=a%60;return r>0?l>0?o("countdownHourMinute",{h:r,m:l}):o("countdownHoursOnly",{h:r}):o("countdownMinute",{m:a})}const ft="cm-peak-alert-preview";let Gt=0;function sn(t){const s=t.useCost?t.useCost(x=>x):void 0,o=s?.state?.config,[n,a]=O(Date.now()),[r,l]=O(null),[i,d]=O(null);if(oe(()=>{const x=window.setInterval(()=>a(Date.now()),1e4);return()=>window.clearInterval(x)},[]),oe(()=>{const x=N=>{const P=N.detail?.kind==="offpeak"?"offpeak":"peak";d(P);const M=s?.state?.config;if(M?.peakAlertWebNotify===!0&&window.Notification&&Notification.permission==="granted"){const w=V(Q(M.locale));try{new Notification(w(P==="peak"?"peakAlertTitlePeak":"peakAlertTitleOffPeak")+w("peakAlertPreviewTag"),{body:w("peakAlertBody",{time:w("countdownMinute",{m:2}),phase:w(P==="peak"?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}}};return window.addEventListener(ft,x),window.__cmPeakAlertLive=!0,()=>{window.removeEventListener(ft,x),window.__cmPeakAlertLive=!1}},[]),oe(()=>{if(!o||o.peakAlertEnabled!==!0||o.peakEnabled!==!0||o.peakAlertWebNotify!==!0||!window.Notification||Notification.permission!=="granted")return;const x=Ge(n,Array.isArray(o.peakWindows)?o.peakWindows:[]);if(x===null)return;const N=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",P=x.nextIntoPeak===!0;if(N!=="both"&&N!==(P?"peak":"offpeak"))return;const M=Number(o.peakAlertAhead),w=(Number.isFinite(M)&&M>=1?M:2)*6e4;if(n<x.nextAtMs-w||n>=x.nextAtMs||Gt===x.nextAtMs)return;const S=V(Q(o.locale));Gt=x.nextAtMs;try{new Notification(S(P?"peakAlertTitlePeak":"peakAlertTitleOffPeak"),{body:S("peakAlertBody",{time:ge(x,n,S),phase:S(P?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}},[n]),!o||o.peakEnabled!==!0)return null;let b=null;if(o.peakAlertEnabled===!0){const x=Date.parse(o.peakEffectiveAt||"");if(!(Number.isFinite(x)&&n<x)){const N=Ge(n,Array.isArray(o.peakWindows)?o.peakWindows:[]);if(N!==null){const P=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",M=Number(o.peakAlertAhead),w=(Number.isFinite(M)&&M>=1?M:2)*6e4;(P==="both"||P===(N.nextIntoPeak?"peak":"offpeak"))&&n>=N.nextAtMs-w&&n<N.nextAtMs&&r!==N.nextAtMs&&(b=N)}}}let u=null,v=!1,g=null;if(b!==null)u=b,v=b.nextIntoPeak===!0,g=()=>l(b.nextAtMs);else if(i!==null)u={nextAtMs:n+2*6e4,nextIntoPeak:i==="peak"},v=i==="peak",g=()=>d(null);else return null;const h=V(Q(o.locale)),p=o.peakAlertPosition==="center"?"cm-peak-alert-center":"cm-peak-alert-corner";return e("div",{className:"cm-peak-alert "+p+" "+(v?"cm-peak-alert-peak":"cm-peak-alert-offpeak"),role:"alert"},e("div",{className:"cm-peak-alert-badge"},h(v?"peakAlertBadgePeak":"peakAlertBadgeOffPeak")),e("div",{className:"cm-peak-alert-title"},h(v?"peakAlertTitlePeak":"peakAlertTitleOffPeak")),e("div",{className:"cm-peak-alert-body"},h("peakAlertBody",{time:ge(u,n,h),phase:h(v?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})),e("div",{className:"cm-peak-alert-actions"},e("button",{className:"cm-btn",onClick:g},h("peakAlertBtn"))))}function on(t){const{config:s,t:o}=t,[n,a]=O(Date.now());oe(()=>{const d=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(d)},[]);const r=Ke(s,n);if(r===null)return null;const l=Ve(r),i=r.nextIntoPeak?o("nextPeakIn",{time:ge(r,n,o)}):o("nextOffPeakIn",{time:ge(r,n,o)});return e(X,{label:o(l.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-strip "+(r.weekend?"weekend":r.inPeak?"peak":"off")},e("div",{className:"cm-peak-track"},e("div",{className:"cm-peak-segment cm-peak-high"}),e("div",{className:"cm-peak-segment cm-peak-low"}),e("div",{className:"cm-peak-marker",style:{left:r.weekend?"50%":r.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-chip"},o(l.chip)+" · "+i)))}function ln(t){const{config:s,t:o}=t,[n,a]=O(Date.now());oe(()=>{const d=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(d)},[]);const r=Ke(s,n);if(r===null)return null;const l=Ve(r),i=r.nextIntoPeak?o("nextPeakIn",{time:ge(r,n,o)}):o("nextOffPeakIn",{time:ge(r,n,o)});return e(X,{label:o(l.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-classic "+(r.weekend?"weekend":r.inPeak?"peak":"off")},e("div",{className:"cm-peak-classic-marker",style:{left:r.weekend?"50%":r.inPeak?"25%":"75%"}}),e("div",{className:"cm-peak-track"},e("div",{className:"cm-peak-segment cm-peak-high"}),e("div",{className:"cm-peak-segment cm-peak-low"})),e("span",{className:"cm-peak-classic-chip"},o(l.chip)+" · "+i)))}function gt(t,s,o){return e(s?.peakStyle==="classic"?ln:on,{config:s,t:o})}function rn(t){const{config:s,t:o}=t,[n,a]=O(Date.now());oe(()=>{const b=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(b)},[]);const r=Ke(s,n);if(r===null)return null;const l=Ve(r),i=r.nextIntoPeak?o("nextPeakIn",{time:ge(r,n,o)}):o("nextOffPeakIn",{time:ge(r,n,o)}),d=[o(l.notice),i];return e(X,{label:d,side:"right",delayMs:300},e("div",{className:"cm-peak-rail "+(r.weekend?"weekend":r.inPeak?"peak":"off"),"aria-label":d.join("; ")},e("div",{className:"cm-peak-rail-track"},e("div",{className:"cm-peak-rail-segment cm-peak-rail-high"}),e("div",{className:"cm-peak-rail-segment cm-peak-rail-low"}),e("div",{className:"cm-peak-rail-marker",style:{top:r.weekend?"50%":r.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-label"},o(l.short))))}function cn(t){const{config:s,t:o}=t,[n,a]=O(Date.now());oe(()=>{const b=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(b)},[]);const r=Ke(s,n);if(r===null)return null;const l=Ve(r),i=r.nextIntoPeak?o("nextPeakIn",{time:ge(r,n,o)}):o("nextOffPeakIn",{time:ge(r,n,o)}),d=[o(l.notice),i];return e(X,{label:d,side:"right",delayMs:300},e("div",{className:"cm-peak-rail-classic "+(r.weekend?"weekend":r.inPeak?"peak":"off"),"aria-label":d.join("; ")},e("div",{className:"cm-peak-rail-classic-track"},e("div",{className:"cm-peak-rail-classic-segment peak"}),e("div",{className:"cm-peak-rail-classic-segment off"}),e("div",{className:"cm-peak-rail-classic-marker",style:{top:r.weekend?"50%":r.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-classic-label"},o(l.short))))}function dn(t,s,o){return e(s?.peakStyle==="classic"?cn:rn,{config:s,t:o})}function Kt(t,s,o){const n=t.today,a=s.budget??{enabled:!1,amount:100,period:"month"},r=Number(s.exchangeRate),i=(t.budgetUsed??(a.period==="day"?z(t.today,s):a.period==="all"?z(t.total,s):z(t.month,s)))*(Number.isFinite(r)&&r>0?r:1),d=Math.max(0,Number(a.amount)||0),b=d>0?Math.min(999,i/d*100):null,u=ce(b===null?null:Math.min(100,b),ae(s,"budget")),v=z(n,s)*(Number.isFinite(r)&&r>0?r:1),g=d>0?Math.min(999,v/d*100):null,h=a.detail!==!1;return{level:b===null?"ok":b>=100?"over":b>=80?"warn":"ok",rail:u.label===null?"—":Math.round(u.label)+"%",body:e(q,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("budget")),e("span",{className:"cm-bbox-pct cm-num"},u.label===null?"—":u.label.toFixed(1)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:u.width+"%"}})),h?e(q,null,s.hideTodayCost===!0?null:e("div",{className:"cm-bbox-line cm-num"},o("todayShare",{amount:$(z(n,s),s),pct:g===null?"—":g.toFixed(1)+"%"})),e("div",{className:"cm-bbox-line cm-num"},o("usedOf",{used:de(i,s),amount:de(d,s)}))):null,gt(t,s,o))}}function Vt(t,s,o){const n=t.goQuota,a=s?.goQuota?.main==="weekly"||s?.goQuota?.main==="monthly"?s.goQuota.main:"rolling",r=n[a],l=r!==null&&typeof r?.percent=="number"?Math.max(0,Math.min(100,Number(r.percent)||0)):0,i=h=>h!==null&&typeof h?.percent=="number"?Math.round(Math.max(0,Math.min(100,h.percent)))+"%":"—",d=h=>o(h==="rolling"?"goShortRolling":h==="weekly"?"goShortWeekly":"goShortMonthly"),b=["rolling","weekly","monthly"].filter(h=>h!==a),u=r!==null&&typeof r?.resetsAt=="string"&&r.resetsAt.length>0?o("goResetAt",{time:new Date(r.resetsAt).toLocaleString()}):"",v=s?.goQuota?.detail!==!1,g=ce(l,ae(s,"go"));return{level:l>=100?"over":l>=80?"warn":"ok",rail:g.label===null?"—":Math.round(g.label)+"%",body:e(q,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("goQuotaRowLabel")+" "+d(a)),e("span",{className:"cm-bbox-pct cm-num"},g.label===null?"—":Math.round(g.label)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:g.width+"%"}})),v?e(q,null,e("div",{className:"cm-bbox-line cm-num"},b.map(h=>d(h)+" "+i(n[h])).join(" · ")),u?e("div",{className:"cm-bbox-line"},u):null):null)}}function un(t){const{state:s,wide:o}=t,n=s.goQuota,a=V(Q(s.config?.locale));if(!n||n.status!=="ok")return null;const r=s.config?.goQuota?.main==="weekly"||s.config?.goQuota?.main==="monthly"?s.config.goQuota.main:"rolling";if(n[r]===null||typeof n[r]?.percent!="number")return null;const l=Vt(s,s.config,a),i=[a("goQuotaTitle"),a("goWindowRolling")+": "+(n.rolling===null?"—":Math.round(n.rolling.percent)+"%"),a("goWindowWeekly")+": "+(n.weekly===null?"—":Math.round(n.weekly.percent)+"%"),a("goWindowMonthly")+": "+(n.monthly===null?"—":Math.round(n.monthly.percent)+"%"+(n.monthly!==null&&typeof n.monthly.resetsAt=="string"&&n.monthly.resetsAt.length>0?" · "+a("goResetAt",{time:new Date(n.monthly.resetsAt).toLocaleString()}):"")),a("goQuotaFetchedAt",{time:n.fetchedAt>0?new Date(n.fetchedAt).toLocaleTimeString():"—"})].join("; ");return e(X,{label:i,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(l.level==="ok"?"":" "+l.level)+(o?"":" rail")},o?l.body:e("div",{className:"cm-bbox-rail cm-num"},l.rail)))}function mn(t){return t===null||typeof t!="object"||typeof t.percent!="number"?null:Math.max(0,Math.min(100,Math.round(Number(t.percent)||0)))}function Re(t){const s=t!==null&&typeof t=="object"?t:{};return{five:s["5h"]??null,seven:s["7d"]??s.week??s.weekly??null}}function pn(t,s,o=Date.now()){if(typeof t!="string"||!t)return"";const n=Date.parse(t);if(!Number.isFinite(n))return"";const a=n-o;if(a<=0)return s("resetReached");const r=Math.ceil(a/6e4),l=Math.floor(r/1440),i=Math.floor(r%1440/60),d=r%60;return l>0?s("resetDays",{d:l,h:i}):i>0?s("resetHours",{h:i,m:d}):s("resetMinutes",{m:d})}function Le(t,s,o=Date.now()){const n=pn(t?.resetsAt,s,o);return n?s("goResetAt",{time:new Date(t.resetsAt).toLocaleString()})+" ("+n+")":""}function Ye(t,s,o){return t===null?"—":o(s==="remaining"?"quotaRemaining":"quotaUsed",{pct:t})}function Je(){const[,t]=O(0),s=()=>t(Date.now());return{onMouseEnter:s,onFocus:s}}function Oe(t,s,o,n){const a=mn(s),r=a===null?"ok":a>=100?"over":a>=80?"warn":"ok",l=ce(a,o);return{level:r,pct:a,label:l.label,row:e("div",{className:"cm-mm-row"+(r==="ok"?"":" "+r)},e("span",{className:"cm-bbox-label"},t),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:l.width+"%"}})),e("span",{className:"cm-bbox-pct cm-num"},l.label===null?"—":l.label+"%"))}}function Yt(t){const s=Je(),{five:o,seven:n,fetchedAt:a,t:r,wide:l,refresh:i,direction:d="used"}=t,b=Oe(r("codingPlanRemain5h"),o,d,r),u=Oe(r("codingPlanRemain7d"),n,d,r),v=b.level==="over"||u.level==="over"?"over":b.level==="warn"||u.level==="warn"?"warn":"ok",g=(N,P,M)=>{const w=Ye(M.label,d,r),S=Le(P,r);return N+" "+w+(S?" · "+S:"")},h=[r("codingPlanMinimaxTitle"),g(r("codingPlanRemain5h"),o,b),g(r("codingPlanRemain7d"),n,u),a>0?r("goQuotaFetchedAt",{time:new Date(a).toLocaleTimeString()}):null,...i?fe(r,i):[]].filter(Boolean).join(`
|
|
4
|
-
`),
|
|
5
|
-
`),
|
|
6
|
-
`),P=v.map(([,S])=>g(S)).filter(S=>S!==null),M=P.some(S=>S>=100)?"over":P.some(S=>S>=80)?"warn":"ok",w=P.length>0?P.slice(0,2).map(S=>ce(S,h).label+"%").join(" "):typeof v[0][1]?.text=="string"?v[0][1].text:"—";return e(X,{label:e("span",{style:{whiteSpace:"pre-line"}},N),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(M==="ok"?"":" "+M)+(a===!1?" rail":"")+(d.busy?" busy":""),...me(d.busy,d.run)},a===!1?e("div",{className:"cm-bbox-rail cm-num"},w):e(q,null,e("div",{className:"cm-mm-title"},i(b.labelKey)),...p)))}function Nn(t){const s=Je(),{source:o,snapshot:n,state:a,wide:r,api:l}=t,i=V(Q(a.config?.locale)),d=we(l?()=>l.refreshGatewayQuota(o.id):null),b=ae(a.config,"plan"),u=n.accounts.length>1,v=y=>u?(Pt[y.provider]??y.provider)+" · ":"",g=[];for(const y of n.accounts){if(g.length>=4)break;for(const m of y.windows){if(g.length>=4)break;const C=v(y)+(m.label||m.id||i("gatewaySourceUnknown"));g.push({win:m,name:C,view:Oe(C,m,b,i)})}y.windows.length===0&&y.credits!=null&&g.push({win:null,name:v(y)+(y.credits.unit||"credits"),text:(y.credits.used??"—")+" / "+(y.credits.limit??"—")})}if(g.length===0)return null;const h=g.some(y=>y.view?.level==="over")?"over":g.some(y=>y.view?.level==="warn")?"warn":"ok",p=g.map(y=>{if(y.text!=null)return y.name+" "+y.text;const m=Le(y.win,i);return y.name+" "+Ye(y.view.label,b,i)+(m?" · "+m:"")});n.fetchedAt>0&&p.push(i("goQuotaFetchedAt",{time:new Date(n.fetchedAt).toLocaleTimeString()})),p.push(...fe(i,d));const x=[o.label||o.id,...p].join(`
|
|
7
|
-
`),N=g.map((y,m)=>y.text!=null?e("div",{key:m,className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},y.name),e("span",{className:"cm-mm-text cm-num"},y.text)):e(q,{key:m},y.view.row)),P=e(q,null,e("div",{className:"cm-mm-title"},o.label||o.id),...N),M=g.filter(y=>y.view).map(y=>y.view.label).filter(y=>y!==null),w=M.length>0?M.slice(0,2).map(y=>y+"%").join(" "):g[0].text??"—",S=e("div",{className:"cm-bbox-rail cm-num"},w);return e(X,{label:e("span",{style:{whiteSpace:"pre-line"}},x),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(h==="ok"?"":" "+h)+(r===!1?" rail":"")+(d.busy?" busy":""),...me(d.busy,d.run)},r===!1?S:P))}function Sn(t,s,o,n){const a=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:[],r=[];for(const l of s.gatewayQuotas?.sources??[]){if(l.enabled===!1||l.display!=="sidebar"&&l.display!=="both")continue;const i=a.find(d=>d.id===l.id);!i||i.status!=="ok"&&i.status!=="partial"&&i.status!=="stale"||i.accounts.length===0||r.push(e(Nn,{source:l,snapshot:i,state:t,wide:o,api:n}))}return r}const Cn={anthropic:"Claude",zai:"Z.ai",minimax:"MM",kimi:"Kimi",openrouter:"OR",siliconflow:"SF",commandcode:"CC",scnet:"SCNet",volcengine:"Ark",qwen:"Qwen"};function An(t){const s=t.useCost?t.useCost(p=>p):void 0,[o,n]=O(null),[a,r]=O({}),l=s?.state,i=t.api;if(!l)return null;const d=l.config,b=d.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};if(b.enabled!==!0)return null;const u=V(Q(d?.locale)),v=[];if(b.budget!==!1){const p=d.budget??{enabled:!1,amount:100,period:"month"};if(p.enabled===!0){const x=Number(d.exchangeRate),P=(l.budgetUsed??(p.period==="day"?z(l.today,d):p.period==="all"?z(l.total,d):z(l.month,d)))*(Number.isFinite(x)&&x>0?x:1),M=Math.max(0,Number(p.amount)||0);if(M>0){const w=Math.min(999,P/M*100),S=w>=100?"over":w>=80?"warn":"ok";v.push({key:"budget",label:u("budgetShort"),level:S,tip:u("budgetOf",{period:u(He[p.period]??"periodMonth")})+" · "+u("usedOf",{used:de(P,d),amount:de(M,d)})+" · "+w.toFixed(1)+"%",segs:[{name:"main",pct:Math.round(ce(Math.min(100,w),ae(d,"budget")).width)}]})}}}if(b.go!==!1){const p=l.goQuota;if(d?.goQuota?.enabled!==!1&&p?.status==="ok"){const x=d.goQuota.main==="weekly"||d.goQuota.main==="monthly"?d.goQuota.main:"rolling",N=x==="rolling"?p.rolling:x==="weekly"?p.weekly:p.monthly;if(N!==null&&typeof N=="object"&&typeof N.percent=="number"){const P=Math.max(0,Math.min(100,Math.round(Number(N.percent)||0))),M=P>=100?"over":P>=80?"warn":"ok",w=typeof N.resetsAt=="string"&&N.resetsAt.length>0?" · "+u("goResetAt",{time:new Date(N.resetsAt).toLocaleString()}):"";v.push({key:"go",label:"Go "+u(x==="rolling"?"goShortRolling":x==="weekly"?"goShortWeekly":"goShortMonthly"),level:M,tip:"Go: "+P+"%"+w,segs:[{name:"main",pct:Math.round(ce(P,ae(d,"go")).width)}]})}}}if(b.plans!==!1)for(const p of Te){const x=l.codingPlans?.[p.id];if(d.codingPlans?.[p.id]?.enabled!==!0||!x||x.status!=="ok")continue;const N=x.windows!==null&&typeof x.windows=="object"?x.windows:{},P=Object.entries(N);if(P.length===0)continue;const M=Cn[p.id]??p.id,w=[],S=[];let y=0,m=0;for(const[C,A]of P){const B=bt(C,u),j=typeof A?.resetsAt=="string"&&A.resetsAt.length>0?" · "+u("goResetAt",{time:new Date(A.resetsAt).toLocaleString()}):"",T=A!==null&&typeof A=="object"&&typeof A.percent=="number"?Math.max(0,Math.min(100,Math.round(Number(A.percent)||0))):null;if(S.push(B+" "+(T===null?typeof A?.text=="string"?A.text:"—":T+"%")+j),T===null){w.push({name:C,pct:null,text:typeof A?.text=="string"?A.text:"—"});continue}m>=2||(m+=1,w.push({name:C,pct:Math.round(ce(T,ae(d,"plan")).width)}),y=Math.max(y,T>=100?2:T>=80?1:0))}x.fetchedAt>0&&S.push(u("goQuotaFetchedAt",{time:new Date(x.fetchedAt).toLocaleTimeString()})),w.length!==0&&v.push({key:p.id,label:M,level:["ok","warn","over"][y],tip:S.join("; "),segs:w})}const g=Z.status==="ok"?Z.windows.weekly??null:null;if(g!==null&&typeof g.percent=="number"){const p=Math.max(0,Math.min(100,Math.round(Number(g.percent)||0))),x=typeof g.resetsAt=="string"&&g.resetsAt.length>0?" · "+u("goResetAt",{time:new Date(g.resetsAt).toLocaleString()}):"";v.push({key:"codex",label:"Codex",level:p>=100?"over":p>=80?"warn":"ok",tip:u("codexQuotaTitle")+": "+p+"%"+x,segs:[{name:"weekly",pct:Math.round(ce(p,ae(d,"plan")).width)}]})}if(v.length===0)return null;const h=p=>{o!==null||!i||(n(p),r(x=>({...x,[p]:null})),Promise.resolve().then(()=>p==="budget"?i.reload():p==="go"?i.refreshGoQuota():p==="codex"?$e(!0):i.refreshCodingPlan(p)).catch(x=>{r(N=>({...N,[p]:x?.message??String(x)}))}).finally(()=>n(null)))};return e("div",{className:"cm-qstrip"},v.map(p=>{const x=o===p.key,N=a[p.key],P=[e("span",{className:"cm-qlabel",key:"l"},p.label)];x?P.push(e("span",{className:"cm-qtext",key:"busy"},u("refreshing"))):p.segs.forEach((w,S)=>{S>0&&P.push(e("span",{className:"cm-qsep",key:"sep"+S,"aria-hidden":"true"})),w.pct===null?P.push(e("span",{className:"cm-qtext",key:w.name},w.text)):P.push(e("span",{className:"cm-qseg",key:w.name},e("span",{className:"cm-qbar"},e("span",{className:"cm-qfill",style:{width:w.pct+"%"}})),e("span",null,w.pct+"%")))});const M=[p.tip];return!x&&i&&M.push(u("clickToRefresh")),x&&M.push(u("refreshing")),N&&M.push("⚠ "+u("balanceRefreshFailed",{message:N})),e(X,{key:p.key,label:M.join("; "),side:"bottom",delayMs:400},e("span",{className:"cm-qchip"+(i?" action":"")+(p.level==="ok"?"":" "+p.level),...i?me(x,()=>h(p.key)):{}},P))}))}function Pn(t){const s=t.useCost?t.useCost(u=>u):void 0,o=Ce(!1),[n,a]=O(!1),[r,l]=O(!1),i=s?.state?.config;if(!i||i.sidebarSimplePromptSeen===!0)return null;const d=V(Q(i.locale)),b=async u=>{if(!o.current){o.current=!0,a(!0),l(!1);try{await t.api.updateConfig({sidebarSimple:u,sidebarSimplePromptSeen:!0})}catch{l(!0)}finally{o.current=!1,a(!1)}}};return e("div",{className:"cm-qguide",role:"dialog","aria-label":d("sidebarSimpleTitle"),"aria-busy":n},e("h4",null,d("sidebarSimpleTitle")),e("p",null,d("sidebarSimpleBody")),r?e("p",{role:"alert"},d("sidebarSimpleError")):null,e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small",disabled:n,onClick:()=>b(!1)},d("sidebarSimpleOff")),e("button",{type:"button",className:"cm-btn small primary",disabled:n,onClick:()=>b(!0)},d("sidebarSimpleOn"))))}function Mn(t){const s=t.useCost?t.useCost(i=>i):void 0,o=Ce(!1),n=s?.state;if(!n)return null;const a=n.config;if(a.sidebarSimplePromptSeen!==!0||a.quotaStrip?.promptSeen===!0)return null;const r=V(Q(a?.locale)),l=i=>{if(o.current===!0)return;o.current=!0;const d=a.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};t.api.updateConfig({quotaStrip:{...d,enabled:i,promptSeen:!0}}).catch(()=>{o.current=!1})};return e("div",{className:"cm-qguide",role:"dialog","aria-label":r("quotaStripGuideTitle")},e("h4",null,r("quotaStripGuideTitle")),e("p",null,r("quotaStripGuideBody")),e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small",onClick:()=>l(!1)},r("quotaStripGuideOff")),e("button",{type:"button",className:"cm-btn small primary",onClick:()=>l(!0)},r("quotaStripGuideOn"))))}const Jt="dsh-cost-meter:balance-click-hint-seen",Tn=()=>{try{return window.localStorage.getItem(Jt)==="1"}catch{return!1}},Bn=()=>{try{window.localStorage.setItem(Jt,"1")}catch{}};function Dn(t){const s=t.useCost?t.useCost(h=>h):void 0,o=Ce(!1),[n,a]=O(!1),[r]=O(Tn),l=s?.state;if(!l)return null;const i=l.config,d=i.balance?.display==="sidebar"||i.balance?.display==="both",b=(i?.customBalances??[]).some(h=>h?.enabled===!0&&(h.display==="sidebar"||h.display==="both"))||i.customBalance?.enabled===!0&&(i.customBalance?.display==="sidebar"||i.customBalance?.display==="both"),u=Te.some(h=>{const p=i.codingPlans?.[h.id];return p?.enabled===!0&&(p.display==="sidebar"||p.display==="both")});if(n||r||i.balance?.clickHintSeen===!0||!d&&!b&&!u||i.sidebarSimplePromptSeen!==!0||i.quotaStrip?.promptSeen!==!0)return null;const v=V(Q(i?.locale)),g=()=>{o.current!==!0&&(a(!0),o.current=!0,Bn(),t.api.updateConfig({balance:{...i.balance??{},clickHintSeen:!0}}).catch(()=>{o.current=!1,a(!1)}))};return e("div",{className:"cm-qguide",role:"dialog","aria-label":v("balanceClickGuideTitle")},e("h4",null,v("balanceClickGuideTitle")),e("p",null,v("balanceClickGuideBody")),e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small primary",onClick:g},v("balanceClickGuideOk"))))}function $t(t){const{state:s,wide:o}=t,n=s.today,a=s.config,r=V(Q(a?.locale)),l=a.budget??{enabled:!1,amount:100,period:"month"},i=Number(a.exchangeRate),b=(s.budgetUsed??(l.period==="day"?z(s.today,a):l.period==="all"?z(s.total,a):z(s.month,a)))*(Number.isFinite(i)&&i>0?i:1),u=Math.max(0,Number(l.amount)||0),v=u>0?Math.min(999,b/u*100):null,g=v===null?"ok":v>=100?"over":v>=80?"warn":"ok";if(l.enabled===!0){const p=z(n,a),x=p*(Number.isFinite(i)&&i>0?i:1),N=u>0?Math.min(999,x/u*100):null,P=[r("budgetOf",{period:r(He[l.period]??"periodMonth")}),r("usedOf",{used:de(b,a),amount:de(u,a)})+" · "+(v===null?"—":v.toFixed(1)+"%"),...a.hideTodayCost===!0?[]:[r("todayShare",{amount:$(p,a),pct:N===null?"—":N.toFixed(1)+"%"})],r("monthTotal",{month:$(z(s.month,a),a),total:$(z(s.total,a),a)})].join("; "),M=Kt(s,a,r);return e(X,{label:P,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(g==="ok"?"":" "+g)+(o?"":" rail")},o?M.body:e("div",{className:"cm-bbox-rail cm-num"},M.rail)))}const h=[r("todayCostTitle"),r("callsTokens",{calls:n.calls,input:H(n.input),cache:H(n.cacheRead+n.cacheWrite),output:H(n.output)}),r("monthCost",{amount:$(z(s.month,a),a)}),r("totalCost",{amount:$(z(s.total,a),a)})].join("; ");return e(X,{label:h,side:"right",delayMs:300},e(q,null,e("div",{className:"cm-foot"+(o?"":" cm-foot-rail")},o?e(q,null,r("today")," ",e("span",{className:"cm-num"},$(z(n,a),a))):e(it,{size:16})),o?gt(s,a,r):null))}function Rn(t){const s=t.useCost?t.useCost(A=>A):void 0;let o;if(t.useProjection)try{o=t.useProjection("costUsage")}catch{o=void 0}ct(t,o);const n=s?.state,a=!!t.wide,r=Ce(null);if(oe(()=>{const A=r.current,B=A?.parentElement;if(!A||!B)return;const j=()=>{a?B.firstElementChild!==A&&B.insertBefore(A,B.firstElementChild):B.lastElementChild!==A&&B.appendChild(A)};j();const T=new MutationObserver(()=>{A.isConnected&&j()});return T.observe(B,{childList:!0}),a?(B.style.flexDirection="",B.style.flexWrap="",B.style.alignItems="",B.style.gap=""):(B.style.flexDirection="column",B.style.flexWrap="nowrap",B.style.alignItems="center",B.style.gap="6px"),()=>{T.disconnect(),a||(B.style.flexDirection="",B.style.flexWrap="",B.style.alignItems="",B.style.gap="")}},[a,n]),!n)return null;const l=n.config,i=V(Q(l?.locale)),d=(l.balance?.display==="sidebar"||l.balance?.display==="both")&&l.hideOfficialBalance!==!0,u=pt(n,l).length>0,v=d&&l.balance?.showProgressBar===!0&&n.balance?.status==="ok",g=u&&l.balance?.showProgressBar===!0,h=l.goQuota?.main==="weekly"||l.goQuota?.main==="monthly"?l.goQuota.main:"rolling",p=l.goQuota?.enabled!==!1&&(l.goQuota?.display==="sidebar"||l.goQuota?.display==="both")&&n.goQuota?.status==="ok"&&n.goQuota?.[h]!==null,x=Te.map(A=>A.id).filter(A=>{const B=l.codingPlans?.[A];if(B?.enabled!==!0||B.display!=="sidebar"&&B.display!=="both")return!1;const j=n.codingPlans?.[A];if(j?.status!=="ok")return!1;const T=j.windows!==null&&typeof j.windows=="object"?j.windows:{};return Object.keys(T).length>0}),N=x.length>0,P=Sn(n,l,a,t.api),M=Z.status==="ok"&&Z.windows.weekly!==null,w=(l.budget??{}).enabled===!0,S=l.sidebar!==!1&&l.hideTodayCost!==!0;if(!d&&!u&&!p&&!N&&!M&&!w&&!S&&P.length===0)return null;const y=l.sidebarSimple===!0,m=!y&&a&&l.sidebarStyle==="compact",C=[];if(y&&a&&S&&C.push(e("div",{className:"cm-simple-summary"},e("span",null,i("today")),e("span",{className:"cm-num"},$(z(n.today,l),l)))),v?C.push(e($a,{state:n,wide:a,api:t.api})):d&&C.push(e(Ja,{state:n,wide:a,api:t.api})),g?C.push(e(Xa,{state:n,wide:a,api:t.api})):u&&C.push(e(tn,{state:n,wide:a,api:t.api})),N&&C.push(...x.map(A=>A==="minimax"?e(fn,{state:n,wide:a,api:t.api}):e(xn,{id:A,state:n,wide:a,api:t.api}))),C.push(...P),M&&C.push(e(vn,{state:n,wide:a,api:t.api})),p&&w&&a&&!y){const A=Vt(n,l,i),B=Kt(n,l,i),j=A.level==="over"||B.level==="over"?"over":A.level==="warn"||B.level==="warn"?"warn":"ok";C.push(e("div",{className:"cm-bbox cm-bbox-pair"+(j==="ok"?"":" "+j)},e("div",{className:"cm-bbox-section"+(A.level==="ok"?"":" "+A.level)},A.body),e("div",{className:"cm-bbox-divider"}),e("div",{className:"cm-bbox-section"+(B.level==="ok"?"":" "+B.level)},B.body)))}else p&&C.push(e(un,{state:n,wide:a})),w&&C.push(e($t,{state:n,wide:a}));return!w&&S&&!(y&&a)&&C.push(e($t,{state:n,wide:a})),a||C.push(dn(n,l,i)),e("div",{ref:r,...y?{tabIndex:0,role:"region","aria-label":i("sidebarSimple")}:{},className:"cm-footer-stack"+(a?"":" rail")+(m?" compact":"")+(y?" simple":"")},...C)}function ht(t){return e("div",{className:"cm-card"},e("p",{className:"cm-card-title"},t.title),e("div",{className:"cm-card-value cm-num"},t.value),e("p",{className:"cm-card-sub"},t.sub))}const Me=(t,s,o)=>e("button",{type:"button",className:"cm-collapse-h","aria-expanded":String(t),onClick:s},e("span",{className:"cm-caret"+(t?" open":"")}),e("h3",{className:"cm-h"},o));function Ln(t){const{state:s,api:o}=t,n=V(Q(s.config?.locale)),[a,r]=O(!1);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(a,()=>r(!a),n("history"))),a?e("div",{className:"cm-collapse-body"},e(On,{state:s,api:o})):null)}function On(t){const{state:s,api:o}=t,n=V(Q(s.config?.locale)),[a,r]=O(null),[l,i]=O({}),[d,b]=O(()=>new Set),u=s.history??[];if(u.length===0)return e("p",{className:"cm-empty"},n("noHistory"));const v=h=>{if(a===h){r(null);return}r(h),!(l[h]!==void 0||d.has(h))&&(b(p=>{const x=new Set(p);return x.add(h),x}),o.getDaySessions(h).then(p=>i(x=>({...x,[h]:Array.isArray(p?.sessions)?p.sessions:[]}))).catch(()=>i(p=>({...p,[h]:"error"}))).finally(()=>b(p=>{const x=new Set(p);return x.delete(h),x})))},g=h=>h.map(p=>e("tr",{key:p.id},yt(p,s.config?.showSessionId===!0,n),e("td",{className:"num"},String(p.calls)),e("td",{className:"num"},H(p.input)),e("td",{className:"num"},H(p.cacheRead+p.cacheWrite)),e("td",{className:"num"},H(p.output)),e("td",{className:"num"},$(z(p,s.config),s.config))));return e("div",{className:"cm-scroll"},e("p",{className:"cm-hint",style:{padding:"6px 10px 0"}},n("historyExpandHint")),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("colDate")),e("th",{className:"num"},n("colCalls")),e("th",{className:"num"},n("colInTok")),e("th",{className:"num"},n("colCacheTok")),e("th",{className:"num"},n("colOutTok")),e("th",{className:"num"},n("colCost")))),e("tbody",null,u.flatMap(h=>{const p=e("tr",{key:h.date,className:"cm-row-click",onClick:()=>v(h.date)},e("td",null,(a===h.date?"▾ ":"▸ ")+h.date),e("td",{className:"num"},String(h.calls)),e("td",{className:"num"},H(h.input)),e("td",{className:"num"},H(h.cacheRead+h.cacheWrite)),e("td",{className:"num"},H(h.output)),e("td",{className:"num"},$(z(h,s.config),s.config)));if(a!==h.date)return[p];const x=l[h.date],N=d.has(h.date)&&x===void 0?e("p",{className:"cm-empty"},n("historySessionsLoading")):x==="error"?e("p",{className:"cm-empty"},n("historySessionsError")):!Array.isArray(x)||x.length===0?e("p",{className:"cm-empty"},n("historyNoSessions")):e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("colSession")),e("th",{className:"num"},n("colCalls")),e("th",{className:"num"},n("colInTok")),e("th",{className:"num"},n("colCacheTok")),e("th",{className:"num"},n("colOutTok")),e("th",{className:"num"},n("colCost")))),e("tbody",null,g(x)));return[p,e("tr",{key:h.date+"-sessions"},e("td",{colSpan:6},N))]}))))}function En(t){const{state:s,api:o}=t,n=V(Q(s.config?.locale)),[a,r]=O(!1),[l,i]=O(100),[d,b]=O("cost-desc"),[u,v]=O(null),[g,h]=O(!1),[p,x]=O(!1),N=De.useRef(0),P=(y,m)=>{const[C,A]=m==="recent"?["recent","desc"]:m.split("-"),B=++N.current;h(!0),x(!1),o.getTopSessions(y,C,A).then(j=>{B===N.current&&v(Array.isArray(j?.sessions)?j.sessions:[])}).catch(()=>{B===N.current&&x(!0)}).finally(()=>{B===N.current&&h(!1)})},M=()=>{r(y=>{const m=!y;return m&&u===null&&!g&&P(l,d),m})},w=y=>{i(y),(a||u!==null)&&P(y,d)},S=y=>{b(y),(a||u!==null)&&P(l,y)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(a,M,n("sessionRankTitle"))),a?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-hint"},n("sessionRankHint")),e("div",{style:{display:"flex",gap:"12px",flexWrap:"wrap",margin:"6px 0"}},e("div",{className:"cm-field"},e("label",null,n("sessionRankSort")),e("select",{className:"cm-input",value:d,onChange:y=>S(y.target.value)},e("option",{value:"cost-desc"},n("sessionSortCostDesc")),e("option",{value:"cost-asc"},n("sessionSortCostAsc")),e("option",{value:"time-desc"},n("sessionSortTimeDesc")),e("option",{value:"time-asc"},n("sessionSortTimeAsc")),e("option",{value:"recent"},n("sessionSortRecent")))),e("div",{className:"cm-field"},e("label",null,n("sessionRankLimit")),e("select",{className:"cm-input",value:String(l),onChange:y=>w(Number(y.target.value))},e("option",{value:"50"},"50"),e("option",{value:"100"},"100"),e("option",{value:"200"},"200")))),g?e("p",{className:"cm-empty"},n("sessionRankLoading")):p?e("p",{className:"cm-empty"},n("sessionRankError")):u===null||u.length===0?e("p",{className:"cm-empty"},n("sessionRankEmpty")):e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("colDate")),e("th",null,n("colSession")),e("th",{className:"num"},n("colCalls")),e("th",{className:"num"},n("colInTok")),e("th",{className:"num"},n("colCacheTok")),e("th",{className:"num"},n("colOutTok")),e("th",{className:"num"},n("colCost")))),e("tbody",null,u.map(y=>e("tr",{key:y.date+":"+y.id},e("td",null,y.date),yt(y,s.config?.showSessionId===!0,n),e("td",{className:"num"},String(y.calls)),e("td",{className:"num"},H(y.input)),e("td",{className:"num"},H((y.cacheRead??0)+(y.cacheWrite??0))),e("td",{className:"num"},H(y.output)),e("td",{className:"num"},$(z(y,s.config),s.config)))))))):null)}function jn(t){const{state:s}=t,o=V(Q(s.config?.locale)),n=s.today.sessions??[];if(n.length===0)return e("p",{className:"cm-empty"},o("noSessionsToday"));const a=s.config?.showSessionId===!0;return e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,o("colSession")),e("th",{className:"num"},o("colCalls")),e("th",{className:"num"},o("colInTok")),e("th",{className:"num"},o("colCacheTok")),e("th",{className:"num"},o("colOutTok")),e("th",{className:"num"},o("colCost")))),e("tbody",null,n.map(r=>e("tr",{key:r.id},yt(r,a,o),e("td",{className:"num"},String(r.calls)),e("td",{className:"num"},H(r.input)),e("td",{className:"num"},H(r.cacheRead+r.cacheWrite)),e("td",{className:"num"},H(r.output)),e("td",{className:"num"},$(z(r,s.config),s.config)))))))}function yt(t,s,o){const n=typeof t.title=="string"?t.title.trim():"",a=String(t.id).slice(0,14)+"…",r=n.length>0?n:a,l=n.length>0?n+" · "+t.id:t.id;return e("td",{title:l},e("div",{className:"cm-sess-title"+(n.length===0?" cm-sess-id":"")},r),s&&n.length>0?e("div",{className:"cm-sess-id"},a):null)}const qn={CNY:{symbol:"¥",decimals:4,exchangeRate:7.2},USD:{symbol:"$",decimals:6,exchangeRate:1},EUR:{symbol:"€",decimals:6,exchangeRate:.92}};function Hn(t){const{state:s,draft:o,setDraft:n,t:a}=t,r=s.config,l=o?.budget??r.budget,i=Number(r.exchangeRate),b=(s.budgetUsed??(l.period==="day"?z(s.today,r):l.period==="all"?z(s.total,r):z(s.month,r)))*(Number.isFinite(i)&&i>0?i:1),u=Math.max(0,Number(l.amount)||0),v=l.enabled&&u>0?Math.min(999,b/u*100):null,g=v===null?"ok":v>=100?"over":v>=80?"warn":"ok",h=(N,P)=>{o!==null&&n({...o,budget:{...o.budget??r.budget,[N]:P}})},p=l.period==="custom"?l.customStart+" → "+(l.customEnd??a("periodDay")):null,x=l.enabled&&v!==null?a("budgetStatus",{period:a(He[l.period]??"periodMonth"),amount:de(u,r),used:de(b,r),pct:v.toFixed(1)})+(g==="over"?a("overLimit"):g==="warn"?a("nearLimit"):""):null;return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("budget")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:l.enabled===!0,onChange:N=>h("enabled",N.target.checked)}),e("span",null,a("enableBudget")))),l.enabled?e(q,null,e("div",{className:"cm-budget-bar"},e("div",{className:"cm-budget-fill "+(g==="ok"?"":g),style:{width:(v===null?0:Math.min(100,v))+"%"}})),e("div",{className:"cm-budget-line"+(g==="over"?" over":"")+" cm-num"},x),e("div",{className:"cm-budget-controls"},e("div",{className:"cm-field"},e("label",null,a("budgetAmountLabel")),le({value:l.amount},N=>h("amount",N))),e("div",{className:"cm-field"},e("label",null,a("budgetPeriodLabel")),e("select",{className:"cm-input",value:l.period,onChange:N=>h("period",N.target.value)},e("option",{value:"day"},a("periodDay")),e("option",{value:"month"},a("periodMonth")),e("option",{value:"all"},a("periodAll")),e("option",{value:"custom"},a("periodCustomRange")))),l.period==="custom"?e(q,null,e("div",{className:"cm-field"},e("label",null,a("startDate")),e("input",{className:"cm-input",type:"date",value:l.customStart??"",onChange:N=>h("customStart",N.target.value===""?null:N.target.value)})),e("div",{className:"cm-field"},e("label",null,a("endDate")),e("input",{className:"cm-input",type:"date",value:l.customEnd??"",onChange:N=>h("customEnd",N.target.value===""?null:N.target.value)}))):null),p!==null?e("p",{className:"cm-hint"},a("rangeText",{range:p})):null):e("p",{className:"cm-note"},a("budgetDisabledNote")))}function Un(t){const{state:s,draft:o,setDraft:n,t:a}=t,r=s.config,l=(u,v)=>{o!==null&&n({...o,[u]:v})},i=o===null?r:{...r,...o},d=(()=>{if(i.peakEnabled!==!0)return a("peakOff");const u=Date.parse(i.peakEffectiveAt||""),v=Date.now();if(Number.isFinite(u)&&v<u)return a("peakNotEffective",{time:new Date(u).toLocaleString()});const g=i.peakWindows??[],h=Ge(v,g);return h===null?a("offPeakActive"):h.weekend===!0?a("weekendAllOffPeak"):h.inPeak?a("peakActive"):a("offPeakActive")})(),b=(i.peakWindows?.length??0)>0?a("peakSummary",{windows:i.peakWindows.map(u=>u.start+":00-"+u.end+":00").join(Q(i.locale)==="zh"?"、":", "),time:i.peakEffectiveAt||a("unknown"),status:d}):a("noPeakWindows",{status:d});return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("peakPanelTitle")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakEnabled!==!1,onChange:u=>l("peakEnabled",u.target.checked)}),e("span",null,a("peakEnabledLabel")))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakNotice!==!1,onChange:u=>l("peakNotice",u.target.checked)}),e("span",null,a("peakNoticeLabel")))),e("div",{className:"cm-field"},e("label",null,a("peakStyleLabel")),e("select",{className:"cm-input",value:o?.peakStyle==="classic"?"classic":"compact",onChange:u=>l("peakStyle",u.target.value)},e("option",{value:"compact"},a("peakStyleCompact")),e("option",{value:"classic"},a("peakStyleClassic"))))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakAlertEnabled!==!1,onChange:u=>l("peakAlertEnabled",u.target.checked)}),e("span",null,a("peakAlertLabel")))),e("div",{className:"cm-field"},e("label",null,a("peakAlertAheadLabel")),e("input",{className:"cm-input narrow",type:"number",min:"1",max:"30",step:"1",value:String(typeof o?.peakAlertAhead=="number"&&Number.isFinite(o.peakAlertAhead)&&o.peakAlertAhead>=1&&o.peakAlertAhead<=30?o.peakAlertAhead:2),onChange:u=>{const v=Number(u.target.value);Number.isInteger(v)&&v>=1&&v<=30&&l("peakAlertAhead",v)}})),e("div",{className:"cm-field"},e("label",null,a("peakAlertTargetLabel")),e("select",{className:"cm-input",value:o?.peakAlertTarget==="peak"||o?.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",onChange:u=>l("peakAlertTarget",u.target.value)},e("option",{value:"both"},a("peakAlertTargetBoth")),e("option",{value:"peak"},a("peakAlertTargetPeak")),e("option",{value:"offpeak"},a("peakAlertTargetOffPeak"))))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",null,a("peakAlertPositionLabel")),e("select",{className:"cm-input",value:o?.peakAlertPosition==="center"?"center":"corner",onChange:u=>l("peakAlertPosition",u.target.value)},e("option",{value:"corner"},a("peakAlertPositionCorner")),e("option",{value:"center"},a("peakAlertPositionCenter")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakAlertWebNotify===!0,onChange:u=>{l("peakAlertWebNotify",u.target.checked),u.target.checked&&window.Notification&&Notification.permission==="default"&&Promise.resolve(Notification.requestPermission()).catch(()=>{})}}),e("span",null,a("peakAlertWebNotifyLabel"))),e("p",{className:"cm-hint"},a("peakAlertWebNotifyHint")))),e("div",{className:"cm-field"},e("label",null,a("peakAlertPreviewLabel")),e("div",{className:"cm-row"},e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("peak")},a("peakAlertPreviewPeak")),e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("offpeak")},a("peakAlertPreviewOffPeak")))),e("div",{className:"cm-peak-preview"},o?.peakEnabled!==!1&&o?.peakNotice!==!1?gt(s,i,a):e("p",{className:"cm-hint"},a("peakNoticeHiddenHint"))),e("p",{className:"cm-hint"},b),e("p",{className:"cm-hint"},a("weekendRuleNote")))}function le(t,s){const o=t.value;return e("input",{className:"cm-input narrow",type:"number",step:"any",min:"0",value:typeof o=="number"?String(o):"",onChange:n=>{const a=n.target.value;if(a===""){if(t.emptyMode==="clear"){s(null);return}if(t.emptyMode==="ignore")return;s(0);return}const r=Number(a);Number.isFinite(r)&&r>=0&&s(r)}})}function kt(t){const{modelId:s,entry:o,isDefault:n,draft:a,setDraft:r,t:l}=t,i=_e(o),d=g=>{const h={..._e(g)};if(Array.isArray(g.rateHistory)){const p=g.rateHistory.filter(x=>Date.parse(x.before)<=Date.now());p.length>0?h.rateHistory=p:delete h.rateHistory}return h},b=(g,h,p)=>{if(p===null){if(n){const C=d(a.prices.default??{cacheHit:0,cacheMiss:0,output:0}),A={...C[g]??{}};delete A[h];const B={...C};Object.keys(A).length>0?B[g]=A:delete B[g],r({...a,prices:{...a.prices,default:B}});return}const w={...a.prices.models},S=d(w[s]??{cacheHit:0,cacheMiss:0,output:0}),y={...S[g]??{}};delete y[h];const m={...S};Object.keys(y).length>0?m[g]=y:delete m[g],w[s]=m,r({...a,prices:{...a.prices,models:w}});return}const x=Math.max(0,p);if(n){let S={...d(a.prices.default??{cacheHit:0,cacheMiss:0,output:0})};if(g==="base")S[h]=x;else{const y={...S[g]??{},[h]:x};S={...S,[g]:y}}r({...a,prices:{...a.prices,default:S}});return}const N={...a.prices.models},P=d(N[s]??{cacheHit:0,cacheMiss:0,output:0});let M={...P};if(g==="base")M[h]=x;else{const w={...P[g]??{},[h]:x};M={...P,[g]:w}}N[s]=M,r({...a,prices:{...a.prices,models:N}})},u=()=>{const g={...a.prices.models};delete g[s],r({...a,prices:{...a.prices,models:g}})},v=(g,h)=>{const p=h==="base"?i:i[h]??null,x=h==="base"?"ignore":"clear";return e("div",{className:"cm-price-row",key:h},e("span",null,g),le({value:p?.cacheHit??null,emptyMode:x},N=>b(h,"cacheHit",N)),le({value:p?.cacheMiss??null,emptyMode:x},N=>b(h,"cacheMiss",N)),le({value:p?.output??null,emptyMode:x},N=>b(h,"output",N)))};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},s),e(q,null,i?.legacy===!0?e("span",{className:"cm-price-legacy"},l("legacyModel")):null,n?e("span",{className:"cm-price-legacy"},l("defaultFallback")):null,n?null:e("button",{className:"cm-btn small danger",onClick:u},l("remove")))),e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,l("flatCached")),e("span",null,l("flatInput")),e("span",null,l("flatOutput"))),v(l("tierBase"),"base"),v(l("tierOffPeak"),"offPeak"),v(l("tierPeak"),"peak"),Array.isArray(o?.rateHistory)&&o.rateHistory.length>0?e("p",{className:"cm-note"},l("datedPriceNote")):null)}const Zt={deepseek:"DeepSeek",openai:"OpenAI",anthropic:"Anthropic",google:"Google Gemini",moonshot:"Moonshot (Kimi)","z-ai":"Z.ai / 智谱",xai:"xAI",alibaba:"阿里云百炼",minimax:"MiniMax",tencent:"腾讯混元",xiaomi:"小米",upstage:"Upstage",nvidia:"NVIDIA",mistral:"Mistral",meta:"Meta",meituan:"美团 LongCat","opencode-go":"OpenCode Go"};function In(t,s,o="USD"){if(t=_e(t),t===null||typeof t!="object")return"";if(t.unpriced===!0)return s("catalogUnpriced");const n=r=>(o==="CNY"?"¥":"$")+String(r),a=t.peak!==null&&typeof t.peak=="object"?t.peak:null;return a!==null?n(t.cacheMiss)+"/"+n(a.cacheMiss)+" in · "+n(t.output)+"/"+n(a.output)+" out":n(t.cacheMiss??t.input??0)+" in · "+n(t.output??0)+" out"}function Qn(t){const{state:s,draft:o,setDraft:n,t:a}=t,[r,l]=O(!1),[i,d]=O({}),b=s.priceCatalog;if(b===null||typeof b!="object")return null;const u=o?.prices??s.config.prices,v=o?.priceTableDisplay??s.config.priceTableDisplay??{},g=(m,C)=>{const A=v[m+":"+C];return typeof A=="boolean"?A:m==="deepseek"},h=(m,C,A)=>{o!==null&&n({...o,priceTableDisplay:{...v,[m+":"+C]:A}})},p=(m,C)=>m==="deepseek"?u.models?.[C]!==void 0:u.providers?.[m]?.models?.[C]!==void 0,x=(m,C,A)=>{if(o===null)return;const B=JSON.parse(JSON.stringify(A));if(m==="deepseek"){n({...o,prices:{...o.prices,models:{...o.prices.models,[C]:B}}});return}const j={...o.prices.providers??{}},T=j[m]??{};j[m]={...T,models:{...T.models??{},[C]:B}},n({...o,prices:{...o.prices,providers:j}})},N=(m,C)=>{if(o===null)return;if(m==="deepseek"){const j={...o.prices.models};delete j[C],n({...o,prices:{...o.prices,models:j}});return}const A={...o.prices.providers??{}},B=A[m];if(B!==void 0&&B.models!==void 0){const j={...B.models};delete j[C],A[m]={...B,models:j},n({...o,prices:{...o.prices,providers:A}})}},P=Object.keys(b).sort((m,C)=>m==="deepseek"?-1:C==="deepseek"?1:m.localeCompare(C)),M=m=>Object.values(b[m]).reduce((C,A)=>C+Object.keys(A).length,0),w=new Set(Object.values(b.deepseek??{}).flatMap(m=>Object.keys(m))),S=Object.keys(u.models??{}).filter(m=>!w.has(m)).sort(),y=(m,C,A)=>{const B=p(m,C),j=g(m,C),T=B?e("label",{className:"cm-check cm-vendor-display",title:a("catalogDisplayHint")},e("input",{type:"checkbox",checked:j,onChange:f=>h(m,C,f.target.checked)}),e("span",null,a("catalogDisplayLabel"))):null;if(B&&!j&&o!==null){const f=m==="deepseek"?e(kt,{key:C,modelId:C,entry:u.models[C],isDefault:!1,draft:o,setDraft:n,t:a}):e(aa,{key:C,provider:m,modelId:C,entry:u.providers?.[m]?.models?.[C],draft:o,setDraft:n,t:a});return e("div",{key:C,className:"cm-catalog-mounted"},T,f)}return e("div",{key:C,className:"cm-catalog-row"},e("span",{className:"cm-catalog-id"},C),e("span",{className:"cm-catalog-price"},In(A,a,m==="deepseek"?u.currency:"USD")),B?e("span",{className:"cm-catalog-tag"},a("mountedTag")):null,T,e("button",{className:"cm-btn small",disabled:!B&&A?.unpriced===!0,onClick:()=>B?N(m,C):x(m,C,A)},a(B?"unmountBtn":"mountBtn")))};return e("div",{className:"cm-budget",style:{marginTop:"8px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("catalogTitle")),e("button",{className:"cm-toggle-btn",onClick:()=>l(m=>!m)},a(r?"catalogCollapse":"catalogOpen"))),r?e(q,null,e("p",{className:"cm-note"},a("catalogNote")),P.map(m=>{const C=i[m]===!0;return e("div",{key:m},e("div",{className:"cm-catalog-vendor cm-vendor-toggle",onClick:()=>d(A=>({...A,[m]:!C}))},e("span",null,(C?"▾ ":"▸ ")+(Zt[m]??m)+" · "+M(m))),C?e(q,null,m==="deepseek"?e("p",{className:"cm-hint"},a("catalogDeepseekNote")):null,Object.keys(b[m]).sort().map(A=>e("div",{key:A},e("div",{className:"cm-catalog-family"},A),Object.keys(b[m][A]).sort().map(B=>y(m,B,b[m][A][B])))),m==="deepseek"&&S.length>0?e("div",null,e("div",{className:"cm-catalog-family"},a("catalogCustomModels")),S.map(A=>y("deepseek",A,null))):null):null)})):null)}const Xt=t=>t==="zen"?"go":t,ea=t=>{const s=t.indexOf(":");return s<=0?t:Xt(t.slice(0,s).toLowerCase())+t.slice(s)};function Fn(t){const{state:s,config:o,t:n,initialTab:a}=t,[r,l]=O(a==="history"?"history":"today"),[i,d]=O(!1),b=w=>{if(w===null||typeof w!="object")return{};if(w.byProviderModel&&Object.keys(w.byProviderModel).length>0)return w.byProviderModel;if(w.byModel&&Object.keys(w.byModel).length>0)return w.byModel;const S={};if(Array.isArray(w.sessions))for(const y of w.sessions){if(y===null||typeof y!="object")continue;const m=typeof y.provider=="string"&&y.provider.length>0?y.provider:"deepseek",C=typeof y.model=="string"&&y.model.length>0?y.model:"unknown",A=m+":"+C,B=S[A]??(S[A]={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0,cost:0}),j=T=>typeof T=="number"&&Number.isFinite(T)&&T>=0?T:0;B.input+=j(y.input),B.output+=j(y.output),B.cacheRead+=j(y.cacheRead),B.cacheWrite+=j(y.cacheWrite),B.reasoning+=j(y.reasoning),B.cost+=j(y.cost)}if(Object.keys(S).length>0)return S;if(Number(w.cost)>0||Number(w.input)>0||Number(w.output)>0){const y=m=>typeof m=="number"&&Number.isFinite(m)&&m>=0?m:0;return{"deepseek:legacy":{input:y(w.input),output:y(w.output),cacheRead:y(w.cacheRead),cacheWrite:y(w.cacheWrite),reasoning:y(w.reasoning),cost:y(w.cost)}}}return{}},v=(w=>{const S={},y=m=>{for(const C of Object.keys(m??{})){const A=m[C];if(A===null||typeof A!="object")continue;const B=S[C]??(S[C]={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0,cost:0,calls:0});B.input+=Number(A.input)||0,B.output+=Number(A.output)||0,B.cacheRead+=Number(A.cacheRead)||0,B.cacheWrite+=Number(A.cacheWrite)||0,B.reasoning+=Number(A.reasoning)||0,B.cost+=Number(A.cost)||0,B.calls+=Number(A.calls)||0}};if(w==="today")y(b(s.today));else for(const m of s.history??[])y(b(m));return Object.entries(S).map(([m,C])=>{const A=m.indexOf(":"),B=(A>0?m.slice(0,A):"deepseek").toLowerCase(),j=A>0?m.slice(A+1):m,T=C.input+C.output+C.cacheRead+C.cacheWrite+C.reasoning,f=C.cacheRead+C.input;return{label:m==="deepseek:legacy"?n("modelStatsLegacy"):B==="deepseek"||B===""?j:Xt(B)+":"+j,...C,tokens:T,cls:ot(B,j,o),hitRate:f>0?C.cacheRead/f:null,cacheUnreported:Ea(C),blended:T>0&&C.cost>0?C.cost/T*1e6:null,perUsd:C.cost>0?T/C.cost:null}}).filter(m=>m.tokens>0||m.cost>0)})(r).sort((w,S)=>S.cost-w.cost||S.tokens-w.tokens),g=w=>(Math.max(0,Math.min(1,w))*100).toFixed(1)+"%",h=v.reduce((w,S)=>Math.max(w,S.cost),0),p=v.reduce((w,S)=>Math.max(w,S.tokens),0),x=v.reduce((w,S)=>Math.max(w,S.perUsd??0),0),N=(w,S)=>e("button",{className:"cm-mstats-tab"+(r===w?" active":""),onClick:()=>l(w)},S),P=w=>w.cls==="plan"?e("span",{className:"cm-plan-tag",title:n("billingClassLabel")},n("billingClassPlan")):null,M=(w,S,y,m,C)=>e("div",{className:"cm-mstats-row"},e("span",{className:"cm-mstats-name"},w,C??null),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar "+y,style:{width:g(S)}})),e("span",{className:"cm-mstats-val"},m));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(i,()=>d(!i),n("modelStatsTitle"))),i?e("div",{className:"cm-collapse-body"},e("div",{className:"cm-mstats-tabs"},N("today",n("modelStatsToday")),N("history",n("modelStatsHistory"))),v.length===0?e("p",{className:"cm-note"},n("modelStatsEmpty")):e(q,null,e("div",{className:"cm-mstats-h"},n("modelStatsCostH")),v.map(w=>e(q,{key:"c:"+w.label},M(w.label,h>0?w.cost/h:0,"cost",$(w.cost,o),e(q,null,P(w),w.cacheUnreported?e("span",{className:"cm-plan-tag",title:n("modelStatsHitUnreportedTip")},"⚠"):null)))),e("div",{className:"cm-mstats-h"},n("modelStatsTokensH")),e("div",{className:"cm-mstats-legend"},e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"var(--dsw-alias-state-business-primary)"}}),n("modelStatsInput")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#ff9800"}}),n("modelStatsCache")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#34a853"}}),n("modelStatsOutput"))),[...v].sort((w,S)=>S.tokens-w.tokens).map(w=>e("div",{className:"cm-mstats-row",key:"t:"+w.label},e("span",{className:"cm-mstats-name"},w.label),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-seg in",style:{width:g(p>0?w.input/p:0)}}),e("div",{className:"cm-mstats-seg cache",style:{width:g(p>0?(w.cacheRead+w.cacheWrite)/p:0)}}),e("div",{className:"cm-mstats-seg out",style:{width:g(p>0?(w.output+w.reasoning)/p:0)}})),e("span",{className:"cm-mstats-val"},H(w.tokens)))),e("div",{className:"cm-mstats-h"},n("modelStatsHitH")),[...v].sort((w,S)=>(S.hitRate??-1)-(w.hitRate??-1)).map(w=>e(q,{key:"h:"+w.label},M(w.label,w.hitRate??0,"hit",w.cacheUnreported?n("modelStatsHitUnreported"):w.hitRate===null?"—":(w.hitRate*100).toFixed(1)+"%",w.cacheUnreported?e("span",{className:"cm-plan-tag",title:n("modelStatsHitUnreportedTip")},"⚠"):null))),e("div",{className:"cm-mstats-h"},n("modelStatsValueH")),[...v].sort((w,S)=>(S.perUsd??-1)-(w.perUsd??-1)).map(w=>e(q,{key:"v:"+w.label},M(w.label,x>0?(w.perUsd??0)/x:0,"value",w.perUsd===null?"—":H(w.perUsd)+" tok/$"+(w.blended!==null?" · "+n("modelStatsBlended",{price:"$"+w.blended.toFixed(2)}):"")))),e("p",{className:"cm-mstats-note"},n("modelStatsNote")))):null)}function _n(t,s){return t==="fiveHour"?s==="en"?"5-hour":"5 小时":t==="weekly"?s==="en"?"This week":"本周":t==="monthly"?s==="en"?"This month":"本月":t==="daily"?s==="en"?"Today":"当日":t}function Wn(t,s){if(t==="go")return"OpenCode Go";const o=Te.find(n=>n.id===t);return o!==void 0?s(o.labelKey):t}const ta=["fiveHour","weekly","monthly","daily"];function zn(t,s){const o=new Map,n=a=>{const r=new Date(a),l=i=>String(i).padStart(2,"0");if(s==="monthly")return r.getFullYear()+"-"+l(r.getMonth()+1);if(s==="weekly"){const i=new Date(r.getFullYear(),r.getMonth(),r.getDate()-(r.getDay()+6)%7);return i.getFullYear()+"-"+l(i.getMonth()+1)+"-"+l(i.getDate())}return r.getFullYear()+"-"+l(r.getMonth()+1)+"-"+l(r.getDate())};for(const a of Object.values(t??{}))for(const r of a??[]){if(r===null||typeof r!="object"||!(r.tokens>0)&&!(r.cost>0))continue;const l=n(Number(r.t1)||Number(r.t0)),i=o.get(l)??{key:l,tokens:0,cost:0,pct:0,intervals:0};i.tokens+=Number(r.tokens)||0,i.cost+=Number(r.cost)||0,i.pct+=Number(r.pct)||0,i.intervals+=1,o.set(l,i)}return[...o.values()].map(a=>({...a,per1Tokens:a.pct>0?a.tokens/a.pct:null,fullTokens:a.pct>0?a.tokens/a.pct*100:null})).sort((a,r)=>a.key<r.key?-1:a.key>r.key?1:0)}function Gn(t){const{state:s,config:o,t:n}=t,[a,r]=O(!1),[l,i]=O("daily"),d=Q(o?.locale),b=s?.planStats,u=b!=null&&typeof b.providers=="object"?b.providers:{},v=Object.keys(u).sort(),g=m=>$(Number(m)||0,o??s?.config),h=m=>m.method==="none"||m.per1Tokens===null?"—":H(m.per1Tokens)+" tok · "+g(m.per1Cost),p=m=>m.method==="none"||m.fullTokens===null?"—":H(m.fullTokens)+" tok · "+g(m.fullCost),x=m=>m.method==="sample"?n("planStatsMethodSample"):m.method==="live"?n("planStatsMethodLive"):n("planStatsMethodNone"),N=m=>{let C=x(m);return m.method==="sample"&&Number(m.sampleAt)>0&&(C=n("planStatsMethodSampleAt",{method:C,time:new Date(Number(m.sampleAt)).toLocaleString(d==="en"?"en-US":"zh-CN")})),(m.method==="sample"||m.method==="live")&&m.confidence==="low"&&(C+=" · "+n("planStatsConfidenceLow")),C},P=([m,C,A])=>e("tr",{key:C+":"+m},e("td",null,_n(m,d)),e("td",{className:"num"},Math.round(A.percent*10)/10+"%"),e("td",{className:"num"},H(A.localTokens)+" tok · "+g(A.localCost)),e("td",{className:"num"},h(A)),e("td",{className:"num"},p(A)),e("td",{className:"num cm-plan-reset"},A.resetsAt.length>0?n("planStatsResets",{time:new Date(A.resetsAt).toLocaleString(d==="en"?"en-US":"zh-CN")}):"—"),e("td",{className:"cm-plan-method"},N(A))),M=a?v.flatMap(m=>Object.entries(u[m]?.intervals??{})).map(([m,C])=>({winKey:m,list:C})):[],w=zn(Object.fromEntries(M.map(m=>[m.winKey,m.list])),l),S=w.reduce((m,C)=>Math.max(m,C.fullTokens??0),0),y=(m,C)=>e("button",{key:m,className:"cm-mstats-tab"+(l===m?" active":""),onClick:()=>i(m)},C);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(a,()=>r(!a),n("planStatsTitle"))),a?e("div",{className:"cm-collapse-body"},v.length===0?e("p",{className:"cm-empty"},n("planStatsEmpty")):e(q,null,v.map(m=>{const C=u[m]?.windows??{},A=[...ta.filter(B=>C[B]!==void 0).map(B=>[B,m,C[B]]),...Object.keys(C).filter(B=>!ta.includes(B)).map(B=>[B,m,C[B]])];return e("div",{key:m,className:"cm-plan-provider"},e("div",{className:"cm-plan-provider-name"},Wn(m,n),e("span",{className:"cm-plan-updated"},(()=>{const B=Number(u[m]?.generatedAt)||Number(b?.generatedAt)||0;return B>0?new Date(B).toLocaleTimeString(d==="en"?"en-US":"zh-CN"):""})())),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("planStatsWindow")),e("th",{className:"num"},n("planStatsPercent")),e("th",null,n("planStatsLocal")),e("th",null,n("planStatsPer1")),e("th",null,n("planStatsFull")),e("th",null,""),e("th",null,""))),e("tbody",null,A.map(P))))}),e("div",{className:"cm-mstats-h",style:{marginTop:"10px"}},n("planStatsCurveTitle")),e("div",{className:"cm-mstats-tabs"},y("daily",n("planStatsDaily")),y("weekly",n("planStatsWeekly")),y("monthly",n("planStatsMonthly"))),w.length===0?e("p",{className:"cm-note"},n("planStatsCurveEmpty")):e(q,null,[...w].reverse().map(m=>e("div",{className:"cm-mstats-row",key:m.key},e("span",{className:"cm-mstats-name"},m.key),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar value",style:{width:(S>0?(m.fullTokens??0)/S*100:0).toFixed(1)+"%"}})),e(X,{label:n("planStatsBarTip",{date:m.key,full:m.fullTokens===null?"—":H(m.fullTokens),per1:m.per1Tokens===null?"—":H(m.per1Tokens),tokens:H(m.tokens),cost:g(m.cost),intervals:m.intervals}),side:"top",delayMs:200},e("span",{className:"cm-mstats-val"},m.fullTokens===null?"—":H(m.fullTokens)))))),e("p",{className:"cm-note"},n("planStatsNote")))):null)}function aa(t){const{provider:s,modelId:o,entry:n,draft:a,setDraft:r,t:l}=t,i=u=>{const v={...a.prices.providers??{}},g=v[s]??{};v[s]={...g,models:u},r({...a,prices:{...a.prices,providers:v}})},d=(u,v)=>{if(a===null)return;const g={...(a.prices.providers??{})[s]?.models??{}};g[o]={...g[o]??{},[u]:Math.max(0,v)},i(g)},b=()=>{if(a===null)return;const u={...(a.prices.providers??{})[s]?.models??{}};delete u[o],i(u)};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},o),e(q,null,n?.unpriced===!0?e("span",{className:"cm-price-legacy"},l("catalogUnpriced")):null,e("button",{className:"cm-btn small danger",onClick:b},l("unmountBtn")))),n?.unpriced===!0?null:e(q,null,e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,l("flatInput")),e("span",null,l("flatCached")),e("span",null,l("flatOutput"))),e("div",{className:"cm-price-row"},e("span",null,"USD"),le({value:n?.input??null,emptyMode:"ignore"},u=>d("input",u)),le({value:n?.cachedInput??null,emptyMode:"ignore"},u=>d("cachedInput",u)),le({value:n?.output??null,emptyMode:"ignore"},u=>d("output",u)))))}const Ee=t=>[e("option",{value:"sidebar"},t("balanceSidebar")),e("option",{value:"settings"},t("balanceSettings")),e("option",{value:"both"},t("balanceBoth")),e("option",{value:"off"},t("off"))],je=t=>t!=null?e("div",{className:"cm-msg "+t.kind},t.text):null;function Kn(t){const{state:s,api:o,t:n,draft:a,setDraft:r}=t,[l,i]=O(!1),[d,b]=O(null),u=s.balance,v=s.config,g=s.reconcile,h=(a?.balance??v.balance??{}).reconcile!==!1,p=M=>{a===null||typeof r!="function"||r({...a,balance:{...a.balance??v.balance??{},reconcile:M.target.checked}})},x=async()=>{if(!l){i(!0),b(null);try{const M=await o.refreshBalance();b({kind:M.ok?"ok":"err",text:M.message})}catch(M){b({kind:"err",text:n("balanceRefreshFailed",{message:M?.message??String(M)})})}finally{i(!1)}}},N=M=>ke(M,v,u?.currency),P=u.status==="ok"?e("div",{className:"cm-bal-line"},e("span",null,n("balanceLine",{total:N(u.totalBalance),granted:N(u.grantedBalance),toppedUp:N(u.toppedUpBalance),time:u.fetchedAt>0?new Date(u.fetchedAt).toLocaleTimeString():"—"}))):u.status==="error"?e("div",{className:"cm-bal-line err"},n("balanceQueryFailedHint",{message:u.message||n("unknownError")})):e("div",{className:"cm-bal-line"},n("balanceNotQueried"));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("accountBalance")),e("button",{className:"cm-btn small",onClick:x,disabled:l},n(l?"refreshing":"refreshBalance"))),P,g!==void 0&&g.ok===!1?e("div",{className:"cm-bal-line warn"},"⚠ "+g.message):null,e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:h,onChange:p}),n("reconcileLabel")),je(d))}function Vn(t){const{state:s,api:o,t:n,draft:a,setDraft:r}=t,l=s.config,i=a?.customBalances??l.customBalances??[],d=g=>{a!==null&&r({...a,customBalances:g,...g.length===0?{customBalance:{...l.customBalance??{},enabled:!1,request:{url:"",headers:{}}}}:{}})},b=(g,h)=>{d(i.map((p,x)=>x===g?{...p,...h}:p))},u=g=>{d(i.filter((h,p)=>p!==g))},v=(g="custom")=>{i.length>=8||d([...i,{...g==="aliyun"?{adapter:g}:{},enabled:!1,label:g==="aliyun"?"千问 / 阿里云":"",labelEn:g==="aliyun"?"Qianwen / Alibaba Cloud":"",display:"both",unit:g==="aliyun"?"CNY":"USD",refreshMinutes:15,request:{url:g==="aliyun"?"https://business.aliyuncs.com/":"",method:g==="aliyun"?"POST":"GET",headers:{}},extract:{},allowedHosts:[]}])};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("customBalanceTitle")),e("button",{className:"cm-btn small",onClick:()=>v(),disabled:i.length>=8},n("customBalanceAdd")),e("button",{className:"cm-btn small",onClick:()=>v("aliyun"),disabled:i.length>=8},n("aliyunBalanceAdd"))),e("p",{className:"cm-note"},n("customBalanceMultiNote")),i.length===0?e("p",{className:"cm-hint"},n("customBalanceEmpty")):i.map((g,h)=>e(Yn,{key:"cbe-"+h,state:s,api:o,t:n,entry:g,index:h,canRemove:!0,onPatch:p=>b(h,p),onRemove:()=>u(h)})))}function Yn(t){const{state:s,api:o,t:n,entry:a,index:r,canRemove:l,onPatch:i,onRemove:d}=t,b=a.adapter==="aliyun",[u,v]=O(!1),[g,h]=O(null),[p,x]=O(!1),[N,P]=O(()=>JSON.stringify(a.request?.headers??{},null,2)),[M,w]=O(()=>JSON.stringify(a.extract??{},null,2)),[S,y]=O(()=>(a.allowedHosts??[]).join(", ")),[m,C]=O({headers:"",extract:""}),A=Ce(!1),B=s.config,T=(Array.isArray(s.customBalances)?s.customBalances:[]).find(k=>k.index===r)??null,f=a.enabled===!0,L=()=>{x(k=>!k)};oe(()=>{p&&!A.current&&(P(JSON.stringify(a.request?.headers??{},null,2)),w(JSON.stringify(a.extract??{},null,2)),y((a.allowedHosts??[]).join(", ")),C({headers:"",extract:""})),A.current=p},[p]);const J=(k,D)=>i({[k]:D}),re=(k,D)=>i({request:{...a.request??{},[k]:D}}),R=(()=>{if(b)return["ALIBABA_CLOUD_ACCESS_KEY_ID","ALIBABA_CLOUD_ACCESS_KEY_SECRET","ALIBABA_CLOUD_SECURITY_TOKEN"];const k=new Set,D=[];for(const G of Object.values(a.request?.headers??{}))if(typeof G=="string")for(const F of G.matchAll(/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/g))k.has(F[1])||(k.add(F[1]),D.push(F[1]));return D})(),E=k=>{P(k);try{const D=JSON.parse(k);if(D===null||typeof D!="object"||Array.isArray(D))throw new Error("invalid");if(Object.values(D).some(G=>typeof G!="string"))throw new Error("invalid");C(G=>({...G,headers:""})),re("headers",D)}catch{C(D=>({...D,headers:n("customBalanceInvalidJson")}))}},_=k=>{y(k);const D=k.split(/[\s,;]+/).map(G=>G.trim()).filter(G=>G.length>0);J("allowedHosts",D)},I=k=>{w(k);try{const D=JSON.parse(k);if(D===null||typeof D!="object"||Array.isArray(D))throw new Error("invalid");C(G=>({...G,extract:""})),J("extract",D)}catch{C(D=>({...D,extract:n("customBalanceInvalidJson")}))}},ee=async()=>{const k=(B.customBalances??[])[r];if(!(u||k?.enabled!==!0)){v(!0),h(null);try{const D=await o.refreshCustomBalance(r);h({kind:D.ok?"ok":"err",text:D.message})}catch(D){h({kind:"err",text:n("customBalanceRefreshFailed",{message:D?.message??String(D)})})}finally{v(!1)}}},ne=T!==null&&T.status==="ok"?e(q,null,B.balance?.showProgressBar===!0?e("div",{className:"cm-budget",style:{marginTop:"8px"}},e(ut,{segments:dt(s,B,T,a),direction:ae(B,"balance")}),e("div",{className:"cm-bal-line"},mt(T,B,n,s,a))):e("div",{className:"cm-bal-line"},n("customBalanceRemaining",{amount:ve(T.remaining,B,T,a)}))):T!==null&&T.status==="error"?e("div",{className:"cm-bal-line err"},T.message||n("unknownError")):e("div",{className:"cm-bal-line"},T?.message||n("balanceNotQueried")),c=p?e(q,null,e("p",{className:"cm-note"},n(b?"aliyunBalanceNote":"customBalanceConfigNote")),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",null,n("customBalanceLabelZh")),e("input",{className:"cm-input",value:a.label??"",onChange:k=>J("label",k.target.value)})),e("div",{className:"cm-field"},e("label",null,n("customBalanceLabelEn")),e("input",{className:"cm-input",value:a.labelEn??"",onChange:k=>J("labelEn",k.target.value)})),!b&&e("div",{className:"cm-field"},e("label",null,n("customBalanceUnitLabel")),e("select",{className:"cm-input",value:a.unit==="CNY"||a.unit==="EUR"?a.unit:"USD",onChange:k=>J("unit",k.target.value)},e("option",{value:"USD"},"USD ($)"),e("option",{value:"CNY"},"CNY (¥)"),e("option",{value:"EUR"},"EUR (€)"))),e("div",{className:"cm-field"},e("label",null,n("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:a.display??"both",onChange:k=>J("display",k.target.value)},...Ee(n))),e("div",{className:"cm-field"},e("label",null,n("customBalanceRefreshInterval")),le({value:a.refreshMinutes??15},k=>J("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(k)))))),!b&&e("div",{className:"cm-field"},e("label",null,n("customBalanceMethod")),e("select",{className:"cm-input",value:a.request?.method??"GET",onChange:k=>re("method",k.target.value)},e("option",{value:"GET"},"GET"),e("option",{value:"POST"},"POST"))),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceUrl")),e("input",{className:"cm-input",value:a.request?.url??"",placeholder:"https://example.com/key/info",onChange:k=>re("url",k.target.value)})),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceHeaders")),e("span",{className:"cm-hint"},n("customBalanceHeadersVarNote")),e("textarea",{className:"cm-input",rows:5,value:N,onChange:k=>E(k.target.value)}),m.headers?e("span",{className:"cm-hint err"},m.headers):null),e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceCredentialsTitle")),R.length>0?e(q,null,!b&&e("span",{className:"cm-hint"},n("customBalanceCredentialsHint")),R.map(k=>e(Pe,{key:"cb-var-"+k,target:"customVar:"+k,configured:(s.customVarStatus?.[k]?.configured??!1)===!0,source:s.customVarStatus?.[k]?.source??"",t:n,api:o,placeholder:"{{"+k+"}}"}))):e("span",{className:"cm-hint"},n("customBalanceNoPlaceholders"))),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceAllowedHosts")),e("input",{className:"cm-input",value:S,placeholder:"api.example.com, relay.example.org",onChange:k=>_(k.target.value)}),e("span",{className:"cm-hint"},n("customBalanceAllowedHostsHint"))),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceExtract")),e("textarea",{className:"cm-input",rows:8,value:M,onChange:k=>I(k.target.value)}),m.extract?e("span",{className:"cm-hint err"},m.extract):null))):e("p",{className:"cm-note cm-collapsed-note"},ze(a,Q(B?.locale))||n("customBalanceTitle"));return e("div",{className:"cm-budget",style:{marginTop:"10px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},`#${r+1} · `+(ze(a,Q(B?.locale))||n("customBalanceTitle"))),e("button",{className:"cm-toggle-btn",onClick:L},n(p?"customBalanceCollapseConfig":"customBalanceOpenConfig")),e("button",{className:"cm-btn small",onClick:ee,disabled:u||f===!1},n(u?"refreshing":"refreshCustomBalance")),l?e("button",{className:"cm-btn small",onClick:d},n("customBalanceRemove")):null),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:f===!0,onChange:k=>J("enabled",k.target.checked)}),e("span",null,n("enable"))),ne,c,je(g))}function Jn(t){const{state:s,api:o,t:n,draft:a,setDraft:r}=t,[l,i]=O(!1),[d,b]=O(null),u=s.goQuota,v=s.config,g=a?.goQuota?.enabled??v.goQuota?.enabled??!0,h=(y,m)=>{a!==null&&r({...a,goQuota:{...a.goQuota??v.goQuota,[y]:m}})},p=async()=>{if(!(l||g===!1)){i(!0),b(null);try{const y=await o.refreshGoQuota();b({kind:y.ok?"ok":"err",text:y.message})}catch(y){b({kind:"err",text:n("syncFailed",{message:y?.message??String(y)})})}finally{i(!1)}}},x=v.goQuota?.main==="weekly"||v.goQuota?.main==="monthly"?v.goQuota.main:"rolling",N=[x,...["rolling","weekly","monthly"].filter(y=>y!==x)],P=y=>y==="rolling"?"goWindowRolling":y==="weekly"?"goWindowWeekly":"goWindowMonthly",M=y=>y==="rolling"?u.rolling:y==="weekly"?u.weekly:u.monthly,w=(y,m,C)=>{const A=m!==null&&typeof m=="object"&&typeof m.percent=="number",B=A?Math.max(0,Math.min(100,Number(m.percent)||0)):null,j=ce(B,ae(v,"go")),T=A&&typeof m.resetsAt=="string"&&m.resetsAt.length>0?n("goResetAt",{time:new Date(m.resetsAt).toLocaleString()}):"";return e("div",{className:"cm-go-row"+(C?" main":"")},e("span",{className:"cm-go-label"},n(y)),e("div",{className:"cm-go-bar"},B===null?null:e("div",{className:"cm-go-fill",style:{width:j.width+"%"}})),e("span",{className:"cm-go-num"},j.label===null?"—":n("goQuotaPercent",{percent:String(Math.round(j.label))})),T?e("span",{className:"cm-go-reset"},T):null)},S=g===!1?e("p",{className:"cm-note"},n("goQuotaDisabledNote")):u.status==="ok"?e("div",{className:"cm-go-list"},N.map(y=>w(P(y),M(y),y===x)),e("div",{className:"cm-go-time"},n("goQuotaFetchedAt",{time:u.fetchedAt>0?new Date(u.fetchedAt).toLocaleTimeString():"—"}))):u.status==="error"?e("div",{className:"cm-bal-line err"},u.message||n("unknownError")):u.status==="off"&&u.message?e("p",{className:"cm-note"},u.message):e("div",{className:"cm-bal-line"},n("goQuotaNotQueried"));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("goQuotaTitle")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:g===!0,onChange:y=>h("enabled",y.target.checked)}),e("span",null,n("enableGoQuota"))),e("button",{className:"cm-btn small",onClick:p,disabled:l||g===!1},n(l?"refreshing":"refreshGoQuota"))),S,je(d))}const $n=(t,s)=>{if(typeof t?.keyVar=="string"&&t.keyVar.length>0)return t.keyVar;const n="CLIPROXYAPI_MANAGEMENT_KEY_"+(String(t?.id??"").toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"GATEWAY");return Object.keys(s??{}).find(a=>a===n||a.startsWith(n+"_"))??n};function Zn(t){const{state:s,api:o,t:n,draft:a,setDraft:r}=t,[l,i]=O(null),[d,b]=O({}),[u,v]=O({}),g=s.config,p=(a??g).gatewayQuotas?.sources??[],x=Array.isArray(s.gatewayQuotas)?s.gatewayQuotas:[],N=T=>{a!==null&&r({...a,gatewayQuotas:{...a.gatewayQuotas??g.gatewayQuotas??{},sources:T}})},P=(T,f)=>N(p.map((L,J)=>J===T?{...L,...f}:L)),M=T=>v(f=>({...f,[T]:f[T]!==!0})),w=async T=>{if(l!==null)return;const f=(g.gatewayQuotas?.sources??[]).find(L=>L.id===T);if(!(!f||f.enabled!==!0||f.display==="off")){i(T),b(L=>({...L,[T]:null}));try{const L=await o.refreshGatewayQuota(T);b(J=>({...J,[T]:{kind:L.ok?"ok":"err",text:L.message}}))}catch(L){b(J=>({...J,[T]:{kind:"err",text:L?.message??String(L)}}))}finally{i(null)}}},S=()=>{if(p.length>=4)return;const T="gateway-"+Date.now().toString(36);v(f=>({...f,[T]:!0})),N([...p,{id:T,type:"cliproxyapi",label:"CLIProxyAPI",baseURL:"http://127.0.0.1:8317",enabled:!1,display:"both",refreshMinutes:15,includeProviders:at,allowedHosts:[],allowInsecureHttp:!1}])},y=(T,f,L)=>e("div",{className:"cm-field"},e("label",null,T),e("input",{className:"cm-input",value:f??"",onChange:L})),m=(T,f)=>{const L=Oe(T?.label||T?.id||n("gatewaySourceUnknown"),T,ae(g,"plan"),n);return e(q,{key:T?.id||f},L.row,T?.resetsAt?e("div",{className:"cm-note"},Le(T,n)):null)},C=T=>e("div",{className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},T.label||"package"),e("span",{className:"cm-bbox-pct cm-num"},(T.used??"—")+" / "+(T.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(T.remaining??"—")+" remaining")),A=T=>T==null?null:e(q,null,e("div",{className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},T.unit||"credits"),e("span",{className:"cm-bbox-pct cm-num"},(T.used??"—")+" / "+(T.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(T.remaining??"—")+" remaining")),(T.packages??[]).map(C)),B=(T,f)=>e("div",{key:T.id||f,className:"cm-budget",style:{marginTop:"8px",padding:"10px 12px"}},e("div",{className:"cm-budget-head"},e("strong",null,(Pt[T.provider]??T.provider??n("gatewaySourceUnknown"))+" · "+(T.label||n("gatewaySourceUnknown"))),e("span",{className:"cm-hint"},T.status)),T.plan?e("div",{className:"cm-note"},T.plan):null,T.windows.length>0?e("div",{className:"cm-go-list"},T.windows.map(m)):null,A(T.credits),T.message?e("div",{className:"cm-note"},T.message):null),j=(T,f)=>{const L=x.find(R=>R.id===T.id)??{id:T.id,status:"off",accounts:[],unsupportedProviders:[]},J=$n(T,s.customVarStatus),re=u[T.id]===!0;return e("div",{key:T.id||f,className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(re,()=>M(T.id),T.label||T.id||n("gatewayQuotaTitle")),re?null:e("span",{className:"cm-hint"},L.status??n("gatewaySourceUnknown")),e("button",{className:"cm-btn small",onClick:()=>w(T.id),disabled:l!==null||T.enabled!==!0},l===T.id?n("gatewaySourceRefreshing"):n("refreshGoQuota")),e("button",{className:"cm-btn small",onClick:()=>N(p.filter((R,E)=>E!==f))},n("gatewaySourceRemove"))),re?e("div",{className:"cm-collapse-body"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:T.enabled===!0,onChange:R=>P(f,{enabled:R.target.checked})}),n("gatewaySourceEnabled")),e("div",{className:"cm-grid"},y(n("gatewaySourceLabel"),T.label,R=>P(f,{label:R.target.value})),y(n("gatewaySourceBaseURL"),T.baseURL,R=>P(f,{baseURL:R.target.value})),e("div",{className:"cm-field"},e("label",null,n("gatewaySourceDisplay")),e("select",{className:"cm-input",value:T.display??"both",onChange:R=>P(f,{display:R.target.value})},...Ee(n))),y(n("gatewaySourceAllowlist"),(T.allowedHosts??[]).join(", "),R=>P(f,{allowedHosts:R.target.value.split(/[\s,;]+/).filter(Boolean)}))),J?e("div",{className:"cm-field"},e("label",null,n("gatewaySourceCredential")),e(Pe,{target:"customVar:"+J,configured:s.customVarStatus?.[J]?.configured===!0,source:s.customVarStatus?.[J]?.source??"",t:n,api:o,placeholder:J})):null,e("div",{className:"cm-note"},n("gatewaySourceStatus")+": "+(L.status??n("gatewaySourceUnknown"))+(L.serverVersion?" · "+L.serverVersion:"")+(L.fetchedAt>0?" · "+n("gatewaySourceFetchedAt",{time:new Date(L.fetchedAt).toLocaleTimeString()}):"")+(L.message?" · "+L.message:"")),L.unsupportedProviders.length>0?e("div",{className:"cm-note"},n("gatewaySourceUnsupported")+": "+L.unsupportedProviders.join(", ")):null,L.accounts.length>0?L.accounts.map(B):e("div",{className:"cm-bal-line"},n("gatewaySourceNoAccounts")),d[T.id]?e("div",{className:"cm-msg "+d[T.id].kind},d[T.id].text):null):null)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("gatewayQuotaTitle")),e("button",{className:"cm-btn small",onClick:S,disabled:p.length>=4},n("gatewaySourceAdd")),e("button",{className:"cm-btn small",onClick:()=>o.refreshGatewayQuota(),disabled:l!==null||p.length===0},n(l===null?"refreshGoQuota":"gatewaySourceRefreshing"))),e("p",{className:"cm-note"},n("gatewayQuotaNote")),p.length===0?e("p",{className:"cm-hint"},n("gatewaySourceEmpty")):p.map(j))}const Te=[{id:"anthropic",labelKey:"codingPlanAnthropic"},{id:"zai",labelKey:"codingPlanZai"},{id:"minimax",labelKey:"codingPlanMinimax"},{id:"kimi",labelKey:"codingPlanKimi"},{id:"openrouter",labelKey:"codingPlanOpenrouter"},{id:"siliconflow",labelKey:"codingPlanSiliconflow"},{id:"commandcode",labelKey:"codingPlanCommandcode"},{id:"scnet",labelKey:"codingPlanScnet"},{id:"volcengine",labelKey:"codingPlanVolcengine"},{id:"qwen",labelKey:"codingPlanQwen"}],na="dsh-cost-meter.codingPlans.open";function Xn(){try{return window.localStorage.getItem(na)==="1"}catch{return!1}}function es(t){const{state:s,api:o,t:n,draft:a,setDraft:r}=t,[l,i]=O(null),[d,b]=O({}),[u,v]=O(Xn),g=()=>{v(R=>{const E=!R;try{window.localStorage.setItem(na,E?"1":"0")}catch{}return E})},h=s.codingPlans??{},p=s.config,x=R=>a?.codingPlans?.[R]??p.codingPlans?.[R]??{},N=R=>h[R]??{status:"off",message:"",fetchedAt:0,windows:{}},P=(R,E,_)=>{if(a===null)return;const I=a.codingPlans??p.codingPlans??{};r({...a,codingPlans:{...I,[R]:{...I[R]??{},[E]:_}}})},[M,w]=O(""),[S,y]=O({}),m=R=>R?.rates!==null&&typeof R?.rates=="object"&&!Array.isArray(R.rates)?R.rates:{},C=["input","cachedInput","output"],A=R=>S[R]??m(x("qwen"))[R]??{},B=R=>C.every(E=>Number.isFinite(Number(R[E]))&&Number(R[E])>0),j=(R,E,_)=>{if(a===null)return;const I={...A(R),[E]:String(_)};y(k=>({...k,[R]:I}));const ee=C.every(k=>String(I[k]??"").trim()==="");if(!ee&&!B(I))return;const ne=a.codingPlans??p.codingPlans??{},c={...(ne.qwen??{}).rates??{}};ee?delete c[R]:c[R]=Object.fromEntries(C.map(k=>[k,Number(I[k])])),r({...a,codingPlans:{...ne,qwen:{...ne.qwen??{},rates:c}}})},T=R=>{a!==null&&y(E=>({...E,[R]:E[R]??m(x("qwen"))[R]??{}}))},f=R=>{if(a===null)return;y(I=>{const ee={...I};return delete ee[R],ee});const E=a.codingPlans??p.codingPlans??{},_={...(E.qwen??{}).rates??{}};delete _[R],r({...a,codingPlans:{...E,qwen:{...E.qwen??{},rates:_}}})},L=async R=>{if(l===null){i(R),b(E=>({...E,[R]:null}));try{const E=await o.refreshCodingPlan(R);b(_=>({..._,[R]:{kind:E.ok?"ok":"err",text:E.message}}))}catch(E){b(_=>({..._,[R]:{kind:"err",text:n("syncFailed",{message:E?.message??String(E)})}}))}finally{i(null)}}},J=(R,E)=>{if(typeof E?.percent!="number")return e("div",{className:"cm-go-row"},e("span",{className:"cm-go-label"},R.replace(/_/g," ")),e("span",{className:"cm-go-num"},typeof E?.text=="string"?E.text:"—"));const _=E?Math.max(0,Math.min(100,Number(E.percent)||0)):0,I=ce(_,ae(p,"plan")),ee=E&&typeof E.resetsAt=="string"&&E.resetsAt.length>0?n("goResetAt",{time:new Date(E.resetsAt).toLocaleString()}):"";return e("div",{className:"cm-go-row"},e("span",{className:"cm-go-label"},R.replace(/_/g," ")),e("div",{className:"cm-go-bar"},e("div",{className:"cm-go-fill",style:{width:I.width+"%"}})),e("span",{className:"cm-go-num"},n("goQuotaPercent",{percent:String(Math.round(I.label))})),ee?e("span",{className:"cm-go-reset"},ee):null)},re=({id:R,labelKey:E})=>{const _=x(R),I=N(R),ee=_.enabled===!0,ne=I.windows!==null&&typeof I.windows=="object"?I.windows:{},c=ee===!1?e("p",{className:"cm-note"},n("codingPlanDisabledNote")):I.status==="ok"?e("div",{className:"cm-go-list"},Object.keys(ne).length>0?R==="minimax"&&(Re(ne).five!=null||Re(ne).seven!=null)?e(Yt,{five:Re(ne).five,seven:Re(ne).seven,fetchedAt:I.fetchedAt,t:n,wide:!0,direction:ae(p,"plan")}):Object.entries(ne).map(([k,D])=>J(k,D)):e("div",{className:"cm-bal-line"},n("codingPlanNotQueried")),e("div",{className:"cm-go-time"},n("goQuotaFetchedAt",{time:I.fetchedAt>0?new Date(I.fetchedAt).toLocaleTimeString():"—"}))):I.status==="error"?e("div",{className:"cm-bal-line err"},I.message||n("unknownError")):I.status==="off"&&I.message?e("p",{className:"cm-note"},I.message):e("div",{className:"cm-bal-line"},n("codingPlanNotQueried"));return e("div",{key:R,className:"cm-budget",style:{marginTop:"8px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n(E)),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:ee,onChange:k=>P(R,"enabled",k.target.checked)}),e("span",null,n("enableCodingPlan"))),e("button",{className:"cm-btn small",onClick:()=>{L(R)},disabled:l!==null||ee===!1},n(l===R?"refreshing":"refreshCodingPlan"))),ee?e("div",{className:"cm-field"},e("label",null,n("codingPlanDisplayLabel")),e("select",{className:"cm-input",value:typeof _.display=="string"?_.display:R==="minimax"?"both":"settings",onChange:k=>P(R,"display",k.target.value)},e("option",{value:"sidebar"},n("balanceSidebar")),e("option",{value:"settings"},n("balanceSettings")),e("option",{value:"both"},n("balanceBoth")),e("option",{value:"off"},n("off"))),e("span",{className:"cm-hint"},n("codingPlanDisplayNote"))):null,ee&&R!=="scnet"&&R!=="qwen"?e("div",{className:"cm-field"},e("label",null,n("codingPlanRefreshIntervalLabel")),le({value:typeof _.refreshMinutes=="number"&&Number.isFinite(_.refreshMinutes)&&_.refreshMinutes>0?_.refreshMinutes:15},k=>{P(R,"refreshMinutes",Math.min(1440,Math.max(1,Math.floor(k))))})):null,ee?R==="scnet"||R==="qwen"?e(q,null,e("div",{className:"cm-field"},e("label",null,n(R==="qwen"?"qwenPlanCreditsLabel":"scnetPlanCreditsLabel")),e("input",{className:"cm-input",type:"number",min:"1",step:"1000",value:typeof _.planCredits=="number"&&Number.isFinite(_.planCredits)&&_.planCredits>0?_.planCredits:R==="qwen"?5e5:24e4,onChange:k=>{const D=Number(k.target.value);Number.isFinite(D)&&D>0&&P(R,"planCredits",Math.floor(D))}})),e("div",{className:"cm-field"},e("label",null,n(R==="qwen"?"qwenPlanStartLabel":"scnetPlanStartLabel")),e("input",{className:"cm-input",type:"date",value:typeof _.planStart=="string"?_.planStart:"",onChange:k=>P(R,"planStart",k.target.value)})),R==="qwen"?e(q,null,e("div",{className:"cm-field"},e("label",null,n("qwenRatesLabel"))),[...new Set([...Object.keys(m(_)),...Object.keys(S)])].sort().map(k=>e("div",{key:k,className:"cm-match-row"},e("span",{style:{minWidth:"120px"}},k),C.map(D=>e("input",{key:D,className:"cm-input narrow",type:"number",min:"0",step:"0.1",value:A(k)[D]??"",placeholder:n("qwenRate_"+D),"aria-label":k+" · "+n("qwenRate_"+D),onChange:G=>{const F=G.target.value;j(k,D,F)}})),e("button",{className:"cm-btn small",onClick:()=>f(k)},n("overrideRemove")),k in S&&!B(A(k))?e("span",{className:"cm-note"},n("qwenRateDraftNote")):null)),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:n("qwenRatesModelPlaceholder"),value:M,onChange:k=>w(k.target.value)}),e("button",{className:"cm-btn small",onClick:()=>{const k=M.trim();k.length!==0&&(T(k),w(""))},disabled:M.trim().length===0},n("qwenRatesAdd")))):null,e("p",{className:"cm-note"},n(R==="qwen"?"qwenLocalNote":"scnetLocalNote"))):R==="volcengine"?e(q,null,e("div",{className:"cm-field"},e("label",null,n("volcengineAccessKeyIdLabel"))),e(Pe,{target:"codingPlans.volcengine.ak",configured:I.keyConfigured===!0,source:I.keySource,t:n,api:o,placeholder:n("volcengineAccessKeyPlaceholder")}),e("div",{className:"cm-field"},e("label",null,n("volcengineSecretAccessKeyLabel"))),e(Pe,{target:"codingPlans.volcengine.sk",configured:I.keyConfigured===!0,source:I.keySource,t:n,api:o,placeholder:n("volcengineSecretPlaceholder")}),e("p",{className:"cm-note"},n("volcengineNote"))):e(q,null,e("div",{className:"cm-field"},e("label",null,n("codingPlanKeyLabel"))),e(Pe,{target:"codingPlans."+R,configured:I.keyConfigured===!0,source:I.keySource,t:n,api:o,placeholder:"sk-…"})):null,c,d[R]!=null?e("div",{className:"cm-msg "+d[R].kind},d[R].text):null)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("codingPlansTitle")),e("button",{className:"cm-toggle-btn",onClick:g},n(u?"codingPlansCollapse":"codingPlansOpen"))),u?e(q,null,e("p",{className:"cm-note"},n("codingPlansNote")),Te.map(re)):e("p",{className:"cm-note cm-collapsed-note"},n("codingPlansCollapsedHint")))}const ts=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],sa=t=>(t.input??0)+(t.output??0)+(t.cacheRead??0)+(t.cacheWrite??0);function wt(t){const s=t.useCost?t.useCost(S=>S):void 0,o=t.state??s?.state;if(!o)return null;const n=o.config,a=Q(n?.locale),r=t.t??V(a),l=Array.isArray(o.history)?o.history:[];if(l.length===0)return e("div",null,e("h3",{className:"cm-h"},r("usageTitle")),e("p",{className:"cm-empty"},r("usageEmpty")));const i=o.meta?.dayKey??"",d=new Map(l.map(S=>[S.date,S])),b=S=>{const y=m=>String(m).padStart(2,"0");return S.getFullYear()+"-"+y(S.getMonth()+1)+"-"+y(S.getDate())},u=new Date;u.setHours(0,0,0,0);const v=new Date(u);v.setDate(v.getDate()+(6-(u.getDay()+6)%7));const g=26,h=[],p=[];let x=-1;for(let S=g-1;S>=0;S-=1){for(let m=0;m<7;m+=1){const C=new Date(v);C.setDate(C.getDate()-(S*7+(6-m)));const A=d.get(b(C));h.push(A!==void 0?{day:A,tokens:sa(A)}:{day:{date:b(C)},tokens:0})}const y=new Date(v);y.setDate(y.getDate()-(S*7+6)),p.push(y.getMonth()!==x?a==="en"?ts[y.getMonth()]:String(y.getMonth()+1)+"月":""),x=y.getMonth()}const N=Math.max(...h.map(S=>S.tokens),1),P=S=>{const y=S/N;return y<.25?1:y<.5?2:y<.75?3:4},M=S=>{const{day:y,tokens:m}=S,C="cm-ug-cell"+(m>0?" l"+P(m):"")+(y.date===i?" today":""),A=r("usageDay",{date:y.date,tokens:H(m),input:H(y.input??0),cache:H((y.cacheRead??0)+(y.cacheWrite??0)),output:H(y.output??0),calls:y.calls??0,cost:$(z(y,n),n)});return e(X,{key:y.date,label:A,side:"top",delayMs:200},e("div",{className:C}))},w=o.total;return e("div",{className:"cm-ug"},e("h3",{className:"cm-h"},r("usageTitle")),e("div",{className:"cm-ug-total"},r("usageTotal",{tokens:H(sa(w)),input:H(w.input??0),cache:H((w.cacheRead??0)+(w.cacheWrite??0)),output:H(w.output??0),calls:w.calls??0})),e("div",{className:"cm-ug-grid",style:{gridTemplateColumns:"repeat("+g+",1fr)"}},h.map(M)),e("div",{className:"cm-ug-months",style:{gridTemplateColumns:"repeat("+g+",1fr)"}},p.map((S,y)=>e("span",{key:"m"+String(y),className:"cm-ug-monthc"},S))))}function as(t){const s=t.useCost?t.useCost(c=>c):void 0,o=t.api,n=s?.state??null,[a,r]=O(null),[l,i]=O(null),[d,b]=O(!1),[u,v]=O(!1),[g,h]=O(!1),[p,x]=O(""),[N,P]=O(!1),[M,w]=O(!1),[S,y]=O("overview"),[m,C]=O({status:"idle",at:0,error:null}),A=De.useRef(null),B=De.useRef(null),j=De.useRef(null);oe(()=>{if(n!==null){const c=JSON.stringify(n.config);r(k=>{const D=k!==null&&JSON.stringify(k)!==A.current;return D||(B.current=n.config,j.current=n.config),D?k:JSON.parse(c)}),A.current=c}},[n]),oe(()=>{a!==null&&j.current===null&&B.current!==null&&(j.current=B.current)},[a]),oe(()=>{if(a===null||o===void 0)return;const c=JSON.stringify(a);if(c===A.current)return;C(D=>D.status==="saving"?D:{...D,status:"saving"});const k=setTimeout(()=>{const D={},G=j.current??B.current;if(G!==null&&typeof G=="object")for(const F of Object.keys(a))JSON.stringify(a[F])!==JSON.stringify(G[F])&&(D[F]=a[F]);if(Object.keys(D).length===0){A.current=c,C({status:"saved",at:Date.now(),error:null});return}o.updateConfig(D).then(()=>{A.current=c,G!==null&&typeof G=="object"&&(j.current={...G,...D}),C({status:"saved",at:Date.now(),error:null})},F=>{C({status:"error",at:0,error:F?.message??String(F)})})},600);return()=>{clearTimeout(k)}},[a,o]),oe(()=>{s?.status==="error"&&s.error&&i({kind:"err",text:f("ledgerReadFailed",{message:s.error})})},[s?.status,s?.error]);const T=Q((a??n?.config)?.locale),f=V(T);if(s===void 0||n===null)return e("div",{className:"cm-section"},e("p",{className:"cm-empty"},s?.status==="loading"?f("readingLedger"):f("ledgerUnavailable")));const L=n.config,J=async()=>{if(!N){P(!0),i(null);try{const c=await o.fetchPrices();if(i({kind:c.ok?"ok":"err",text:c.message}),c.ok&&c.state&&typeof c.state.config=="object"){const k=JSON.stringify(c.state.config);r(JSON.parse(k)),A.current=k}}catch(c){i({kind:"err",text:f("syncFailed",{message:c?.message??String(c)})})}finally{P(!1),b(!1)}}},re=async()=>{if(!N){P(!0);try{await o.resetHistory(),i({kind:"ok",text:f("historyCleared")})}catch(c){i({kind:"err",text:f("clearFailed",{message:c?.message??String(c)})})}finally{P(!1),v(!1)}}},R=async()=>{if(!N){P(!0),i(null);try{const c=await o.importLegacyHistory();i({kind:"ok",text:c.message})}catch(c){i({kind:"err",text:f("legacyImportFailed",{message:c?.message??String(c)})})}finally{P(!1),h(!1)}}},E=(c,k)=>{a!==null&&r({...a,[c]:k})},_=()=>{if(a===null)return;const c=p.trim().toLowerCase();if(c.length===0||!/^[a-z0-9_.-]+$/.test(c)||a?.prices.models[c]!==void 0)return;const k={...a.prices.models,[c]:{cacheHit:0,cacheMiss:0,output:0}};r({...a,prices:{...a.prices,models:k}}),x("")},I=a===null?[]:Object.keys(a.prices.models).filter(c=>{const D=(a?.priceTableDisplay??L.priceTableDisplay??{})["deepseek:"+c];return typeof D=="boolean"?D:!0}).map(c=>e(kt,{key:c,modelId:c,entry:a.prices.models[c]??{cacheHit:0,cacheMiss:0,output:0},isDefault:!1,draft:a,setDraft:r,t:f})),ee=[["overview",f("tabOverview")],["quotas",f("tabQuotas")],["usage",f("tabUsage")],["pricing",f("tabPricing")],["display",f("tabDisplay")]],ne=m.status==="saving"?e("span",{className:"cm-hint"},f("saving")):m.status==="error"?e("span",{className:"cm-msg err"},f("autoSaveFailed",{message:m.error??""})):e("span",{className:"cm-hint"},m.status==="saved"?f("autoSavedAt",{time:new Date(m.at).toLocaleTimeString()}):f("autoSaveHint"));return e("div",{className:"cm-section"},e("div",{className:"cm-tabs-row"},e("div",{className:"cm-tabs",role:"tablist"},ee.map(([c,k])=>e("button",{key:c,type:"button",role:"tab","aria-selected":String(S===c),className:"cm-tab"+(S===c?" active":""),onClick:()=>y(c)},k))),ne),je(l),S==="overview"?e(q,{key:"overview"},e("div",{className:"cm-cards"},L.hideTodayCost===!0?null:e(ht,{title:f("cardToday"),value:$(z(n.today,L),L),sub:f("callsTokens",{calls:n.today.calls,input:H(n.today.input),cache:H(n.today.cacheRead+n.today.cacheWrite),output:H(n.today.output)})}),e(ht,{title:f("cardMonth"),value:$(z(n.month,L),L),sub:f("callsTokens",{calls:n.month.calls,input:H(n.month.input),cache:H(n.month.cacheRead+n.month.cacheWrite),output:H(n.month.output)})}),e(ht,{title:f("cardTotal"),value:$(z(n.total,L),L),sub:f("cardTotalSub",{calls:n.total.calls})})),e("p",{className:"cm-note",key:"cards-footnote"},f("cardsFootnote")),(()=>{const c=Qa(n);return c!==null?e("p",{className:"cm-note",key:"tz-hint"},f("timezoneHint",{host:c.hostLabel,browser:c.browserLabel})):null})(),e("label",{className:"cm-cards-toggle",title:f("cardsTogglePlanTotalHint")},e("input",{type:"checkbox",checked:(a??L).showTotalWithPlan===!0,onChange:c=>{const k=a??L;k!=null&&r({...k,showTotalWithPlan:c.target.checked})}}),e("span",null,f("cardsTogglePlanTotal"))),e("div",null,e("h3",{className:"cm-h"},f("todaySessions")),e(jn,{state:n,t:f})),e(Hn,{state:n,draft:a,setDraft:r,t:f}),(L.balance?.display==="settings"||L.balance?.display==="both")&&L.hideOfficialBalance!==!0?e(Kn,{state:n,api:o,t:f,draft:a,setDraft:r}):null):null,S==="quotas"?e(q,{key:"quotas"},e(Zn,{state:n,api:o,t:f,draft:a,setDraft:r}),e(Jn,{state:n,api:o,t:f,draft:a,setDraft:r}),e(es,{state:n,api:o,t:f,draft:a,setDraft:r}),e(Vn,{state:n,api:o,t:f,draft:a,setDraft:r})):null,S==="usage"?e(q,{key:"usage"},!qe||(L.usage?.position??"cost")==="cost"?e(wt,{state:n,t:f,locale:T}):null,e(Fn,{state:n,config:a??L,t:f}),e(Gn,{state:n,config:a??L,t:f}),e(Ln,{state:n,api:o}),e(En,{state:n,api:o}),e("div",null,e("h3",{className:"cm-h"},f("historyDataTitle")),e("div",{className:"cm-buttons"},g?e(q,null,e("span",{className:"cm-hint"},f("confirmImportLegacy")),e("button",{className:"cm-btn",onClick:R,disabled:N},f("apply")),e("button",{className:"cm-btn",onClick:()=>h(!1)},f("cancel"))):e("button",{className:"cm-btn",onClick:()=>h(!0),disabled:N},f("importLegacy")),u?e(q,null,e("span",{className:"cm-hint"},f("confirmReset")),e("button",{className:"cm-btn danger",onClick:re,disabled:N},f("confirmClear")),e("button",{className:"cm-btn",onClick:()=>v(!1)},f("cancel"))):e("button",{className:"cm-btn danger",onClick:()=>v(!0),disabled:N},f("clearAllHistory"))),e("p",{className:"cm-note"},f("legacyImportNote")))):null,S==="display"?e(q,{key:"display"},n?.secretMigration?.pending?.length>0?e(_a,{pending:n.secretMigration.pending,t:f}):null,e("div",{className:"cm-toolbar"},e("div",{className:"cm-field"},e("label",null,f("languageLabel")),e("select",{className:"cm-input",value:a?.locale??"auto",onChange:c=>E("locale",c.target.value)},e("option",{value:"auto"},f("localeAuto")),e("option",{value:"zh"},f("localeZh")),e("option",{value:"en"},f("localeEn"))))),e("div",null,e("h3",{className:"cm-h"},f("displaySettings")),e("div",{className:"cm-grid"},e("div",{className:"cm-grid-group"},f("groupGeneral")),qe?e("div",{className:"cm-field"},e("label",null,f("usagePositionLabel")),e("select",{className:"cm-input",value:a?.usage?.position??"cost",onChange:c=>{a!==null&&r({...a,usage:{...a.usage??{position:"cost"},position:c.target.value}})}},e("option",{value:"cost"},f("usagePositionCost")),e("option",{value:"general"},f("usagePositionGeneral")),e("option",{value:"section"},f("usagePositionSection")))):null,e("div",{className:"cm-field"},e("label",null,f("positionLabel")),e("select",{className:"cm-input",value:a?.position??"dock",onChange:c=>E("position",c.target.value)},e("option",{value:"dock"},f("positionDock")),e("option",{value:"header"},f("positionHeader")),e("option",{value:"off"},f("off")))),e("div",{className:"cm-field"},e("label",null,f("sidebarLabel")),e("select",{className:"cm-input",value:a?.sidebar===!1?"off":"on",onChange:c=>E("sidebar",c.target.value==="on")},e("option",{value:"on"},f("sidebarOn")),e("option",{value:"off"},f("off")))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.showSessionId===!0,onChange:c=>E("showSessionId",c.target.checked)}),e("span",null,f("showSessionIdLabel"))),e("div",{className:"cm-grid-group"},f("groupMoney")),e("div",{className:"cm-field"},e("label",null,f("currencyLabel")),e("select",{className:"cm-input",value:a?.currency??"CNY",onChange:c=>{const k=qn[c.target.value];k!==void 0&&a!==null&&r({...a,currency:c.target.value,...k})}},e("option",{value:"CNY"},f("currencyCny")),e("option",{value:"USD"},f("currencyUsd")),e("option",{value:"EUR"},f("currencyEur")))),e("div",{className:"cm-field"},e("label",null,f("symbolLabel")),e("input",{className:"cm-input narrow",type:"text",value:a?.symbol??"",onChange:c=>E("symbol",c.target.value)})),e("div",{className:"cm-field"},e("label",null,f("rateLabel")),le({value:a?.exchangeRate??1,emptyMode:"ignore"},c=>E("exchangeRate",c))),e("div",{className:"cm-field"},e("label",null,f("decimalsLabel")),le({value:a?.decimals??2},c=>E("decimals",Math.min(10,Math.floor(c))))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.hideOfficialBalance===!0,onChange:c=>E("hideOfficialBalance",c.target.checked)}),e("span",null,f("hideOfficialBalanceLabel"))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.hideTodayCost===!0,onChange:c=>E("hideTodayCost",c.target.checked)}),e("span",null,f("hideTodayCostLabel"))),e("div",{className:"cm-grid-group"},f("groupSidebar")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.sidebarSimple===!0,onChange:c=>{a&&r({...a,sidebarSimple:c.target.checked,sidebarSimplePromptSeen:!0})}}),e("span",null,f("sidebarSimple"))),e("div",{className:"cm-field"},e("span",{className:"cm-hint"},f("sidebarSimpleNote"))),e("div",{className:"cm-field"},e("label",null,f("sidebarStyleLabel")),e("select",{className:"cm-input",value:a?.sidebarStyle??"standard",disabled:a?.sidebarSimple===!0,onChange:c=>E("sidebarStyle",c.target.value)},e("option",{value:"standard"},f("sidebarStyleStandard")),e("option",{value:"compact"},f("sidebarStyleCompact")))),e("div",{className:"cm-field"},e("label",null,f("balanceDisplayLabel")),e("select",{className:"cm-input",value:a?.balance?.display??"both",onChange:c=>{a!==null&&r({...a,balance:{...a.balance??{display:"both",refreshMinutes:5},display:c.target.value}})}},...Ee(f))),e("div",{className:"cm-field"},e("label",null,f("refreshIntervalLabel")),le({value:a?.balance?.refreshMinutes??5},c=>{a!==null&&r({...a,balance:{...a.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(c)))}})})),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.balance?.showProgressBar===!0,onChange:c=>{a!==null&&r({...a,balance:{...a.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},showProgressBar:c.target.checked}})}}),e("span",null,f("balanceShowProgressBar")))),e("div",{className:"cm-field"},e("label",null,f("balanceBudgetCapLabel")),le({value:a?.balance?.budgetCap??""},c=>{a!==null&&r({...a,balance:{...a.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},budgetCap:c>0?c:null}})}),e("span",{className:"cm-hint"},f("balanceBudgetCapHint"))),e("div",{className:"cm-field"},e("label",null,f("barDirectionsTitle")),["balance","budget","go","plan"].map(c=>e("div",{className:"cm-dir-row",key:c},e("span",{className:"cm-dir-label"},f("barDirection_"+c)),e("select",{className:"cm-input",value:a?.barDirections?.[c]??(c==="balance"?"remaining":"used"),onChange:k=>{if(a===null)return;const D={balance:"remaining",budget:"used",go:"used",plan:"used"};r({...a,barDirections:{...a.barDirections??D,[c]:k.target.value}})}},e("option",{value:"remaining"},f("barDirectionRemaining")),e("option",{value:"used"},f("barDirectionUsed"))))),e("span",{className:"cm-hint"},f("barDirectionsHint"))),e("div",{className:"cm-field"},e("label",null,f("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:a?.customBalance?.display??L.customBalance?.display??"both",onChange:c=>{a!==null&&r({...a,customBalance:{...a.customBalance??L.customBalance??{},display:c.target.value}})}},...Ee(f))),e("div",{className:"cm-field"},e("label",null,f("customBalanceRefreshInterval")),le({value:a?.customBalance?.refreshMinutes??L.customBalance?.refreshMinutes??15},c=>{a!==null&&r({...a,customBalance:{...a.customBalance??L.customBalance??{},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(c)))}})})),e("div",{className:"cm-field"},e("label",null,f("goQuotaDisplayLabel")),e("select",{className:"cm-input",value:a?.goQuota?.display??"both",onChange:c=>{a!==null&&r({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:""},display:c.target.value}})}},...Ee(f))),e("div",{className:"cm-field"},e("label",null,f("goMainLabel")),e("select",{className:"cm-input",value:a?.goQuota?.main??"rolling",onChange:c=>{a!==null&&r({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:"",main:"rolling"},main:c.target.value}})}},e("option",{value:"rolling"},f("goWindowRolling")),e("option",{value:"weekly"},f("goWindowWeekly")),e("option",{value:"monthly"},f("goWindowMonthly")))),e("div",{className:"cm-field"},e("label",null,f("goQuotaRefreshIntervalLabel")),e("div",{className:"cm-range-row"},e("input",{className:"cm-range",type:"range",min:"1",max:"60",step:"1",value:Math.min(60,Math.max(1,Math.floor(Number(a?.goQuota?.refreshMinutes)||15))),onChange:c=>{a!==null&&r({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:""},refreshMinutes:Math.min(60,Math.max(1,Math.floor(Number(c.target.value)||15)))}})}}),e("span",{className:"cm-range-value"},`${Math.min(60,Math.max(1,Math.floor(Number(a?.goQuota?.refreshMinutes)||15)))} ${f("goQuotaRefreshMinutesUnit")}`))),e("div",{className:"cm-field"},e("label",null,f("goQuotaKeyLabel"))),e(Pe,{target:"goQuota",configured:L.goQuota?.keyConfigured===!0,source:L.goQuota?.keySource,t:f,api:o,placeholder:"sk-…"}),e("div",{className:"cm-grid-group"},f("quotaStripGroup")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.quotaStrip?.enabled===!0,onChange:c=>{a!==null&&r({...a,quotaStrip:{...a.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0},enabled:c.target.checked,promptSeen:!0}})}}),e("span",null,f("quotaStripEnable")))),a?.quotaStrip?.enabled===!0?[["budget","quotaStripShowBudget"],["go","quotaStripShowGo"],["plans","quotaStripShowPlans"]].map(([c,k])=>e("label",{key:c,className:"cm-check"},e("input",{type:"checkbox",checked:a.quotaStrip[c]!==!1,onChange:D=>{a!==null&&r({...a,quotaStrip:{...a.quotaStrip,[c]:D.target.checked}})}}),e("span",null,f(k)))):null,e("div",{className:"cm-field"},e("span",{className:"cm-hint"},f("quotaStripNote"))),e("div",{className:"cm-grid-group"},f("groupCorner")),e("div",{className:"cm-field"},e("label",null,f("cornerLabel")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.corner?.enabled===!0,onChange:c=>{a!==null&&r({...a,corner:{...a.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},enabled:c.target.checked}})}}),e("span",null,f("cornerEnabledLabel"))),a?.corner?.enabled===!0?[["goRolling","cornerGoRolling"],["goWeekly","cornerGoWeekly"],["goMonthly","cornerGoMonthly"],["budget","cornerBudget"]].map(([c,k])=>e("label",{key:c,className:"cm-check"},e("input",{type:"checkbox",checked:a.corner[c]!==!1,onChange:D=>{a!==null&&r({...a,corner:{...a.corner,[c]:D.target.checked}})}}),e("span",null,f(k)))):null),e("div",{className:"cm-grid-group"},f("groupDetail")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.goQuota?.detail!==!1,onChange:c=>{a!==null&&r({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:"",main:"rolling",detail:!0},detail:c.target.checked}})}}),e("span",null,f("goDetailLabel")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.budget?.detail!==!1,onChange:c=>{a!==null&&r({...a,budget:{...a.budget??{enabled:!1,amount:100,period:"month",customStart:null,customEnd:null,detail:!0},detail:c.target.checked}})}}),e("span",null,f("budgetDetailLabel"))))),e("p",{className:"cm-note"},f("badgeNote")))):null,S==="pricing"?e(q,{key:"pricing"},e(Un,{state:n,draft:a,setDraft:r,t:f}),e("div",null,Me(M,()=>w(!M),f("priceTableTitle")),M?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-note"},f("priceTableNote")),e("p",{className:"cm-hint"},f("priceTableDisplayHint")),e("div",{className:"cm-catalog-vendor"},f("deepseekMountedHeader")),I,e(kt,{key:"__default__",modelId:f("defaultModelId"),entry:a?.prices.default??{cacheHit:0,cacheMiss:0,output:0},isDefault:!0,draft:a,setDraft:r,t:f}),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:f("newModelPlaceholder"),value:p,onChange:c=>x(c.target.value)}),e("button",{className:"cm-btn small",onClick:_,disabled:p.trim().length===0},f("addModel"))),(()=>{const c=a?.priceTableDisplay??L.priceTableDisplay??{},k=a?.prices?.providers??{},D=F=>Object.keys(k[F]?.models??{}).filter(se=>c[F+":"+se]===!0),G=Object.keys(k).filter(F=>D(F).length>0).sort((F,se)=>F.localeCompare(se));return G.length===0?null:G.map(F=>e("div",{key:F},e("div",{className:"cm-catalog-vendor"},(Zt[F]??F)+" · "+f("mountedSuffix")),D(F).sort().map(se=>e(aa,{key:F+":"+se,provider:F,modelId:se,entry:k[F].models[se],draft:a,setDraft:r,t:f}))))})()):null),(()=>{const c=a?.priceOverrides??L.priceOverrides??{},k=a?.priceMatchDismissed??L.priceMatchDismissed??[],D=a?.prices??L.prices,G=n.today.byProviderModel??{},F={prices:D,priceMatch:a?.priceMatch??L.priceMatch},se=Object.keys(G).filter(U=>{if(k.includes(U)||c[U]!==void 0)return!1;const K=U.indexOf(":"),be=(K>0?U.slice(0,K):"deepseek").toLowerCase(),vt=K>0?U.slice(K+1):U;return st(be,vt,F).matched!==!0}),pe=[...new Set([...se,...Object.keys(c)])].filter(U=>!k.includes(U)),xe=n.month?.byProviderModel??{},Ne=Object.keys(xe).filter(U=>{if(k.includes(U)||c[U]!==void 0)return!1;const K=U.indexOf(":"),be=(K>0?U.slice(0,K):"deepseek").toLowerCase(),vt=K>0?U.slice(K+1):U;return st(be,vt,F).matched===!0}).sort(),Be=[{value:"__local__",label:f("overrideTargetLocal")},{value:"deepseek:__default__",label:f("overrideTargetDefault")},...Object.keys(D.models??{}).map(U=>({value:"deepseek:"+U,label:"DeepSeek · "+U})),...Object.entries(D.providers??{}).flatMap(([U,K])=>Object.keys(K?.models??{}).map(be=>({value:U+":"+be,label:U+" · "+be})))],oa=(U,K)=>{if(a===null)return;const be={...a.priceOverrides??{}};K===""?delete be[U]:be[U]=K,r({...a,priceOverrides:be})},os=U=>{if(a===null)return;const K={...a.priceOverrides??{}};delete K[U],r({...a,priceOverrides:K,priceMatchDismissed:[...new Set([...k,U])]})};return e("div",null,e("h3",{className:"cm-h"},f("priceMatchLabel")),e("div",{className:"cm-field"},e("select",{className:"cm-input",value:a?.priceMatch==="exact"?"exact":"auto",onChange:U=>E("priceMatch",U.target.value)},e("option",{value:"auto"},f("priceMatchAuto")),e("option",{value:"exact"},f("priceMatchExact")))),e("p",{className:"cm-note"},f("priceMatchNote")),pe.length>0?e(q,null,e("h3",{className:"cm-h"},f("unmatchedTitle")),e("p",{className:"cm-hint"},f("unmatchedHint")),pe.map(U=>e("div",{key:U,className:"cm-match-row"},e("span",null,ea(U)),e("select",{className:"cm-input",value:c[U]??"",onChange:K=>oa(U,K.target.value)},e("option",{value:""},"—"),Be.map(K=>e("option",{key:K.value,value:K.value},K.label))),e("button",{className:"cm-btn small",title:f("removePriceMatchHint"),onClick:()=>os(U)},f("overrideRemove"))))):e("p",{className:"cm-hint"},f("overrideNone")),k.length>0?e("button",{className:"cm-btn small",onClick:()=>E("priceMatchDismissed",[])},f("restorePriceMatches",{count:k.length})):null,Ne.length>0?e(q,null,e("h3",{className:"cm-h"},f("matchedTitle")),e("p",{className:"cm-hint"},f("matchedHint")),Ne.map(U=>e("div",{key:U,className:"cm-match-row"},e("span",null,ea(U)),e("select",{className:"cm-input",value:"",onChange:K=>{K.target.value!==""&&oa(U,K.target.value)}},e("option",{value:""},f("matchedKeepAuto")),Be.map(K=>e("option",{key:K.value,value:K.value},K.label)))))):null)})(),e(Qn,{state:n,draft:a,setDraft:r,t:f}),e("div",null,e("h3",{className:"cm-h"},f("dataSync")),e("div",{className:"cm-field"},e("label",null,f("pricingCurrencyLabel")),e("select",{className:"cm-input",value:a?.pricingCurrency==="CNY"?"CNY":"USD",onChange:c=>E("pricingCurrency",c.target.value)},e("option",{value:"USD"},f("pricingCurrencyUsd")),e("option",{value:"CNY"},f("pricingCurrencyCny"))),e("p",{className:"cm-note"},f("pricingCurrencyNote"))),e("div",{className:"cm-buttons"},d?e(q,null,e("span",{className:"cm-hint"},f("confirmFetch")),e("button",{className:"cm-btn",onClick:J,disabled:N},f("apply")),e("button",{className:"cm-btn",onClick:()=>b(!1)},f("cancel"))):e("button",{className:"cm-btn",onClick:()=>b(!0),disabled:N},f("syncFromDocs"))),e("p",{className:"cm-note"},f("lastSync",{time:L.fetchedAt!==null?new Date(L.fetchedAt).toLocaleString():f("neverSynced")})+f("source",{source:L.priceSource==="official"?f("sourceOfficial"):f("sourceBundled")})),e("p",{className:"cm-note"},f("syncScopeNote")))):null)}const ns=["remote"];async function ss(t){const s=t.remote;if(s===void 0||typeof s.$mount!="function")return;const o=await s.$mount(Ma);t.effect(()=>()=>{o()},"cost-meter: remote contribution");const n=t.get("remote.costMeter");if(n===void 0)return;const a=Fa({status:"loading",error:null,state:null}),r=()=>V(Q(a.getSnapshot().state?.config?.locale)),l=async(c,k)=>{const D=await n[c](...k??[]);if(D===null||typeof D!="object"||D.ok!==!0)throw new Error(D?.error?.message??r()("rpcFailed",{method:c}));return D.value};let i=!1;const d=async()=>{if(i)return;i=!0;const c=a.getSnapshot();try{const k=await l("getState");a.set({status:"ready",error:null,state:k})}catch(k){a.set({status:"error",error:k?.message??String(k),state:c.state})}finally{i=!1}};t.effect(()=>t.on("connection/reset",()=>{d()}),"cost-meter: reconnect reload");const b=setInterval(()=>{document.hidden||d()},6e4);t.effect(()=>()=>{clearInterval(b)},"cost-meter: poll timer");const u=()=>{document.visibilityState==="visible"&&d()};document.addEventListener("visibilitychange",u),t.effect(()=>()=>{document.removeEventListener("visibilitychange",u)},"cost-meter: visibility reload");const v={reload:d,updateConfig:async c=>{const k=await l("updateConfig",[c]);return a.set({status:"ready",error:null,state:k}),k},fetchPrices:async()=>{const c=await n.fetchPrices();if(c===null||typeof c!="object"||c.ok!==!0)throw new Error(c?.error?.message??r()("rpcSyncFailed"));return c.value.state!==void 0&&a.set({status:"ready",error:null,state:c.value.state}),c.value},resetHistory:async()=>{const c=await l("resetHistory");return a.set({status:"ready",error:null,state:c}),c},importLegacyHistory:async()=>{const c=await n.importLegacyHistory();if(c===null||typeof c!="object"||c.ok!==!0)throw new Error(c?.error?.message??c?.value?.message??r()("legacyImportFailed",{message:"RPC failed"}));return c.value.state!==void 0&&a.set({status:"ready",error:null,state:c.value.state}),c.value},getDaySessions:async c=>l("getDaySessions",[c]),getTopSessions:async(c,k,D)=>l("getTopSessions",[c,k,D]),refreshBalance:async()=>{const c=await n.refreshBalance();if(c===null||typeof c!="object"||c.ok!==!0)throw new Error(c?.error?.message??r()("rpcBalanceFailed"));return c.value.state!==void 0&&a.set({status:"ready",error:null,state:c.value.state}),c.value},refreshGoQuota:async()=>{const c=await n.refreshGoQuota();if(c===null||typeof c!="object"||c.ok!==!0)throw new Error(c?.error?.message??r()("rpcSyncFailed"));return c.value.state!==void 0&&a.set({status:"ready",error:null,state:c.value.state}),c.value},refreshGatewayQuota:async(c=null)=>{const k=c==null?await n.refreshGatewayQuota():await n.refreshGatewayQuota(c);if(k===null||typeof k!="object"||k.ok!==!0)throw new Error(k?.error?.message??r()("rpcSyncFailed"));return k.value.state!==void 0&&a.set({status:"ready",error:null,state:k.value.state}),k.value},refreshCustomBalance:async(c=null)=>{const k=c==null?await n.refreshCustomBalance():await n.refreshCustomBalance(c);if(k===null||typeof k!="object"||k.ok!==!0)throw new Error(k?.error?.message??r()("rpcSyncFailed"));return k.value.state!==void 0&&a.set({status:"ready",error:null,state:k.value.state}),k.value},refreshCodingPlan:async c=>{const k=await n.refreshCodingPlan(c);if(k===null||typeof k!="object"||k.ok!==!0)throw new Error(k?.error?.message??r()("rpcSyncFailed"));return k.value.state!==void 0&&a.set({status:"ready",error:null,state:k.value.state}),k.value},setCredential:async(c,k)=>{const D=await n.setCredential(c,k);if(D===null||typeof D!="object"||D.ok!==!0)throw new Error(D?.error?.message??D?.value?.message??r()("rpcSyncFailed"));return D.value.state!==void 0&&a.set({status:"ready",error:null,state:D.value.state}),D.value},clearCredential:async c=>{const k=await n.clearCredential(c);if(k===null||typeof k!="object"||k.ok!==!0)throw new Error(k?.error?.message??k?.value?.message??r()("rpcSyncFailed"));return k.value.state!==void 0&&a.set({status:"ready",error:null,state:k.value.state}),k.value}};d();const g=t.get("slots");if(g===void 0)return;const h=()=>({hooks:{cost:a},api:v}),p=()=>({gen:0,dispose:null}),x=(c,k,D,G,F=!0)=>{c.dispose!==null&&(c.dispose(),c.dispose=null),c.gen+=1;const se=c.gen;F&&g.inject(k,()=>{if(c.gen!==se)return;const pe=typeof D=="function"?D():g.register(D,G);if(c.gen!==se){pe();return}return c.dispose=pe,()=>{c.dispose===pe&&(c.dispose=null),pe()}})},N=p(),P=c=>{const k=c==="header"?"conversation.session.header.actions":"conversation.composer.dock";x(N,k,c==="header"?{name:k,id:"cost-meter",order:-5,inject:h}:{name:k,id:"cost-meter",order:5,inject:h},c==="header"?Wa:za,c!=="off")},M=p(),w=c=>{x(M,"sidebar.footer.action",{name:"sidebar.footer.action",id:"cost-meter",order:0,inject:h},Rn,c)},S=p(),y=c=>{x(S,"conversation.composer.dock",{name:"conversation.composer.dock",id:"cost-meter-corner",order:9,inject:h},nn,c)};g.inject("conversation.input.dock",()=>g.register({name:"conversation.input.dock",id:"cost-meter-qstrip",order:5,inject:h},An)),g.inject("sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-simple-guide",order:1,inject:h},Pn)),g.inject("sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-qstrip-guide",order:1,inject:h},Mn)),g.inject("sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-balance-click-guide",order:2,inject:h},Dn));const m=p(),C=c=>{x(m,"sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-peak-alert",order:0,inject:h},sn),null,c)};window.cmPeakAlertPreview=c=>{if(window.__cmPeakAlertLive!==!0){console.warn("[dsh-cost-meter] 弹窗组件未挂载:需启用峰谷计价并重启 dsh web 后再预览。");return}window.dispatchEvent(new CustomEvent(ft,{detail:{kind:c==="offpeak"?"offpeak":"peak"}}))};const A=p(),B=c=>{x(A,"settings.section",{name:"settings.section",id:"cost-meter",order:30,label:c==="en"?Se.en.sectionLabel:Se.zh.sectionLabel,inject:h},as,!0)},j=p(),T=c=>{x(j,"settings.general.item",{name:"settings.general.item",id:"cost-meter-usage",order:30,inject:h},wt,c)},f=p(),L=(c,k)=>{x(f,"settings.section",{name:"settings.section",id:"cost-meter-usage",order:31,label:k==="en"?Se.en.usageSectionLabel:Se.zh.usageSectionLabel,inject:h},wt,c)};let J=null,re=null,R=null,E=null,_=null,I=null;const ee=()=>{const c=a.getSnapshot().state,k=c?.config?.position??"dock",D=c?.config?.sidebar!==!1&&c?.config?.hideTodayCost!==!0,G=c?.config?.balance?.display??"both",F=(G==="sidebar"||G==="both")&&c?.config?.hideOfficialBalance!==!0,se=D||F,pe=c?.config?.corner?.enabled===!0,xe=Q(c?.config?.locale),Ne=c?.config?.usage?.position??"cost";k!==J&&(P(k),J=k),se!==re&&(w(se),re=se),pe!==R&&(y(pe),R=pe);const Be=c?.config?.peakEnabled===!0;Be!==I&&(C(Be),I=Be),xe!==E&&(B(xe),E=xe),Ne!==_?(qe&&(T(Ne==="general"),L(Ne==="section",xe)),_=Ne):qe&&Ne==="section"&&xe!==E&&L(!0,xe)};ee();const ne=a.subscribe(ee);return()=>{ne()}}return Ze.apply=ss,Ze.inject=ns,Nt.exports}});
|
|
2
|
+
window.__ModuleLoader__.load({id:"dsh-cost-meter",factory:Pt=>{var Mt={exports:{}},Xe=Mt.exports;Object.defineProperty(Xe,Symbol.toStringTag,{value:"Module"});const De=Pt("react"),{Tooltip:ee}=Pt("@deepseek-ai/dsh-client-ui-primitives"),He=!1,ga='.cm-root{display:block;text-align:center;max-width:var(--dsh-chat-content-width,720px);width:100%;margin:0 auto;box-sizing:border-box;padding:4px calc(var(--dsh-composer-side-clearance,0px) + 16px) 0;font-size:12px;line-height:20px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cm-chip{display:inline-flex;align-items:center;gap:4px;max-width:180px;padding:0 8px;height:22px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:12px;line-height:22px;color:var(--dsw-alias-label-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cm-foot{display:flex;align-items:center;gap:6px;height:32px;padding:0 8px;border-radius:8px;font-size:12px;color:var(--dsw-alias-label-secondary);white-space:nowrap;overflow:hidden}.cm-foot:hover{background:var(--dsw-alias-interactive-bg-hover)}.cm-foot-rail{width:100%;justify-content:center;padding:0;font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary)}.cm-foot-rail:hover{background:var(--dsw-alias-interactive-bg-hover)}.cm-num{font-variant-numeric:tabular-nums}.cm-go-rail{font-size:11px;font-weight:700;color:var(--dsw-alias-label-primary)}.cm-go-list{display:flex;flex-direction:column;gap:10px}.cm-go-row{display:flex;align-items:center;gap:8px;font-size:12px}.cm-go-label{flex:none;width:88px;color:var(--dsw-alias-label-secondary)}.cm-go-bar{flex:1;height:6px;border-radius:3px;background:var(--dsw-alias-interactive-bg-hover);overflow:hidden}.cm-go-fill{height:100%;border-radius:3px;background:var(--dsw-alias-brand-primary)}.cm-go-num{flex:none;min-width:44px;text-align:right;font-weight:600;font-variant-numeric:tabular-nums}.cm-go-reset{flex:none;max-width:230px;font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cm-go-time{font-size:11px;color:var(--dsw-alias-label-tertiary)}.cm-go-row.main .cm-go-label{font-weight:600;color:var(--dsw-alias-label-primary)}.cm-corner{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;width:100%;max-width:var(--dsh-chat-content-width,720px);margin:2px auto 0;box-sizing:border-box;padding:0 calc(var(--dsh-composer-side-clearance,0px) + 16px)}.cm-corner-chip{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:11px;line-height:20px;color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums}.cm-corner-chip:hover{background:var(--dsw-alias-interactive-bg-hover)}.cm-qstrip{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:6px;width:100%;max-width:var(--dsh-chat-content-width,720px);margin:0 auto;box-sizing:border-box;padding:0 calc(var(--dsh-composer-side-clearance,0px) + 16px)}.cm-qchip{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 8px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:11px;line-height:22px;color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;cursor:default}.cm-qchip:hover{background:var(--dsw-alias-interactive-bg-hover)}.cm-qchip .cm-qlabel{color:var(--dsw-alias-label-primary);font-weight:600}.cm-qchip .cm-qbar{display:block;width:44px;height:4px;border-radius:2px;background:var(--dsw-alias-border-l1);overflow:hidden;flex:none}.cm-qchip .cm-qfill{display:block;height:100%;border-radius:2px;background:var(--dsw-alias-state-ok-primary,#3ba272)}.cm-qchip .cm-qseg{display:inline-flex;align-items:center;gap:4px}.cm-qchip .cm-qsep{width:1px;height:12px;background:var(--dsw-alias-border-l1);flex:none}.cm-qchip .cm-qtext{color:var(--dsw-alias-label-secondary)}.cm-qchip.warn .cm-qfill{background:var(--dsw-alias-state-warn-primary)}.cm-qchip.over .cm-qfill{background:var(--dsw-alias-state-error-primary)}.cm-qchip.action{cursor:pointer;user-select:none;outline:none}.cm-qchip.action:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-brand-primary)}.cm-qchip.action:active{transform:translateY(.5px)}.cm-plan-provider{display:flex;flex-direction:column;gap:8px}.cm-plan-provider+.cm-plan-provider{margin-top:14px}.cm-plan-provider-name{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600}.cm-plan-updated{font-size:11px;font-weight:400;color:var(--dsw-alias-label-tertiary)}.cm-plan-tag{flex:none;margin-left:6px;padding:0 6px;border-radius:999px;border:1px solid var(--dsw-alias-border-l1);font-size:10px;line-height:16px;color:var(--dsw-alias-state-warn-primary)}.cm-plan-reset,.cm-plan-method{font-size:11px;color:var(--dsw-alias-label-tertiary)}.cm-qguide{position:fixed;top:18px;left:50%;transform:translate(-50%);z-index:9999;max-width:440px;width:calc(100% - 32px);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;background:var(--dsw-alias-bg-layer-1);box-shadow:0 8px 28px #0000002e;padding:14px 16px;font-size:13px;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:8px}.cm-qguide h4{margin:0;font-size:13px;font-weight:600}.cm-qguide p{margin:0;font-size:12px;line-height:1.6;color:var(--dsw-alias-label-secondary)}.cm-qguide .cm-buttons{display:flex;gap:8px;justify-content:flex-end}.cm-section{display:flex;flex-direction:column;gap:20px;padding:4px 2px 24px;font-size:13px;color:var(--dsw-alias-label-primary)}.cm-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.cm-cards-toggle{display:flex;align-items:center;gap:6px;margin:-6px 2px 0 auto;width:fit-content;font-size:12px;color:var(--dsw-alias-label-tertiary);cursor:pointer;user-select:none}.cm-cards-toggle:hover{color:var(--dsw-alias-label-primary)}.cm-cards-toggle input{margin:0;cursor:pointer}.cm-card,.cm-budget{border:1px solid var(--dsw-alias-border-l1);border-radius:12px;padding:14px 16px;background:var(--dsw-alias-bg-layer-1)}.cm-card-title{font-size:12px;color:var(--dsw-alias-label-tertiary);margin:0 0 8px}.cm-card-value{font-size:20px;line-height:28px;font-weight:600}.cm-card-sub{font-size:12px;color:var(--dsw-alias-label-tertiary);margin-top:4px}.cm-h{font-size:13px;font-weight:600;margin:0}.cm-collapse-h{display:flex;align-items:center;gap:8px;background:none;border:none;padding:0;margin:0;cursor:pointer;color:inherit;font:inherit;text-align:left}.cm-collapse-h:hover .cm-h{color:var(--dsw-alias-interactive-text-hover,var(--dsw-alias-label-primary))}.cm-caret{flex:none;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid var(--dsw-alias-label-secondary);transform:rotate(-90deg);transition:transform .15s ease}.cm-caret.open{transform:rotate(0)}.cm-collapse-body{display:flex;flex-direction:column;gap:12px;margin-top:12px}.cm-toolbar{display:flex;justify-content:flex-end;align-items:center;gap:10px}.cm-toolbar .cm-field{flex-direction:row;align-items:center;gap:8px}.cm-toolbar .cm-field label{margin:0;font-size:12px;color:var(--dsw-alias-label-tertiary)}.cm-toolbar .cm-input{min-width:150px;padding:4px 10px}.cm-tabs-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--dsh-alias-border-l1);padding-bottom:10px}.cm-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.cm-tab{font:inherit;font-size:13px;color:var(--dsw-alias-label-secondary);background:transparent;border:none;border-radius:8px;padding:6px 14px;cursor:pointer;white-space:nowrap}.cm-tab:hover{background:var(--dsw-alias-interactive-bg-hover)}.cm-tab.active{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted);font-weight:600}.cm-tabs-row .cm-msg{padding:2px 10px}.cm-note{font-size:12px;color:var(--dsw-alias-label-tertiary);margin:0}.cm-table{width:100%;border-collapse:collapse;font-size:12px}.cm-table th,.cm-table td{text-align:left;padding:7px 10px;border-bottom:1px solid var(--dsw-alias-border-l1);white-space:nowrap}.cm-table th{color:var(--dsw-alias-label-tertiary);font-weight:500}.cm-table td.num,.cm-table th.num{text-align:right;font-variant-numeric:tabular-nums}.cm-table tr:last-child td{border-bottom:none}.cm-table tr.cm-row-click{cursor:pointer}.cm-table tr.cm-row-click:hover td{background:var(--dsw-alias-bg-hover,rgba(127,127,127,.08))}.cm-sess-title{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cm-sess-id{font-size:11px;font-family:ui-monospace,Consolas,monospace;color:var(--dsw-alias-label-tertiary)}.cm-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:8px 0}.cm-scroll{max-height:320px;overflow:auto;border:1px solid var(--dsw-alias-border-l1);border-radius:10px}.cm-grid{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:12px}.cm-field{display:flex;flex-direction:column;gap:6px}.cm-field label{font-size:12px;color:var(--dsw-alias-label-secondary)}.cm-input{font:inherit;font-size:13px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;padding:6px 10px;outline:none}.cm-input:focus{border-color:var(--dsw-alias-state-business-primary)}.cm-input.narrow{max-width:120px}.cm-range-row{display:flex;align-items:center;gap:10px}.cm-range{flex:1;min-width:0;accent-color:var(--dsw-alias-state-business-primary)}.cm-range-value{flex:none;min-width:44px;font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:right}.cm-check{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--dsw-alias-label-primary);cursor:pointer}.cm-price-card{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;padding:12px 14px;display:flex;flex-direction:column;gap:10px;background:var(--dsw-alias-bg-layer-1)}.cm-price-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.cm-price-name{font-weight:600;font-size:13px}.cm-price-legacy{font-size:11px;color:var(--dsw-alias-label-tertiary);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:1px 8px}.cm-price-row{display:grid;grid-template-columns:52px 1fr 1fr 1fr;gap:8px;align-items:center}.cm-price-row span{font-size:12px;color:var(--dsw-alias-label-tertiary)}.cm-price-row input{width:100%}.cm-buttons{display:flex;flex-wrap:wrap;gap:10px;align-items:center}.cm-btn{font:inherit;font-size:13px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-button-elevated-fill);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;padding:6px 14px;cursor:pointer}.cm-btn:hover{background:var(--dsw-alias-interactive-bg-hover)}.cm-btn.primary{background:var(--dsw-alias-state-business-primary);border-color:transparent;color:var(--dsw-alias-label-primary-inverted)}.cm-btn.primary:hover{opacity:.88;background:var(--dsw-alias-state-business-primary)}.cm-btn.danger,.cm-msg.err,.cm-bal-line.err,.cm-bal-err{color:var(--dsw-alias-state-error-primary)}.cm-btn.small{padding:3px 10px;font-size:12px}.cm-msg{font-size:12px;line-height:18px;padding:8px 12px;border-radius:8px;border:1px solid var(--dsw-alias-border-l1)}.cm-msg.ok{color:var(--dsw-alias-state-success-primary)}.cm-hint{font-size:12px;color:var(--dsw-alias-label-tertiary)}.cm-budget{display:flex;flex-direction:column;gap:10px}.cm-peak-alert{position:fixed;z-index:9999;width:340px;max-width:calc(100vw - 32px);padding:16px;border-radius:14px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);box-shadow:0 14px 36px #00000038;display:flex;flex-direction:column;gap:8px;font-size:12px;animation:cm-peak-alert-in .22s cubic-bezier(.2,.8,.2,1)}.cm-peak-alert.cm-peak-alert-corner{right:20px;bottom:20px}.cm-peak-alert.cm-peak-alert-center{top:50%;left:50%;transform:translate(-50%,-50%);animation-name:cm-peak-alert-in-center}.cm-peak-alert-peak{border-top:3px solid var(--dsw-alias-state-warn-primary)}.cm-peak-alert-offpeak{border-top:3px solid var(--dsw-alias-state-info-primary,#3b82f6)}.cm-peak-alert-badge{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.4px;text-transform:uppercase}.cm-peak-alert-badge:before{content:"";width:8px;height:8px;border-radius:50%;background:currentColor;box-shadow:0 0 0 4px color-mix(in srgb,currentColor 16%,transparent)}.cm-peak-alert-peak .cm-peak-alert-badge{color:var(--dsw-alias-state-warn-primary)}.cm-peak-alert-offpeak .cm-peak-alert-badge{color:var(--dsw-alias-state-info-primary,#3b82f6)}.cm-peak-alert-title{font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary)}.cm-peak-alert-body{color:var(--dsw-alias-label-secondary);line-height:1.55}.cm-peak-alert-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}.cm-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}@keyframes cm-peak-alert-in{0%{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes cm-peak-alert-in-center{0%{opacity:0;transform:translate(-50%,calc(-50% + 10px))}to{opacity:1;transform:translate(-50%,-50%)}}.cm-budget-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.cm-budget-bar{height:8px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);overflow:hidden}.cm-budget-fill{height:100%;border-radius:999px;background:var(--dsw-alias-state-business-primary);transition:width .3s ease}.cm-ug{display:flex;flex-direction:column;gap:12px}.cm-ug-total{font-size:13px;color:var(--dsw-alias-label-primary)}.cm-ug-grid{display:grid;grid-auto-flow:column;grid-template-rows:repeat(7,auto);gap:3px;width:100%}.cm-ug-cell{width:100%;aspect-ratio:1/1;border-radius:3px;box-sizing:border-box;background:color-mix(in srgb,var(--dsw-alias-label-primary) 8%,transparent);border:1px solid var(--dsw-alias-border-l1)}.cm-ug-cell.l1,.cm-ug-cell.l2,.cm-ug-cell.l3,.cm-ug-cell.l4{border-color:transparent}.cm-ug-cell.l1{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 25%,var(--dsw-alias-bg-layer-3))}.cm-ug-cell.l2{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 50%,var(--dsw-alias-bg-layer-3))}.cm-ug-cell.l3{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 75%,var(--dsw-alias-bg-layer-3))}.cm-ug-cell.l4{background:var(--dsw-alias-state-business-primary)}.cm-ug-cell.today{outline:1px solid var(--dsw-alias-label-secondary);outline-offset:1px}.cm-ug-months{display:grid;grid-auto-flow:column;gap:3px;width:100%;font-size:10px;color:var(--dsw-alias-label-tertiary);margin-top:4px}.cm-ug-monthc{white-space:nowrap}.cm-budget-line{font-size:13px;color:var(--dsw-alias-label-secondary)}.cm-budget-line.over{color:var(--dsw-alias-state-error-primary)}.cm-peak-strip{display:flex;align-items:center;gap:6px;margin-top:4px;min-width:0}.cm-peak-track{position:relative;display:flex;flex:1;height:6px;min-width:0;border-radius:999px;overflow:hidden;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3)}.cm-peak-segment{height:100%;flex:1}.cm-peak-high{background:#ff9800}.cm-peak-low{background:var(--dsw-alias-state-business-primary)}.cm-peak-marker{position:absolute;top:0;left:50%;width:2px;height:100%;background:var(--dsw-alias-bg-base);box-shadow:0 0 0 1px var(--dsw-alias-label-tertiary);transform:translate(-50%);transition:left .4s ease;z-index:2}.cm-peak-chip{font-size:11px;font-weight:600;line-height:1.2;white-space:nowrap;color:var(--dsw-alias-label-secondary)}.cm-peak-classic{position:relative;display:flex;flex-direction:column;gap:5px;margin-top:6px;min-width:0}.cm-peak-classic .cm-peak-track{flex:none;height:8px}.cm-peak-classic-marker{position:absolute;top:0;left:50%;width:4px;height:12px;background:var(--dsw-alias-bg-base);border:1.5px solid #ff9800;box-shadow:0 0 0 1px var(--dsw-alias-bg-base),0 0 0 2px var(--dsw-alias-label-tertiary);transform:translate(-50%);transition:left .4s ease;z-index:2;border-radius:2px}.cm-peak-classic-marker:after{content:"";position:absolute;top:-7px;left:50%;transform:translate(-50%);border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid #ff9800}.cm-peak-classic.off .cm-peak-classic-marker{border-color:var(--dsw-alias-state-business-primary)}.cm-peak-classic.off .cm-peak-classic-marker:after{border-top-color:var(--dsw-alias-state-business-primary)}.cm-peak-classic-chip{align-self:flex-start;font-size:11px;font-weight:600;line-height:1.4;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:2px 8px;white-space:nowrap;color:var(--dsw-alias-label-secondary)}.cm-peak-strip.peak .cm-peak-chip,.cm-peak-classic.peak .cm-peak-classic-chip,.cm-peak-rail.peak .cm-peak-rail-label,.cm-peak-rail-classic.peak .cm-peak-rail-classic-label{color:#ff9800}.cm-peak-strip.off .cm-peak-chip,.cm-peak-classic.off .cm-peak-classic-chip,.cm-peak-rail.off .cm-peak-rail-label,.cm-peak-rail-classic.off .cm-peak-rail-classic-label{color:var(--dsw-alias-state-business-primary)}.cm-peak-strip.weekend .cm-peak-chip,.cm-peak-classic.weekend .cm-peak-classic-chip,.cm-peak-rail.weekend .cm-peak-rail-label,.cm-peak-rail-classic.weekend .cm-peak-rail-classic-label{color:#34a853}.cm-peak-classic.weekend .cm-peak-classic-marker{border-color:#34a853}.cm-peak-classic.weekend .cm-peak-classic-marker:after{border-top-color:#34a853}.cm-peak-rail{display:flex;flex-direction:column;align-items:center;gap:3px;width:40px;box-sizing:border-box}.cm-peak-rail-track{position:relative;display:flex;flex-direction:column;width:6px;height:56px;border-radius:999px;overflow:hidden;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3)}.cm-peak-rail-segment{width:100%;flex:1}.cm-peak-rail-high{background:#ff9800}.cm-peak-rail-low{background:var(--dsw-alias-state-business-primary)}.cm-peak-rail-marker{position:absolute;left:0;top:50%;width:100%;height:2px;background:var(--dsw-alias-bg-base);box-shadow:0 0 0 1px var(--dsw-alias-label-tertiary);transform:translateY(-50%);transition:top .4s ease;z-index:2}.cm-peak-rail-label{font-size:10px;font-weight:600;line-height:1.2;white-space:nowrap;color:var(--dsw-alias-label-secondary)}.cm-peak-rail-classic{display:flex;flex-direction:column;align-items:center;gap:3px;width:40px;box-sizing:border-box}.cm-peak-rail-classic-track{position:relative;display:flex;flex-direction:column;width:14px;height:56px;border-radius:999px;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3)}.cm-peak-rail-classic-segment{position:relative;width:100%;flex:1;overflow:hidden}.cm-peak-rail-classic-segment.peak{background:#ff9800;border-radius:999px 999px 0 0}.cm-peak-rail-classic-segment.off{background:var(--dsw-alias-state-business-primary);border-radius:0 0 999px 999px}.cm-peak-rail-classic-marker{position:absolute;left:50%;top:50%;width:12px;height:4px;background:var(--dsw-alias-bg-base);border:1.5px solid #ff9800;box-shadow:0 0 0 1px var(--dsw-alias-bg-base),0 0 0 2px var(--dsw-alias-label-tertiary);transform:translate(-50%,-50%);transition:top .4s ease;z-index:2;border-radius:2px}.cm-peak-rail-classic.off .cm-peak-rail-classic-marker{border-color:var(--dsw-alias-state-business-primary)}.cm-peak-rail-classic-label{font-size:10px;font-weight:600;line-height:1.2;white-space:nowrap}.cm-peak-rail-classic.weekend .cm-peak-rail-classic-marker{border-color:#34a853}.cm-grid-group{grid-column:1 / -1;margin-top:8px;font-size:12px;font-weight:600;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:4px}.cm-grid-group:first-child{margin-top:0}.cm-peak-preview{margin-top:8px}.cm-toggle-btn{background:none;border:none;padding:0;font-size:12px;font-weight:600;color:var(--dsw-alias-state-business-primary);cursor:pointer}.cm-toggle-btn:hover{text-decoration:underline}.cm-collapsed-note{margin-top:4px}.cm-catalog-vendor{margin-top:10px;font-size:12px;font-weight:600;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:2px;display:flex;align-items:center;justify-content:space-between;gap:8px}.cm-vendor-toggle{cursor:pointer;user-select:none}.cm-vendor-toggle:hover{color:var(--dsw-alias-label-secondary)}.cm-vendor-display{display:inline-flex;align-items:center;gap:4px;font-weight:400;font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap}.cm-catalog-family{margin:6px 0 2px;font-size:11px;font-weight:600;color:var(--dsw-alias-label-tertiary)}.cm-catalog-row{display:flex;align-items:center;gap:8px;padding:4px 0;border-top:1px solid var(--dsw-alias-border-l1);font-size:12px}.cm-catalog-mounted{display:flex;flex-direction:column;gap:4px;padding:6px 0;border-top:1px solid var(--dsw-alias-border-l1)}.cm-catalog-id{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cm-catalog-price{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:11px}.cm-catalog-tag{font-size:10px;padding:1px 6px;border-radius:999px;border:1px solid var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary);white-space:nowrap}.cm-mstats-tabs{display:flex;gap:8px;margin-bottom:8px}.cm-mstats-tab{background:none;border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:2px 12px;font-size:12px;color:var(--dsw-alias-label-secondary);cursor:pointer}.cm-mstats-tab.active{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-bg-base);font-weight:600}.cm-mstats-h{margin:10px 0 4px;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary)}.cm-mstats-row{display:grid;grid-template-columns:minmax(90px,170px) 1fr auto;gap:8px;align-items:center;font-size:11px;line-height:1.7}.cm-mstats-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary)}.cm-mstats-barbg{position:relative;height:10px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);overflow:hidden;display:flex}.cm-mstats-bar{height:100%;min-width:0;border-radius:999px}.cm-mstats-bar.cost{background:#ff9800}.cm-mstats-bar.hit{background:#34a853}.cm-mstats-bar.value{background:#a142f4}.cm-mstats-seg{height:100%;min-width:0}.cm-mstats-seg.in{background:var(--dsw-alias-state-business-primary)}.cm-mstats-seg.cache{background:#ff9800}.cm-mstats-seg.out{background:#34a853}.cm-mstats-val{white-space:nowrap;color:var(--dsw-alias-label-secondary)}.cm-mstats-legend{display:flex;gap:12px;font-size:10px;color:var(--dsw-alias-label-tertiary);margin:2px 0 4px}.cm-mstats-dot{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:3px}.cm-mstats-note{margin-top:10px;font-size:10px;line-height:1.6;color:var(--dsw-alias-label-tertiary)}.cm-match-row{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:12px;flex-wrap:wrap}.cm-match-row .cm-input{flex:1;min-width:160px}.cm-budget-controls{display:grid;grid-template-columns:repeat(2,minmax(180px,1fr));gap:12px}.cm-bbox{border:1px solid var(--dsw-alias-border-l1);border-radius:12px;padding:8px 10px;background:var(--dsw-alias-bg-layer-1);display:flex;flex-direction:column;gap:6px;min-width:148px;box-sizing:border-box}.cm-bbox.rail{padding:6px;min-width:0;width:40px;align-items:center;justify-content:center;border-radius:10px}.cm-bbox.warn{border-color:var(--dsw-alias-state-warn-primary)}.cm-bbox.over{border-color:var(--dsw-alias-state-error-primary)}.cm-bbox-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.cm-bbox-label,.cm-bbox-pct{font-size:12px;font-weight:600;color:var(--dsw-alias-label-primary)}.cm-bbox.warn .cm-bbox-pct{color:var(--dsw-alias-state-warn-primary)}.cm-bbox.over .cm-bbox-pct{color:var(--dsw-alias-state-error-primary)}.cm-bbox-bar{height:6px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);overflow:hidden}.cm-bbox-bar.segments{display:flex;height:8px}.cm-bbox-bar.segments .cm-bbox-fill{flex:none;border-radius:0;height:100%}.cm-bbox-bar.segments .cm-bbox-fill:first-child{border-radius:999px 0 0 999px}.cm-bbox-bar.segments .cm-bbox-seg-today{flex:none;height:100%;background:#ff9800}.cm-bbox-bar.segments .cm-bbox-seg-spent{flex:none;height:100%;background:var(--dsw-alias-interactive-bg-hover);border-radius:0 999px 999px 0}.cm-bbox-bar.segments.rev .cm-bbox-fill:first-child,.cm-bbox-bar.segments.rev .cm-bbox-seg-today:first-child{border-radius:999px 0 0 999px}.cm-bbox-bar.segments.rev .cm-bbox-fill,.cm-bbox-bar.segments.rev .cm-bbox-fill:last-child,.cm-bbox-bar.segments.rev .cm-bbox-seg-today:last-child,.cm-bbox-bar.segments.rev .cm-bbox-seg-spent:last-child{border-radius:0 999px 999px 0}.cm-bbox-bar.segments.rev .cm-bbox-seg-spent{border-radius:0}.cm-dir-row{display:flex;align-items:center;gap:8px;margin-top:6px}.cm-dir-label{flex:1 1 40%;font-size:12px;color:var(--dsw-alias-label-secondary)}.cm-dir-row .cm-input{flex:1 1 60%;width:auto}.cm-bbox-fill{height:100%;border-radius:999px;background:var(--dsw-alias-state-business-primary)}.cm-balance-name{display:inline-flex;align-items:center;gap:4px;min-width:0}.cm-bal-amt{margin-left:auto;text-align:right}.cm-bbox-pct.cm-bal-amt{color:var(--dsw-alias-state-business-primary)}.cm-bal-link{flex:none;display:inline-flex;align-items:center;justify-content:center;padding:2px;border-radius:4px;font-size:12px;line-height:16px;color:var(--dsw-alias-label-tertiary);text-decoration:none;outline:none}.cm-bal-link:hover{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-hover)}.cm-bal-link:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-brand-primary)}.cm-bbox.warn .cm-bbox-fill,.cm-bbox .cm-bbox-section.warn .cm-bbox-fill,.cm-bbox .cm-mm-row.warn .cm-bbox-fill,.cm-budget-fill.warn{background:var(--dsw-alias-state-warn-primary)}.cm-bbox.over .cm-bbox-fill,.cm-bbox-section.over .cm-bbox-fill,.cm-mm-row.over .cm-bbox-fill,.cm-budget-fill.over{background:var(--dsw-alias-state-error-primary)}.cm-bbox-line{font-size:12px;color:var(--dsw-alias-label-tertiary)}.cm-bbox-rail{font-size:11px;font-weight:600;color:var(--dsw-alias-label-primary)}.cm-bbox.warn .cm-bbox-pct,.cm-bbox.warn .cm-bbox-rail,.cm-bbox .cm-bbox-section.warn .cm-bbox-pct,.cm-bbox .cm-mm-row.warn .cm-bbox-pct,.cm-mm-row.warn .cm-bbox-label,.cm-corner-chip.warn,.cm-qchip.warn,.cm-simple-summary.warn{color:var(--dsw-alias-state-warn-primary)}.cm-bbox.over .cm-bbox-pct,.cm-bbox.over .cm-bbox-rail,.cm-bbox-section.over .cm-bbox-pct,.cm-mm-row.over .cm-bbox-pct,.cm-mm-row.over .cm-bbox-label,.cm-corner-chip.over,.cm-qchip.over,.cm-simple-summary.over{color:var(--dsw-alias-state-error-primary)}.cm-bbox-pair{display:flex;flex-direction:column;gap:0;padding:2px 10px}.cm-bbox-pair .cm-bbox-section{display:flex;flex-direction:column;gap:4px;padding:4px 0}.cm-bbox-pair .cm-bbox-bar{height:4px}.cm-bbox-divider{height:1px;background:var(--dsw-alias-border-l1);margin:0}.cm-bbox.clickable,.cm-foot.clickable{cursor:pointer}.cm-bbox.clickable:hover{border-color:var(--dsw-alias-state-business-primary)}.cm-bbox.clickable:focus-visible,.cm-foot.clickable:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}@keyframes cm-click-refresh-pulse{0%,to{opacity:.55}50%{opacity:1}}.cm-bbox.clickable.busy,.cm-foot.clickable.busy{animation:cm-click-refresh-pulse 1.1s ease-in-out infinite}.cm-mm{padding:8px 10px;gap:4px}.cm-mm-title{font-size:12px;font-weight:600;color:var(--dsw-alias-label-primary)}.cm-gw-switcher{cursor:pointer;user-select:none;font-size:11px;padding:1px 6px;border-radius:999px;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary)}.cm-gw-switcher:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.cm-gw-sub{font-size:11px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cm-mm-row{display:flex;align-items:center;gap:8px;padding:2px 0}.cm-mm-row .cm-bbox-label{flex:none;width:auto;min-width:22px;max-width:115px;font-weight:400;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:keep-all}.cm-mm-row .cm-bbox-bar{flex:1;min-width:40px;height:6px}.cm-mm-row .cm-bbox-pct{flex:none;min-width:2.4em;text-align:right;font-variant-numeric:tabular-nums}.cm-mm-row.wide .cm-bbox-label{width:auto;max-width:64px;flex:0 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cm-mm-row.wide .cm-mm-text{flex:1;min-width:0;font-size:12px;color:var(--dsw-alias-label-secondary);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cm-bal-line{font-size:13px;color:var(--dsw-alias-label-secondary)}.cm-bal-line.warn{color:var(--dsw-alias-state-warning-primary,#b45309)}.cm-footer-stack{display:flex;flex-direction:column;gap:6px;width:100%;align-items:stretch;box-sizing:border-box}.cm-footer-stack.rail{align-items:center}.cm-footer-stack .cm-bbox{width:100%;min-width:0}.cm-footer-stack .cm-foot{width:100%;box-sizing:border-box}.cm-footer-stack.compact .cm-bbox{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px;row-gap:2px;align-items:center}.cm-footer-stack.compact .cm-bbox>*{grid-column:1/-1}.cm-footer-stack.compact .cm-bbox>.cm-mm-row{grid-column:auto}.cm-footer-stack.compact .cm-mm-row{min-width:0;gap:4px;flex-wrap:nowrap}.cm-footer-stack.compact .cm-mm-row .cm-bbox-label{flex:0 1 auto;min-width:0;max-width:45%;width:auto}.cm-footer-stack.compact .cm-mm-row .cm-bbox-bar{min-width:0;flex:1 1 0}.cm-footer-stack.simple{gap:0;max-height:38vh;max-height:min(38dvh,320px);overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;border:1px solid var(--dsw-alias-border-l1);border-radius:10px;background:var(--dsw-alias-bg-layer-1)}.cm-footer-stack.simple>*{flex-shrink:0}.cm-footer-stack.simple:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.cm-footer-stack.simple .cm-bbox{border:0;border-radius:0;padding:4px 8px;gap:2px;background:transparent;box-shadow:inset 0 -1px var(--dsw-alias-border-l1)}.cm-footer-stack.simple .cm-mm-title{font-size:11px;line-height:16px;margin:0}.cm-footer-stack.simple .cm-mm-row{gap:6px;min-height:16px;line-height:16px;margin:0;padding:0}.cm-footer-stack.simple .cm-mm-text{font-size:11px}.cm-footer-stack.simple>.cm-peak-strip,.cm-footer-stack.simple>.cm-peak-classic{margin:0;padding:4px 8px}.cm-simple-summary>span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cm-footer-stack.simple .cm-bbox-pct{font-size:12px;line-height:18px}.cm-footer-stack.simple .cm-bbox-bar{height:4px}.cm-footer-stack.simple .cm-bbox-line{display:none}.cm-footer-stack.simple .cm-foot{height:26px;padding:0 8px}.cm-footer-stack.simple .cm-peak-classic{margin-top:2px;gap:2px}.cm-footer-stack.simple .cm-peak-classic-chip{padding:0 4px;border:0;background:transparent}.cm-simple-summary{position:sticky;top:0;z-index:1;background:var(--dsw-alias-bg-layer-1);display:flex;justify-content:space-between;align-items:center;gap:8px;padding:5px 8px;font-size:12px;font-weight:600;border-bottom:1px solid var(--dsw-alias-border-l1)}.cm-footer-stack.simple.rail{border:0;background:transparent}.cm-footer-stack.simple.rail .cm-bbox{padding:4px 2px}.cm-footer-stack.simple .cm-peak-rail-track,.cm-footer-stack.simple .cm-peak-rail-classic-track{height:28px}@media(max-width:640px){.cm-cards,.cm-grid,.cm-budget-controls{grid-template-columns:1fr}}',Tt="dsh-cost-meter/client.css";if(typeof document<"u"&&document.querySelector("style[data-plugin-css="+JSON.stringify(Tt)+"]")===null){const t=document.createElement("style");t.dataset.plugin="dsh-cost-meter",t.dataset.pluginCss=Tt,t.textContent=ga,document.head.appendChild(t)}const Ne={zh:{sessionCostTitle:"本会话费用(按每次调用实际时刻精确计费)",sessionDetailTokens:"输入 {input} · 缓存 {cache} · 输出 {output}",sessionDetailCache:"缓存:读 {read} · 写 {write}(写入按命中价计费)",cost:"费用 {amount}",sessionLine:"本会话 {amount} · 输入 {input} · 缓存 {cache} · 输出 {output}",balanceQueryFailed:"余额查询失败:{message}",unknownError:"未知错误",balance:"余额",queryFailed:"查询失败",balanceTitle:"DeepSeek 开放平台账户余额",reconcileLabel:"官方余额变动与本地账本交叉对账(偏差超阈时提示)",totalBalance:"总余额 {amount}",grantedToppedUp:"赠送 {granted} · 充值 {toppedUp}",updatedAt:"更新时间 {time}",budgetOf:"预算({period})",usedOf:"已用 {used} / {amount}",todayShare:"今日 {amount} · 占预算 {pct}",monthTotal:"本月 {month} · 累计 {total}",budget:"预算",todayCostTitle:"今日费用(按官方价格精确计费)",callsTokens:"调用 {calls} 次 · 输入 {input} · 缓存 {cache} · 输出 {output}",monthCost:"本月 {amount}",totalCost:"累计 {amount}",today:"今日",periodDay:"今日",periodMonth:"本月",periodAll:"累计",periodCustomRange:"自定义区间",noHistory:"暂无历史记录。开始对话后,费用将按天汇总在这里。",colDate:"日期",colCalls:"调用",colInTok:"输入 tok",colCacheTok:"缓存 tok",colOutTok:"输出 tok",colCost:"费用",noSessionsToday:"今日暂无会话记录。",colSession:"会话",enableBudget:"启用预算",budgetAmountLabel:"预算额度(按显示币种)",budgetPeriodLabel:"预算周期",startDate:"开始日期",endDate:"结束日期(留空 = 今日)",rangeText:"统计区间:{range}",budgetDisabledNote:"未启用预算。启用后此处显示预算额度、已用金额与已用百分比(按当前币种换算);周期可选今日/本月/累计或自定义日期区间。",budgetStatus:"{period}预算 {amount} · 已用 {used} · {pct}%",overLimit:"(已超出)",nearLimit:"(接近上限)",legacyModel:"旧模型",defaultFallback:"默认回退",remove:"移除",tierBase:"基础",tierOffPeak:"谷时",tierPeak:"峰时",balanceRefreshFailed:"余额刷新失败:{message}",balanceLine:"总余额 {total} · 赠送 {granted} · 充值 {toppedUp} · 更新于 {time}",balanceQueryFailedHint:"余额查询失败:{message}(使用 设置→模型 中配置的 API Key)",balanceNotQueried:"未查询余额",accountBalance:"官方账户余额",refreshing:"刷新中…",refreshBalance:"刷新余额",customBalanceTitle:"自定义 Provider 余额",customBalanceMultiNote:"支持配置多个自定义提供商(最多 8 条),每条独立的请求与解析规则、独立开关与显示位置、独立刷新间隔;升级前的单条配置已自动迁移为第 1 条。",customBalanceAdd:"添加配置",aliyunBalanceAdd:"添加千问 / 阿里云余额",aliyunBalanceNote:"查询阿里云中国站资金账户可用金,按接口币种显示。使用 RAM AccessKey(需 bss:DescribeBillingAccount 权限),不是千问模型 API Key;共享同一组阿里云凭据。前两项必填,Security Token 仅 STS 临时凭据需要。密钥只存入凭据库。",customBalanceRemove:"删除",customBalanceEmpty:"尚未配置自定义 Provider 余额,点击「添加配置」新建。",customBalanceConfigNote:"配置自定义 Provider 的余额查询请求与解析规则。请求头支持 {{ENV_VAR}} 占位符,从 DSH 凭据库或环境变量解析;extract 规则支持点路径、数字常量与 add / subtract / divide 运算(NewApi 等 quota 端点用 divide 按 500000 换算美元)。",customBalanceLabelZh:"中文名称",customBalanceLabelEn:"英文名称",customBalanceUrl:"请求 URL",customBalanceMethod:"请求方法",customBalanceHeaders:"请求头 (JSON)",customBalanceExtract:"解析规则 (JSON)",customBalanceDisplayLabel:"自定义余额显示位置",customBalanceRefreshInterval:"刷新间隔 (分钟)",customBalanceUnitLabel:"余额币种",balanceBarRemaining:"余额 {amount}",balanceBarToday:"当日已用 {amount}",balanceBarSpent:"已用 {amount}",balanceShowProgressBar:"余额进度条 (蓝=余额,橙=当日,灰=已用)",barDirectionsTitle:"进度条方向",barDirectionsHint:"各组进度条可独立选择填充方向:「剩余方向」满条起步、随消耗递减;「已用方向」空条起步、随消耗填满。",barDirection_balance:"余额条(官方/自定义)",barDirection_budget:"预算条",barDirection_go:"Go 额度条",barDirection_plan:"Plan / Codex 额度条",barDirectionRemaining:"剩余方向(满 → 空)",barDirectionUsed:"已用方向(空 → 满)",balanceBudgetCapLabel:"额度上限 (可选)",balanceBudgetCapHint:"留空则优先使用 API 返回的 max_budget;仍无则显示整条浅蓝",customBalanceInvalidJson:"JSON 格式无效",customBalanceHeadersVarNote:"值支持 {{VAR_NAME}} 占位符,从 DSH 凭据库/环境变量解析,不落盘。变量名参考 <ROUTE>_API_KEY:<ROUTE> 为模型页 Provider ID 大写、非字母数字换下划线,如 openai→OPENAI_API_KEY、abc23-d→ABC23_D_API_KEY;同名即共用同一把密钥。",customBalanceAllowedHosts:"凭据白名单 (逗号分隔)",customBalanceAllowedHostsHint:"请求头带密钥时仅放行列表内主机,留空则放行并警告,防导入他人配置外带密钥。",customBalanceCredentialsTitle:"凭据输入",customBalanceCredentialsHint:"为上方 {{VAR}} 占位符存入密钥(write-only,只写凭据库,不回显):",customBalanceNoPlaceholders:'请求头还没有 {{VAR}} 占位符:填入如 "Authorization": "Bearer {{MY_API_KEY}}" 后这里会出现凭据输入框。',enable:"启用",customBalanceOpenConfig:"展开配置",customBalanceCollapseConfig:"收起配置",customBalanceLine:"剩余 {remaining} · 已用 {spend} / 额度 {maxBudget} · 更新于 {time}",customBalanceRemaining:"剩余 {amount}",refreshCustomBalance:"刷新自定义余额",customBalanceRefreshFailed:"自定义余额刷新失败:{message}",goQuotaTitle:"OpenCode Go 订阅额度",goQuotaRowLabel:"Go",goWindowRolling:"滚动 5 小时",goWindowWeekly:"本周",goWindowMonthly:"本月",goResetAt:"重置:{time}",resetReached:"已到重置时间",resetDays:"剩余 {d}天{h}小时",resetHours:"剩余 {h}小时{m}分",resetMinutes:"剩余 {m}分钟",quotaUsed:"已用 {pct}%",quotaRemaining:"剩余 {pct}%",goQuotaPercent:"{percent}%",goQuotaFetchedAt:"更新于 {time}",goQuotaDisplayLabel:"Go 额度显示位置",goQuotaRefreshIntervalLabel:"Go 额度刷新间隔(分钟)",goQuotaRefreshMinutesUnit:"分钟",goQuotaKeyLabel:"OpenCode Go API Key(可选,留空自动发现)",goMainLabel:"Go 额度主档位",goDetailLabel:"Go 图框详细信息",credentialConfiguredOf:"已配置(来源:{source})",credentialNotConfigured:"未配置",credentialSave:"保存",credentialClear:"清除",credentialSaving:"保存中…",credentialInputHint:"密钥只写入 DSH 凭据库,不保存在账本里,也不会回显。",secretMigrationPending:"以下密钥仍以明文留在本地账本,未能自动迁入凭据库。请导出对应环境变量后重启:",budgetDetailLabel:"预算图框详细信息",refreshGoQuota:"刷新额度",goQuotaNotQueried:"未查询额度",enableGoQuota:"启用 OpenCode Go 额度",codingPlansTitle:"Coding Plan 额度",codingPlansNote:"按厂商查询 coding plan 订阅额度(各家独立开关与凭据)。凭据只发送到对应厂商的官方端点;Key 留空时按环境变量与 CLI 登录态自动发现。",codingPlansOpen:"展开 Coding Plan 额度配置",codingPlansCollapse:"折叠 Coding Plan 额度",codingPlansCollapsedHint:"默认收起;展开后可为各家启用、填 Key 并查询额度,展开/收起状态会被记住。",codingPlanAnthropic:"Anthropic(Claude Pro/Max)",codingPlanZai:"Z.ai / 智谱 GLM Coding Plan",codingPlanMinimax:"MiniMax Token Plan",codingPlanMinimaxTitle:"MiniMax Plan",codingPlanRemain5h:"5h",codingPlanRemain7d:"7d",balanceRechargeLink:"打开 DeepSeek 充值页(platform.deepseek.com/usage)",codexQuotaTitle:"ChatGPT (Codex) 周额度",codexQuotaEnabled:"显示 Codex 额度(需安装并登录 dsh-openai-codex)",includeSubagentCost:"本会话费用包含子代理",gatewayQuotaEmpty:"暂无额度数据",enableCodingPlan:"启用额度查询",codingPlanDisplayLabel:"显示位置",codingPlanDisplayNote:"选「主页面侧边栏 / 两者」后,该厂商额度以图框卡片常驻侧边栏(与 Go 额度/余额同款,收起窄栏显示百分比)。",codingPlanKeyLabel:"API Key(可选,留空自动发现)",codingPlanRefreshIntervalLabel:"刷新间隔(分钟)",refreshCodingPlan:"刷新",codingPlanNotQueried:"未查询额度",gatewayQuotaTitle:"CLIProxyAPI 网关额度",gatewayQuotaNote:"只读查询网关 Provider 额度;Management Key 仅写入凭据库。",gatewaySourceAdd:"添加来源",gatewaySourceRemove:"删除来源",gatewaySourceEmpty:"尚未配置网关来源",gatewaySourceEnabled:"启用来源",gatewaySourceLabel:"来源名称",gatewaySourceBaseURL:"Base URL",gatewaySourceDisplay:"显示位置",gatewaySourceAllowlist:"允许的 Host",gatewaySourceCredential:"Management Key(只写)",gatewaySourceStatus:"状态",gatewaySourceUnsupported:"不支持的 Provider",gatewaySourceUnknown:"未知",gatewaySourceNoAccounts:"未发现账号",gatewaySourceRefreshing:"刷新中…",gatewaySourceFetchedAt:"抓取于 {time}",gatewaySwitchAccount:"切换账号 (当前: {account})",codingPlanDisabledNote:"未启用。开启后将按刷新间隔查询该厂商的 coding plan 额度并显示在这里。",goQuotaDisabledNote:"未启用额度。开启后将读取 OpenCode Go 订阅额度(滚动 5 小时 / 本周 / 本月)并显示在侧边栏图框、设置页与右下角;没有 Go 订阅时会在这里提示原因。",cornerLabel:"右下角显示(dock)",cornerEnabledLabel:"在右下角显示 OpenCode Go 额度 / 预算",cornerGoRolling:"滚动 5 小时额度",cornerGoWeekly:"本周额度",cornerGoMonthly:"本月额度",cornerBudget:"预算已用%",goShortRolling:"5h",goShortWeekly:"周",goShortMonthly:"月",goShortDaily:"日",budgetShort:"预算",ledgerReadFailed:"账本读取失败:{message}",readingLedger:"正在读取账本…",ledgerUnavailable:"账本不可用",syncFailed:"同步失败:{message}",historyCleared:"历史记录已清除。",clearFailed:"清除失败:{message}",peakOff:"峰谷计价已关闭,按基础价格计费",peakNotEffective:"尚未生效(生效时间:{time}),当前按基础价格计费",peakActive:"当前处于峰时段,按峰时价计费",peakNotice:"当前为 DeepSeek 峰时高价时段,按峰时价计费",offPeakActive:"当前处于谷时段,按谷时价计费",weekendAllOffPeak:"周末时段——全谷价(周六及周日全天按谷时价计费)",weekendChip:"周末时段——全谷价",weekendShort:"周末全谷",weekendRuleNote:"2026-08-23(周日)00:00 起,周末(周六及周日,北京时间)全天不再区分峰谷,统一按谷时价格计费;生效前的费用仍按原规则结算。",peakShort:"峰时",offPeakShort:"平价",peakStyleLabel:"峰谷时段条样式",peakStyleCompact:"简洁(单行紧凑)",peakStyleClassic:"经典(分段与胶囊芯片)",peakAlertLabel:"峰/谷切换前弹窗提醒",peakAlertAheadLabel:"提前提醒(分钟,1-30)",peakAlertTargetLabel:"提醒类型",peakAlertTargetPeak:"进入峰时",peakAlertTargetOffPeak:"进入谷时",peakAlertTargetBoth:"峰和谷",peakAlertTitlePeak:"即将进入峰时",peakAlertTitleOffPeak:"即将进入谷时",peakAlertBody:"约 {time} 后计费档位切换为{phase}价,请注意本时段调用成本。",peakAlertPhasePeak:"峰时",peakAlertPhaseOffPeak:"谷时",peakAlertBtn:"知道了",peakAlertBadgePeak:"峰价提醒",peakAlertBadgeOffPeak:"谷价提醒",peakAlertPositionLabel:"弹窗位置",peakAlertPositionCorner:"右下角",peakAlertPositionCenter:"屏幕中心",peakAlertWebNotifyLabel:"同步发送系统通知",peakAlertWebNotifyHint:"开关后请在浏览器地址栏允许通知权限,才能在页面最小化/切走时收到提醒。",peakAlertPreviewLabel:"预览弹窗",peakAlertPreviewPeak:"预览 进入峰",peakAlertPreviewOffPeak:"预览 进入谷",peakAlertPreviewTag:"(预览)",peakPanelTitle:"峰谷计价与提示",peakNoticeHiddenHint:"提示已隐藏:需启用峰谷计价并开启「峰时高价时段显著提示」。",groupGeneral:"常规",groupMoney:"金额与币种",groupSidebar:"侧边栏显示",sidebarSimple:"简化侧栏显示",sidebarSimpleNote:"压缩卡片和明细,保留金额、额度与悬停详情;面板最多占屏幕高度的 38%,超出后可滚动。关闭后恢复原有布局。",sidebarSimpleTitle:"试试更轻巧的侧栏",sidebarSimpleBody:"简化显示可以为会话列表留出更多空间。要现在开启吗?之后可在「设置 → 费用 → 显示」中切换。",sidebarSimpleOn:"开启简化显示",sidebarSimpleOff:"保留当前显示",sidebarSimpleError:"设置未能保存。可重试,或关闭提示后在设置中调整。",closeGuide:"关闭提示",todayBudget:"今日 / {period}预算",sidebarStyleLabel:"侧边栏进度条样式",sidebarStyleStandard:"标准",sidebarStyleCompact:"紧凑(两列)",restorePriceMatches:"恢复已移除的模型 ({count})",removePriceMatchHint:"移除会清除手动映射并隐藏此行,可恢复;不会删除用量记录,后续按自动匹配规则计价。",groupCorner:"右下角角标",groupDetail:"图框详细信息",catalogTitle:"拓展价格表",catalogNote:"内置各厂商、按模型家族分类的参考价格目录(只读)。挂载 = 把条目复制进上方可编辑价格表并参与计费;DeepSeek 模型可取消挂载(回退默认价,目录中仍可重新挂载)。",catalogOpen:"展开拓展价格表",catalogCollapse:"收起拓展价格表",mountBtn:"挂载",unmountBtn:"取消挂载",mountedTag:"已挂载",catalogUnpriced:"未核价",catalogDeepseekNote:"DeepSeek 模型支持峰谷两档;取消挂载后按默认价计费且不再被自动匹配命中。",modelStatsTitle:"按模型统计(token 与费用)",modelStatsToday:"今日",modelStatsHistory:"近 90 天",modelStatsCostH:"费用排行",modelStatsTokensH:"Token 消耗",modelStatsHitH:"缓存命中率",modelStatsHitUnreported:"未上报?",modelStatsHitUnreportedTip:"该模型累计多次长上下文调用而缓存命中恒为 0:大概率是中转/代理层剥掉了用量里的缓存字段(或中转请求导致缓存真实未命中),命中率无法统计,且金额按全未命中价计(为上界)。直连官方 API 可恢复准确的缓存命中与更低的金额。",modelStatsValueH:"性价比 · 每美元 token 数",modelStatsInput:"输入",modelStatsCache:"缓存",modelStatsOutput:"输出",modelStatsEmpty:"该时段暂无用量数据。",modelStatsBlended:"综合单价 {price}/M",modelStatsNote:"口径:缓存命中率 = 缓存读 ÷ (缓存读 + 非缓存输入);「未上报?」= 用量疑似未含缓存字段(常见于中转/代理链路),命中率无法统计且金额按全未命中价计(上界);综合单价 = 费用 ÷ 总 token × 1M(USD/M tokens);性价比 = 总 token ÷ 费用,越高越好;费用为账本按每次调用实际时刻计费的美元值。",modelStatsLegacy:"未分模型(早期数据 · 按当时记录计费)",sessionLineSplit:"本会话 {amount}(API)· Plan 等值 {planAmount} · 输入 {input} · 缓存 {cache} · 输出 {output}",costChipPlan:"费用 {amount}(+Plan)",sessionDetailPlan:"Plan 订阅额度消耗(等值){amount}",planStatsTitle:"Token Plan 用量统计(每 1% 与满窗估算)",planStatsEmpty:"暂无已启用的 Coding Plan 额度数据;在「额度」标签启用并成功刷新后,这里会显示各窗口的每 1% 额度与满窗用量估算。",planStatsWindow:"窗口",planStatsPercent:"已用 %",planStatsLocal:"本周期实际(本地账本)",planStatsPer1:"每 1% 额度 ≈",planStatsFull:"满窗 100% ≈",planStatsResets:"重置 {time}",planStatsMethodSample:"采样差分",planStatsMethodLive:"当前用量折算",planStatsMethodNone:"样本不足",planStatsMethodSampleAt:"{method}(基准 {time})",planStatsConfidenceLow:"读数精度受限",planStatsCurveTitle:"Plan 用量曲线(按采样区间聚合)",planStatsDaily:"每日",planStatsWeekly:"每周",planStatsMonthly:"每月",planStatsCurveEmpty:"采样区间尚不足(至少两次成功刷新且百分比有变化),曲线会在持续使用后逐步成形。",planStatsBarTip:"{date}:满窗估计 ≈ {full}(每 1% ≈ {per1})· 实际 {tokens} / {cost} · {intervals} 个采样区间",planStatsNote:"口径:「金额」为目录 API 价等值——订阅渠道耗套餐额度,预算只计 API;估算只统计 dsh 内调用,服务端「已用%」为全账号口径。每 1%/满窗取可信采样段差分(短段波动大,标注「精度受限」)。5 小时窗滚动,周/月按本地日历。",billingClassLabel:"计费方式",billingClassPlan:"Plan 订阅",catalogDisplayLabel:"在费用设置直接显示",catalogDisplayHint:"只决定该模型价格卡是否在费用设置「价格表」区直接显示,不影响挂载状态与计费;不直接显示时已挂载模型在拓展价格表内展开厂商后可编辑。",priceTableDisplayHint:"各模型是否在「价格表」区直接显示,可在下方拓展价格表中逐模型用「在费用设置直接显示」开关切换;DeepSeek 模型默认直接显示,第三方模型挂载后默认收入拓展表。",catalogCustomModels:"手动新增模型",priceMatchLabel:"未知模型名自动匹配",priceMatchAuto:"自动(去后缀 / 前缀 / 家族相似)",priceMatchExact:"仅精确匹配",priceMatchNote:"自动匹配顺序:精确 → 手动指定 → 去日期/版本后缀 → 前缀 → 家族相似;未命中时 DeepSeek 回退默认价,其他 provider 不计价。",unmatchedTitle:"最近出现但未命中价格的模型",unmatchedHint:"按当前匹配模式未命中价格条目(含跨厂商兑底后仍按默认价兜底的);为其指定条目写入手动匹配覆盖,选择「默认价」即回退 DeepSeek 默认价。本地推理来源(lmstudio / ollama / vLLM 等)的模型已自动按零消耗处理;如需计费,可在此为其指定价格条目。",overrideTargetDefault:"DeepSeek 默认价",overrideRemove:"移除",overrideTargetLocal:"本地模型(零消耗)",matchedTitle:"本月已命中价格的模型",matchedHint:"以下模型已自动命中价格条目。在行内选择目标即可改挂其它条目,或选择「本地模型(零消耗)」把该模型标记为本地来源——token 照常统计、费用按 0 计,历史金额即时归零。写入后该行转入上方手动指定区。",matchedKeepAuto:"保持自动命中",overrideNone:"暂无手动匹配覆盖。",mountedSuffix:"已挂载(参与计费)",flatInput:"输入",flatCached:"缓存",flatOutput:"输出",deepseekMountedHeader:"DeepSeek 价格表(已挂载)",codingPlanKimi:"Kimi / Moonshot",codingPlanOpenrouter:"OpenRouter",codingPlanSiliconflow:"SiliconFlow 硅基流动",codingPlanCommandcode:"CommandCode",codingPlanScnet:"SCNet 超算互联网 Token Plan",codingPlanVolcengine:"火山方舟 Volcano Ark Coding Plan",codingPlanQwen:"千问 Qwen Token Plan",qwenPlanCreditsLabel:"月度 Credits 额度(个人版 Lite 5 万 / 标准版 50 万,以订阅页为准)",qwenPlanStartLabel:"订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)",qwenRatesLabel:"Credits 抵扣率覆盖(可选;每百万 token 抵扣的 Credits,留空用内置表)",qwenRatesModelPlaceholder:"模型名,如 qwen3.8-max-preview",qwenRatePlaceholder:"费率",qwenRate_input:"输入",qwenRate_cachedInput:"缓存读",qwenRate_output:"输出",qwenRateDraftNote:"待填齐三项正数后自动保存;全部清空恢复内置表。",qwenRatesAdd:"添加",qwenLocalNote:"按本地账本估算,实际 Credits 以控制台为准。仅统计 qwen、qwen-tokenplan、qianwen-tokenplan、qwen-token-plan、qianwen-token-plan 订阅渠道(支持 llm- 前缀),显式分类为 API 的调用不计;qianwen 按量渠道不计。内置表以外的模型需手动指定抵扣率。",scnetPlanCreditsLabel:"本地估算月度 Credits 额度(基础 60,000 / 标准 240,000 / 高级 600,000)",scnetPlanStartLabel:"订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)",scnetLocalNote:"可接入外部控制台快照(以采集时间为准,最长保留 24 小时)。没有有效快照时,按官方 Credits 抵扣表由本地账本估算;本地估算不覆盖其他工具的调用和未收录模型,实际用量以控制台为准。",volcengineAccessKeyIdLabel:"火山引擎 AccessKey ID",volcengineSecretAccessKeyLabel:"火山引擎 SecretAccessKey",volcengineNote:"火山方舟管控面需 AK/SK 签名(非 ARK_API_KEY Bearer):在火山引擎控制台 IAM 创建子用户并授予 ArkReadOnlyAccess + BillingCenterReadOnlyAccess,填写 AccessKeyID 与 SecretAccessKey;也可在环境变量导出 VOLC_ACCESSKEY / VOLC_SECRETKEY 自动发现(官方 SDK 约定);凭据仅发往 open.volcengineapi.com。",volcengineAccessKeyPlaceholder:"AK...",volcengineSecretPlaceholder:"SK...",countdownHoursOnly:"{h}小时",countdownHourMinute:"{h}小时{m}分",countdownMinute:"{m}分钟",nextOffPeakIn:"{time}后进入平价",nextPeakIn:"{time}后进入高峰",peakSummary:"峰时段(UTC):{windows};生效时间:{time}。{status}",noPeakWindows:"未配置峰谷时段。{status}",unknown:"未知",cardToday:"今日费用",cardMonth:"本月费用",cardTotal:"累计费用",cardTotalSub:"自账本建立以来 · 调用 {calls} 次",cardsFootnote:"口径说明:金额为最近一次落盘快照(2 秒防抖;正常关闭会先强制落盘再退出),与官方实时账单存在分钟级时差属预期;tokens 列为输入+输出+缓存+推理的合计——推理 tokens 由 API 单独上报且不计费(官方账单将其并入「输出」列展示),对账请以金额为准。",timezoneHint:"时区提示:「今日/本月」按宿主机时区 {host} 取日界,与当前浏览器({browser})不同——宿主机跨日界的时刻与本地不一致,你本地午夜后的调用会被记到前一日(并非漏计;官方余额对账也会因此提示偏差)。可在宿主机上以本地时区运行 dsh 使两者一致。",todaySessions:"今日会话",historyExpandHint:"点击日期行可展开当日会话明细",historySessionsLoading:"会话明细加载中…",historyNoSessions:"该日无会话明细(早期数据或会话日志已清理)",historySessionsError:"会话明细加载失败",sessionRankTitle:"按会话统计(全部历史)",sessionRankHint:"不按日期分组,全部历史会话;排序与条数可切换",sessionRankEmpty:"暂无会话数据",sessionRankLoading:"会话排行加载中…",sessionRankError:"会话排行加载失败",sessionRankLimit:"显示条数",showSessionIdLabel:"会话列表附显会话 ID",cardsTogglePlanTotal:"金额含 Plan 总额",cardsTogglePlanTotalHint:"开启后所有金额按含 Plan 订阅等值的总费用展示;关闭(默认)仅计真金白银 API 渠道",hideOfficialBalanceLabel:"隐藏官方账户余额(开启后侧边栏与设置页不再显示官方余额)",hideTodayCostLabel:"隐藏今日消耗金额(开启后侧边栏/预算明细/概览卡片不再显示今日费用)",sessionRankSort:"排序",sessionSortCostDesc:"费用 高→低",sessionSortCostAsc:"费用 低→高",sessionSortTimeDesc:"时间 新→旧",sessionSortTimeAsc:"时间 旧→新",sessionSortRecent:"实时顺序",history:"历史记录",usageTitle:"Token 用量统计",usageTotal:"累计 {tokens} tokens · 输入 {input} · 缓存 {cache} · 输出 {output} · {calls} 次调用",usageDay:"{date}:共 {tokens} tokens(输入 {input} · 缓存 {cache} · 输出 {output})· {calls} 次调用 · {cost}",usageEmpty:"暂无历史数据,开始对话后每日用量会汇总在这里",usageSectionLabel:"用量",usagePositionLabel:"Token 用量统计位置",usagePositionCost:"费用设置",usagePositionGeneral:"通用设置",usagePositionSection:"独立分节(用量)",displaySettings:"显示设置",tabOverview:"概览",tabQuotas:"额度",tabUsage:"用量",tabPricing:"价格",tabDisplay:"显示",historyDataTitle:"历史数据",positionLabel:"会话费用显示位置",positionDock:"输入区下方",positionHeader:"会话标题栏",off:"关闭",quotaStripGroup:"输入框上方额度横条",quotaStripEnable:"启用额度横条(输入框上方一条横排显示)",quotaStripShowBudget:"横条含预算已用%",quotaStripShowGo:"横条含 Go 额度",quotaStripShowPlans:"横条含 Coding Plan 额度",quotaStripNote:"横条悬停可见各窗口重置时刻与更新时间;无可用额度数据时自动隐藏。",quotaStripGuideTitle:"新增:输入框上方额度横条",quotaStripGuideBody:"可以在输入框上方用一条横条实时查看预算与多家订阅额度(OpenCode Go / Coding Plan)的用量百分比。要现在开启吗?可随时在「设置 → 显示设置」中更改。",quotaStripGuideOn:"开启横条",quotaStripGuideOff:"暂不开启",clickToRefresh:"点击立即刷新",balanceClickGuideTitle:"新增:余额图框点击刷新",balanceClickGuideBody:"现在点击侧边栏的官方余额 / 自定义余额 / Coding Plan 图框,即可立即刷新最新数据,无需等待自动刷新间隔或进入设置页;刷新中会有呼吸闪烁,失败时保持原值并在悬停提示中说明原因。",balanceClickGuideOk:"知道了",sidebarLabel:"当日费用显示",sidebarOn:"侧边栏底部",currencyLabel:"货币单位",currencyCny:"人民币 CNY",currencyUsd:"美元 USD",currencyEur:"欧元 EUR",symbolLabel:"货币符号",rateLabel:"汇率(1 美元 = ? 目标币种)",decimalsLabel:"小数位数",balanceDisplayLabel:"余额显示位置",balanceSidebar:"主页面侧边栏",balanceSettings:"设置页",balanceBoth:"两者都显示",refreshIntervalLabel:"余额刷新间隔(分钟)",peakEnabledLabel:"启用 DeepSeek 峰谷时段价格",peakNoticeLabel:"峰时高价时段显著提示(侧边栏预算框/今日费用;设置页峰谷面板内预览)",badgeNote:"会话费用按每次调用的时间与价格计算,保留峰谷和历史档位。输入、输出、缓存读写分别统计;提供独立缓存写入价或长上下文档位时按对应规则计费。",priceTableTitle:"价格表(美元 / 1M tokens)",pricingCurrencyLabel:"官方价格币种",pricingCurrencyUsd:"美元(英文官方页)",pricingCurrencyCny:"人民币(中文官方页)",pricingCurrencyNote:"决定「从官方文档同步价格」抓取哪个语言的官方页。切换并同步后,历史账目会按新价目整体重算(日志覆盖不全的会话保持原口径),历史与官方账单同基准;重算在后台进行,完成后有提示。",priceTableNote:"价格按调用时间选择:Flash 新价自北京时间 2026-09-10 12:00 生效,V4 Pro 自 09-14 12:00 转按 Flash 计价;此前的历史价保留。工作日高峰为 09–12、14–18 时,峰价为谷价两倍,周末全天谷价。缓存写入按命中价计费。所有设置修改后自动保存。",datedPriceNote:"这里显示当前适用价格。手工编辑会取消此条后续预定调价,已发生的历史价格仍保留。",defaultModelId:"default(未匹配模型时回退)",newModelPlaceholder:"新模型 ID(如 deepseek-v4-pro)",addModel:"添加模型",dataSync:"数据与同步",saving:"保存中…",autoSaveFailed:"自动保存失败:{message}",autoSavedAt:"已自动保存 {time}",autoSaveHint:"配置修改后自动保存",confirmFetch:"确认用官方文档价格覆盖价格表?",apply:"应用",cancel:"取消",syncFromDocs:"从官方文档同步价格",syncScopeNote:"同步范围说明:「从官方文档同步价格」仅更新 DeepSeek 官方模型价(含峰谷档);第三方厂商的扩展目录价(z-ai / Kimi / Qwen / Volcano 等)不随该按钮变化,随插件版本发布维护,如有滞后可在「拓展价格表」挂载后编辑,或经「模型名匹配」为任意模型手动指定价格。",confirmReset:"确认清除全部历史?",importLegacy:"导入安装前历史",confirmImportLegacy:"确认导入?将回放全部会话日志,只补账本缺失的日期与会话,不影响已有记录。",legacyImportFailed:"导入安装前历史失败:{message}",legacyImportNote:"插件首次启动后会自动导入一次安装前历史;此处可手动重跑(如后续拷入了旧日志)。金额按当前价目表回推,已清理的日志无法回放,同一会话跨安装时刻时其安装前用量不计入。",confirmClear:"确认清除",clearAllHistory:"清除全部历史",lastSync:"最近同步:{time}",neverSynced:"从未(使用内置价格)",source:";来源:{source}",sourceOfficial:"官方文档",sourceBundled:"内置默认",languageLabel:"界面语言",localeAuto:"跟随浏览器(自动)",localeZh:"简体中文",localeEn:"English",sectionLabel:"费用",rpcFailed:"{method} 调用失败",rpcSyncFailed:"同步调用失败",rpcBalanceFailed:"余额刷新调用失败"},en:{sessionCostTitle:"Cost of this session (billed exactly at each call time)",sessionDetailTokens:"Input {input} · Cache {cache} · Output {output}",sessionDetailCache:"Cache: read {read} · write {write} (writes billed at the hit price)",cost:"Cost {amount}",sessionLine:"This session {amount} · Input {input} · Cache {cache} · Output {output}",balanceQueryFailed:"Balance query failed: {message}",unknownError:"Unknown error",balance:"Balance",queryFailed:"Query failed",balanceTitle:"DeepSeek open-platform account balance",reconcileLabel:"Cross-check official balance changes against the local ledger (warn when they diverge)",totalBalance:"Total {amount}",grantedToppedUp:"Granted {granted} · Topped-up {toppedUp}",updatedAt:"Updated {time}",budgetOf:"Budget ({period})",usedOf:"Used {used} / {amount}",todayShare:"Today {amount} · {pct} of budget",monthTotal:"This month {month} · All time {total}",budget:"Budget",todayCostTitle:"Today's cost (billed exactly at official prices)",callsTokens:"Calls {calls} · Input {input} · Cache {cache} · Output {output}",monthCost:"This month {amount}",totalCost:"All time {amount}",today:"Today",periodDay:"Today",periodMonth:"This month",periodAll:"All time",periodCustomRange:"Custom range",noHistory:"No history yet. Once you start chatting, costs are aggregated here per day.",colDate:"Date",colCalls:"Calls",colInTok:"In tok",colCacheTok:"Cache tok",colOutTok:"Out tok",colCost:"Cost",noSessionsToday:"No sessions recorded today.",colSession:"Session",enableBudget:"Enable budget",budgetAmountLabel:"Budget amount (in display currency)",budgetPeriodLabel:"Budget period",startDate:"Start date",endDate:"End date (empty = today)",rangeText:"Range: {range}",budgetDisabledNote:"Budget is disabled. Once enabled, this panel shows the budget limit, the amount used and the used percentage (converted to the display currency); the period can be today / this month / all time / a custom date range.",budgetStatus:"{period} budget {amount} · Used {used} · {pct}%",overLimit:" (over limit)",nearLimit:" (near limit)",legacyModel:"Legacy",defaultFallback:"Default fallback",remove:"Remove",tierBase:"Base",tierOffPeak:"Off-peak",tierPeak:"Peak",balanceRefreshFailed:"Balance refresh failed: {message}",balanceLine:"Total {total} · Granted {granted} · Topped-up {toppedUp} · Updated {time}",balanceQueryFailedHint:"Balance query failed: {message} (uses the API key configured in Settings → Models)",balanceNotQueried:"Balance not queried",accountBalance:"Account balance",refreshing:"Refreshing…",refreshBalance:"Refresh balance",customBalanceTitle:"Custom provider balance",customBalanceMultiNote:"Configure multiple custom providers (up to 8): each entry has its own request & extract rules, enable switch, display position and refresh interval; your previous single entry was migrated to #1 automatically.",customBalanceAdd:"Add entry",aliyunBalanceAdd:"Add Qianwen / Alibaba Cloud balance",aliyunBalanceNote:"Queries available funds for an Alibaba Cloud China account in the returned currency. Uses shared RAM AccessKey credentials with bss:DescribeBillingAccount permission, not a Qianwen model API key. The first two fields are required; Security Token is only for temporary STS credentials. Secrets stay in the credential store.",customBalanceRemove:"Remove",customBalanceEmpty:'No custom provider balance configured yet — click "Add entry" to create one.',customBalanceConfigNote:"Configure the balance query request and extract rules. Headers support {{ENV_VAR}} placeholders resolved from DSH credentials or environment variables; extract rules accept dot paths, numeric constants, and add / subtract / divide operations (use divide with 500000 for NewApi-style quota endpoints).",customBalanceLabelZh:"Chinese name",customBalanceLabelEn:"English name",customBalanceUrl:"Request URL",customBalanceMethod:"HTTP method",customBalanceHeaders:"Headers (JSON)",customBalanceExtract:"Extract rules (JSON)",customBalanceDisplayLabel:"Custom balance display",customBalanceRefreshInterval:"Refresh interval (minutes)",customBalanceUnitLabel:"Balance currency",balanceBarRemaining:"Balance {amount}",balanceBarToday:"Today {amount}",balanceBarSpent:"Spent {amount}",balanceShowProgressBar:"Balance progress bar (blue=balance, orange=today, gray=spent)",barDirectionsTitle:"Progress bar direction",barDirectionsHint:'Each group of bars can independently choose its fill direction: "Remaining" starts full and drains with usage; "Used" starts empty and fills up.',barDirection_balance:"Balance bars (official/custom)",barDirection_budget:"Budget bar",barDirection_go:"Go quota bar",barDirection_plan:"Plan / Codex quota bars",barDirectionRemaining:"Remaining (full → empty)",barDirectionUsed:"Used (empty → full)",balanceBudgetCapLabel:"Budget cap (optional)",balanceBudgetCapHint:"Leave empty to use API max_budget; if still missing, show full light-blue bar",customBalanceInvalidJson:"Invalid JSON",customBalanceHeadersVarNote:"Values support {{VAR_NAME}} placeholders resolved from the DSH credential store or env, never written to disk. The name follows <ROUTE>_API_KEY, where <ROUTE> is the Models-page Provider ID uppercased with non-alphanumerics replaced by underscores, e.g. openai→OPENAI_API_KEY, abc23-d→ABC23_D_API_KEY; sharing a name shares the same key.",customBalanceAllowedHosts:"Allowed hosts (comma-separated)",customBalanceAllowedHostsHint:"When headers carry credentials only listed hosts are allowed; leave empty to allow with a warning. Protects keys when importing someone else's config.",customBalanceCredentialsTitle:"Credential input",customBalanceCredentialsHint:"Store the key for each {{VAR}} placeholder above (write-only: stored in the DSH credential store, never echoed back):",customBalanceNoPlaceholders:'No {{VAR}} placeholders in the headers yet — add e.g. "Authorization": "Bearer {{MY_API_KEY}}" and a credential input will appear here.',enable:"Enable",customBalanceOpenConfig:"Expand config",customBalanceCollapseConfig:"Collapse config",customBalanceLine:"Remaining {remaining} · Spent {spend} / Budget {maxBudget} · Updated {time}",customBalanceRemaining:"Remaining {amount}",refreshCustomBalance:"Refresh custom balance",customBalanceRefreshFailed:"Custom balance refresh failed: {message}",goQuotaTitle:"OpenCode Go subscription quota",goQuotaRowLabel:"Go",goWindowRolling:"Rolling 5h",goWindowWeekly:"Weekly",goWindowMonthly:"Monthly",goResetAt:"Resets: {time}",resetReached:"Reset time reached",resetDays:"{d}d {h}h left",resetHours:"{h}h {m}m left",resetMinutes:"{m}m left",quotaUsed:"{pct}% used",quotaRemaining:"{pct}% remaining",goQuotaPercent:"{percent}%",goQuotaFetchedAt:"Updated {time}",goQuotaDisplayLabel:"Go quota display position",goQuotaRefreshIntervalLabel:"Go quota refresh interval (minutes)",goQuotaRefreshMinutesUnit:"min",goQuotaKeyLabel:"OpenCode Go API key (optional; empty = auto-detect)",goMainLabel:"Go quota primary window",goDetailLabel:"Go box details",credentialConfiguredOf:"Configured (source: {source})",credentialNotConfigured:"Not configured",credentialSave:"Save",credentialClear:"Clear",credentialSaving:"Saving…",credentialInputHint:"The key is written to the DSH credential store only — it is never saved in the ledger and never echoed back.",secretMigrationPending:"These credentials are still stored in plaintext in the local ledger and could not be migrated automatically. Export the matching environment variables and restart:",budgetDetailLabel:"Budget box details",refreshGoQuota:"Refresh quota",goQuotaNotQueried:"Quota not queried",enableGoQuota:"Enable OpenCode Go quota",codingPlansTitle:"Coding plan quotas",codingPlansNote:"Query coding plan subscription quotas per vendor (independent enable switch and credentials per vendor). Credentials are only sent to the vendor's official endpoint; leave the key empty to auto-detect from environment variables and CLI logins.",codingPlansOpen:"Expand Coding Plan quotas",codingPlansCollapse:"Collapse Coding Plan quotas",codingPlansCollapsedHint:"Collapsed by default; expand to enable providers, enter keys and query quotas. The open/closed state is remembered.",codingPlanAnthropic:"Anthropic (Claude Pro/Max)",codingPlanZai:"Z.ai / Zhipu GLM Coding Plan",codingPlanMinimax:"MiniMax Token Plan",codingPlanMinimaxTitle:"MiniMax Plan",codingPlanRemain5h:"5h",codingPlanRemain7d:"7d",balanceRechargeLink:"Open DeepSeek top-up page (platform.deepseek.com/usage)",codexQuotaTitle:"ChatGPT (Codex) weekly quota",codexQuotaEnabled:"Show Codex quota (requires signed-in dsh-openai-codex)",includeSubagentCost:"Include subagents in session cost",gatewayQuotaEmpty:"No quota data",enableCodingPlan:"Enable quota queries",codingPlanDisplayLabel:"Display position",codingPlanDisplayNote:`With "Main sidebar / Both" selected, this vendor's quota shows as a card in the sidebar (same box style as the Go quota / balance; the collapsed rail shows percentages).`,codingPlanKeyLabel:"API key (optional; empty = auto-detect)",codingPlanRefreshIntervalLabel:"Refresh interval (minutes)",refreshCodingPlan:"Refresh",codingPlanNotQueried:"Quota not queried",gatewayQuotaTitle:"CLIProxyAPI gateway quotas",gatewayQuotaNote:"Read-only gateway provider quotas; management keys are write-only.",gatewaySourceAdd:"Add source",gatewaySourceRemove:"Remove source",gatewaySourceEmpty:"No gateway source configured",gatewaySourceEnabled:"Enable source",gatewaySourceLabel:"Source label",gatewaySourceBaseURL:"Base URL",gatewaySourceDisplay:"Display",gatewaySourceAllowlist:"Allowed hosts",gatewaySourceCredential:"Management key (write-only)",gatewaySourceStatus:"Status",gatewaySourceUnsupported:"Unsupported providers",gatewaySourceUnknown:"Unknown",gatewaySourceNoAccounts:"No accounts",gatewaySourceRefreshing:"Refreshing…",gatewaySourceFetchedAt:"fetched {time}",gatewaySwitchAccount:"Switch account (current: {account})",codingPlanDisabledNote:"Disabled. Enable it to query this vendor's coding plan quota on the refresh interval and show it here.",goQuotaDisabledNote:"Quota disabled. Enable it to read the OpenCode Go subscription quota (rolling 5h / weekly / monthly) and show it in the sidebar box, Settings page and bottom-right corner; if you have no Go subscription, the reason will be shown here.",cornerLabel:"Bottom-right (dock) display",cornerEnabledLabel:"Show OpenCode Go quota / budget at the bottom-right",cornerGoRolling:"Rolling-5h quota",cornerGoWeekly:"Weekly quota",cornerGoMonthly:"Monthly quota",cornerBudget:"Budget used %",goShortRolling:"5h",goShortWeekly:"Wk",goShortMonthly:"Mo",goShortDaily:"Daily",budgetShort:"Budget",ledgerReadFailed:"Ledger read failed: {message}",readingLedger:"Reading ledger…",ledgerUnavailable:"Ledger unavailable",syncFailed:"Sync failed: {message}",historyCleared:"History cleared.",clearFailed:"Clear failed: {message}",peakOff:"Peak/off-peak pricing is off; base prices are used",peakNotEffective:"Not yet effective (effective at {time}); base prices are currently used",peakActive:"Peak hour now; peak prices apply",peakNotice:"DeepSeek peak-hour pricing is active; current calls are billed at peak prices",offPeakActive:"Off-peak now; off-peak prices apply",weekendAllOffPeak:"Weekend — all off-peak (Sat & Sun billed at off-peak prices all day)",weekendChip:"Weekend — all off-peak",weekendShort:"Weekend",weekendRuleNote:"From Aug 23, 2026 00:00 (Beijing time), weekends (Saturday & Sunday) are billed entirely at off-peak prices; charges before that still follow the previous rules.",peakShort:"Peak",offPeakShort:"Off-peak",peakStyleLabel:"Peak period strip style",peakStyleCompact:"Compact (one-line)",peakStyleClassic:"Classic (segments & chip)",peakAlertLabel:"Popup alert before peak/off-peak switch",peakAlertAheadLabel:"Lead time (minutes, 1-30)",peakAlertTargetLabel:"Alert type",peakAlertTargetPeak:"Entering peak",peakAlertTargetOffPeak:"Entering off-peak",peakAlertTargetBoth:"Both",peakAlertTitlePeak:"Entering peak hours soon",peakAlertTitleOffPeak:"Entering off-peak hours soon",peakAlertBody:"Billing switches to {phase} pricing in about {time}; mind your call costs in this window.",peakAlertPhasePeak:"peak",peakAlertPhaseOffPeak:"off-peak",peakAlertBtn:"Got it",peakAlertBadgePeak:"Peak alert",peakAlertBadgeOffPeak:"Off-peak alert",peakAlertPositionLabel:"Popup position",peakAlertPositionCorner:"Bottom-right",peakAlertPositionCenter:"Screen center",peakAlertWebNotifyLabel:"Also send a system notification",peakAlertWebNotifyHint:"When enabled, allow notification permission in the browser address bar so you get alerted even when the page is minimized or backgrounded.",peakAlertPreviewLabel:"Preview the popup",peakAlertPreviewPeak:"Preview entering peak",peakAlertPreviewOffPeak:"Preview entering off-peak",peakAlertPreviewTag:" (preview)",peakPanelTitle:"Peak/off-peak pricing & notice",peakNoticeHiddenHint:"Notice hidden: enable peak/off-peak pricing and the “prominent notice” toggle.",groupGeneral:"General",groupMoney:"Money & currency",groupSidebar:"Sidebar display",sidebarSimple:"Simplify the sidebar",sidebarSimpleNote:"Condense cards and details while keeping amounts, quotas and hover details. The panel uses at most 38% of the viewport height and scrolls as needed. Turn off to restore your layout.",sidebarSimpleTitle:"A lighter sidebar",sidebarSimpleBody:"Simple display leaves more room for conversations. Enable it now? You can change it in Settings → Cost → Display anytime.",sidebarSimpleOn:"Enable simple display",sidebarSimpleOff:"Keep current display",sidebarSimpleError:"Settings could not be saved. Retry or dismiss this guide and change them later in Settings.",closeGuide:"Dismiss guide",todayBudget:"Today / {period} budget",sidebarStyleLabel:"Sidebar progress style",sidebarStyleStandard:"Standard",sidebarStyleCompact:"Compact (2 columns)",restorePriceMatches:"Restore removed models ({count})",removePriceMatchHint:"Remove clears the override and hides the row until restored. Usage records are kept; automatic price matching applies.",groupCorner:"Corner chips",groupDetail:"Box details",catalogTitle:"Extended price catalog",catalogNote:"A built-in, read-only reference catalog grouped by vendor and model family. Mounting copies an entry into the editable price table above so it is used for billing; DeepSeek models can be unmounted (they fall back to the default price and can be re-mounted here).",catalogOpen:"Expand extended price catalog",catalogCollapse:"Collapse extended price catalog",mountBtn:"Mount",unmountBtn:"Unmount",mountedTag:"Mounted",catalogUnpriced:"Unpriced",catalogDeepseekNote:"DeepSeek models support peak/off-peak tiers; once unmounted they bill at the default price and are no longer hit by auto-matching.",modelStatsTitle:"Per-model statistics (tokens & cost)",modelStatsToday:"Today",modelStatsHistory:"Last 90 days",modelStatsCostH:"Cost ranking",modelStatsTokensH:"Token usage",modelStatsHitH:"Cache hit rate",modelStatsHitUnreported:"unreported?",modelStatsHitUnreportedTip:"This model has many long-context calls but zero cache hits: most likely a relay/proxy strips the cache fields from usage (or the relay genuinely breaks the prefix cache). The hit rate cannot be computed and the cost is priced as all-cache-miss (an upper bound). Connecting directly to the official API restores accurate cache hits and lower costs.",modelStatsValueH:"Value · tokens per USD",modelStatsInput:"Input",modelStatsCache:"Cache",modelStatsOutput:"Output",modelStatsEmpty:"No usage data for this period.",modelStatsBlended:"blended {price}/M",modelStatsNote:'Cache hit rate = cache reads ÷ (reads + non-cached input); "unreported?" = usage carries no cache fields (common behind relays), cost priced as all-miss (upper bound); blended = cost ÷ tokens × 1M; value = tokens ÷ cost (higher better). Costs are USD as billed.',billingClassLabel:"Billing class",billingClassPlan:"Plan subscription",modelStatsLegacy:"Unattributed (early data · billed as recorded)",sessionLineSplit:"This session {amount} (API) · Plan equiv. {planAmount} · Input {input} · Cache {cache} · Output {output}",costChipPlan:"Cost {amount} (+Plan)",sessionDetailPlan:"Plan subscription quota usage (equiv.) {amount}",planStatsTitle:"Token Plan usage stats (per-1% & full-window estimates)",planStatsEmpty:"No enabled coding-plan quota data yet; enable and successfully refresh a provider under the Quotas tab to see per-1% and full-window usage estimates here.",planStatsWindow:"Window",planStatsPercent:"Used %",planStatsLocal:"This period actual (local ledger)",planStatsPer1:"Per 1% quota ≈",planStatsFull:"Full window (100%) ≈",planStatsResets:"resets {time}",planStatsMethodSample:"sample delta",planStatsMethodLive:"current usage ratio",planStatsMethodNone:"not enough samples",planStatsMethodSampleAt:"{method} (as of {time})",planStatsConfidenceLow:"low reading precision",planStatsCurveTitle:"Plan usage curves (aggregated from sample intervals)",planStatsDaily:"Daily",planStatsWeekly:"Weekly",planStatsMonthly:"Monthly",planStatsCurveEmpty:"Not enough sample intervals yet (at least two successful refreshes with a percent change); the curves will take shape with continued use.",planStatsBarTip:"{date}: full-window est. ≈ {full} (per 1% ≈ {per1}) · actual {tokens} / {cost} · {intervals} sample interval(s)",planStatsNote:'Scope: amounts are catalog-price equivalents — plans consume quota, budget counts API only. Estimates cover dsh-made calls only; server "used %" covers the whole account. Per-1%/full-window from trustworthy sample deltas (short segments fluctuate, tagged low-precision). 5h window rolling, week/month local calendar.',catalogDisplayLabel:"Show directly in Cost settings",catalogDisplayHint:"Only decides whether this model's price card appears directly in the Cost settings price table; mounting and billing are unaffected. When hidden, the mounted model stays editable inside the expanded vendor section of this catalog.",priceTableDisplayHint:"Use the per-model “Show directly in Cost settings” toggle in the extended price catalog below to choose which models appear here; DeepSeek models default to direct display, third-party models default to the catalog once mounted.",catalogCustomModels:"Custom models",priceMatchLabel:"Auto-match unknown model names",priceMatchAuto:"Auto (strip suffix / prefix / family similarity)",priceMatchExact:"Exact match only",priceMatchNote:"Match order: exact → manual override → strip date/version suffix → prefix → family similarity. Unmatched DeepSeek ids fall back to the default price; other providers stay unpriced.",unmatchedTitle:"Recently seen models without a price hit",unmatchedHint:"No price entry hit under the current match mode (incl. cross-vendor fallback), or fell back to the DeepSeek default. Pick which entry each bills against (saved as a manual override); “Default price” = DeepSeek default. Local-runtime models (lmstudio / ollama / vLLM / …) are zero-cost automatically; assign an entry here to bill them.",overrideTargetDefault:"DeepSeek default price",overrideRemove:"Remove",overrideTargetLocal:"Local model (zero cost)",matchedTitle:"Models matched this month",matchedHint:"These models already auto-matched a price entry. Pick a target to re-map them, or pick “Local model (zero cost)” to mark them as local — tokens are still counted, cost is 0, and their historical amounts are zeroed immediately. Overridden rows move to the manual list above.",matchedKeepAuto:"Keep auto match",overrideNone:"No manual match overrides.",mountedSuffix:"Mounted (billed)",flatInput:"Input",flatCached:"Cached",flatOutput:"Output",deepseekMountedHeader:"DeepSeek price table (mounted)",codingPlanKimi:"Kimi / Moonshot",codingPlanOpenrouter:"OpenRouter",codingPlanSiliconflow:"SiliconFlow",codingPlanCommandcode:"CommandCode",codingPlanScnet:"SCNet Token Plan",codingPlanVolcengine:"Volcano Ark Coding Plan",codingPlanQwen:"Qwen Token Plan (qianwenai.com)",qwenPlanCreditsLabel:"Monthly credits quota (personal Lite 50K / Standard 500K; see your plan page)",qwenPlanStartLabel:"Plan start date (optional, YYYY-MM-DD; empty = calendar month)",qwenRatesLabel:"Credits rate overrides (optional; credits deducted per 1M tokens; empty = built-in table)",qwenRatesModelPlaceholder:"Model name, e.g. qwen3.8-max-preview",qwenRatePlaceholder:"rate",qwenRate_input:"Input",qwenRate_cachedInput:"Cached input",qwenRate_output:"Output",qwenRateDraftNote:"Enter all three positive rates to save automatically; clear all to restore the built-in table.",qwenRatesAdd:"Add",qwenLocalNote:"Local estimate; the console is authoritative. Only qwen, qwen-tokenplan, qianwen-tokenplan, qwen-token-plan and qianwen-token-plan subscription providers count (llm- prefix supported). Explicit API classifications and the qianwen pay-as-you-go provider are excluded. Add rates above for models outside the built-in table.",scnetPlanCreditsLabel:"Monthly credits quota for local estimates (Basic 60,000 / Standard 240,000 / Pro 600,000)",scnetPlanStartLabel:"Plan start date (optional, YYYY-MM-DD; empty = calendar month)",scnetLocalNote:"Supports external console snapshots with their original capture time (up to 24 hours old). Without a valid snapshot, credits are estimated from the local ledger using the official deduction table. Local estimates exclude other tools and unlisted models; the console remains the reference for actual usage.",volcengineAccessKeyIdLabel:"Volcengine AccessKey ID",volcengineSecretAccessKeyLabel:"Volcengine SecretAccessKey",volcengineNote:"Volcano Ark control-plane requires AK/SK HMAC signature (not ARK_API_KEY Bearer): create an IAM sub-user with ArkReadOnlyAccess + BillingCenterReadOnlyAccess and enter AccessKeyID and SecretAccessKey; or export VOLC_ACCESSKEY / VOLC_SECRETKEY (official SDK env) for auto-discovery; credentials are only sent to open.volcengineapi.com.",volcengineAccessKeyPlaceholder:"AK...",volcengineSecretPlaceholder:"SK...",countdownHoursOnly:"{h}h",countdownHourMinute:"{h}h {m}m",countdownMinute:"{m}m",nextOffPeakIn:"Off-peak in {time}",nextPeakIn:"Peak in {time}",peakSummary:"Peak hours (UTC): {windows}; effective: {time}. {status}",noPeakWindows:"No peak windows configured. {status}",unknown:"unknown",cardToday:"Today",cardMonth:"This month",cardTotal:"All time",cardTotalSub:"Since the ledger was created · Calls {calls}",cardsFootnote:"Amounts reflect the latest ledger snapshot (2s debounce; clean shutdown flushes first), so minute-level lag vs the live official bill is expected. Token columns sum input+output+cache+reasoning; reasoning tokens are unbilled (the official bill folds them into output) — reconcile by amount.",timezoneHint:"Timezone notice: today/this-month key by the host's timezone {host}, which differs from this browser ({browser}) — calls after your local midnight land on the previous day (not lost). Run dsh in your local timezone to align.",todaySessions:"Today's sessions",historyExpandHint:"Click a date row to expand its session details",historySessionsLoading:"Loading session details…",historyNoSessions:"No session details for this day (early data or session logs cleaned)",historySessionsError:"Failed to load session details",sessionRankTitle:"By session (all history)",sessionRankHint:"All historical sessions, not grouped by date; sort and row count are switchable",sessionRankEmpty:"No session data yet",sessionRankLoading:"Loading session ranking…",sessionRankError:"Failed to load session ranking",sessionRankLimit:"Rows",showSessionIdLabel:"Show session IDs in session lists",cardsTogglePlanTotal:"Include plan totals",cardsTogglePlanTotalHint:"When on, every amount shows total equivalent cost including plan subscriptions; off (default) counts real-money API channels only",hideOfficialBalanceLabel:"Hide official account balance (balance UI removed from sidebar and settings)",hideTodayCostLabel:"Hide today's cost (today's amount removed from sidebar, budget details and overview card)",sessionRankSort:"Sort",sessionSortCostDesc:"Cost high→low",sessionSortCostAsc:"Cost low→high",sessionSortTimeDesc:"Time new→old",sessionSortTimeAsc:"Time old→new",sessionSortRecent:"Recent order",history:"History",usageTitle:"Token usage stats",usageTotal:"All-time {tokens} tokens · input {input} · cache {cache} · output {output} · {calls} calls",usageDay:"{date}: {tokens} tokens (input {input} · cache {cache} · output {output}) · {calls} calls · {cost}",usageEmpty:"No history yet — daily usage will accumulate here",usageSectionLabel:"Usage",usagePositionLabel:"Token usage stats position",usagePositionCost:"Cost settings",usagePositionGeneral:"General settings",usagePositionSection:"Own section (Usage)",displaySettings:"Display settings",tabOverview:"Overview",tabQuotas:"Quotas",tabUsage:"Usage",tabPricing:"Pricing",tabDisplay:"Display",historyDataTitle:"History data",positionLabel:"Session cost display position",positionDock:"Below the composer",positionHeader:"Session title bar",off:"Off",quotaStripGroup:"Quota strip above the input",quotaStripEnable:"Enable the quota strip (one row above the input box)",quotaStripShowBudget:"Strip includes budget used %",quotaStripShowGo:"Strip includes the Go quota",quotaStripShowPlans:"Strip includes coding plan quotas",quotaStripNote:"Hover a chip for reset times and the last refresh; the strip hides itself when there is no quota data.",quotaStripGuideTitle:"New: quota strip above the input",quotaStripGuideBody:"Show budget and subscription quotas (OpenCode Go / coding plans) as one compact strip above the input box. Enable it now? You can change this anytime in Settings → Display.",quotaStripGuideOn:"Enable the strip",quotaStripGuideOff:"Not now",clickToRefresh:"Click to refresh now",balanceClickGuideTitle:"New: click the balance box to refresh",balanceClickGuideBody:"Click the official balance / custom balance / coding-plan box in the sidebar to fetch the latest data immediately — no need to wait for the auto-refresh interval or open Settings. While refreshing the box pulses; on failure the previous value is kept and the reason appears in the hover tooltip.",balanceClickGuideOk:"Got it",sidebarLabel:"Today cost display",sidebarOn:"Sidebar footer",currencyLabel:"Currency",currencyCny:"Chinese Yuan (CNY)",currencyUsd:"US Dollar (USD)",currencyEur:"Euro (EUR)",symbolLabel:"Currency symbol",rateLabel:"Exchange rate (1 USD = ? target currency)",decimalsLabel:"Decimal places",balanceDisplayLabel:"Balance display position",balanceSidebar:"Main sidebar",balanceSettings:"Settings page",balanceBoth:"Both",refreshIntervalLabel:"Balance refresh interval (minutes)",peakEnabledLabel:"Use DeepSeek peak-hour prices",peakNoticeLabel:"Prominent notice during peak hours (sidebar budget box, today's cost; previewed in the Settings peak panel)",badgeNote:"Session cost uses each call's time and price, including peak and historical rates. Input, output, cache reads and writes are counted separately; independent cache-write and long-context rates apply when configured.",priceTableTitle:"Price table (USD / 1M tokens)",pricingCurrencyLabel:"Official price currency",pricingCurrencyUsd:"USD (English official page)",pricingCurrencyCny:"CNY (Chinese official page)",pricingCurrencyNote:'Which language of the official pricing page "Sync" fetches. After re-syncing, history is re-costed on the new table (sessions without full log coverage keep their basis); the recompute runs in the background.',priceTableNote:"Prices follow the call timestamp: new Flash rates start at 04:00 UTC Sep 10, 2026; V4 Pro switches to Flash rates at 04:00 UTC Sep 14. Earlier rates remain available for historical calls. Weekday peak hours are 01–04 and 06–10 UTC, at twice off-peak rates; weekends are off-peak. Cache writes use the cache-hit rate. Auto-saved.",datedPriceNote:"Current rates are shown here. Editing cancels any future scheduled change for this entry; earlier historical rates are retained.",defaultModelId:"default (fallback for unmatched models)",newModelPlaceholder:"New model ID (e.g. deepseek-v4-pro)",addModel:"Add model",dataSync:"Data & sync",saving:"Saving…",autoSaveFailed:"Auto-save failed: {message}",autoSavedAt:"Auto-saved {time}",autoSaveHint:"Settings are auto-saved",confirmFetch:"Overwrite the price table with prices from the official docs?",apply:"Apply",cancel:"Cancel",syncFromDocs:"Sync prices from official docs",syncScopeNote:'Sync scope: "Sync prices from official docs" only updates DeepSeek official prices (incl. peak/off-peak tiers). Third-party catalog prices (z-ai / Kimi / Qwen / Volcano etc.) change only per plugin release; to adjust, mount them in the extended catalog and edit, or match by model name.',confirmReset:"Clear all history?",importLegacy:"Import pre-install history",confirmImportLegacy:"Confirm import? Replays all session logs and only fills dates/sessions missing from the ledger; existing records are untouched.",legacyImportFailed:"Failed to import pre-install history: {message}",legacyImportNote:"Pre-install history is imported automatically once on first launch; this button re-runs it manually (e.g. after copying in old logs). Costs are estimated with the current price catalog; cleaned logs cannot be replayed, and for a session spanning the install moment its pre-install usage is not counted.",confirmClear:"Confirm clear",clearAllHistory:"Clear all history",lastSync:"Last sync: {time}",neverSynced:"Never (bundled prices)",source:"; Source: {source}",sourceOfficial:"Official docs",sourceBundled:"Bundled",languageLabel:"Language",localeAuto:"Follow browser (auto)",localeZh:"Simplified Chinese",localeEn:"English",sectionLabel:"Cost",rpcFailed:"{method} call failed",rpcSyncFailed:"Sync call failed",rpcBalanceFailed:"Balance refresh call failed"}};function ba(){return(typeof navigator<"u"&&typeof navigator.language=="string"?navigator.language:"").toLowerCase().startsWith("zh")?"zh":"en"}function F(t){return t==="zh"||t==="en"?t:ba()}function V(t){const s=t==="zh"?Ne.zh:Ne.en;return(o,n)=>{let a=s[o]??Ne.en[o]??o;if(n)for(const l of Object.keys(n))a=a.split("{"+l+"}").join(String(n[l]));return a}}const Re={day:"periodDay",month:"periodMonth",all:"periodAll",custom:"periodCustomRange"};function Y(t,s){throw new Error("dsh-cost-meter: 服务端数据非法 ("+t+": "+s+")")}function $(t,s){return(typeof t!="number"||!Number.isFinite(t))&&Y(s,"number"),t}function et(t,s){return typeof t!="string"&&Y(s,"string"),t}const Qe=(t,s,o)=>typeof t=="string"&&s.includes(t)?t:o;function Bt(t,s){return typeof t!="boolean"&&Y(s,"boolean"),t}function Ue(t,s){const o={};if(t!==null&&typeof t=="object"&&!Array.isArray(t))for(const n of Object.keys(t)){const a=t[n];if(a===null||typeof a!="object"||Array.isArray(a))continue;const l=r=>typeof r=="number"&&Number.isFinite(r)&&r>=0?r:0;o[n]={input:l(a.input),output:l(a.output),cacheRead:l(a.cacheRead),cacheWrite:l(a.cacheWrite),reasoning:l(a.reasoning),cost:l(a.cost),apiCost:a.apiCost===void 0?l(a.cost):l(a.apiCost)}}return o}function tt(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{id:et(t.id,s+".id"),provider:typeof t.provider=="string"?t.provider:"",model:typeof t.model=="string"?t.model:"",input:$(t.input,s+".input"),output:$(t.output,s+".output"),cacheRead:$(t.cacheRead,s+".cacheRead"),cacheWrite:$(t.cacheWrite,s+".cacheWrite"),reasoning:t.reasoning===void 0?0:$(t.reasoning,s+".reasoning"),calls:$(t.calls,s+".calls"),cost:$(t.cost,s+".cost"),apiCost:t.apiCost===void 0?void 0:$(t.apiCost,s+".apiCost"),byModel:Ue(t.byModel,s+".byModel"),byProviderModel:Ue(t.byProviderModel,s+".byProviderModel")}}function Fe(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o={date:et(t.date,s+".date"),input:$(t.input,s+".input"),output:$(t.output,s+".output"),cacheRead:$(t.cacheRead,s+".cacheRead"),cacheWrite:$(t.cacheWrite,s+".cacheWrite"),reasoning:t.reasoning===void 0?0:$(t.reasoning,s+".reasoning"),calls:$(t.calls,s+".calls"),cost:$(t.cost,s+".cost"),apiCost:t.apiCost===void 0?void 0:$(t.apiCost,s+".apiCost"),byModel:Ue(t.byModel,s+".byModel"),byProviderModel:Ue(t.byProviderModel,s+".byProviderModel"),sessions:[]};return t.sessions!==void 0&&(Array.isArray(t.sessions)||Y(s+".sessions","array"),o.sessions=t.sessions.map((n,a)=>tt(n,s+".sessions["+a+"]"))),o}function at(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o={cacheHit:$(t.cacheHit,s+".cacheHit"),cacheMiss:$(t.cacheMiss,s+".cacheMiss"),output:$(t.output,s+".output")};for(const n of["cacheWrite","reasoning"])t[n]!==void 0&&(o[n]=$(t[n],s+"."+n));for(const n of["offPeak","peak","legacyBase","longContext"]){if(t[n]===void 0)continue;const a=t[n],l={};for(const r of["cacheHit","cacheMiss","output"])l[r]=$(a[r],s+"."+n+"."+r);for(const r of["cacheWrite","reasoning","aboveInputTokens"])a[r]!==void 0&&(l[r]=$(a[r],s+"."+n+"."+r));o[n]=l}t.legacy!==void 0&&(o.legacy=Bt(t.legacy,s+".legacy")),t.rateHistory!==void 0&&((!Array.isArray(t.rateHistory)||t.rateHistory.length>16)&&Y(s+".rateHistory","price history"),o.rateHistory=t.rateHistory.map((n,a)=>((!n||typeof n.before!="string"||!Number.isFinite(Date.parse(n.before)))&&Y(s+".rateHistory","dated price"),{...at({...n,rateHistory:void 0},s+".rateHistory."+a),before:n.before})));for(const n of["billingMode","sourceUrl","checkedAt","notes"])typeof t[n]=="string"&&(o[n]=t[n]);return o}function ha(t,s){const o=a=>a==null?void 0:{...a.adapter==="aliyun"?{adapter:"aliyun"}:{},enabled:a.enabled===!0,label:typeof a.label=="string"?a.label:"",labelEn:typeof a.labelEn=="string"?a.labelEn:"",display:Qe(a.display,["sidebar","settings","off"],"both"),unit:a.unit==="CNY"||a.unit==="EUR"?a.unit:"USD",refreshMinutes:typeof a.refreshMinutes=="number"&&Number.isFinite(a.refreshMinutes)?a.refreshMinutes:15,request:a.request&&typeof a.request=="object"?a.request:{url:""},extract:a.extract&&typeof a.extract=="object"?a.extract:{},allowedHosts:Array.isArray(a?.allowedHosts)?a.allowedHosts.filter(l=>typeof l=="string"):[]};(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const n={};if(t.prices!==null&&typeof t.prices=="object"&&t.prices.models!==null&&typeof t.prices.models=="object")for(const a of Object.keys(t.prices.models))n[a]=at(t.prices.models[a],s+".prices.models."+a);return{locale:t.locale==="zh"||t.locale==="en"||t.locale==="auto"?t.locale:"auto",position:t.position==="header"||t.position==="off"?t.position:"dock",sidebar:t.sidebar!==!1,showSessionId:t.showSessionId===!0,hideOfficialBalance:t.hideOfficialBalance===!0,hideTodayCost:t.hideTodayCost===!0,showTotalWithPlan:t.showTotalWithPlan===!0,sidebarSimple:t.sidebarSimple===!0,sidebarSimplePromptSeen:t.sidebarSimplePromptSeen===!0,codexQuotaEnabled:t.codexQuotaEnabled===!0,includeSubagentCost:t.includeSubagentCost===!0,sidebarStyle:t.sidebarStyle==="compact"?"compact":"standard",priceMatchDismissed:Array.isArray(t.priceMatchDismissed)?t.priceMatchDismissed.filter(a=>typeof a=="string"):[],pricingCurrency:t.pricingCurrency==="CNY"?"CNY":"USD",currency:typeof t.currency=="string"?t.currency:"CNY",symbol:typeof t.symbol=="string"?t.symbol:"¥",decimals:$(t.decimals,s+".decimals"),exchangeRate:$(t.exchangeRate,s+".exchangeRate"),peakEnabled:t.peakEnabled===!0,peakEffectiveAt:typeof t.peakEffectiveAt=="string"?t.peakEffectiveAt:"",peakWindows:Array.isArray(t.peakWindows)?t.peakWindows.map((a,l)=>({start:$(a.start,s+".peakWindows["+l+"].start"),end:$(a.end,s+".peakWindows["+l+"].end")})):[],peakNotice:t.peakNotice!==!1,peakAlertEnabled:t.peakAlertEnabled!==!1,peakAlertAhead:Number.isFinite(t.peakAlertAhead)&&t.peakAlertAhead>=1&&t.peakAlertAhead<=30?t.peakAlertAhead:2,peakAlertTarget:t.peakAlertTarget==="peak"||t.peakAlertTarget==="offpeak"?t.peakAlertTarget:"both",peakAlertPosition:t.peakAlertPosition==="center"?"center":"corner",peakAlertWebNotify:t.peakAlertWebNotify===!0,peakStyle:t.peakStyle==="classic"?"classic":"compact",priceMatch:t.priceMatch==="exact"?"exact":"auto",priceOverrides:(()=>{const a={};if(t.priceOverrides!==null&&typeof t.priceOverrides=="object"&&!Array.isArray(t.priceOverrides))for(const[l,r]of Object.entries(t.priceOverrides))typeof l=="string"&&typeof r=="string"&&(a[l]=r);return a})(),priceTableDisplay:(()=>{const a={};if(t.priceTableDisplay!==null&&typeof t.priceTableDisplay=="object"&&!Array.isArray(t.priceTableDisplay))for(const[l,r]of Object.entries(t.priceTableDisplay))typeof l=="string"&&(a[l]=r===!0);return a})(),codingPlans:(()=>{const a={};if(t.codingPlans!==null&&typeof t.codingPlans=="object"&&!Array.isArray(t.codingPlans))for(const l of Object.keys(t.codingPlans)){const r=t.codingPlans[l];r===null||typeof r!="object"||Array.isArray(r)||(a[l]={enabled:r.enabled===!0,display:r.display==="sidebar"||r.display==="both"||r.display==="off"?r.display:"settings",refreshMinutes:typeof r.refreshMinutes=="number"&&Number.isFinite(r.refreshMinutes)?r.refreshMinutes:15,apiKey:typeof r.apiKey=="string"?r.apiKey:"",...typeof r.planCredits=="number"&&Number.isFinite(r.planCredits)&&r.planCredits>0?{planCredits:r.planCredits}:{},...typeof r.planStart=="string"?{planStart:r.planStart}:{},...r.rates!==null&&typeof r.rates=="object"&&!Array.isArray(r.rates)?{rates:r.rates}:{},...typeof r.accessKeyId=="string"?{accessKeyId:r.accessKeyId}:{},...typeof r.secretAccessKey=="string"?{secretAccessKey:r.secretAccessKey}:{}})}return a})(),prices:{models:n,default:at(t.prices?.default??{cacheHit:0,cacheMiss:0,output:0},s+".prices.default"),providers:t.prices?.providers&&typeof t.prices.providers=="object"?t.prices.providers:{},currency:typeof t.prices?.currency=="string"&&t.prices.currency.length>0?t.prices.currency:void 0},historyDays:$(t.historyDays,s+".historyDays"),fetchedAt:t.fetchedAt===null||t.fetchedAt===void 0?null:et(t.fetchedAt,s+".fetchedAt"),priceSource:typeof t.priceSource=="string"?t.priceSource:"bundled",budget:{enabled:t.budget?.enabled===!0,amount:typeof t.budget?.amount=="number"&&Number.isFinite(t.budget.amount)?t.budget.amount:100,period:t.budget?.period==="day"||t.budget?.period==="all"||t.budget?.period==="custom"?t.budget.period:"month",customStart:typeof t.budget?.customStart=="string"?t.budget.customStart:null,customEnd:typeof t.budget?.customEnd=="string"?t.budget.customEnd:null,detail:t.budget?.detail!==!1},balance:{display:Qe(t.balance?.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof t.balance?.refreshMinutes=="number"&&Number.isFinite(t.balance.refreshMinutes)?t.balance.refreshMinutes:5,showProgressBar:t.balance?.showProgressBar===!0,budgetCap:typeof t.balance?.budgetCap=="number"&&Number.isFinite(t.balance.budgetCap)&&t.balance.budgetCap>0?t.balance.budgetCap:null,clickHintSeen:t.balance?.clickHintSeen===!0},goQuota:{enabled:t.goQuota?.enabled!==!1,display:Qe(t.goQuota?.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof t.goQuota?.refreshMinutes=="number"&&Number.isFinite(t.goQuota.refreshMinutes)?t.goQuota.refreshMinutes:15,apiKey:typeof t.goQuota?.apiKey=="string"?t.goQuota.apiKey:"",main:t.goQuota?.main==="weekly"||t.goQuota?.main==="monthly"?t.goQuota.main:"rolling",detail:t.goQuota?.detail!==!1},customBalance:o(t.customBalance),gatewayQuotas:(()=>{const a=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:t.gatewayQuotas?.sources;return{sources:Array.isArray(a)?a.slice(0,4).filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)).map(r=>({id:typeof r.id=="string"?r.id.slice(0,48):"",type:"cliproxyapi",label:typeof r.label=="string"?r.label.slice(0,80):"",baseURL:typeof r.baseURL=="string"?r.baseURL:"",enabled:r.enabled!==!1,display:Qe(r.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof r.refreshMinutes=="number"&&Number.isFinite(r.refreshMinutes)?Math.min(1440,Math.max(1,Math.floor(r.refreshMinutes))):15,includeProviders:Array.isArray(r.includeProviders)?[...new Set(r.includeProviders.filter(i=>typeof i=="string").map(i=>i.toLowerCase()).filter(i=>st.includes(i)))]:st,allowedHosts:Array.isArray(r.allowedHosts)?r.allowedHosts.filter(i=>typeof i=="string").slice(0,16):[],allowInsecureHttp:r.allowInsecureHttp===!0,keyVar:typeof r.keyVar=="string"?r.keyVar:""})):[]}})(),customBalances:(()=>{if(Array.isArray(t.customBalances))return t.customBalances.filter(l=>l!==null&&typeof l=="object").slice(0,8).map(o).filter(Boolean);const a=o(t.customBalance);return a?[a]:[]})(),corner:{enabled:t.corner?.enabled===!0,goRolling:t.corner?.goRolling!==!1,goWeekly:t.corner?.goWeekly!==!1,goMonthly:t.corner?.goMonthly!==!1,budget:t.corner?.budget!==!1},quotaStrip:{enabled:t.quotaStrip?.enabled===!0,budget:t.quotaStrip?.budget!==!1,go:t.quotaStrip?.go!==!1,plans:t.quotaStrip?.plans!==!1,promptSeen:t.quotaStrip?.promptSeen===!0},usage:{position:t.usage?.position==="general"||t.usage?.position==="section"?t.usage.position:"cost"},barDirections:(()=>{const a=t.barDirections!==null&&typeof t.barDirections=="object"&&!Array.isArray(t.barDirections)?t.barDirections:{},l=(r,i)=>a[r]==="remaining"||a[r]==="used"?a[r]:i;return{balance:l("balance","remaining"),budget:l("budget","used"),go:l("go","used"),plan:l("plan","used")}})(),planBilling:{providers:(()=>{const a={};if(t.planBilling?.providers!==null&&typeof t.planBilling?.providers=="object"&&!Array.isArray(t.planBilling.providers))for(const[l,r]of Object.entries(t.planBilling.providers))typeof l=="string"&&(r==="auto"||r==="plan"||r==="api")&&(a[l]=r);return a})(),models:(()=>{const a={};if(t.planBilling?.models!==null&&typeof t.planBilling?.models=="object"&&!Array.isArray(t.planBilling.models))for(const[l,r]of Object.entries(t.planBilling.models))typeof l=="string"&&l.length>0&&(r==="plan"||r==="api")&&(a[l]=r);return a})()}}}const he=t=>typeof t=="number"&&Number.isFinite(t)?t:null,te=t=>he(t)??0,ya={status:"off",message:"",fetchedAt:0,currency:"",totalBalance:0,grantedBalance:0,toppedUpBalance:0},ka={status:"off",message:"",fetchedAt:0,rolling:null,weekly:null,monthly:null},Dt=(t=null)=>({status:"off",message:"",fetchedAt:0,label:"",unit:"USD",remaining:0,maxBudget:null,spend:null,index:t});function wa(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{status:t.status==="ok"||t.status==="error"?t.status:"off",message:typeof t.message=="string"?t.message:"",fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:0,currency:typeof t.currency=="string"?t.currency:"",totalBalance:te(t.totalBalance),grantedBalance:te(t.grantedBalance),toppedUpBalance:te(t.toppedUpBalance)}}function nt(t,s){return t==null?null:((typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{percent:te(t.percent),resetsAt:typeof t.resetsAt=="string"?t.resetsAt:""})}function xa(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{status:t.status==="ok"||t.status==="error"?t.status:"off",message:typeof t.message=="string"?t.message:"",fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:0,rolling:t.rolling===void 0||t.rolling===null?null:nt(t.rolling,s+".rolling"),weekly:t.weekly===void 0||t.weekly===null?null:nt(t.weekly,s+".weekly"),monthly:t.monthly===void 0||t.monthly===null?null:nt(t.monthly,s+".monthly")}}function Rt(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{status:t.status==="ok"||t.status==="error"?t.status:"off",message:typeof t.message=="string"?t.message:"",fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:0,label:typeof t.label=="string"?t.label:"",unit:typeof t.unit=="string"?t.unit:"USD",remaining:te(t.remaining),maxBudget:he(t.maxBudget),spend:he(t.spend),index:typeof t.index=="number"&&Number.isFinite(t.index)&&t.index>=0?Math.floor(t.index):null}}const va=new Set(["ok","partial","unknown","error","stale","unsupported","capability_missing"]),Na=new Set(["off","loading","ok","partial","stale","error"]),st=["antigravity","claude","codex","kimi","xai","workbuddy"],Lt={antigravity:"Antigravity",claude:"Claude",codex:"Codex",kimi:"Kimi",xai:"xAI",workbuddy:"WorkBuddy"};function Sa(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o=(r,i="")=>typeof r=="string"?r:i,n=r=>he(r),a=r=>r!==null&&typeof r=="object"&&!Array.isArray(r)?{id:o(r.id),label:o(r.label),...n(r.percent)===null?{}:{percent:n(r.percent)},resetsAt:o(r.resetsAt),periodHours:n(r.periodHours),scope:o(r.scope)}:null,l=r=>r!==null&&typeof r=="object"&&!Array.isArray(r)?{unit:o(r.unit,"credits"),used:n(r.used),remaining:n(r.remaining),limit:n(r.limit),fetchedAt:o(r.fetchedAt),packages:Array.isArray(r.packages)?r.packages.filter(i=>i!==null&&typeof i=="object"&&!Array.isArray(i)).map(i=>({id:o(i.id),label:o(i.label),used:n(i.used),remaining:n(i.remaining),limit:n(i.limit),startsAt:o(i.startsAt),resetsAt:o(i.resetsAt)})):[]}:void 0;return{id:o(t.id),type:"cliproxyapi",label:o(t.label),status:Na.has(t.status)?t.status:"error",message:o(t.message),fetchedAt:n(t.fetchedAt)??0,attemptedAt:n(t.attemptedAt)??0,serverVersion:o(t.serverVersion),keyConfigured:t.keyConfigured===!0,keySource:o(t.keySource,"none"),accounts:Array.isArray(t.accounts)?t.accounts.filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)).slice(0,16).map(r=>({id:o(r.id),provider:o(r.provider,"unknown"),label:o(r.label,"unknown"),status:va.has(r.status)?r.status:"unknown",message:o(r.message),plan:o(r.plan),windows:Array.isArray(r.windows)?r.windows.map(a).filter(Boolean):[],credits:l(r.credits)})):[],unsupportedProviders:Array.isArray(t.unsupportedProviders)?t.unsupportedProviders.filter(r=>typeof r=="string").slice(0,32):[]}}function Ca(t){if(t===null||typeof t!="object"||Array.isArray(t))return null;const s={};if(t.providers!==null&&typeof t.providers=="object"&&!Array.isArray(t.providers))for(const[o,n]of Object.entries(t.providers)){if(n===null||typeof n!="object"||Array.isArray(n))continue;const a={},l={};if(n.windows!==null&&typeof n.windows=="object"&&!Array.isArray(n.windows))for(const[r,i]of Object.entries(n.windows))i===null||typeof i!="object"||Array.isArray(i)||(a[r]={percent:te(i.percent),resetsAt:typeof i.resetsAt=="string"?i.resetsAt:"",localTokens:te(i.localTokens),localCost:te(i.localCost),method:i.method==="sample"||i.method==="live"?i.method:"none",sampleAt:he(i.sampleAt),confidence:i.confidence==="high"||i.confidence==="low"?i.confidence:null,per1Tokens:he(i.per1Tokens),per1Cost:he(i.per1Cost),fullTokens:he(i.fullTokens),fullCost:he(i.fullCost),sampleCount:te(i.sampleCount)});if(n.intervals!==null&&typeof n.intervals=="object"&&!Array.isArray(n.intervals))for(const[r,i]of Object.entries(n.intervals))Array.isArray(i)&&(l[r]=i.filter(c=>c!==null&&typeof c=="object"&&!Array.isArray(c)).map(c=>({t0:te(c.t0),t1:te(c.t1),tokens:te(c.tokens),cost:te(c.cost),pct:te(c.pct),per1Tokens:te(c.per1Tokens),per1Cost:te(c.per1Cost)})));s[o]={windows:a,intervals:l}}return{generatedAt:te(t.generatedAt),providers:s}}function Ot(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object"),{today:Fe(t.today,s+".today"),month:Fe(t.month,s+".month"),total:Fe(t.total,s+".total"),budgetUsed:typeof t.budgetUsed=="number"&&Number.isFinite(t.budgetUsed)?t.budgetUsed:void 0,balance:t.balance==null?ya:wa(t.balance,s+".balance"),goQuota:t.goQuota==null?ka:xa(t.goQuota,s+".goQuota"),customBalance:t.customBalance==null?Dt():Rt(t.customBalance,s+".customBalance"),customBalances:Array.isArray(t.customBalances)?t.customBalances.filter(o=>o!==null&&typeof o=="object").map((o,n)=>Rt(o,s+".customBalances["+n+"]")):[],gatewayQuotas:Array.isArray(t.gatewayQuotas)?t.gatewayQuotas.filter(o=>o!==null&&typeof o=="object"&&!Array.isArray(o)).map((o,n)=>Sa(o,s+".gatewayQuotas["+n+"]")):[],customVarStatus:t.customVarStatus!==null&&typeof t.customVarStatus=="object"&&!Array.isArray(t.customVarStatus)?Object.fromEntries(Object.entries(t.customVarStatus).filter(([,o])=>o!==null&&typeof o=="object").map(([o,n])=>[o,{configured:n.configured===!0,source:typeof n.source=="string"?n.source:""}])):{},codingPlans:t.codingPlans!==null&&typeof t.codingPlans=="object"&&!Array.isArray(t.codingPlans)?t.codingPlans:{},planStats:Ca(t.planStats),history:Array.isArray(t.history)?t.history.map((o,n)=>Fe(o,s+".history["+n+"]")):[],config:ha(t.config,s+".config"),reconcile:t.reconcile===null||t.reconcile===void 0?void 0:{ok:t.reconcile.ok===!0,message:typeof t.reconcile.message=="string"?t.reconcile.message:""},priceCatalog:t.priceCatalog!==null&&typeof t.priceCatalog=="object"&&!Array.isArray(t.priceCatalog)?t.priceCatalog:null,meta:{now:typeof t.meta?.now=="number"?t.meta.now:Date.now(),timezoneOffsetMinutes:typeof t.meta?.timezoneOffsetMinutes=="number"?t.meta.timezoneOffsetMinutes:0,timezone:typeof t.meta?.timezone=="string"?t.meta.timezone:"",dayKey:typeof t.meta?.dayKey=="string"?t.meta.dayKey:"",monthKey:typeof t.meta?.monthKey=="string"?t.meta.monthKey:""}}}function Aa(t,s){(t===null||typeof t!="object"||Array.isArray(t))&&Y(s,"object");const o={ok:t.ok===!0,message:typeof t.message=="string"?t.message:""};return t.state!==void 0&&t.state!==null&&(o.state=Ot(t.state,s+".state")),o}function re(t){return{parse:t}}const ot=re(Ot),Pa=re(t=>((t===null||typeof t!="object"||Array.isArray(t))&&Y("patch","object"),t)),Ma=re(Aa),Et=re(t=>(typeof t!="string"&&Y("provider","string"),t)),Ta=re(t=>{if(t!=null)return(typeof t!="number"||!Number.isInteger(t)||t<0||t>7)&&Y("index","0-7 integer"),t}),Ba=re(t=>(typeof t!="string"&&Y("date","string"),t)),Da=re(t=>((t===null||typeof t!="object"||Array.isArray(t))&&Y("day","object"),t)),Ra=re(t=>(Number.isFinite(Number(t))||Y("limit","number"),Number(t))),jt=re(t=>(typeof t!="string"&&Y("sort","string"),t)),La=re(t=>((t===null||typeof t!="object"||Array.isArray(t))&&Y("topSessions","object"),t)),qt=re(t=>(typeof t!="string"&&Y("target","string"),t)),Oa=re(t=>(typeof t!="string"&&Y("value","string"),t)),Ea={package:"dsh-cost-meter",descriptors:[{method:"getState",result:{mode:"strict",typeSymbol:"dsh-cost-meter#CostState",schema:ot}},{method:"updateConfig",parameters:[{name:"patch",wire:"patch",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#ConfigPatch",schema:Pa}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#CostState",schema:ot}},{method:"fetchPrices"},{method:"refreshBalance"},{method:"refreshGoQuota"},{method:"refreshCustomBalance",parameters:[{name:"index",wire:"index",source:"json",acceptsUndefined:!0,codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CustomBalanceIndex",schema:Ta}}]},{method:"refreshCodingPlan",parameters:[{name:"provider",wire:"provider",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CodingPlanProvider",schema:Et}}]},{method:"refreshGatewayQuota",parameters:[{name:"sourceId",wire:"sourceId",source:"json",acceptsUndefined:!0,codec:{mode:"strict",typeSymbol:"dsh-cost-meter#GatewayQuotaSourceId",schema:re(t=>{if(t!=null)return(typeof t!="string"||t.length>48||!/^[a-z0-9][a-z0-9_-]*$/.test(t))&&Y("sourceId","gateway source id"),t})}}]},{method:"resetHistory",result:{mode:"strict",typeSymbol:"dsh-cost-meter#CostState",schema:ot}},{method:"importLegacyHistory"},{method:"getDaySessions",parameters:[{name:"date",wire:"date",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#DayKey",schema:Ba}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#DayRecord",schema:Da}},{method:"getSessionCost",parameters:[{name:"sessionId",wire:"sessionId",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionId",schema:Et}}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionCost",schema:re(t=>({own:tt(t.own,"own"),subagents:tt(t.subagents,"subagents"),found:Bt(t.found,"found"),subagentCount:$(t.subagentCount,"subagentCount")}))}},{method:"getTopSessions",parameters:[{name:"limit",wire:"limit",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionLimit",schema:Ra}},{name:"sort",wire:"sort",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionSort",schema:jt},acceptsUndefined:!0},{name:"dir",wire:"dir",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#SessionSortDir",schema:jt},acceptsUndefined:!0}],result:{mode:"strict",typeSymbol:"dsh-cost-meter#TopSessions",schema:La}},{method:"setCredential",parameters:[{name:"target",wire:"target",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CredentialTarget",schema:qt}},{name:"value",wire:"value",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CredentialValue",schema:Oa}}]},{method:"clearCredential",parameters:[{name:"target",wire:"target",source:"json",codec:{mode:"strict",typeSymbol:"dsh-cost-meter#CredentialTarget",schema:qt}}]}].map(t=>({id:"dsh-cost-meter#costMeter/"+t.method,service:"costMeter",namespace:"costMeter",invocation:{kind:"direct"},parameters:[],result:{mode:"strict",typeSymbol:"dsh-cost-meter#FetchPricesResult",schema:Ma},...t}))};function ja(t,s){const o=s?.models??{};return typeof t=="string"&&t.length>0&&o[t]!==void 0?o[t]:s?.default??{cacheHit:0,cacheMiss:0,output:0}}function Le(t){if(t===null||typeof t!="object")return;const s=r=>{const i=t[r];return typeof i=="number"&&Number.isFinite(i)&&i>=0?i:void 0},o=s("cacheMiss")??s("input")??0,a={cacheHit:s("cacheHit")??s("cachedInput")??s("cacheRead")??o,cacheMiss:o,output:s("output")??0},l=s("reasoning");return l!==void 0&&(a.reasoning=l),s("cacheWrite")!==void 0&&(a.cacheWrite=s("cacheWrite")),a}function qa(t){const s=Le(t);if(s===void 0)return null;for(const o of["offPeak","peak","legacyBase"]){const n=Le(t[o]);n!==void 0&&(s[o]=n)}return Number.isFinite(t.longContext?.aboveInputTokens)&&t.longContext.aboveInputTokens>0&&(s.longContext={...Le(t.longContext),aboveInputTokens:t.longContext.aboveInputTokens}),Array.isArray(t.rateHistory)&&(s.rateHistory=t.rateHistory.slice(0,16).map(o=>{const n={...Le(o),before:o.before};for(const a of["offPeak","peak"]){const l=Le(o[a]);l!==void 0&&(n[a]=l)}return n})),s}function We(t,s=Date.now()){if(!t||!Number.isFinite(s)||!Array.isArray(t.rateHistory))return t;let o=null,n=1/0;for(const r of t.rateHistory){const i=Date.parse(r.before);s<i&&i<n&&(o=r,n=i)}if(!o)return t;const{before:a,...l}=o;return{...t,...l}}const It=Date.parse("2026-08-22T16:00:00Z");function _e(t){if(!Number.isFinite(t)||t<It)return null;const s=Math.floor((t+8*36e5)/864e5),o=(s+4)%7;if(o!==6&&o!==0)return null;const n=o===6?s:s-1;return{start:Math.max(n*864e5-8*36e5,It),end:(n+2)*864e5-8*36e5}}function Ht(t,s,o){if(!Array.isArray(o)||o.length===0||_e(t)!==null||Number.isFinite(s)&&t<s)return!1;const n=new Date(t).getUTCHours();return o.some(a=>{const l=Number(a.start),r=Number(a.end);return!Number.isFinite(l)||!Number.isFinite(r)?!1:l<r?n>=l&&n<r:n>=l||n<r})}const Ia=Date.parse("2026-08-16T16:00:00Z");function Qt(t,s,o){const n=We(t,s)??{cacheHit:0,cacheMiss:0,output:0},a=r=>({cacheHit:r.cacheHit,cacheMiss:r.cacheMiss,output:r.output,reasoning:r.reasoning??0,...r.cacheWrite===void 0?{}:{cacheWrite:r.cacheWrite},...r.longContext===void 0?{}:{longContext:r.longContext}});if(Number.isFinite(s)&&s<Ia){const r=n.legacyBase;return a(r===void 0?n:r)}if(o?.enabled!==!0)return a(n);const l=typeof o.effectiveAtMs=="number"&&Number.isFinite(o.effectiveAtMs)?o.effectiveAtMs:void 0;if(Ht(s,l,o.windows)){const r=n.peak;return a(r===void 0?n:r)}if(l!==void 0&&s>=l){const r=n.offPeak;return a(r===void 0?n:r)}return a(n)}function Ut(t,s){const o=Math.max(0,Number(t.input)||0),n=Math.max(0,Number(t.output)||0),a=Math.max(0,Number(t.cacheRead)||0),l=Math.max(0,Number(t.cacheWrite)||0),r=Math.max(0,Number(t.reasoning)||0);return s.longContext&&o+a+l>s.longContext.aboveInputTokens&&(s=s.longContext),(o*s.cacheMiss+n*s.output+a*s.cacheHit+l*(s.cacheWrite??s.cacheHit)+r*(s.reasoning??0))/1e6}function Ft(t,s,o){const n=Number(t);if(!Number.isFinite(n)||n<0||n===0)return 0;if(s!=="CNY")return n;const a=Number(o);return!Number.isFinite(a)||a<=0?n:n/a}function ae(t,s){const o=t?.barDirections,n=s==="balance"?"remaining":"used";if(o===null||typeof o!="object"||Array.isArray(o))return n;const a=o[s];return a==="remaining"||a==="used"?a:n}function ue(t,s){if(t==null||!Number.isFinite(Number(t)))return{width:0,label:null};const o=Math.max(0,Math.min(100,Number(t))),n=s==="remaining"?Math.round((100-o)*10)/10:Math.round(o*10)/10;return{width:n,label:n}}function ce(t,s){const o=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$",n=Number(s?.decimals),a=Math.max(0,Math.min(10,Number.isFinite(n)?Math.floor(n):2));let l=a;t>0&&t<Math.pow(10,-a)&&(l=a+2);const r=t.toFixed(l),i=r.includes(".")?r.replace(/0+$/,"").replace(/\.$/,""):r;return o+i}function J(t,s){const o=Number(s?.exchangeRate),n=t*(Number.isFinite(o)&&o>0?o:1);return ce(n,s)}function Q(t){const s=Math.max(0,Number(t)||0),o=n=>n>=100?String(Math.round(n)):String(Math.round(n*10)/10);return s<1e3?String(Math.round(s)):s>=999500?o(s/1e6)+"M":s<1e6?o(s/1e3)+"K":o(s/1e6)+"M"}function de(t){return String(t??"").toLowerCase().replace(/\([^)]*\)/g," ").replace(/([^)]*)/g," ").replace(/[^a-z0-9]+/g,"")}function Ce(t,s){if(typeof t!="string"||t.length===0)return null;const o=Array.isArray(s)?s.filter(S=>typeof S=="string"&&S.length>0):[];if(o.length===0)return null;const n=S=>String(S).toLowerCase().replace(/[-@]\d{4}-?\d{2}-?\d{2}$/,"").replace(/[-@]v\d+(\.\d+)*$/,""),a=o.find(S=>S===t);if(a!==void 0)return a;const l=de(t);if(l.length===0)return null;const r=o.find(S=>de(S)===l);if(r!==void 0)return r;let i=null,c=0;for(const S of o){const C=de(S);if(!(C.length<4||C===l)&&l.includes(C)&&C.length>c){const P=l.indexOf(C);if(/^\d{1,2}$/.test(l.slice(P+C.length)))continue;i=S,c=C.length}}if(i!==null)return i;const b=n(t),d=o.find(S=>n(S)===b);if(d!==void 0)return d;let k=null;for(const S of o){const C=n(S);if(C.length===0||C===b)continue;const P=b.slice(C.length);if(b.startsWith(C)&&/^[-_./:]/.test(P)){if(/^\d{1,2}$/.test(P.replace(/^[-_./:]+/,"")))continue;(k===null||n(k).length<C.length)&&(k=S)}}if(k!==null)return k;const g=S=>n(S).split(/[-_./:]+/).filter(Boolean),h=g(t);if(h.length<2)return null;let p=null,v=0;for(const S of o){const C=g(S);let P=0;for(;P<h.length&&P<C.length&&h[P]===C[P];)P+=1;P<h.length&&P<C.length&&/^\d+$/.test(h[P])&&/^\d+$/.test(C[P])||P>=2&&P===C.length&&P<h.length&&h.slice(P).every(w=>/^\d{1,2}$/.test(w))||P>=2&&P<h.length&&P<C.length&&(/^\d{1,2}$/.test(h[P])&&/^[a-z]/.test(C[P])||/^\d{1,2}$/.test(C[P])&&/^[a-z]/.test(h[P]))||P>=2&&(P>v||P===v&&p!==null&&S.length<p.length)&&(p=S,v=P)}return p}const Ha=new Set(["lmstudio","ollama","jan","gpt4all","koboldcpp","llamacpp","llama-cpp","localai","vllm","sglang","tabbyapi","lmdeploy","oobabooga","text-generation-webui","llama-server"]),Qa=["lmstudio:","lmstudio/","ollama:","ollama/","jan:","jan/","gpt4all:","gpt4all/","koboldcpp:","koboldcpp/","llamacpp:","llamacpp/","llama-cpp:","llama-cpp/","localai:","localai/","vllm:","vllm/","sglang:","sglang/","tabbyapi:","tabbyapi/","lmdeploy:","oobabooga/","text-generation-webui/","llama-server:","gguf:","local:"];function Ua(t,s){if(typeof t=="string"&&Ha.has(t))return!0;const o=typeof s=="string"?s.toLowerCase():"";return Qa.some(n=>o.startsWith(n))}function lt(t,s,o){const n=o?.prices??{},a=o?.priceMatch==="exact"?"exact":"auto",l=o?.priceOverrides&&typeof o.priceOverrides=="object"?o.priceOverrides:{};let r=String(t??"").trim().toLowerCase();r.startsWith("llm-")&&(r=r.slice(4)),r===""&&(r="deepseek");let i=r,c=s;const b=l[r+":"+s];if(b==="__local__")return{entry:null,priced:!1,billingMode:"flat",matched:!0};if(typeof b=="string"&&b.length>0){const g=b.indexOf(":");if(g>0&&b.slice(g+1).length>0?(i=b.slice(0,g).trim().toLowerCase(),c=b.slice(g+1)):c=b,i==="deepseek"&&c==="__default__")return{entry:n.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}if(Ua(i,c))return{entry:null,priced:!1,billingMode:"flat",matched:!1};if(i==="deepseek"||i.includes("deepseek")){const g=n.models??{},h=g[c]!==void 0?c:a==="auto"?Ce(c,Object.keys(g)):null;if(h!==null)return{entry:g[h],priced:!0,billingMode:"deepseek-peak",matched:!0};if(a==="auto"){let p=null,v=-1,S="flat";for(const[C,P]of Object.entries(n.providers??{})){const w=P?.models??{},x=Ce(c,Object.keys(w));if(x===null||w[x]?.unpriced===!0)continue;const f=(x===c||de(x)===de(c)?1e3:0)+de(x).length;f>v&&(p=w[x],v=f,S=w[x]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(p!==null)return{entry:p,priced:!0,billingMode:S,matched:!0}}return{entry:n.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}const d=n.providers?.[i]?.models??{},k=d[c]!==void 0?c:a==="auto"?Ce(c,Object.keys(d)):null;if(k!==null)return{entry:d[k],priced:d[k]?.unpriced!==!0,billingMode:"flat",matched:!0};if(a==="auto"){const g=n.models??{},h=Ce(c,Object.keys(g));if(h!==null)return{entry:g[h],priced:!0,billingMode:"deepseek-peak",matched:!0};let p=null,v=-1,S="flat";for(const[C,P]of Object.entries(n.providers??{})){if(C===i)continue;const w=P?.models??{},x=Ce(c,Object.keys(w));if(x===null||w[x]?.unpriced===!0)continue;const f=(x===c||de(x)===de(c)?1e3:0)+de(x).length;f>v&&(p=w[x],v=f,S=w[x]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(p!==null)return{entry:p,priced:!0,billingMode:S,matched:!0}}if(r!=="deepseek"&&!r.includes("deepseek")&&typeof b=="string"&&b.length>0&&!b.includes(":")){const g=n.models??{},h=g[b]!==void 0?b:a==="auto"?Ce(b,Object.keys(g)):null;if(h!==null)return{entry:g[h],priced:!0,billingMode:"deepseek-peak",matched:!0}}return{entry:null,priced:!1,billingMode:"flat",matched:!1}}function Fa(t){const s=Number(t?.calls)||0,o=Number(t?.input)||0,n=Number(t?.cacheRead)||0;return s>=3&&o>=1e5&&n===0}function Ae(t,s){return!t||!s?0:typeof t.cost=="number"&&Number.isFinite(t.cost)?t.cost:_t(t,s).total}function rt(t){if(t===null||typeof t!="object")return 0;const s=Number(t.cost)||0,o=t.apiCost===void 0||t.apiCost===null?s:Number(t.apiCost);return Number.isFinite(o)&&o>=0?Math.min(o,s):s}function _(t,s){return s!==null&&typeof s=="object"&&s.showTotalWithPlan===!0?Number(t?.cost)||0:rt(t)}const Wa={go:["go","zen","opencode","opencode-go"],qwen:["qwen","qwen-tokenplan","qianwen-tokenplan","qwen-token-plan","qianwen-token-plan"],scnet:["scnet","scnet-tokenplan","scnet-token-plan"]},Wt=["anthropic","zai","minimax","kimi","openrouter","siliconflow","commandcode","scnet","volcengine","qwen","go"];function _a(t){const s=String(t??"").trim().toLowerCase().replace(/^llm-/,"");if(s.length===0)return null;for(const[o,n]of Object.entries(Wa))if(n.includes(s))return o;return Wt.includes(s)?s:null}function za(t){const s=new Set,o=t?.codingPlans;if(o!==null&&typeof o=="object")for(const n of Wt)n!=="go"&&o[n]?.enabled===!0&&s.add(n);return t?.goQuota?.enabled===!0&&s.add("go"),s}function Ga(t,s,o){const n=String(t??"").trim().toLowerCase();if(n.length>0&&n!=="deepseek"&&!n.includes("deepseek"))return!1;const a=de(s);if(a.length===0)return!1;const l=o?.prices,r=l?.models??{};for(const i of Object.keys(r))if(de(i)===a)return!1;for(const i of Object.values(l?.providers??{}))for(const c of Object.keys(i?.models??{}))if(de(c)===a)return!0;return!1}function ze(t,s,o){let n=_a(t);if(n===null&&Ga(t,s,o)&&(n="go"),n===null)return"api";const a=o?.planBilling?.models;if(a!==null&&typeof a=="object"){const r=a[t+":"+s];if(r==="plan"||r==="api")return r;const i=a[n+":"+s];if(i==="plan"||i==="api")return i}const l=o?.planBilling?.providers?.[n];return l==="plan"||l==="api"?l:za(o).has(n)?"plan":"api"}function _t(t,s){if(!t||!s)return{total:0,api:0};const o={enabled:s.peakEnabled===!0,effectiveAtMs:Date.parse(s.peakEffectiveAt||""),windows:s.peakWindows},n=Date.now(),a=t.byProviderModel??t.byModel??{};let l=0,r=0;for(const k of Object.keys(a)){const g=k.indexOf(":"),h=g>0?k.slice(0,g):"deepseek",p=g>0?k.slice(g+1):k,v=lt(h,p,s);if(v.priced){const S=Ut(a[k],Qt(qa(v.entry),n,{...o,enabled:v.billingMode==="deepseek-peak"&&o.enabled})),C=Ft(S,v.billingMode==="deepseek-peak"&&s.prices?.currency==="CNY"?"CNY":"USD",s.exchangeRate);l+=C,ze(h,p,s)==="api"&&(r+=C)}}const i={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0};for(const k of Object.keys(a))i.input+=a[k].input??0,i.output+=a[k].output??0,i.cacheRead+=a[k].cacheRead??0,i.cacheWrite+=a[k].cacheWrite??0,i.reasoning+=a[k].reasoning??0;const c={input:Math.max(0,(t.input??0)-i.input),output:Math.max(0,(t.output??0)-i.output),cacheRead:Math.max(0,(t.cacheRead??0)-i.cacheRead),cacheWrite:Math.max(0,(t.cacheWrite??0)-i.cacheWrite),reasoning:Math.max(0,(t.reasoning??0)-i.reasoning)},b=Ut(c,Qt(ja("default",s.prices),n,o)),d=Ft(b,s.prices?.currency==="CNY"?"CNY":"USD",s.exchangeRate);return l+=d,r+=d,{total:l,api:r}}function it(t,s){if(!t||!s)return!1;const o=t.byProviderModel??{};for(const n of Object.keys(o)){const a=n.indexOf(":"),l=a>0?n.slice(0,a):"deepseek",r=a>0?n.slice(a+1):n;if(ze(l,r,s)==="plan")return!0}return!1}function zt(t){return(t?.input??0)+(t?.cacheRead??0)+(t?.cacheWrite??0)}function ct(t,s){if(t?.apiCost!==void 0)return rt(t);if(!it(t,s))return Ae(t,s);let o=0;for(const[n,a]of Object.entries(t.byProviderModel??{})){if(!Number.isFinite(a.cost))return _t(t,s).api;const l=n.indexOf(":");ze(n.slice(0,l),n.slice(l+1),s)==="plan"&&(o+=a.cost)}return Math.max(0,Ae(t,s)-o)}function ut(t){const s=Math.abs(Math.round(Number(t)||0)),o=Math.floor(s/60),n=s%60;return"UTC"+(Number(t)<0?"-":"+")+o+(n>0?":"+String(n).padStart(2,"0"):"")}function Ka(t){const s=t?.meta,o=Number(s?.timezoneOffsetMinutes);if(!Number.isFinite(o))return null;const n=-new Date().getTimezoneOffset();if(n===o)return null;const a=typeof s?.timezone=="string"&&s.timezone.length>0?s.timezone:"";return{hostLabel:a?a+" ("+ut(o)+")":ut(o),browserLabel:ut(n)}}function Va(t){let s=t;const o=new Set;return{getSnapshot:()=>s,subscribe:n=>(o.add(n),()=>{o.delete(n)}),set:n=>{if(n!==s){s=n;for(const a of[...o])a()}}}}const{createElement:e,Fragment:I,useState:j,useEffect:se,useRef:Se}=De;function Pe({target:t,configured:s,source:o,t:n,api:a,placeholder:l,disabled:r}){const[i,c]=j(""),[b,d]=j(!1),[k,g]=j(null),h=r===!0||b,p=async()=>{const S=i.trim();if(!(S.length===0||h)){d(!0),g(null);try{const C=await a.setCredential(t,S);c(""),g({kind:"ok",text:C?.message??n("credentialSave")})}catch(C){g({kind:"err",text:String(C?.message??C)})}finally{d(!1)}}},v=async()=>{if(!h){d(!0),g(null);try{const S=await a.clearCredential(t);c(""),g({kind:"ok",text:S?.message??n("credentialClear")})}catch(S){g({kind:"err",text:String(S?.message??S)})}finally{d(!1)}}};return e("div",{className:"cm-field"},e("input",{className:"cm-input",type:"password",value:i,placeholder:typeof l=="string"?l:"",disabled:h,autoComplete:"off",onChange:S=>c(S.target.value)}),e("div",{className:"cm-buttons"},e("button",{className:"cm-btn small",onClick:p,disabled:h||i.trim().length===0},n(b?"credentialSaving":"credentialSave")),s===!0?e("button",{className:"cm-btn small",onClick:v,disabled:h},n("credentialClear")):null),e("span",{className:"cm-hint"},s===!0?n("credentialConfiguredOf",{source:typeof o=="string"&&o.length>0?o:"unknown"}):n("credentialNotConfigured")),e("span",{className:"cm-hint"},n("credentialInputHint")),Ie(k))}function Ya({pending:t,t:s}){return!Array.isArray(t)||t.length===0?null:e("div",{className:"cm-msg err"},e("div",null,s("secretMigrationPending")),e("div",null,t.join("、")))}function dt({size:t=16,className:s}){return e("svg",{width:t,height:t,className:s,viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},e("path",{d:"M4 4H12A2 2 0 0 1 14 6V11.5A2 2 0 0 1 12 13.5H4A2 2 0 0 1 2 11.5V6A2 2 0 0 1 4 4ZM4 5.3H12A0.7 0.7 0 0 1 12.7 6V11.5A0.7 0.7 0 0 1 12 12.2H4A0.7 0.7 0 0 1 3.3 11.5V6A0.7 0.7 0 0 1 4 5.3Z",fill:"currentColor",fillRule:"evenodd"}),e("path",{d:"M3.3 5.3H12.7V7.1H3.3Z",fill:"currentColor"}),e("path",{d:"M8 2.8A1.3 1.3 0 1 0 8 5.4A1.3 1.3 0 1 0 8 2.8Z",fill:"currentColor"}))}function Gt(t,s){const o=Se(!1),n=Se(""),a=s!==null&&typeof s=="object"?[s.input,s.cacheRead,s.cacheWrite,s.output,s.reasoning,s.cost].map(l=>String(l??0)).join("|"):"";se(()=>{if(!o.current){o.current=!0,n.current=a;return}if(a===""||a===n.current)return;n.current=a;const l=setTimeout(()=>{t.api?.reload?.()},800);return()=>clearTimeout(l)},[a])}function $a(t,s,o,n){const a=c=>["input","output","cacheRead","cacheWrite"].reduce((b,d)=>b+(c?.[d]??0),0),l=s?.found&&a(s.own)>=a(t)?s.own:t;if(!o||!s?.subagentCount)return l;const r=s.subagents,i={...l};for(const c of["input","output","cacheRead","cacheWrite","reasoning","cost"])i[c]=(l?.[c]??0)+(r?.[c]??0);i.apiCost=ct(l,n)+rt(r);for(const c of["byModel","byProviderModel"]){i[c]={...l?.[c]};for(const[b,d]of Object.entries(r?.[c]??{})){const k={...i[c][b]};for(const g of["input","output","cacheRead","cacheWrite","reasoning","cost"])k[g]=(k[g]??0)+(d[g]??0);delete k.apiCost,i[c][b]=k}}return i}function Kt(t){const s=t.useProjection?t.useProjection("costUsage"):void 0,o=t.useCost?.(i=>i)?.state,n=o?.config,[a,l]=j(null);Gt(t,s),se(()=>{if(!t.sessionId||!t.api?.getSessionCost)return;let i=!0,c=!1;const b=async()=>{if(!c){c=!0;try{const k=await t.api.getSessionCost(t.sessionId);i&&l({id:t.sessionId,include:n?.includeSubagentCost===!0,value:k})}catch{}finally{c=!1}}};b();const d=n?.includeSubagentCost===!0?setInterval(b,1e4):null;return()=>{i=!1,d!==null&&clearInterval(d)}},[t.sessionId,o?.meta?.now,s,n?.includeSubagentCost]);const r=a?.id===t.sessionId&&a.include===(n?.includeSubagentCost===!0)?a.value:null;return{usage:$a(s,r,n?.includeSubagentCost===!0,n),config:n}}function Ja(t){const{usage:s,config:o}=Kt(t);if(!s||!o||zt(s)+(s?.output??0)===0)return null;const n=V(F(o.locale));let a=0,l=Ae(s,o);if(o.showTotalWithPlan!==!0&&(s.apiCost!==void 0||it(s,o))){const c={total:Ae(s,o),api:ct(s,o)};a=Math.max(0,c.total-c.api),a>0&&(l=c.api)}const r=zt(s),i=[n("sessionCostTitle"),n("sessionDetailTokens",{input:Q(s?.input??0),cache:Q((s?.cacheRead??0)+(s?.cacheWrite??0)),output:Q(s?.output??0)}),n("sessionDetailCache",{read:Q(s?.cacheRead??0),write:Q(s?.cacheWrite??0)}),n("cost",{amount:J(l,o)}),...a>0?[n("sessionDetailPlan",{amount:J(a,o)})]:[]].join("; ");return e(ee,{label:i,side:"top",delayMs:500},e("div",{className:"cm-chip"},a>0?n("costChipPlan",{amount:J(l,o)}):n("cost",{amount:J(l,o)})))}function Za(t){const{usage:s,config:o}=Kt(t);if(!s||!o)return null;const n=s.input??0,a=(s.cacheRead??0)+(s.cacheWrite??0),l=s.output??0;if(n+a+l===0)return null;const r=V(F(o.locale));let i=0,c=Ae(s,o);if(o.showTotalWithPlan!==!0&&(s.apiCost!==void 0||it(s,o))){const b={total:Ae(s,o),api:ct(s,o)};i=Math.max(0,b.total-b.api),i>0&&(c=b.api)}return e("div",{className:"cm-root"},i>0?r("sessionLineSplit",{amount:J(c,o),planAmount:J(i,o),input:Q(n),cache:Q(a),output:Q(l)}):r("sessionLine",{amount:J(c,o),input:Q(n),cache:Q(a),output:Q(l)}))}const Xa={USD:"$",CNY:"¥",EUR:"€"};function ye(t,s,o){const n=typeof o=="string"?o.toUpperCase():"",a=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$";return ce(t,{symbol:Xa[n]??a,decimals:Math.max(2,Math.min(10,Math.floor(Number(s?.decimals)||2)))})}function Vt(t,s){const o=Number(t?.balance?.budgetCap);if(Number.isFinite(o)&&o>0)return o;const n=Number(s?.maxBudget);return Number.isFinite(n)&&n>0?n:null}function en(t){const s=t.today,o=s?.byProviderModel;if(o===null||typeof o!="object"||Object.keys(o).length===0)return Number(s?.cost)||0;let n=0;for(const[a,l]of Object.entries(o)){const r=a.indexOf(":");let i=r>=0?a.slice(0,r):a;i.startsWith("llm-")&&(i=i.slice(4)),!(i!=="deepseek"&&i!=="deepseek-official")&&(n+=Number(l?.cost)||0)}return n}function Yt(t,s,o,n,a=null){const l=o==="official"?en(t):Number(t.today?.cost)||0;if(o==="custom"){if(Xt(s,n,a)==="USD")return l;const c=Number(s?.exchangeRate);return l*(Number.isFinite(c)&&c>0?c:1)}const r=Number(s?.exchangeRate);return l*(Number.isFinite(r)&&r>0?r:1)}function $t({remaining:t,spend:s,todayUsed:o,cap:n}){if(n===null||n<=0)return{remainingPct:100,todayPct:0,spentPct:0,hasCap:!1,pastSpend:0,today:0};const a=Math.max(0,Number(t)||0),l=Math.max(0,Number(s)||0),r=Math.max(0,Math.min(l,Number(o)||0)),i=Math.max(0,l-r),c=Math.max(0,Math.min(100,a/n*100)),b=Math.max(0,Math.min(100-c,r/n*100)),d=Math.max(0,Math.min(100-c-b,i/n*100));return{remainingPct:c,todayPct:b,spentPct:d,hasCap:!0,pastSpend:i,today:r}}function mt(t,s,o=null,n=null){const a=o??t.customBalance,l=Vt(s,a),r=Number(a?.remaining)||0,i=Number(a?.spend)||0,c=Yt(t,s,"custom",a,n);return{cap:l,...$t({remaining:r,spend:i,todayUsed:c,cap:l})}}function tn(t,s){const o=t.balance,n=Vt(s,null),a=Number(o?.totalBalance)||0,l=Yt(t,s,"official",null),r=n!==null?Math.max(0,n-a):0;return{cap:n,...$t({remaining:a,spend:r,todayUsed:l,cap:n})}}function pt(t){const{segments:s,direction:o="remaining"}=t,{remainingPct:n,todayPct:a,spentPct:l}=s,r=[];n>0&&r.push(e("div",{className:"cm-bbox-fill",style:{width:n+"%"}})),a>0&&r.push(e("div",{className:"cm-bbox-seg-today",style:{width:a+"%"}})),l>0&&r.push(e("div",{className:"cm-bbox-seg-spent",style:{width:l+"%"}})),r.length===0&&r.push(e("div",{className:"cm-bbox-fill",style:{width:"100%"}}));const i=o==="used"?[...r].reverse():r;return e("div",{className:"cm-bbox-bar segments"+(o==="used"?" rev":"")},...i)}function Jt(t,s,o,n,a){const l=[t("balanceBarRemaining",{amount:n})];return o.today>0&&l.push(t("balanceBarToday",{amount:s(o.today)})),o.pastSpend>0&&l.push(t("balanceBarSpent",{amount:s(o.pastSpend)})),a!==null&&a>0&&l.push(t("balanceBudgetCapLabel")+": "+s(a)),l.join(" · ")}function ke(t){const[s,o]=j(!1),[n,a]=j(null);return{busy:s,err:n,run:()=>{s||typeof t!="function"||(o(!0),a(null),Promise.resolve().then(t).catch(r=>{a(r?.message??String(r))}).finally(()=>{o(!1)}))}}}const me=(t,s)=>({role:"button",tabIndex:0,"aria-busy":t?"true":"false",onClick:s,onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),s())}});function fe(t,s){const o=[t("clickToRefresh")];return s.busy&&o.push(t("refreshing")),s.err&&o.push("⚠ "+t("balanceRefreshFailed",{message:s.err})),o}const an="https://platform.deepseek.com/usage";function Zt(t){return e("a",{className:"cm-bal-link",href:an,target:"_blank",rel:"noreferrer noopener",title:t("balanceRechargeLink"),"aria-label":t("balanceRechargeLink"),onClick:s=>s.stopPropagation(),onKeyDown:s=>s.stopPropagation()},e("svg",{width:14,height:14,viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0},e("path",{d:"M8 4H4a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h11a1 1 0 0 0 1-1v-4M11 3h6v6M9 11l8-8"})))}function nn(t){const{state:s,wide:o,api:n}=t,a=s.balance,l=V(F(s.config?.locale)),r=ke(n?()=>n.refreshBalance():null);if(!a||a.status==="off")return null;if(a.status==="error")return e(ee,{label:[l("balanceQueryFailed",{message:a.message||l("unknownError")}),...fe(l,r)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(r.busy?" busy":""),...me(r.busy,r.run)},o?e(I,null,l("balance")," ",e("span",{className:"cm-num"},l("queryFailed"))):"⚠"));const i=[l("balanceTitle"),l("totalBalance",{amount:ye(a.totalBalance,s.config,a.currency)}),l("grantedToppedUp",{granted:ye(a.grantedBalance,s.config,a.currency),toppedUp:ye(a.toppedUpBalance,s.config,a.currency)}),l("updatedAt",{time:a.fetchedAt>0?new Date(a.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...fe(l,r)].join("; ");return e(ee,{label:i,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(r.busy?" busy":""),...me(r.busy,r.run)},o?e(I,null,e("span",{className:"cm-balance-name"},l("balance"),Zt(l)),e("span",{className:"cm-num cm-bal-amt"},ye(a.totalBalance,s.config,a.currency)),s.reconcile?.ok===!1?" ⚠":""):e(dt,{size:16})))}function sn(t){const{state:s,wide:o,api:n}=t,a=s.config,l=s.balance,r=V(F(a?.locale)),i=ke(n?()=>n.refreshBalance():null);if(!l||l.status!=="ok")return null;const c=tn(s,a),b=ye(l.totalBalance,a,l.currency),d=h=>ye(h,a,l.currency),k=[r("balanceTitle"),Jt(r,d,c,b,c.cap),r("grantedToppedUp",{granted:ye(l.grantedBalance,a,l.currency),toppedUp:ye(l.toppedUpBalance,a,l.currency)}),r("updatedAt",{time:l.fetchedAt>0?new Date(l.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...fe(r,i)].join("; "),g=e(I,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-balance-name"},e("span",{className:"cm-bbox-label"},r("balance")),Zt(r)),e("span",{className:"cm-bbox-pct cm-num cm-bal-amt"},b)),e(pt,{segments:c,direction:ae(a,"balance")}));return e(ee,{label:k,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(o?"":" rail")+(i.busy?" busy":""),...me(i.busy,i.run)},o?g:e("div",{className:"cm-bbox-rail cm-num"},Math.round(c.remainingPct)+"%")))}function Ge(t,s){const o=typeof t?.label=="string"?t.label:"",n=typeof t?.labelEn=="string"?t.labelEn:"";return s==="en"?n||o||"Custom balance":o||n||"自定义余额"}function Xt(t,s,o){if((o??t?.customBalance)?.adapter==="aliyun"&&["CNY","USD","EUR"].includes(s?.unit))return s.unit;const n=o?.unit??t?.customBalance?.unit;return n==="CNY"||n==="EUR"||n==="USD"?n:s?.unit==="CNY"||s?.unit==="EUR"?s.unit:"USD"}function we(t,s,o,n){const a=Xt(s,o,n),l=Math.max(2,Math.min(6,Math.floor(Number(s?.decimals)||4))),r=a==="CNY"?"¥":a==="EUR"?"€":"$",i=Number(t);if(!Number.isFinite(i))return"—";let c=i.toFixed(l);return c.includes(".")&&(c=c.replace(/0+$/,"").replace(/\.$/,"")),r+c}function ft(t,s,o,n,a=null){const l=we(t.remaining,s,t,a),r=g=>we(g,s,t,a);if(n&&s.balance?.showProgressBar===!0){const g=mt(n,s,t,a);return[Jt(o,r,g,l,g.cap),o("updatedAt",{time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"})].join(" · ")}const i=t.spend!==null?we(t.spend,s,t,a):"—",c=t.maxBudget!==null?we(t.maxBudget,s,t,a):"—",b=Number(s?.balance?.budgetCap),d=Number.isFinite(b)&&b>0?o("balanceBudgetCapLabel")+": "+we(b,s,t,a):"",k=t.maxBudget!==null&&t.spend!==null?o("customBalanceLine",{remaining:l,spend:i,maxBudget:c,time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"}):o("customBalanceRemaining",{amount:l});return d?k+" · "+d:k}function on(t,s,o,n,a){const l=Ge(a??s.customBalance??{},F(s?.locale)),r=we(n.remaining,s,n,a),i=mt(t,s,n,a);return{level:"ok",rail:Math.round(i.remainingPct)+"%",body:e(I,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},l),e("span",{className:"cm-bbox-pct cm-num cm-bal-amt"},r)),e(pt,{segments:i,direction:ae(s,"balance")}))}}function gt(t,s){const o=s?.customBalances??[],n=Array.isArray(t?.customBalances)?t.customBalances:[],a=[];return o.forEach((l,r)=>{if(l?.enabled!==!0||l.display!=="sidebar"&&l.display!=="both")return;const i=n.find(c=>c.index===r)??(n.length===1&&o.length===1?n[0]:null);a.push({index:r,entry:l,snapshot:i})}),a.length===0&&n.length===0&&s?.customBalance?.enabled===!0&&(s.customBalance.display==="sidebar"||s.customBalance.display==="both")&&t?.customBalance?.status&&t.customBalance.status!=="off"&&a.push({index:null,entry:s.customBalance,snapshot:t.customBalance}),a}function ln(t){const{state:s,wide:o,api:n}=t,a=s.config,l=V(F(a?.locale)),r=gt(s,a);return r.length===0?null:e(I,null,r.map(({index:i,entry:c,snapshot:b})=>e(rn,{key:"cb-"+i,state:s,wide:o,api:n,t:l,index:i,entry:c,snapshot:b})))}function rn(t){const{state:s,wide:o,api:n,t:a,index:l,entry:r,snapshot:i}=t,c=s.config;if(i==null||i.status!=="ok")return null;const b=ke(n?()=>n.refreshCustomBalance(l):null),d=on(s,c,a,i,r),k=[ft(i,c,a,s,r),...fe(a,b)].join(" · ");return e(ee,{label:k,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(d.level==="ok"?"":" "+d.level)+(o?"":" rail")+(b.busy?" busy":""),...me(b.busy,b.run)},o?d.body:e("div",{className:"cm-bbox-rail cm-num"},d.rail)))}function cn(t){const{state:s,wide:o,api:n}=t,a=s.config,l=V(F(a?.locale)),r=gt(s,a);return r.length===0?null:e(I,null,r.map(({index:i,entry:c,snapshot:b})=>e(un,{key:"cbr-"+i,state:s,wide:o,api:n,t:l,index:i,entry:c,snapshot:b})))}function un(t){const{state:s,wide:o,api:n,t:a,index:l,entry:r,snapshot:i}=t,c=s.config,b=i??Dt(l);if(b.status==="off")return null;const d=ke(n?()=>n.refreshCustomBalance(l):null),k=Ge(r??c.customBalance??{},F(c?.locale));if(b.status==="error")return e(ee,{label:[b.message||a("unknownError"),...fe(a,d)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(d.busy?" busy":""),...me(d.busy,d.run)},o?e(I,null,k," ",e("span",{className:"cm-num"},a("queryFailed"))):"⚠"));const g=we(b.remaining,c,b,r),h=[ft(b,c,a,s,r),...fe(a,d)].join(" · ");return e(ee,{label:h,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(d.busy?" busy":""),...me(d.busy,d.run)},o?e(I,null,k," ",e("span",{className:"cm-num"},g)):e(dt,{size:16})))}function dn(t){const o=(t.useCost?t.useCost(p=>p):void 0)?.state;if(!o)return null;const n=o.config,a=V(F(n?.locale)),l=n.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},r=o.goQuota,i=n?.goQuota?.enabled!==!1&&r?.status==="ok",c=p=>p!==null&&typeof p?.percent=="number"?Math.round(Math.max(0,Math.min(100,p.percent))):null,b=[],d=(p,v,S,C)=>{if(!p||!i)return;const P=c(v);if(P===null)return;const w=typeof v.resetsAt=="string"&&v.resetsAt.length>0?a("goResetAt",{time:new Date(v.resetsAt).toLocaleString()}):"";b.push({key:S,text:a(S)+" "+P+"%",tip:a(C)+": "+P+"%"+(w?" · "+w:""),level:P>=100?"over":P>=80?"warn":"ok"})},k=n?.goQuota?.main==="weekly"||n?.goQuota?.main==="monthly"?n.goQuota.main:"rolling",g=[k,...["rolling","weekly","monthly"].filter(p=>p!==k)],h=p=>p==="rolling"?["goRolling",r?.rolling,"goShortRolling","cornerGoRolling"]:p==="weekly"?["goWeekly",r?.weekly,"goShortWeekly","cornerGoWeekly"]:["goMonthly",r?.monthly,"goShortMonthly","cornerGoMonthly"];for(const p of g){const[v,S,C,P]=h(p);d(l[v]===!0,S,C,P)}if(l.budget===!0){const p=n.budget??{enabled:!1,amount:100,period:"month"};if(p.enabled===!0){const v=Number(n.exchangeRate),C=(o.budgetUsed??(p.period==="day"?_(o.today,n):p.period==="all"?_(o.total,n):_(o.month,n)))*(Number.isFinite(v)&&v>0?v:1),P=Math.max(0,Number(p.amount)||0),w=P>0?Math.min(999,C/P*100):null;if(w!==null){const x=w>=100?"over":w>=80?"warn":"ok";b.push({key:"budget",text:a("budgetShort")+" "+w.toFixed(1)+"%",tip:a("budgetOf",{period:a(Re[p.period]??"periodMonth")})+" · "+a("usedOf",{used:ce(C,n),amount:ce(P,n)}),level:x})}}}return b.length===0?null:e("div",{className:"cm-corner"},b.map(p=>e(ee,{key:p.key,label:p.tip,side:"top",delayMs:500},e("span",{className:"cm-corner-chip"+(p.level==="ok"?"":" "+p.level)},p.text))))}function Ke(t,s){if(!Array.isArray(s)||s.length===0||!Number.isFinite(t))return null;const o=(c,b)=>{const d=new Date(t);return d.setUTCDate(d.getUTCDate()+c),d.setUTCHours(b,0,0,0),d.getTime()},n=[];for(let c=-4;c<=4;c+=1)for(const b of s){const d=Number(b?.start),k=Number(b?.end);if(!Number.isFinite(d)||!Number.isFinite(k))continue;const g={at:o(c,d),intoPeak:!0},h={at:o(k<=d?c+1:c,k),intoPeak:!1};_e(g.at)===null&&n.push(g),_e(h.at)===null&&n.push(h)}let a=null,l=null;for(const c of n)c.at<=t&&(a===null||c.at>a.at)&&(a=c),c.at>t&&(l===null||c.at<l.at)&&(l=c);const r=_e(t);return r!==null?l===null?null:{inPeak:!1,weekend:!0,prevAtMs:r.start,nextAtMs:l.at,nextIntoPeak:l.intoPeak}:a===null||l===null?null:{inPeak:Ht(t,void 0,s),weekend:!1,prevAtMs:a.at,nextAtMs:l.at,nextIntoPeak:l.intoPeak}}function Ve(t,s){if(!t||t.peakNotice===!1||t.peakEnabled!==!0)return null;const o=Date.parse(t.peakEffectiveAt||"");if(Number.isFinite(o)&&s<o)return null;const n=Array.isArray(t.peakWindows)?t.peakWindows:[];return Ke(s,n)}function Ye(t){return t.weekend===!0?{short:"weekendShort",chip:"weekendChip",notice:"weekendAllOffPeak"}:t.inPeak?{short:"peakShort",chip:"peakShort",notice:"peakNotice"}:{short:"offPeakShort",chip:"offPeakShort",notice:"offPeakActive"}}function ge(t,s,o){const n=Math.max(0,t.nextAtMs-s),a=Math.max(1,Math.ceil(n/6e4)),l=Math.floor(a/60),r=a%60;return l>0?r>0?o("countdownHourMinute",{h:l,m:r}):o("countdownHoursOnly",{h:l}):o("countdownMinute",{m:a})}const bt="cm-peak-alert-preview";let ea=0;function mn(t){const s=t.useCost?t.useCost(v=>v):void 0,o=s?.state?.config,[n,a]=j(Date.now()),[l,r]=j(null),[i,c]=j(null);if(se(()=>{const v=window.setInterval(()=>a(Date.now()),1e4);return()=>window.clearInterval(v)},[]),se(()=>{const v=S=>{const C=S.detail?.kind==="offpeak"?"offpeak":"peak";c(C);const P=s?.state?.config;if(P?.peakAlertWebNotify===!0&&window.Notification&&Notification.permission==="granted"){const w=V(F(P.locale));try{new Notification(w(C==="peak"?"peakAlertTitlePeak":"peakAlertTitleOffPeak")+w("peakAlertPreviewTag"),{body:w("peakAlertBody",{time:w("countdownMinute",{m:2}),phase:w(C==="peak"?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}}};return window.addEventListener(bt,v),window.__cmPeakAlertLive=!0,()=>{window.removeEventListener(bt,v),window.__cmPeakAlertLive=!1}},[]),se(()=>{if(!o||o.peakAlertEnabled!==!0||o.peakEnabled!==!0||o.peakAlertWebNotify!==!0||!window.Notification||Notification.permission!=="granted")return;const v=Ke(n,Array.isArray(o.peakWindows)?o.peakWindows:[]);if(v===null)return;const S=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",C=v.nextIntoPeak===!0;if(S!=="both"&&S!==(C?"peak":"offpeak"))return;const P=Number(o.peakAlertAhead),w=(Number.isFinite(P)&&P>=1?P:2)*6e4;if(n<v.nextAtMs-w||n>=v.nextAtMs||ea===v.nextAtMs)return;const x=V(F(o.locale));ea=v.nextAtMs;try{new Notification(x(C?"peakAlertTitlePeak":"peakAlertTitleOffPeak"),{body:x("peakAlertBody",{time:ge(v,n,x),phase:x(C?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}},[n]),!o||o.peakEnabled!==!0)return null;let b=null;if(o.peakAlertEnabled===!0){const v=Date.parse(o.peakEffectiveAt||"");if(!(Number.isFinite(v)&&n<v)){const S=Ke(n,Array.isArray(o.peakWindows)?o.peakWindows:[]);if(S!==null){const C=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",P=Number(o.peakAlertAhead),w=(Number.isFinite(P)&&P>=1?P:2)*6e4;(C==="both"||C===(S.nextIntoPeak?"peak":"offpeak"))&&n>=S.nextAtMs-w&&n<S.nextAtMs&&l!==S.nextAtMs&&(b=S)}}}let d=null,k=!1,g=null;if(b!==null)d=b,k=b.nextIntoPeak===!0,g=()=>r(b.nextAtMs);else if(i!==null)d={nextAtMs:n+2*6e4,nextIntoPeak:i==="peak"},k=i==="peak",g=()=>c(null);else return null;const h=V(F(o.locale)),p=o.peakAlertPosition==="center"?"cm-peak-alert-center":"cm-peak-alert-corner";return e("div",{className:"cm-peak-alert "+p+" "+(k?"cm-peak-alert-peak":"cm-peak-alert-offpeak"),role:"alert"},e("div",{className:"cm-peak-alert-badge"},h(k?"peakAlertBadgePeak":"peakAlertBadgeOffPeak")),e("div",{className:"cm-peak-alert-title"},h(k?"peakAlertTitlePeak":"peakAlertTitleOffPeak")),e("div",{className:"cm-peak-alert-body"},h("peakAlertBody",{time:ge(d,n,h),phase:h(k?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})),e("div",{className:"cm-peak-alert-actions"},e("button",{className:"cm-btn",onClick:g},h("peakAlertBtn"))))}function pn(t){const{config:s,t:o}=t,[n,a]=j(Date.now());se(()=>{const c=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(c)},[]);const l=Ve(s,n);if(l===null)return null;const r=Ye(l),i=l.nextIntoPeak?o("nextPeakIn",{time:ge(l,n,o)}):o("nextOffPeakIn",{time:ge(l,n,o)});return e(ee,{label:o(r.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-strip "+(l.weekend?"weekend":l.inPeak?"peak":"off")},e("div",{className:"cm-peak-track"},e("div",{className:"cm-peak-segment cm-peak-high"}),e("div",{className:"cm-peak-segment cm-peak-low"}),e("div",{className:"cm-peak-marker",style:{left:l.weekend?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-chip"},o(r.chip)+" · "+i)))}function fn(t){const{config:s,t:o}=t,[n,a]=j(Date.now());se(()=>{const c=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(c)},[]);const l=Ve(s,n);if(l===null)return null;const r=Ye(l),i=l.nextIntoPeak?o("nextPeakIn",{time:ge(l,n,o)}):o("nextOffPeakIn",{time:ge(l,n,o)});return e(ee,{label:o(r.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-classic "+(l.weekend?"weekend":l.inPeak?"peak":"off")},e("div",{className:"cm-peak-classic-marker",style:{left:l.weekend?"50%":l.inPeak?"25%":"75%"}}),e("div",{className:"cm-peak-track"},e("div",{className:"cm-peak-segment cm-peak-high"}),e("div",{className:"cm-peak-segment cm-peak-low"})),e("span",{className:"cm-peak-classic-chip"},o(r.chip)+" · "+i)))}function $e(t,s,o){return e(s?.peakStyle==="classic"?fn:pn,{config:s,t:o})}function gn(t){const{config:s,t:o}=t,[n,a]=j(Date.now());se(()=>{const b=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(b)},[]);const l=Ve(s,n);if(l===null)return null;const r=Ye(l),i=l.nextIntoPeak?o("nextPeakIn",{time:ge(l,n,o)}):o("nextOffPeakIn",{time:ge(l,n,o)}),c=[o(r.notice),i];return e(ee,{label:c,side:"right",delayMs:300},e("div",{className:"cm-peak-rail "+(l.weekend?"weekend":l.inPeak?"peak":"off"),"aria-label":c.join("; ")},e("div",{className:"cm-peak-rail-track"},e("div",{className:"cm-peak-rail-segment cm-peak-rail-high"}),e("div",{className:"cm-peak-rail-segment cm-peak-rail-low"}),e("div",{className:"cm-peak-rail-marker",style:{top:l.weekend?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-label"},o(r.short))))}function bn(t){const{config:s,t:o}=t,[n,a]=j(Date.now());se(()=>{const b=window.setInterval(()=>a(Date.now()),3e4);return()=>window.clearInterval(b)},[]);const l=Ve(s,n);if(l===null)return null;const r=Ye(l),i=l.nextIntoPeak?o("nextPeakIn",{time:ge(l,n,o)}):o("nextOffPeakIn",{time:ge(l,n,o)}),c=[o(r.notice),i];return e(ee,{label:c,side:"right",delayMs:300},e("div",{className:"cm-peak-rail-classic "+(l.weekend?"weekend":l.inPeak?"peak":"off"),"aria-label":c.join("; ")},e("div",{className:"cm-peak-rail-classic-track"},e("div",{className:"cm-peak-rail-classic-segment peak"}),e("div",{className:"cm-peak-rail-classic-segment off"}),e("div",{className:"cm-peak-rail-classic-marker",style:{top:l.weekend?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-classic-label"},o(r.short))))}function hn(t,s,o){return e(s?.peakStyle==="classic"?bn:gn,{config:s,t:o})}function ta(t,s,o){const n=t.today,a=s.budget??{enabled:!1,amount:100,period:"month"},l=Number(s.exchangeRate),i=(t.budgetUsed??(a.period==="day"?_(t.today,s):a.period==="all"?_(t.total,s):_(t.month,s)))*(Number.isFinite(l)&&l>0?l:1),c=Math.max(0,Number(a.amount)||0),b=c>0?Math.min(999,i/c*100):null,d=ue(b===null?null:Math.min(100,b),ae(s,"budget")),k=_(n,s)*(Number.isFinite(l)&&l>0?l:1),g=c>0?Math.min(999,k/c*100):null,h=a.detail!==!1;return{level:b===null?"ok":b>=100?"over":b>=80?"warn":"ok",rail:d.label===null?"—":Math.round(d.label)+"%",body:e(I,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("budget")),e("span",{className:"cm-bbox-pct cm-num"},d.label===null?"—":d.label.toFixed(1)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:d.width+"%"}})),h?e(I,null,s.hideTodayCost===!0?null:e("div",{className:"cm-bbox-line cm-num"},o("todayShare",{amount:J(_(n,s),s),pct:g===null?"—":g.toFixed(1)+"%"})),e("div",{className:"cm-bbox-line cm-num"},o("usedOf",{used:ce(i,s),amount:ce(c,s)}))):null,$e(t,s,o))}}function aa(t,s,o){const n=t.goQuota,a=s?.goQuota?.main==="weekly"||s?.goQuota?.main==="monthly"?s.goQuota.main:"rolling",l=n[a],r=l!==null&&typeof l?.percent=="number"?Math.max(0,Math.min(100,Number(l.percent)||0)):0,i=h=>h!==null&&typeof h?.percent=="number"?Math.round(Math.max(0,Math.min(100,h.percent)))+"%":"—",c=h=>o(h==="rolling"?"goShortRolling":h==="weekly"?"goShortWeekly":"goShortMonthly"),b=["rolling","weekly","monthly"].filter(h=>h!==a),d=l!==null&&typeof l?.resetsAt=="string"&&l.resetsAt.length>0?o("goResetAt",{time:new Date(l.resetsAt).toLocaleString()}):"",k=s?.goQuota?.detail!==!1,g=ue(r,ae(s,"go"));return{level:r>=100?"over":r>=80?"warn":"ok",rail:g.label===null?"—":Math.round(g.label)+"%",body:e(I,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("goQuotaRowLabel")+" "+c(a)),e("span",{className:"cm-bbox-pct cm-num"},g.label===null?"—":Math.round(g.label)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:g.width+"%"}})),k?e(I,null,e("div",{className:"cm-bbox-line cm-num"},b.map(h=>c(h)+" "+i(n[h])).join(" · ")),d?e("div",{className:"cm-bbox-line"},d):null):null)}}function yn(t){const{state:s,wide:o}=t,n=s.goQuota,a=V(F(s.config?.locale));if(!n||n.status!=="ok")return null;const l=s.config?.goQuota?.main==="weekly"||s.config?.goQuota?.main==="monthly"?s.config.goQuota.main:"rolling";if(n[l]===null||typeof n[l]?.percent!="number")return null;const r=aa(s,s.config,a),i=[a("goQuotaTitle"),a("goWindowRolling")+": "+(n.rolling===null?"—":Math.round(n.rolling.percent)+"%"),a("goWindowWeekly")+": "+(n.weekly===null?"—":Math.round(n.weekly.percent)+"%"),a("goWindowMonthly")+": "+(n.monthly===null?"—":Math.round(n.monthly.percent)+"%"+(n.monthly!==null&&typeof n.monthly.resetsAt=="string"&&n.monthly.resetsAt.length>0?" · "+a("goResetAt",{time:new Date(n.monthly.resetsAt).toLocaleString()}):"")),a("goQuotaFetchedAt",{time:n.fetchedAt>0?new Date(n.fetchedAt).toLocaleTimeString():"—"})].join("; ");return e(ee,{label:i,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(r.level==="ok"?"":" "+r.level)+(o?"":" rail")},o?r.body:e("div",{className:"cm-bbox-rail cm-num"},r.rail)))}function kn(t){return t===null||typeof t!="object"||typeof t.percent!="number"?null:Math.max(0,Math.min(100,Math.round(Number(t.percent)||0)))}function Oe(t){const s=t!==null&&typeof t=="object"?t:{};return{five:s["5h"]??null,seven:s["7d"]??s.week??s.weekly??null}}function wn(t,s,o=Date.now()){if(typeof t!="string"||!t)return"";const n=Date.parse(t);if(!Number.isFinite(n))return"";const a=n-o;if(a<=0)return s("resetReached");const l=Math.ceil(a/6e4),r=Math.floor(l/1440),i=Math.floor(l%1440/60),c=l%60;return r>0?s("resetDays",{d:r,h:i}):i>0?s("resetHours",{h:i,m:c}):s("resetMinutes",{m:c})}function Ee(t,s,o=Date.now()){const n=wn(t?.resetsAt,s,o);return n?s("goResetAt",{time:new Date(t.resetsAt).toLocaleString()})+" ("+n+")":""}function Je(t,s,o){return t===null?"—":o(s==="remaining"?"quotaRemaining":"quotaUsed",{pct:t})}function Ze(){const[,t]=j(0),s=()=>t(Date.now());return{onMouseEnter:s,onFocus:s}}function je(t,s,o,n){const a=kn(s),l=a===null?"ok":a>=100?"over":a>=80?"warn":"ok",r=ue(a,o);return{level:l,pct:a,label:r.label,row:e("div",{className:"cm-mm-row"+(l==="ok"?"":" "+l)},e("span",{className:"cm-bbox-label"},t),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:r.width+"%"}})),e("span",{className:"cm-bbox-pct cm-num"},r.label===null?"—":r.label+"%"))}}function na(t){const s=Ze(),{five:o,seven:n,fetchedAt:a,t:l,wide:r,refresh:i,direction:c="used"}=t,b=je(l("codingPlanRemain5h"),o,c,l),d=je(l("codingPlanRemain7d"),n,c,l),k=b.level==="over"||d.level==="over"?"over":b.level==="warn"||d.level==="warn"?"warn":"ok",g=(S,C,P)=>{const w=Je(P.label,c,l),x=Ee(C,l);return S+" "+w+(x?" · "+x:"")},h=[l("codingPlanMinimaxTitle"),g(l("codingPlanRemain5h"),o,b),g(l("codingPlanRemain7d"),n,d),a>0?l("goQuotaFetchedAt",{time:new Date(a).toLocaleTimeString()}):null,...i?fe(l,i):[]].filter(Boolean).join(`
|
|
3
|
+
`),p=e(I,null,e("div",{className:"cm-mm-title"},l("codingPlanMinimaxTitle")),b.row,d.row),v=e(I,null,e("div",{className:"cm-bbox-rail cm-num"},b.label===null?"—":b.label+"%"),e("div",{className:"cm-bbox-rail cm-num"},d.label===null?"—":d.label+"%"));return e(ee,{label:e("span",{style:{whiteSpace:"pre-line"}},h),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm"+(k==="ok"?"":" "+k)+(r===!1?" rail":"")+(i?" clickable"+(i.busy?" busy":""):""),...i?me(i.busy,i.run):{}},r===!1?v:p))}function xn(t){const{state:s,wide:o,api:n}=t,a=s.codingPlans?.minimax,l=V(F(s.config?.locale)),r=ke(n?()=>n.refreshCodingPlan("minimax"):null);if(!a||a.status!=="ok")return null;const{five:i,seven:c}=Oe(a.windows);return i==null&&c==null?null:e(na,{five:i,seven:c,fetchedAt:a.fetchedAt,t:l,wide:o,refresh:r,direction:ae(s.config,"plan")})}const vn="/plugins/dsh-openai-codex/auth/status",Nn=168*3600;function Sn(t){if(t===null||typeof t!="object"||t.status!=="signed-in")return null;const s=t.usage!==null&&typeof t.usage=="object"?t.usage.rateLimits:null;if(!Array.isArray(s))return null;const o=s.find(i=>i!==null&&typeof i=="object"&&i.id==="codex");if(!o||!Array.isArray(o.windows))return null;const n=o.windows.find(i=>i!==null&&typeof i=="object"&&Number(i.windowSeconds)===Nn);if(!n||typeof n.remainingPercent!="number"||!Number.isFinite(Number(n.remainingPercent)))return null;const a=Math.max(0,Math.min(100,Math.round((100-Number(n.remainingPercent))*10)/10)),l=Number(n.resetAt),r=Number.isFinite(l)&&l>0?new Date(l*1e3).toISOString():"";return{weekly:{percent:a,resetsAt:r}}}const X={status:"idle",windows:{},fetchedAt:0,inFlight:null,listeners:[]},Cn=t=>(X.listeners.push(t),()=>{X.listeners=X.listeners.filter(s=>s!==t)}),An=()=>{for(const t of X.listeners)try{t()}catch{}};async function ht(t=!1,s=!1){if(!s)return;if(X.inFlight!==null)return X.inFlight;if(!t&&X.fetchedAt>0&&Date.now()-X.fetchedAt<5*6e4)return;const o=(async()=>{try{const n=await fetch(vn,{credentials:"same-origin",headers:{accept:"application/json"},signal:AbortSignal.timeout(8e3)});let a={};if(n.ok){const l=Sn(await n.json().catch(()=>null));l!==null&&(a=l)}X.status=Object.keys(a).length>0?"ok":"unavailable",X.windows=a}catch{X.status="unavailable"}finally{X.fetchedAt=Date.now(),X.inFlight=null,An()}})();return X.inFlight=o,o}function yt(t){const[s,o]=j(()=>({status:X.status,windows:X.windows,fetchedAt:X.fetchedAt}));return se(()=>{if(!t)return;let n=!0;const a=()=>{n&&o({status:X.status,windows:X.windows,fetchedAt:X.fetchedAt})},l=Cn(a);return a(),ht(!1,!0),()=>{n=!1,l()}},[t]),s}function Pn(t){const s=Ze(),{state:o,wide:n}=t,a=V(F(o.config?.locale)),l=yt(o.config?.codexQuotaEnabled===!0),r=ke(()=>ht(!0,o.config?.codexQuotaEnabled===!0));if(o.config?.codexQuotaEnabled!==!0||l.status!=="ok")return null;const i=l.windows.weekly??null;if(i===null)return null;const c=ae(o.config,"plan"),b=je(a("goShortWeekly"),i,c,a),d=[a("codexQuotaTitle"),Je(b.label,c,a),Ee(i,a),l.fetchedAt>0?a("goQuotaFetchedAt",{time:new Date(l.fetchedAt).toLocaleTimeString()}):null,...fe(a,r)].filter(Boolean).join(`
|
|
4
|
+
`),k=e(I,null,e("div",{className:"cm-mm-title"},a("codexQuotaTitle")),b.row),g=e("div",{className:"cm-bbox-rail cm-num"},b.label===null?"—":b.label+"%");return e(ee,{label:e("span",{style:{whiteSpace:"pre-line"}},d),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(b.level==="ok"?"":" "+b.level)+(n===!1?" rail":"")+(r.busy?" busy":""),...me(r.busy,r.run)},n===!1?g:k))}function kt(t,s){return t==="fiveHour"||t==="5h"?"5h":t==="weekly"||t==="week"||t==="7d"?t==="7d"?"7d":s("goShortWeekly"):t==="monthly"||t==="month"?s("goShortMonthly"):t==="daily"||t==="day"?s("goShortDaily"):String(t).replace(/_/g," ")}function Mn(t){const s=Ze(),{id:o,state:n,wide:a,api:l}=t,r=n.codingPlans?.[o],i=V(F(n.config?.locale)),c=ke(l?()=>l.refreshCodingPlan(o):null),b=Te.find(x=>x.id===o);if(!b||!r||r.status!=="ok")return null;const d=r.windows!==null&&typeof r.windows=="object"?r.windows:{},k=Object.entries(d);if(k.length===0)return null;const g=x=>x!==null&&typeof x=="object"&&typeof x.percent=="number"?Math.max(0,Math.min(100,Math.round(Number(x.percent)||0))):null,h=ae(n.config,"plan"),p=k.map(([x,N])=>{const f=g(N);if(f===null)return e("div",{key:x,className:"cm-mm-row wide"},e("span",{className:"cm-mm-text"},typeof N?.text=="string"?N.text:"—"));const M=f>=100?"over":f>=80?"warn":"ok",T=ue(f,h);return e("div",{key:x,className:"cm-mm-row wide"+(M==="ok"?"":" "+M)},e("span",{className:"cm-bbox-label"},kt(x,i)),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:T.width+"%"}})),e("span",{className:"cm-bbox-pct cm-num"},T.label===null?"—":T.label+"%"))}),v=k.map(([x,N])=>{const f=g(N),M=Ee(N,i),T=f===null?typeof N?.text=="string"?N.text:"—":Je(ue(f,h).label,h,i);return kt(x,i)+" "+T+(M?" · "+M:"")});r.fetchedAt>0&&v.push(i("goQuotaFetchedAt",{time:new Date(r.fetchedAt).toLocaleTimeString()})),v.push(...fe(i,c));const S=[i(b.labelKey),...v].join(`
|
|
5
|
+
`),C=k.map(([,x])=>g(x)).filter(x=>x!==null),P=C.some(x=>x>=100)?"over":C.some(x=>x>=80)?"warn":"ok",w=C.length>0?C.slice(0,2).map(x=>ue(x,h).label+"%").join(" "):typeof k[0][1]?.text=="string"?k[0][1].text:"—";return e(ee,{label:e("span",{style:{whiteSpace:"pre-line"}},S),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(P==="ok"?"":" "+P)+(a===!1?" rail":"")+(c.busy?" busy":""),...me(c.busy,c.run)},a===!1?e("div",{className:"cm-bbox-rail cm-num"},w):e(I,null,e("div",{className:"cm-mm-title"},i(b.labelKey)),...p)))}const sa=t=>{try{return window.localStorage?.getItem?.("cm.gw."+t)??""}catch{return""}},Tn=(t,s)=>{try{window.localStorage?.setItem?.("cm.gw."+t,s)}catch{}};function Bn(t){const s=Ze(),{source:o,snapshot:n,state:a,wide:l,api:r}=t,i=V(F(a.config?.locale)),[c,b]=j(()=>({source:o.id,id:sa(o.id)})),d=ke(r?()=>r.refreshGatewayQuota(o.id):null),k=ae(a.config,"plan"),g=n.accounts.length>1,h=c.source===o.id?c.id:sa(o.id),p=n.accounts.findIndex(L=>L.id===h),v=p>=0?p:Math.max(0,n.accounts.findIndex(L=>L.windows.length>0||L.credits!=null)),S=n.accounts[v]??n.accounts[0],C=S?.label||S?.id||"",P=L=>g?(Lt[L.provider]??L.provider)+" · ":"",w=g&&S?[S]:n.accounts,x=[];for(const L of w){if(x.length>=4)break;for(const H of L.windows){if(x.length>=4)break;const Z=P(L)+(H.label||H.id||i("gatewaySourceUnknown"));x.push({win:H,name:Z,view:je(Z,H,k,i)})}L.windows.length===0&&L.credits!=null&&x.push({win:null,name:P(L)+(L.credits.unit||"credits"),text:(L.credits.used??"—")+" / "+(L.credits.limit??"—")})}x.length===0&&x.push({name:i("gatewayQuotaEmpty"),text:"—"});const N=x.some(L=>L.view?.level==="over")?"over":x.some(L=>L.view?.level==="warn")?"warn":"ok",f=x.map(L=>{if(L.text!=null)return L.name+" "+L.text;const H=Ee(L.win,i);return L.name+" "+Je(L.view.label,k,i)+(H?" · "+H:"")});n.fetchedAt>0&&f.push(i("goQuotaFetchedAt",{time:new Date(n.fetchedAt).toLocaleTimeString()})),f.push(...fe(i,d));const T=[g&&C?`${o.label||o.id} (${v+1}/${n.accounts.length} · ${C})`:o.label||o.id,...f].join(`
|
|
6
|
+
`),B=x.map((L,H)=>L.text!=null?e("div",{key:H,className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},L.name),e("span",{className:"cm-mm-text cm-num"},L.text)):e(I,{key:H},L.view.row)),O=L=>{if(!L.key||L.key==="Enter"||L.key===" "){L.stopPropagation(),L.preventDefault?.();const H=n.accounts[(v+1)%n.accounts.length];Tn(o.id,H.id),b({source:o.id,id:H.id})}},A=g?e("span",{className:"cm-gw-switcher","aria-label":i("gatewaySwitchAccount",{account:C||v+1}),onClick:O,onKeyDown:O,role:"button",tabIndex:0},`${v+1}/${n.accounts.length} ⇄`):null,m=g?e("div",{className:"cm-bbox-head"},e("div",{className:"cm-mm-title"},o.label||o.id),A):e("div",{className:"cm-mm-title"},o.label||o.id),E=g&&C?e("div",{className:"cm-gw-sub"},C):null,K=e(I,null,m,E,...B),ne=x.filter(L=>L.view).map(L=>L.view.label).filter(L=>L!==null),R=ne.length>0?ne.slice(0,2).map(L=>L+"%").join(" "):x[0].text??"—",q=e("div",{className:"cm-bbox-rail cm-num"},R);return e(ee,{label:e("span",{style:{whiteSpace:"pre-line"}},T),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(N==="ok"?"":" "+N)+(l===!1?" rail":"")+(d.busy?" busy":""),...me(d.busy,d.run)},l===!1?e(I,null,q,A):K))}function Dn(t,s,o,n){const a=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:[],l=[];for(const r of s.gatewayQuotas?.sources??[]){if(r.enabled===!1||r.display!=="sidebar"&&r.display!=="both")continue;const i=a.find(c=>c.id===r.id);!i||i.status!=="ok"&&i.status!=="partial"&&i.status!=="stale"||i.accounts.length===0||l.push(e(Bn,{source:r,snapshot:i,state:t,wide:o,api:n}))}return l}const Rn={anthropic:"Claude",zai:"Z.ai",minimax:"MM",kimi:"Kimi",openrouter:"OR",siliconflow:"SF",commandcode:"CC",scnet:"SCNet",volcengine:"Ark",qwen:"Qwen"};function Ln(t){const s=t.useCost?t.useCost(p=>p):void 0;yt(s?.state?.config?.codexQuotaEnabled===!0);const[o,n]=j(null),[a,l]=j({}),r=s?.state,i=t.api;if(!r)return null;const c=r.config,b=c.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};if(b.enabled!==!0)return null;const d=V(F(c?.locale)),k=[];if(b.budget!==!1){const p=c.budget??{enabled:!1,amount:100,period:"month"};if(p.enabled===!0){const v=Number(c.exchangeRate),C=(r.budgetUsed??(p.period==="day"?_(r.today,c):p.period==="all"?_(r.total,c):_(r.month,c)))*(Number.isFinite(v)&&v>0?v:1),P=Math.max(0,Number(p.amount)||0);if(P>0){const w=Math.min(999,C/P*100),x=w>=100?"over":w>=80?"warn":"ok";k.push({key:"budget",label:d("budgetShort"),level:x,tip:d("budgetOf",{period:d(Re[p.period]??"periodMonth")})+" · "+d("usedOf",{used:ce(C,c),amount:ce(P,c)})+" · "+w.toFixed(1)+"%",segs:[{name:"main",pct:Math.round(ue(Math.min(100,w),ae(c,"budget")).width)}]})}}}if(b.go!==!1){const p=r.goQuota;if(c?.goQuota?.enabled!==!1&&p?.status==="ok"){const v=c.goQuota.main==="weekly"||c.goQuota.main==="monthly"?c.goQuota.main:"rolling",S=v==="rolling"?p.rolling:v==="weekly"?p.weekly:p.monthly;if(S!==null&&typeof S=="object"&&typeof S.percent=="number"){const C=Math.max(0,Math.min(100,Math.round(Number(S.percent)||0))),P=C>=100?"over":C>=80?"warn":"ok",w=typeof S.resetsAt=="string"&&S.resetsAt.length>0?" · "+d("goResetAt",{time:new Date(S.resetsAt).toLocaleString()}):"";k.push({key:"go",label:"Go "+d(v==="rolling"?"goShortRolling":v==="weekly"?"goShortWeekly":"goShortMonthly"),level:P,tip:"Go: "+C+"%"+w,segs:[{name:"main",pct:Math.round(ue(C,ae(c,"go")).width)}]})}}}if(b.plans!==!1)for(const p of Te){const v=r.codingPlans?.[p.id];if(c.codingPlans?.[p.id]?.enabled!==!0||!v||v.status!=="ok")continue;const S=v.windows!==null&&typeof v.windows=="object"?v.windows:{},C=Object.entries(S);if(C.length===0)continue;const P=Rn[p.id]??p.id,w=[],x=[];let N=0,f=0;for(const[M,T]of C){const B=kt(M,d),O=typeof T?.resetsAt=="string"&&T.resetsAt.length>0?" · "+d("goResetAt",{time:new Date(T.resetsAt).toLocaleString()}):"",A=T!==null&&typeof T=="object"&&typeof T.percent=="number"?Math.max(0,Math.min(100,Math.round(Number(T.percent)||0))):null;if(x.push(B+" "+(A===null?typeof T?.text=="string"?T.text:"—":A+"%")+O),A===null){w.push({name:M,pct:null,text:typeof T?.text=="string"?T.text:"—"});continue}f>=2||(f+=1,w.push({name:M,pct:Math.round(ue(A,ae(c,"plan")).width)}),N=Math.max(N,A>=100?2:A>=80?1:0))}v.fetchedAt>0&&x.push(d("goQuotaFetchedAt",{time:new Date(v.fetchedAt).toLocaleTimeString()})),w.length!==0&&k.push({key:p.id,label:P,level:["ok","warn","over"][N],tip:x.join("; "),segs:w})}const g=c.codexQuotaEnabled===!0&&X.status==="ok"?X.windows.weekly??null:null;if(g!==null&&typeof g.percent=="number"){const p=Math.max(0,Math.min(100,Math.round(Number(g.percent)||0))),v=typeof g.resetsAt=="string"&&g.resetsAt.length>0?" · "+d("goResetAt",{time:new Date(g.resetsAt).toLocaleString()}):"";k.push({key:"codex",label:"Codex",level:p>=100?"over":p>=80?"warn":"ok",tip:d("codexQuotaTitle")+": "+p+"%"+v,segs:[{name:"weekly",pct:Math.round(ue(p,ae(c,"plan")).width)}]})}if(k.length===0)return null;const h=p=>{o!==null||!i||(n(p),l(v=>({...v,[p]:null})),Promise.resolve().then(()=>p==="budget"?i.reload():p==="go"?i.refreshGoQuota():p==="codex"?ht(!0,c.codexQuotaEnabled===!0):i.refreshCodingPlan(p)).catch(v=>{l(S=>({...S,[p]:v?.message??String(v)}))}).finally(()=>n(null)))};return e("div",{className:"cm-qstrip"},k.map(p=>{const v=o===p.key,S=a[p.key],C=[e("span",{className:"cm-qlabel",key:"l"},p.label)];v?C.push(e("span",{className:"cm-qtext",key:"busy"},d("refreshing"))):p.segs.forEach((w,x)=>{x>0&&C.push(e("span",{className:"cm-qsep",key:"sep"+x,"aria-hidden":"true"})),w.pct===null?C.push(e("span",{className:"cm-qtext",key:w.name},w.text)):C.push(e("span",{className:"cm-qseg",key:w.name},e("span",{className:"cm-qbar"},e("span",{className:"cm-qfill",style:{width:w.pct+"%"}})),e("span",null,w.pct+"%")))});const P=[p.tip];return!v&&i&&P.push(d("clickToRefresh")),v&&P.push(d("refreshing")),S&&P.push("⚠ "+d("balanceRefreshFailed",{message:S})),e(ee,{key:p.key,label:P.join("; "),side:"bottom",delayMs:400},e("span",{className:"cm-qchip"+(i?" action":"")+(p.level==="ok"?"":" "+p.level),...i?me(v,()=>h(p.key)):{}},C))}))}const oa="dsh-cost-meter:simple-guide-dismissed";function wt(t){if(t?.sidebarSimplePromptSeen===!0)return!0;try{return window.localStorage.getItem(oa)==="1"}catch{return!1}}function On(t){const s=t.useCost?t.useCost(h=>h):void 0,o=Se(!1),[n,a]=j(!1),[l,r]=j(!1),[i,c]=j(!1),b=s?.state?.config;if(!b||i||wt(b))return null;const d=V(F(b.locale)),k=()=>{c(!0);try{window.localStorage.setItem(oa,"1")}catch{}},g=async h=>{if(!o.current){o.current=!0,a(!0),r(!1);try{if((await t.api.updateConfig({sidebarSimple:h,sidebarSimplePromptSeen:!0}))?.config?.sidebarSimple!==h)throw new Error;k()}catch{r(!0)}finally{o.current=!1,a(!1)}}};return e("div",{className:"cm-qguide",role:"dialog","aria-label":d("sidebarSimpleTitle"),"aria-busy":n,onKeyDown:h=>{h.key==="Escape"&&(h.stopPropagation(),k())}},e("div",{className:"cm-bbox-head"},e("h4",null,d("sidebarSimpleTitle")),e("button",{type:"button",className:"cm-btn small","aria-label":d("closeGuide"),onClick:k},"×")),e("p",null,d("sidebarSimpleBody")),l?e("p",{role:"alert"},d("sidebarSimpleError")):null,e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small",disabled:n,onClick:()=>g(!1)},d("sidebarSimpleOff")),e("button",{type:"button",className:"cm-btn small primary",disabled:n,onClick:()=>g(!0)},d("sidebarSimpleOn"))))}function En(t){const s=t.useCost?t.useCost(i=>i):void 0,o=Se(!1),n=s?.state;if(!n)return null;const a=n.config;if(!wt(a)||a.quotaStrip?.promptSeen===!0)return null;const l=V(F(a?.locale)),r=i=>{if(o.current===!0)return;o.current=!0;const c=a.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};t.api.updateConfig({quotaStrip:{...c,enabled:i,promptSeen:!0}}).catch(()=>{o.current=!1})};return e("div",{className:"cm-qguide",role:"dialog","aria-label":l("quotaStripGuideTitle")},e("h4",null,l("quotaStripGuideTitle")),e("p",null,l("quotaStripGuideBody")),e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small",onClick:()=>r(!1)},l("quotaStripGuideOff")),e("button",{type:"button",className:"cm-btn small primary",onClick:()=>r(!0)},l("quotaStripGuideOn"))))}const la="dsh-cost-meter:balance-click-hint-seen",jn=()=>{try{return window.localStorage.getItem(la)==="1"}catch{return!1}},qn=()=>{try{window.localStorage.setItem(la,"1")}catch{}};function In(t){const s=t.useCost?t.useCost(h=>h):void 0,o=Se(!1),[n,a]=j(!1),[l]=j(jn),r=s?.state;if(!r)return null;const i=r.config,c=i.balance?.display==="sidebar"||i.balance?.display==="both",b=(i?.customBalances??[]).some(h=>h?.enabled===!0&&(h.display==="sidebar"||h.display==="both"))||i.customBalance?.enabled===!0&&(i.customBalance?.display==="sidebar"||i.customBalance?.display==="both"),d=Te.some(h=>{const p=i.codingPlans?.[h.id];return p?.enabled===!0&&(p.display==="sidebar"||p.display==="both")});if(n||l||i.balance?.clickHintSeen===!0||!c&&!b&&!d||!wt(i)||i.quotaStrip?.promptSeen!==!0)return null;const k=V(F(i?.locale)),g=()=>{o.current!==!0&&(a(!0),o.current=!0,qn(),t.api.updateConfig({balance:{...i.balance??{},clickHintSeen:!0}}).catch(()=>{o.current=!1,a(!1)}))};return e("div",{className:"cm-qguide",role:"dialog","aria-label":k("balanceClickGuideTitle")},e("h4",null,k("balanceClickGuideTitle")),e("p",null,k("balanceClickGuideBody")),e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small primary",onClick:g},k("balanceClickGuideOk"))))}function xt(t){const{state:s,wide:o}=t,n=s.today,a=s.config,l=V(F(a?.locale)),r=a.budget??{enabled:!1,amount:100,period:"month"},i=Number(a.exchangeRate),b=(s.budgetUsed??(r.period==="day"?_(s.today,a):r.period==="all"?_(s.total,a):_(s.month,a)))*(Number.isFinite(i)&&i>0?i:1),d=Math.max(0,Number(r.amount)||0),k=d>0?Math.min(999,b/d*100):null,g=k===null?"ok":k>=100?"over":k>=80?"warn":"ok";if(r.enabled===!0){const p=_(n,a),v=p*(Number.isFinite(i)&&i>0?i:1),S=d>0?Math.min(999,v/d*100):null,C=[l("budgetOf",{period:l(Re[r.period]??"periodMonth")}),l("usedOf",{used:ce(b,a),amount:ce(d,a)})+" · "+(k===null?"—":k.toFixed(1)+"%"),...a.hideTodayCost===!0?[]:[l("todayShare",{amount:J(p,a),pct:S===null?"—":S.toFixed(1)+"%"})],l("monthTotal",{month:J(_(s.month,a),a),total:J(_(s.total,a),a)})].join("; ");if(t.summary===!0)return e(ee,{label:C,side:"right",delayMs:300},e("div",{className:"cm-simple-summary"+(g==="ok"?"":" "+g),tabIndex:0},e("span",null,l("todayBudget",{period:l(Re[r.period]??"periodMonth")})),e("span",{className:"cm-num"},J(p,a)+" / "+ce(d,a))));const P=ta(s,a,l);return e(ee,{label:C,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(g==="ok"?"":" "+g)+(o?"":" rail")},o?P.body:e("div",{className:"cm-bbox-rail cm-num"},P.rail)))}const h=[l("todayCostTitle"),l("callsTokens",{calls:n.calls,input:Q(n.input),cache:Q(n.cacheRead+n.cacheWrite),output:Q(n.output)}),l("monthCost",{amount:J(_(s.month,a),a)}),l("totalCost",{amount:J(_(s.total,a),a)})].join("; ");return e(ee,{label:h,side:"right",delayMs:300},e(I,null,e("div",{className:"cm-foot"+(o?"":" cm-foot-rail")},o?e(I,null,l("today")," ",e("span",{className:"cm-num"},J(_(n,a),a))):e(dt,{size:16})),o?$e(s,a,l):null))}function Hn(t){const s=t.useCost?t.useCost(B=>B):void 0;yt(s?.state?.config?.codexQuotaEnabled===!0);let o;if(t.useProjection)try{o=t.useProjection("costUsage")}catch{o=void 0}Gt(t,o);const n=s?.state,a=!!t.wide,l=Se(null);if(se(()=>{const B=l.current,O=B?.parentElement;if(!B||!O)return;const A=()=>{a?O.firstElementChild!==B&&O.insertBefore(B,O.firstElementChild):O.lastElementChild!==B&&O.appendChild(B)};A();const m=new MutationObserver(()=>{B.isConnected&&A()});return m.observe(O,{childList:!0}),a?(O.style.flexDirection="",O.style.flexWrap="",O.style.alignItems="",O.style.gap=""):(O.style.flexDirection="column",O.style.flexWrap="nowrap",O.style.alignItems="center",O.style.gap="6px"),()=>{m.disconnect(),a||(O.style.flexDirection="",O.style.flexWrap="",O.style.alignItems="",O.style.gap="")}},[a,n]),!n)return null;const r=n.config,i=V(F(r?.locale)),c=(r.balance?.display==="sidebar"||r.balance?.display==="both")&&r.hideOfficialBalance!==!0,d=gt(n,r).length>0,k=c&&r.balance?.showProgressBar===!0&&n.balance?.status==="ok",g=d&&r.balance?.showProgressBar===!0,h=r.goQuota?.main==="weekly"||r.goQuota?.main==="monthly"?r.goQuota.main:"rolling",p=r.goQuota?.enabled!==!1&&(r.goQuota?.display==="sidebar"||r.goQuota?.display==="both")&&n.goQuota?.status==="ok"&&n.goQuota?.[h]!==null,v=Te.map(B=>B.id).filter(B=>{const O=r.codingPlans?.[B];if(O?.enabled!==!0||O.display!=="sidebar"&&O.display!=="both")return!1;const A=n.codingPlans?.[B];if(A?.status!=="ok")return!1;const m=A.windows!==null&&typeof A.windows=="object"?A.windows:{};return Object.keys(m).length>0}),S=v.length>0,C=Dn(n,r,a,t.api),P=r.codexQuotaEnabled===!0&&X.status==="ok"&&X.windows.weekly!==null,w=(r.budget??{}).enabled===!0,x=r.sidebar!==!1&&r.hideTodayCost!==!0;if(!c&&!d&&!p&&!S&&!P&&!w&&!x&&C.length===0)return null;const N=r.sidebarSimple===!0,f=!N&&a&&r.sidebarStyle==="compact",M=N&&a&&x&&w,T=[];if(M?T.push(e(xt,{state:n,wide:a,summary:!0})):N&&a&&x&&T.push(e("div",{className:"cm-simple-summary"},e("span",null,i("today")),e("span",{className:"cm-num"},J(_(n.today,r),r)))),k?T.push(e(sn,{state:n,wide:a,api:t.api})):c&&T.push(e(nn,{state:n,wide:a,api:t.api})),g?T.push(e(ln,{state:n,wide:a,api:t.api})):d&&T.push(e(cn,{state:n,wide:a,api:t.api})),S&&T.push(...v.map(B=>B==="minimax"?e(xn,{state:n,wide:a,api:t.api}):e(Mn,{id:B,state:n,wide:a,api:t.api}))),T.push(...C),P&&T.push(e(Pn,{state:n,wide:a,api:t.api})),p&&w&&a&&!N){const B=aa(n,r,i),O=ta(n,r,i),A=B.level==="over"||O.level==="over"?"over":B.level==="warn"||O.level==="warn"?"warn":"ok";T.push(e("div",{className:"cm-bbox cm-bbox-pair"+(A==="ok"?"":" "+A)},e("div",{className:"cm-bbox-section"+(B.level==="ok"?"":" "+B.level)},B.body),e("div",{className:"cm-bbox-divider"}),e("div",{className:"cm-bbox-section"+(O.level==="ok"?"":" "+O.level)},O.body)))}else p&&T.push(e(yn,{state:n,wide:a})),w&&!M&&T.push(e(xt,{state:n,wide:a}));return!w&&x&&!(N&&a)&&T.push(e(xt,{state:n,wide:a})),N&&a&&x&&T.push($e(n,r,i)),a||T.push(hn(n,r,i)),e("div",{ref:l,...N?{tabIndex:0,role:"region","aria-label":i("sidebarSimple")}:{},className:"cm-footer-stack"+(a?"":" rail")+(f?" compact":"")+(N?" simple":"")},...T)}function vt(t){return e("div",{className:"cm-card"},e("p",{className:"cm-card-title"},t.title),e("div",{className:"cm-card-value cm-num"},t.value),e("p",{className:"cm-card-sub"},t.sub))}const Me=(t,s,o)=>e("button",{type:"button",className:"cm-collapse-h","aria-expanded":String(t),onClick:s},e("span",{className:"cm-caret"+(t?" open":"")}),e("h3",{className:"cm-h"},o));function Qn(t){const{state:s,api:o}=t,n=V(F(s.config?.locale)),[a,l]=j(!1);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(a,()=>l(!a),n("history"))),a?e("div",{className:"cm-collapse-body"},e(Un,{state:s,api:o})):null)}function Un(t){const{state:s,api:o}=t,n=V(F(s.config?.locale)),[a,l]=j(null),[r,i]=j({}),[c,b]=j(()=>new Set),d=s.history??[];if(d.length===0)return e("p",{className:"cm-empty"},n("noHistory"));const k=h=>{if(a===h){l(null);return}l(h),!(r[h]!==void 0||c.has(h))&&(b(p=>{const v=new Set(p);return v.add(h),v}),o.getDaySessions(h).then(p=>i(v=>({...v,[h]:Array.isArray(p?.sessions)?p.sessions:[]}))).catch(()=>i(p=>({...p,[h]:"error"}))).finally(()=>b(p=>{const v=new Set(p);return v.delete(h),v})))},g=h=>h.map(p=>e("tr",{key:p.id},Nt(p,s.config?.showSessionId===!0,n),e("td",{className:"num"},String(p.calls)),e("td",{className:"num"},Q(p.input)),e("td",{className:"num"},Q(p.cacheRead+p.cacheWrite)),e("td",{className:"num"},Q(p.output)),e("td",{className:"num"},J(_(p,s.config),s.config))));return e("div",{className:"cm-scroll"},e("p",{className:"cm-hint",style:{padding:"6px 10px 0"}},n("historyExpandHint")),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("colDate")),e("th",{className:"num"},n("colCalls")),e("th",{className:"num"},n("colInTok")),e("th",{className:"num"},n("colCacheTok")),e("th",{className:"num"},n("colOutTok")),e("th",{className:"num"},n("colCost")))),e("tbody",null,d.flatMap(h=>{const p=e("tr",{key:h.date,className:"cm-row-click",onClick:()=>k(h.date)},e("td",null,(a===h.date?"▾ ":"▸ ")+h.date),e("td",{className:"num"},String(h.calls)),e("td",{className:"num"},Q(h.input)),e("td",{className:"num"},Q(h.cacheRead+h.cacheWrite)),e("td",{className:"num"},Q(h.output)),e("td",{className:"num"},J(_(h,s.config),s.config)));if(a!==h.date)return[p];const v=r[h.date],S=c.has(h.date)&&v===void 0?e("p",{className:"cm-empty"},n("historySessionsLoading")):v==="error"?e("p",{className:"cm-empty"},n("historySessionsError")):!Array.isArray(v)||v.length===0?e("p",{className:"cm-empty"},n("historyNoSessions")):e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("colSession")),e("th",{className:"num"},n("colCalls")),e("th",{className:"num"},n("colInTok")),e("th",{className:"num"},n("colCacheTok")),e("th",{className:"num"},n("colOutTok")),e("th",{className:"num"},n("colCost")))),e("tbody",null,g(v)));return[p,e("tr",{key:h.date+"-sessions"},e("td",{colSpan:6},S))]}))))}function Fn(t){const{state:s,api:o}=t,n=V(F(s.config?.locale)),[a,l]=j(!1),[r,i]=j(100),[c,b]=j("cost-desc"),[d,k]=j(null),[g,h]=j(!1),[p,v]=j(!1),S=De.useRef(0),C=(N,f)=>{const[M,T]=f==="recent"?["recent","desc"]:f.split("-"),B=++S.current;h(!0),v(!1),o.getTopSessions(N,M,T).then(O=>{B===S.current&&k(Array.isArray(O?.sessions)?O.sessions:[])}).catch(()=>{B===S.current&&v(!0)}).finally(()=>{B===S.current&&h(!1)})},P=()=>{l(N=>{const f=!N;return f&&d===null&&!g&&C(r,c),f})},w=N=>{i(N),(a||d!==null)&&C(N,c)},x=N=>{b(N),(a||d!==null)&&C(r,N)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(a,P,n("sessionRankTitle"))),a?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-hint"},n("sessionRankHint")),e("div",{style:{display:"flex",gap:"12px",flexWrap:"wrap",margin:"6px 0"}},e("div",{className:"cm-field"},e("label",null,n("sessionRankSort")),e("select",{className:"cm-input",value:c,onChange:N=>x(N.target.value)},e("option",{value:"cost-desc"},n("sessionSortCostDesc")),e("option",{value:"cost-asc"},n("sessionSortCostAsc")),e("option",{value:"time-desc"},n("sessionSortTimeDesc")),e("option",{value:"time-asc"},n("sessionSortTimeAsc")),e("option",{value:"recent"},n("sessionSortRecent")))),e("div",{className:"cm-field"},e("label",null,n("sessionRankLimit")),e("select",{className:"cm-input",value:String(r),onChange:N=>w(Number(N.target.value))},e("option",{value:"50"},"50"),e("option",{value:"100"},"100"),e("option",{value:"200"},"200")))),g?e("p",{className:"cm-empty"},n("sessionRankLoading")):p?e("p",{className:"cm-empty"},n("sessionRankError")):d===null||d.length===0?e("p",{className:"cm-empty"},n("sessionRankEmpty")):e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("colDate")),e("th",null,n("colSession")),e("th",{className:"num"},n("colCalls")),e("th",{className:"num"},n("colInTok")),e("th",{className:"num"},n("colCacheTok")),e("th",{className:"num"},n("colOutTok")),e("th",{className:"num"},n("colCost")))),e("tbody",null,d.map(N=>e("tr",{key:N.date+":"+N.id},e("td",null,N.date),Nt(N,s.config?.showSessionId===!0,n),e("td",{className:"num"},String(N.calls)),e("td",{className:"num"},Q(N.input)),e("td",{className:"num"},Q((N.cacheRead??0)+(N.cacheWrite??0))),e("td",{className:"num"},Q(N.output)),e("td",{className:"num"},J(_(N,s.config),s.config)))))))):null)}function Wn(t){const{state:s}=t,o=V(F(s.config?.locale)),n=s.today.sessions??[];if(n.length===0)return e("p",{className:"cm-empty"},o("noSessionsToday"));const a=s.config?.showSessionId===!0;return e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,o("colSession")),e("th",{className:"num"},o("colCalls")),e("th",{className:"num"},o("colInTok")),e("th",{className:"num"},o("colCacheTok")),e("th",{className:"num"},o("colOutTok")),e("th",{className:"num"},o("colCost")))),e("tbody",null,n.map(l=>e("tr",{key:l.id},Nt(l,a,o),e("td",{className:"num"},String(l.calls)),e("td",{className:"num"},Q(l.input)),e("td",{className:"num"},Q(l.cacheRead+l.cacheWrite)),e("td",{className:"num"},Q(l.output)),e("td",{className:"num"},J(_(l,s.config),s.config)))))))}function Nt(t,s,o){const n=typeof t.title=="string"?t.title.trim():"",a=String(t.id).slice(0,14)+"…",l=n.length>0?n:a,r=n.length>0?n+" · "+t.id:t.id;return e("td",{title:r},e("div",{className:"cm-sess-title"+(n.length===0?" cm-sess-id":"")},l),s&&n.length>0?e("div",{className:"cm-sess-id"},a):null)}const _n={CNY:{symbol:"¥",decimals:4,exchangeRate:7.2},USD:{symbol:"$",decimals:6,exchangeRate:1},EUR:{symbol:"€",decimals:6,exchangeRate:.92}};function zn(t){const{state:s,draft:o,setDraft:n,t:a}=t,l=s.config,r=o?.budget??l.budget,i=Number(l.exchangeRate),b=(s.budgetUsed??(r.period==="day"?_(s.today,l):r.period==="all"?_(s.total,l):_(s.month,l)))*(Number.isFinite(i)&&i>0?i:1),d=Math.max(0,Number(r.amount)||0),k=r.enabled&&d>0?Math.min(999,b/d*100):null,g=k===null?"ok":k>=100?"over":k>=80?"warn":"ok",h=(S,C)=>{o!==null&&n({...o,budget:{...o.budget??l.budget,[S]:C}})},p=r.period==="custom"?r.customStart+" → "+(r.customEnd??a("periodDay")):null,v=r.enabled&&k!==null?a("budgetStatus",{period:a(Re[r.period]??"periodMonth"),amount:ce(d,l),used:ce(b,l),pct:k.toFixed(1)})+(g==="over"?a("overLimit"):g==="warn"?a("nearLimit"):""):null;return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("budget")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:r.enabled===!0,onChange:S=>h("enabled",S.target.checked)}),e("span",null,a("enableBudget")))),r.enabled?e(I,null,e("div",{className:"cm-budget-bar"},e("div",{className:"cm-budget-fill "+(g==="ok"?"":g),style:{width:(k===null?0:Math.min(100,k))+"%"}})),e("div",{className:"cm-budget-line"+(g==="over"?" over":"")+" cm-num"},v),e("div",{className:"cm-budget-controls"},e("div",{className:"cm-field"},e("label",null,a("budgetAmountLabel")),ie({value:r.amount},S=>h("amount",S))),e("div",{className:"cm-field"},e("label",null,a("budgetPeriodLabel")),e("select",{className:"cm-input",value:r.period,onChange:S=>h("period",S.target.value)},e("option",{value:"day"},a("periodDay")),e("option",{value:"month"},a("periodMonth")),e("option",{value:"all"},a("periodAll")),e("option",{value:"custom"},a("periodCustomRange")))),r.period==="custom"?e(I,null,e("div",{className:"cm-field"},e("label",null,a("startDate")),e("input",{className:"cm-input",type:"date",value:r.customStart??"",onChange:S=>h("customStart",S.target.value===""?null:S.target.value)})),e("div",{className:"cm-field"},e("label",null,a("endDate")),e("input",{className:"cm-input",type:"date",value:r.customEnd??"",onChange:S=>h("customEnd",S.target.value===""?null:S.target.value)}))):null),p!==null?e("p",{className:"cm-hint"},a("rangeText",{range:p})):null):e("p",{className:"cm-note"},a("budgetDisabledNote")))}function Gn(t){const{state:s,draft:o,setDraft:n,t:a}=t,l=s.config,r=(d,k)=>{o!==null&&n({...o,[d]:k})},i=o===null?l:{...l,...o},c=(()=>{if(i.peakEnabled!==!0)return a("peakOff");const d=Date.parse(i.peakEffectiveAt||""),k=Date.now();if(Number.isFinite(d)&&k<d)return a("peakNotEffective",{time:new Date(d).toLocaleString()});const g=i.peakWindows??[],h=Ke(k,g);return h===null?a("offPeakActive"):h.weekend===!0?a("weekendAllOffPeak"):h.inPeak?a("peakActive"):a("offPeakActive")})(),b=(i.peakWindows?.length??0)>0?a("peakSummary",{windows:i.peakWindows.map(d=>d.start+":00-"+d.end+":00").join(F(i.locale)==="zh"?"、":", "),time:i.peakEffectiveAt||a("unknown"),status:c}):a("noPeakWindows",{status:c});return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("peakPanelTitle")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakEnabled!==!1,onChange:d=>r("peakEnabled",d.target.checked)}),e("span",null,a("peakEnabledLabel")))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakNotice!==!1,onChange:d=>r("peakNotice",d.target.checked)}),e("span",null,a("peakNoticeLabel")))),e("div",{className:"cm-field"},e("label",null,a("peakStyleLabel")),e("select",{className:"cm-input",value:o?.peakStyle==="classic"?"classic":"compact",onChange:d=>r("peakStyle",d.target.value)},e("option",{value:"compact"},a("peakStyleCompact")),e("option",{value:"classic"},a("peakStyleClassic"))))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakAlertEnabled!==!1,onChange:d=>r("peakAlertEnabled",d.target.checked)}),e("span",null,a("peakAlertLabel")))),e("div",{className:"cm-field"},e("label",null,a("peakAlertAheadLabel")),e("input",{className:"cm-input narrow",type:"number",min:"1",max:"30",step:"1",value:String(typeof o?.peakAlertAhead=="number"&&Number.isFinite(o.peakAlertAhead)&&o.peakAlertAhead>=1&&o.peakAlertAhead<=30?o.peakAlertAhead:2),onChange:d=>{const k=Number(d.target.value);Number.isInteger(k)&&k>=1&&k<=30&&r("peakAlertAhead",k)}})),e("div",{className:"cm-field"},e("label",null,a("peakAlertTargetLabel")),e("select",{className:"cm-input",value:o?.peakAlertTarget==="peak"||o?.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",onChange:d=>r("peakAlertTarget",d.target.value)},e("option",{value:"both"},a("peakAlertTargetBoth")),e("option",{value:"peak"},a("peakAlertTargetPeak")),e("option",{value:"offpeak"},a("peakAlertTargetOffPeak"))))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",null,a("peakAlertPositionLabel")),e("select",{className:"cm-input",value:o?.peakAlertPosition==="center"?"center":"corner",onChange:d=>r("peakAlertPosition",d.target.value)},e("option",{value:"corner"},a("peakAlertPositionCorner")),e("option",{value:"center"},a("peakAlertPositionCenter")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakAlertWebNotify===!0,onChange:d=>{r("peakAlertWebNotify",d.target.checked),d.target.checked&&window.Notification&&Notification.permission==="default"&&Promise.resolve(Notification.requestPermission()).catch(()=>{})}}),e("span",null,a("peakAlertWebNotifyLabel"))),e("p",{className:"cm-hint"},a("peakAlertWebNotifyHint")))),e("div",{className:"cm-field"},e("label",null,a("peakAlertPreviewLabel")),e("div",{className:"cm-row"},e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("peak")},a("peakAlertPreviewPeak")),e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("offpeak")},a("peakAlertPreviewOffPeak")))),e("div",{className:"cm-peak-preview"},o?.peakEnabled!==!1&&o?.peakNotice!==!1?$e(s,i,a):e("p",{className:"cm-hint"},a("peakNoticeHiddenHint"))),e("p",{className:"cm-hint"},b),e("p",{className:"cm-hint"},a("weekendRuleNote")))}function ie(t,s){const o=t.value;return e("input",{className:"cm-input narrow",type:"number",step:"any",min:"0",value:typeof o=="number"?String(o):"",onChange:n=>{const a=n.target.value;if(a===""){if(t.emptyMode==="clear"){s(null);return}if(t.emptyMode==="ignore")return;s(0);return}const l=Number(a);Number.isFinite(l)&&l>=0&&s(l)}})}function St(t){const{modelId:s,entry:o,isDefault:n,draft:a,setDraft:l,t:r}=t,i=We(o),c=g=>{const h={...We(g)};if(Array.isArray(g.rateHistory)){const p=g.rateHistory.filter(v=>Date.parse(v.before)<=Date.now());p.length>0?h.rateHistory=p:delete h.rateHistory}return h},b=(g,h,p)=>{if(p===null){if(n){const M=c(a.prices.default??{cacheHit:0,cacheMiss:0,output:0}),T={...M[g]??{}};delete T[h];const B={...M};Object.keys(T).length>0?B[g]=T:delete B[g],l({...a,prices:{...a.prices,default:B}});return}const w={...a.prices.models},x=c(w[s]??{cacheHit:0,cacheMiss:0,output:0}),N={...x[g]??{}};delete N[h];const f={...x};Object.keys(N).length>0?f[g]=N:delete f[g],w[s]=f,l({...a,prices:{...a.prices,models:w}});return}const v=Math.max(0,p);if(n){let x={...c(a.prices.default??{cacheHit:0,cacheMiss:0,output:0})};if(g==="base")x[h]=v;else{const N={...x[g]??{},[h]:v};x={...x,[g]:N}}l({...a,prices:{...a.prices,default:x}});return}const S={...a.prices.models},C=c(S[s]??{cacheHit:0,cacheMiss:0,output:0});let P={...C};if(g==="base")P[h]=v;else{const w={...C[g]??{},[h]:v};P={...C,[g]:w}}S[s]=P,l({...a,prices:{...a.prices,models:S}})},d=()=>{const g={...a.prices.models};delete g[s],l({...a,prices:{...a.prices,models:g}})},k=(g,h)=>{const p=h==="base"?i:i[h]??null,v=h==="base"?"ignore":"clear";return e("div",{className:"cm-price-row",key:h},e("span",null,g),ie({value:p?.cacheHit??null,emptyMode:v},S=>b(h,"cacheHit",S)),ie({value:p?.cacheMiss??null,emptyMode:v},S=>b(h,"cacheMiss",S)),ie({value:p?.output??null,emptyMode:v},S=>b(h,"output",S)))};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},s),e(I,null,i?.legacy===!0?e("span",{className:"cm-price-legacy"},r("legacyModel")):null,n?e("span",{className:"cm-price-legacy"},r("defaultFallback")):null,n?null:e("button",{className:"cm-btn small danger",onClick:d},r("remove")))),e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,r("flatCached")),e("span",null,r("flatInput")),e("span",null,r("flatOutput"))),k(r("tierBase"),"base"),k(r("tierOffPeak"),"offPeak"),k(r("tierPeak"),"peak"),Array.isArray(o?.rateHistory)&&o.rateHistory.length>0?e("p",{className:"cm-note"},r("datedPriceNote")):null)}const ra={deepseek:"DeepSeek",openai:"OpenAI",anthropic:"Anthropic",google:"Google Gemini",moonshot:"Moonshot (Kimi)","z-ai":"Z.ai / 智谱",xai:"xAI",alibaba:"阿里云百炼",minimax:"MiniMax",tencent:"腾讯混元",xiaomi:"小米",upstage:"Upstage",nvidia:"NVIDIA",mistral:"Mistral",meta:"Meta",meituan:"美团 LongCat","opencode-go":"OpenCode Go"};function Kn(t,s,o="USD"){if(t=We(t),t===null||typeof t!="object")return"";if(t.unpriced===!0)return s("catalogUnpriced");const n=l=>(o==="CNY"?"¥":"$")+String(l),a=t.peak!==null&&typeof t.peak=="object"?t.peak:null;return a!==null?n(t.cacheMiss)+"/"+n(a.cacheMiss)+" in · "+n(t.output)+"/"+n(a.output)+" out":n(t.cacheMiss??t.input??0)+" in · "+n(t.output??0)+" out"}function Vn(t){const{state:s,draft:o,setDraft:n,t:a}=t,[l,r]=j(!1),[i,c]=j({}),b=s.priceCatalog;if(b===null||typeof b!="object")return null;const d=o?.prices??s.config.prices,k=o?.priceTableDisplay??s.config.priceTableDisplay??{},g=(f,M)=>{const T=k[f+":"+M];return typeof T=="boolean"?T:f==="deepseek"},h=(f,M,T)=>{o!==null&&n({...o,priceTableDisplay:{...k,[f+":"+M]:T}})},p=(f,M)=>f==="deepseek"?d.models?.[M]!==void 0:d.providers?.[f]?.models?.[M]!==void 0,v=(f,M,T)=>{if(o===null)return;const B=JSON.parse(JSON.stringify(T));if(f==="deepseek"){n({...o,prices:{...o.prices,models:{...o.prices.models,[M]:B}}});return}const O={...o.prices.providers??{}},A=O[f]??{};O[f]={...A,models:{...A.models??{},[M]:B}},n({...o,prices:{...o.prices,providers:O}})},S=(f,M)=>{if(o===null)return;if(f==="deepseek"){const O={...o.prices.models};delete O[M],n({...o,prices:{...o.prices,models:O}});return}const T={...o.prices.providers??{}},B=T[f];if(B!==void 0&&B.models!==void 0){const O={...B.models};delete O[M],T[f]={...B,models:O},n({...o,prices:{...o.prices,providers:T}})}},C=Object.keys(b).sort((f,M)=>f==="deepseek"?-1:M==="deepseek"?1:f.localeCompare(M)),P=f=>Object.values(b[f]).reduce((M,T)=>M+Object.keys(T).length,0),w=new Set(Object.values(b.deepseek??{}).flatMap(f=>Object.keys(f))),x=Object.keys(d.models??{}).filter(f=>!w.has(f)).sort(),N=(f,M,T)=>{const B=p(f,M),O=g(f,M),A=B?e("label",{className:"cm-check cm-vendor-display",title:a("catalogDisplayHint")},e("input",{type:"checkbox",checked:O,onChange:m=>h(f,M,m.target.checked)}),e("span",null,a("catalogDisplayLabel"))):null;if(B&&!O&&o!==null){const m=f==="deepseek"?e(St,{key:M,modelId:M,entry:d.models[M],isDefault:!1,draft:o,setDraft:n,t:a}):e(da,{key:M,provider:f,modelId:M,entry:d.providers?.[f]?.models?.[M],draft:o,setDraft:n,t:a});return e("div",{key:M,className:"cm-catalog-mounted"},A,m)}return e("div",{key:M,className:"cm-catalog-row"},e("span",{className:"cm-catalog-id"},M),e("span",{className:"cm-catalog-price"},Kn(T,a,f==="deepseek"?d.currency:"USD")),B?e("span",{className:"cm-catalog-tag"},a("mountedTag")):null,A,e("button",{className:"cm-btn small",disabled:!B&&T?.unpriced===!0,onClick:()=>B?S(f,M):v(f,M,T)},a(B?"unmountBtn":"mountBtn")))};return e("div",{className:"cm-budget",style:{marginTop:"8px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("catalogTitle")),e("button",{className:"cm-toggle-btn",onClick:()=>r(f=>!f)},a(l?"catalogCollapse":"catalogOpen"))),l?e(I,null,e("p",{className:"cm-note"},a("catalogNote")),C.map(f=>{const M=i[f]===!0;return e("div",{key:f},e("div",{className:"cm-catalog-vendor cm-vendor-toggle",onClick:()=>c(T=>({...T,[f]:!M}))},e("span",null,(M?"▾ ":"▸ ")+(ra[f]??f)+" · "+P(f))),M?e(I,null,f==="deepseek"?e("p",{className:"cm-hint"},a("catalogDeepseekNote")):null,Object.keys(b[f]).sort().map(T=>e("div",{key:T},e("div",{className:"cm-catalog-family"},T),Object.keys(b[f][T]).sort().map(B=>N(f,B,b[f][T][B])))),f==="deepseek"&&x.length>0?e("div",null,e("div",{className:"cm-catalog-family"},a("catalogCustomModels")),x.map(T=>N("deepseek",T,null))):null):null)})):null)}const ia=t=>t==="zen"?"go":t,ca=t=>{const s=t.indexOf(":");return s<=0?t:ia(t.slice(0,s).toLowerCase())+t.slice(s)};function Yn(t){const{state:s,config:o,t:n,initialTab:a}=t,[l,r]=j(a==="history"?"history":"today"),[i,c]=j(!1),b=w=>{if(w===null||typeof w!="object")return{};if(w.byProviderModel&&Object.keys(w.byProviderModel).length>0)return w.byProviderModel;if(w.byModel&&Object.keys(w.byModel).length>0)return w.byModel;const x={};if(Array.isArray(w.sessions))for(const N of w.sessions){if(N===null||typeof N!="object")continue;const f=typeof N.provider=="string"&&N.provider.length>0?N.provider:"deepseek",M=typeof N.model=="string"&&N.model.length>0?N.model:"unknown",T=f+":"+M,B=x[T]??(x[T]={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0,cost:0}),O=A=>typeof A=="number"&&Number.isFinite(A)&&A>=0?A:0;B.input+=O(N.input),B.output+=O(N.output),B.cacheRead+=O(N.cacheRead),B.cacheWrite+=O(N.cacheWrite),B.reasoning+=O(N.reasoning),B.cost+=O(N.cost)}if(Object.keys(x).length>0)return x;if(Number(w.cost)>0||Number(w.input)>0||Number(w.output)>0){const N=f=>typeof f=="number"&&Number.isFinite(f)&&f>=0?f:0;return{"deepseek:legacy":{input:N(w.input),output:N(w.output),cacheRead:N(w.cacheRead),cacheWrite:N(w.cacheWrite),reasoning:N(w.reasoning),cost:N(w.cost)}}}return{}},k=(w=>{const x={},N=f=>{for(const M of Object.keys(f??{})){const T=f[M];if(T===null||typeof T!="object")continue;const B=x[M]??(x[M]={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0,cost:0,calls:0});B.input+=Number(T.input)||0,B.output+=Number(T.output)||0,B.cacheRead+=Number(T.cacheRead)||0,B.cacheWrite+=Number(T.cacheWrite)||0,B.reasoning+=Number(T.reasoning)||0,B.cost+=Number(T.cost)||0,B.calls+=Number(T.calls)||0}};if(w==="today")N(b(s.today));else for(const f of s.history??[])N(b(f));return Object.entries(x).map(([f,M])=>{const T=f.indexOf(":"),B=(T>0?f.slice(0,T):"deepseek").toLowerCase(),O=T>0?f.slice(T+1):f,A=M.input+M.output+M.cacheRead+M.cacheWrite+M.reasoning,m=M.cacheRead+M.input;return{label:f==="deepseek:legacy"?n("modelStatsLegacy"):B==="deepseek"||B===""?O:ia(B)+":"+O,...M,tokens:A,cls:ze(B,O,o),hitRate:m>0?M.cacheRead/m:null,cacheUnreported:Fa(M),blended:A>0&&M.cost>0?M.cost/A*1e6:null,perUsd:M.cost>0?A/M.cost:null}}).filter(f=>f.tokens>0||f.cost>0)})(l).sort((w,x)=>x.cost-w.cost||x.tokens-w.tokens),g=w=>(Math.max(0,Math.min(1,w))*100).toFixed(1)+"%",h=k.reduce((w,x)=>Math.max(w,x.cost),0),p=k.reduce((w,x)=>Math.max(w,x.tokens),0),v=k.reduce((w,x)=>Math.max(w,x.perUsd??0),0),S=(w,x)=>e("button",{className:"cm-mstats-tab"+(l===w?" active":""),onClick:()=>r(w)},x),C=w=>w.cls==="plan"?e("span",{className:"cm-plan-tag",title:n("billingClassLabel")},n("billingClassPlan")):null,P=(w,x,N,f,M)=>e("div",{className:"cm-mstats-row"},e("span",{className:"cm-mstats-name"},w,M??null),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar "+N,style:{width:g(x)}})),e("span",{className:"cm-mstats-val"},f));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(i,()=>c(!i),n("modelStatsTitle"))),i?e("div",{className:"cm-collapse-body"},e("div",{className:"cm-mstats-tabs"},S("today",n("modelStatsToday")),S("history",n("modelStatsHistory"))),k.length===0?e("p",{className:"cm-note"},n("modelStatsEmpty")):e(I,null,e("div",{className:"cm-mstats-h"},n("modelStatsCostH")),k.map(w=>e(I,{key:"c:"+w.label},P(w.label,h>0?w.cost/h:0,"cost",J(w.cost,o),e(I,null,C(w),w.cacheUnreported?e("span",{className:"cm-plan-tag",title:n("modelStatsHitUnreportedTip")},"⚠"):null)))),e("div",{className:"cm-mstats-h"},n("modelStatsTokensH")),e("div",{className:"cm-mstats-legend"},e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"var(--dsw-alias-state-business-primary)"}}),n("modelStatsInput")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#ff9800"}}),n("modelStatsCache")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#34a853"}}),n("modelStatsOutput"))),[...k].sort((w,x)=>x.tokens-w.tokens).map(w=>e("div",{className:"cm-mstats-row",key:"t:"+w.label},e("span",{className:"cm-mstats-name"},w.label),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-seg in",style:{width:g(p>0?w.input/p:0)}}),e("div",{className:"cm-mstats-seg cache",style:{width:g(p>0?(w.cacheRead+w.cacheWrite)/p:0)}}),e("div",{className:"cm-mstats-seg out",style:{width:g(p>0?(w.output+w.reasoning)/p:0)}})),e("span",{className:"cm-mstats-val"},Q(w.tokens)))),e("div",{className:"cm-mstats-h"},n("modelStatsHitH")),[...k].sort((w,x)=>(x.hitRate??-1)-(w.hitRate??-1)).map(w=>e(I,{key:"h:"+w.label},P(w.label,w.hitRate??0,"hit",w.cacheUnreported?n("modelStatsHitUnreported"):w.hitRate===null?"—":(w.hitRate*100).toFixed(1)+"%",w.cacheUnreported?e("span",{className:"cm-plan-tag",title:n("modelStatsHitUnreportedTip")},"⚠"):null))),e("div",{className:"cm-mstats-h"},n("modelStatsValueH")),[...k].sort((w,x)=>(x.perUsd??-1)-(w.perUsd??-1)).map(w=>e(I,{key:"v:"+w.label},P(w.label,v>0?(w.perUsd??0)/v:0,"value",w.perUsd===null?"—":Q(w.perUsd)+" tok/$"+(w.blended!==null?" · "+n("modelStatsBlended",{price:"$"+w.blended.toFixed(2)}):"")))),e("p",{className:"cm-mstats-note"},n("modelStatsNote")))):null)}function $n(t,s){return t==="fiveHour"?s==="en"?"5-hour":"5 小时":t==="weekly"?s==="en"?"This week":"本周":t==="monthly"?s==="en"?"This month":"本月":t==="daily"?s==="en"?"Today":"当日":t}function Jn(t,s){if(t==="go")return"OpenCode Go";const o=Te.find(n=>n.id===t);return o!==void 0?s(o.labelKey):t}const ua=["fiveHour","weekly","monthly","daily"];function Zn(t,s){const o=new Map,n=a=>{const l=new Date(a),r=i=>String(i).padStart(2,"0");if(s==="monthly")return l.getFullYear()+"-"+r(l.getMonth()+1);if(s==="weekly"){const i=new Date(l.getFullYear(),l.getMonth(),l.getDate()-(l.getDay()+6)%7);return i.getFullYear()+"-"+r(i.getMonth()+1)+"-"+r(i.getDate())}return l.getFullYear()+"-"+r(l.getMonth()+1)+"-"+r(l.getDate())};for(const a of Object.values(t??{}))for(const l of a??[]){if(l===null||typeof l!="object"||!(l.tokens>0)&&!(l.cost>0))continue;const r=n(Number(l.t1)||Number(l.t0)),i=o.get(r)??{key:r,tokens:0,cost:0,pct:0,intervals:0};i.tokens+=Number(l.tokens)||0,i.cost+=Number(l.cost)||0,i.pct+=Number(l.pct)||0,i.intervals+=1,o.set(r,i)}return[...o.values()].map(a=>({...a,per1Tokens:a.pct>0?a.tokens/a.pct:null,fullTokens:a.pct>0?a.tokens/a.pct*100:null})).sort((a,l)=>a.key<l.key?-1:a.key>l.key?1:0)}function Xn(t){const{state:s,config:o,t:n}=t,[a,l]=j(!1),[r,i]=j("daily"),c=F(o?.locale),b=s?.planStats,d=b!=null&&typeof b.providers=="object"?b.providers:{},k=Object.keys(d).sort(),g=f=>J(Number(f)||0,o??s?.config),h=f=>f.method==="none"||f.per1Tokens===null?"—":Q(f.per1Tokens)+" tok · "+g(f.per1Cost),p=f=>f.method==="none"||f.fullTokens===null?"—":Q(f.fullTokens)+" tok · "+g(f.fullCost),v=f=>f.method==="sample"?n("planStatsMethodSample"):f.method==="live"?n("planStatsMethodLive"):n("planStatsMethodNone"),S=f=>{let M=v(f);return f.method==="sample"&&Number(f.sampleAt)>0&&(M=n("planStatsMethodSampleAt",{method:M,time:new Date(Number(f.sampleAt)).toLocaleString(c==="en"?"en-US":"zh-CN")})),(f.method==="sample"||f.method==="live")&&f.confidence==="low"&&(M+=" · "+n("planStatsConfidenceLow")),M},C=([f,M,T])=>e("tr",{key:M+":"+f},e("td",null,$n(f,c)),e("td",{className:"num"},Math.round(T.percent*10)/10+"%"),e("td",{className:"num"},Q(T.localTokens)+" tok · "+g(T.localCost)),e("td",{className:"num"},h(T)),e("td",{className:"num"},p(T)),e("td",{className:"num cm-plan-reset"},T.resetsAt.length>0?n("planStatsResets",{time:new Date(T.resetsAt).toLocaleString(c==="en"?"en-US":"zh-CN")}):"—"),e("td",{className:"cm-plan-method"},S(T))),P=a?k.flatMap(f=>Object.entries(d[f]?.intervals??{})).map(([f,M])=>({winKey:f,list:M})):[],w=Zn(Object.fromEntries(P.map(f=>[f.winKey,f.list])),r),x=w.reduce((f,M)=>Math.max(f,M.fullTokens??0),0),N=(f,M)=>e("button",{key:f,className:"cm-mstats-tab"+(r===f?" active":""),onClick:()=>i(f)},M);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(a,()=>l(!a),n("planStatsTitle"))),a?e("div",{className:"cm-collapse-body"},k.length===0?e("p",{className:"cm-empty"},n("planStatsEmpty")):e(I,null,k.map(f=>{const M=d[f]?.windows??{},T=[...ua.filter(B=>M[B]!==void 0).map(B=>[B,f,M[B]]),...Object.keys(M).filter(B=>!ua.includes(B)).map(B=>[B,f,M[B]])];return e("div",{key:f,className:"cm-plan-provider"},e("div",{className:"cm-plan-provider-name"},Jn(f,n),e("span",{className:"cm-plan-updated"},(()=>{const B=Number(d[f]?.generatedAt)||Number(b?.generatedAt)||0;return B>0?new Date(B).toLocaleTimeString(c==="en"?"en-US":"zh-CN"):""})())),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,n("planStatsWindow")),e("th",{className:"num"},n("planStatsPercent")),e("th",null,n("planStatsLocal")),e("th",null,n("planStatsPer1")),e("th",null,n("planStatsFull")),e("th",null,""),e("th",null,""))),e("tbody",null,T.map(C))))}),e("div",{className:"cm-mstats-h",style:{marginTop:"10px"}},n("planStatsCurveTitle")),e("div",{className:"cm-mstats-tabs"},N("daily",n("planStatsDaily")),N("weekly",n("planStatsWeekly")),N("monthly",n("planStatsMonthly"))),w.length===0?e("p",{className:"cm-note"},n("planStatsCurveEmpty")):e(I,null,[...w].reverse().map(f=>e("div",{className:"cm-mstats-row",key:f.key},e("span",{className:"cm-mstats-name"},f.key),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar value",style:{width:(x>0?(f.fullTokens??0)/x*100:0).toFixed(1)+"%"}})),e(ee,{label:n("planStatsBarTip",{date:f.key,full:f.fullTokens===null?"—":Q(f.fullTokens),per1:f.per1Tokens===null?"—":Q(f.per1Tokens),tokens:Q(f.tokens),cost:g(f.cost),intervals:f.intervals}),side:"top",delayMs:200},e("span",{className:"cm-mstats-val"},f.fullTokens===null?"—":Q(f.fullTokens)))))),e("p",{className:"cm-note"},n("planStatsNote")))):null)}function da(t){const{provider:s,modelId:o,entry:n,draft:a,setDraft:l,t:r}=t,i=d=>{const k={...a.prices.providers??{}},g=k[s]??{};k[s]={...g,models:d},l({...a,prices:{...a.prices,providers:k}})},c=(d,k)=>{if(a===null)return;const g={...(a.prices.providers??{})[s]?.models??{}};g[o]={...g[o]??{},[d]:Math.max(0,k)},i(g)},b=()=>{if(a===null)return;const d={...(a.prices.providers??{})[s]?.models??{}};delete d[o],i(d)};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},o),e(I,null,n?.unpriced===!0?e("span",{className:"cm-price-legacy"},r("catalogUnpriced")):null,e("button",{className:"cm-btn small danger",onClick:b},r("unmountBtn")))),n?.unpriced===!0?null:e(I,null,e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,r("flatInput")),e("span",null,r("flatCached")),e("span",null,r("flatOutput"))),e("div",{className:"cm-price-row"},e("span",null,"USD"),ie({value:n?.input??null,emptyMode:"ignore"},d=>c("input",d)),ie({value:n?.cachedInput??null,emptyMode:"ignore"},d=>c("cachedInput",d)),ie({value:n?.output??null,emptyMode:"ignore"},d=>c("output",d)))))}const qe=t=>[e("option",{value:"sidebar"},t("balanceSidebar")),e("option",{value:"settings"},t("balanceSettings")),e("option",{value:"both"},t("balanceBoth")),e("option",{value:"off"},t("off"))],Ie=t=>t!=null?e("div",{className:"cm-msg "+t.kind},t.text):null;function es(t){const{state:s,api:o,t:n,draft:a,setDraft:l}=t,[r,i]=j(!1),[c,b]=j(null),d=s.balance,k=s.config,g=s.reconcile,h=(a?.balance??k.balance??{}).reconcile!==!1,p=P=>{a===null||typeof l!="function"||l({...a,balance:{...a.balance??k.balance??{},reconcile:P.target.checked}})},v=async()=>{if(!r){i(!0),b(null);try{const P=await o.refreshBalance();b({kind:P.ok?"ok":"err",text:P.message})}catch(P){b({kind:"err",text:n("balanceRefreshFailed",{message:P?.message??String(P)})})}finally{i(!1)}}},S=P=>ye(P,k,d?.currency),C=d.status==="ok"?e("div",{className:"cm-bal-line"},e("span",null,n("balanceLine",{total:S(d.totalBalance),granted:S(d.grantedBalance),toppedUp:S(d.toppedUpBalance),time:d.fetchedAt>0?new Date(d.fetchedAt).toLocaleTimeString():"—"}))):d.status==="error"?e("div",{className:"cm-bal-line err"},n("balanceQueryFailedHint",{message:d.message||n("unknownError")})):e("div",{className:"cm-bal-line"},n("balanceNotQueried"));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("accountBalance")),e("button",{className:"cm-btn small",onClick:v,disabled:r},n(r?"refreshing":"refreshBalance"))),C,g!==void 0&&g.ok===!1?e("div",{className:"cm-bal-line warn"},"⚠ "+g.message):null,e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:h,onChange:p}),n("reconcileLabel")),Ie(c))}function ts(t){const{state:s,api:o,t:n,draft:a,setDraft:l}=t,r=s.config,i=a?.customBalances??r.customBalances??[],c=g=>{a!==null&&l({...a,customBalances:g,...g.length===0?{customBalance:{...r.customBalance??{},enabled:!1,request:{url:"",headers:{}}}}:{}})},b=(g,h)=>{c(i.map((p,v)=>v===g?{...p,...h}:p))},d=g=>{c(i.filter((h,p)=>p!==g))},k=(g="custom")=>{i.length>=8||c([...i,{...g==="aliyun"?{adapter:g}:{},enabled:!1,label:g==="aliyun"?"千问 / 阿里云":"",labelEn:g==="aliyun"?"Qianwen / Alibaba Cloud":"",display:"both",unit:g==="aliyun"?"CNY":"USD",refreshMinutes:15,request:{url:g==="aliyun"?"https://business.aliyuncs.com/":"",method:g==="aliyun"?"POST":"GET",headers:{}},extract:{},allowedHosts:[]}])};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("customBalanceTitle")),e("button",{className:"cm-btn small",onClick:()=>k(),disabled:i.length>=8},n("customBalanceAdd")),e("button",{className:"cm-btn small",onClick:()=>k("aliyun"),disabled:i.length>=8},n("aliyunBalanceAdd"))),e("p",{className:"cm-note"},n("customBalanceMultiNote")),i.length===0?e("p",{className:"cm-hint"},n("customBalanceEmpty")):i.map((g,h)=>e(as,{key:"cbe-"+h,state:s,api:o,t:n,entry:g,index:h,canRemove:!0,onPatch:p=>b(h,p),onRemove:()=>d(h)})))}function as(t){const{state:s,api:o,t:n,entry:a,index:l,canRemove:r,onPatch:i,onRemove:c}=t,b=a.adapter==="aliyun",[d,k]=j(!1),[g,h]=j(null),[p,v]=j(!1),[S,C]=j(()=>JSON.stringify(a.request?.headers??{},null,2)),[P,w]=j(()=>JSON.stringify(a.extract??{},null,2)),[x,N]=j(()=>(a.allowedHosts??[]).join(", ")),[f,M]=j({headers:"",extract:""}),T=Se(!1),B=s.config,A=(Array.isArray(s.customBalances)?s.customBalances:[]).find(y=>y.index===l)??null,m=a.enabled===!0,E=()=>{v(y=>!y)};se(()=>{p&&!T.current&&(C(JSON.stringify(a.request?.headers??{},null,2)),w(JSON.stringify(a.extract??{},null,2)),N((a.allowedHosts??[]).join(", ")),M({headers:"",extract:""})),T.current=p},[p]);const K=(y,D)=>i({[y]:D}),ne=(y,D)=>i({request:{...a.request??{},[y]:D}}),R=(()=>{if(b)return["ALIBABA_CLOUD_ACCESS_KEY_ID","ALIBABA_CLOUD_ACCESS_KEY_SECRET","ALIBABA_CLOUD_SECURITY_TOKEN"];const y=new Set,D=[];for(const z of Object.values(a.request?.headers??{}))if(typeof z=="string")for(const W of z.matchAll(/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/g))y.has(W[1])||(y.add(W[1]),D.push(W[1]));return D})(),q=y=>{C(y);try{const D=JSON.parse(y);if(D===null||typeof D!="object"||Array.isArray(D))throw new Error("invalid");if(Object.values(D).some(z=>typeof z!="string"))throw new Error("invalid");M(z=>({...z,headers:""})),ne("headers",D)}catch{M(D=>({...D,headers:n("customBalanceInvalidJson")}))}},L=y=>{N(y);const D=y.split(/[\s,;]+/).map(z=>z.trim()).filter(z=>z.length>0);K("allowedHosts",D)},H=y=>{w(y);try{const D=JSON.parse(y);if(D===null||typeof D!="object"||Array.isArray(D))throw new Error("invalid");M(z=>({...z,extract:""})),K("extract",D)}catch{M(D=>({...D,extract:n("customBalanceInvalidJson")}))}},Z=async()=>{const y=(B.customBalances??[])[l];if(!(d||y?.enabled!==!0)){k(!0),h(null);try{const D=await o.refreshCustomBalance(l);h({kind:D.ok?"ok":"err",text:D.message})}catch(D){h({kind:"err",text:n("customBalanceRefreshFailed",{message:D?.message??String(D)})})}finally{k(!1)}}},oe=A!==null&&A.status==="ok"?e(I,null,B.balance?.showProgressBar===!0?e("div",{className:"cm-budget",style:{marginTop:"8px"}},e(pt,{segments:mt(s,B,A,a),direction:ae(B,"balance")}),e("div",{className:"cm-bal-line"},ft(A,B,n,s,a))):e("div",{className:"cm-bal-line"},n("customBalanceRemaining",{amount:we(A.remaining,B,A,a)}))):A!==null&&A.status==="error"?e("div",{className:"cm-bal-line err"},A.message||n("unknownError")):e("div",{className:"cm-bal-line"},A?.message||n("balanceNotQueried")),u=p?e(I,null,e("p",{className:"cm-note"},n(b?"aliyunBalanceNote":"customBalanceConfigNote")),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",null,n("customBalanceLabelZh")),e("input",{className:"cm-input",value:a.label??"",onChange:y=>K("label",y.target.value)})),e("div",{className:"cm-field"},e("label",null,n("customBalanceLabelEn")),e("input",{className:"cm-input",value:a.labelEn??"",onChange:y=>K("labelEn",y.target.value)})),!b&&e("div",{className:"cm-field"},e("label",null,n("customBalanceUnitLabel")),e("select",{className:"cm-input",value:a.unit==="CNY"||a.unit==="EUR"?a.unit:"USD",onChange:y=>K("unit",y.target.value)},e("option",{value:"USD"},"USD ($)"),e("option",{value:"CNY"},"CNY (¥)"),e("option",{value:"EUR"},"EUR (€)"))),e("div",{className:"cm-field"},e("label",null,n("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:a.display??"both",onChange:y=>K("display",y.target.value)},...qe(n))),e("div",{className:"cm-field"},e("label",null,n("customBalanceRefreshInterval")),ie({value:a.refreshMinutes??15},y=>K("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(y)))))),!b&&e("div",{className:"cm-field"},e("label",null,n("customBalanceMethod")),e("select",{className:"cm-input",value:a.request?.method??"GET",onChange:y=>ne("method",y.target.value)},e("option",{value:"GET"},"GET"),e("option",{value:"POST"},"POST"))),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceUrl")),e("input",{className:"cm-input",value:a.request?.url??"",placeholder:"https://example.com/key/info",onChange:y=>ne("url",y.target.value)})),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceHeaders")),e("span",{className:"cm-hint"},n("customBalanceHeadersVarNote")),e("textarea",{className:"cm-input",rows:5,value:S,onChange:y=>q(y.target.value)}),f.headers?e("span",{className:"cm-hint err"},f.headers):null),e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceCredentialsTitle")),R.length>0?e(I,null,!b&&e("span",{className:"cm-hint"},n("customBalanceCredentialsHint")),R.map(y=>e(Pe,{key:"cb-var-"+y,target:"customVar:"+y,configured:(s.customVarStatus?.[y]?.configured??!1)===!0,source:s.customVarStatus?.[y]?.source??"",t:n,api:o,placeholder:"{{"+y+"}}"}))):e("span",{className:"cm-hint"},n("customBalanceNoPlaceholders"))),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceAllowedHosts")),e("input",{className:"cm-input",value:x,placeholder:"api.example.com, relay.example.org",onChange:y=>L(y.target.value)}),e("span",{className:"cm-hint"},n("customBalanceAllowedHostsHint"))),!b&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,n("customBalanceExtract")),e("textarea",{className:"cm-input",rows:8,value:P,onChange:y=>H(y.target.value)}),f.extract?e("span",{className:"cm-hint err"},f.extract):null))):e("p",{className:"cm-note cm-collapsed-note"},Ge(a,F(B?.locale))||n("customBalanceTitle"));return e("div",{className:"cm-budget",style:{marginTop:"10px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},`#${l+1} · `+(Ge(a,F(B?.locale))||n("customBalanceTitle"))),e("button",{className:"cm-toggle-btn",onClick:E},n(p?"customBalanceCollapseConfig":"customBalanceOpenConfig")),e("button",{className:"cm-btn small",onClick:Z,disabled:d||m===!1},n(d?"refreshing":"refreshCustomBalance")),r?e("button",{className:"cm-btn small",onClick:c},n("customBalanceRemove")):null),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:m===!0,onChange:y=>K("enabled",y.target.checked)}),e("span",null,n("enable"))),oe,u,Ie(g))}function ns(t){const{state:s,api:o,t:n,draft:a,setDraft:l}=t,[r,i]=j(!1),[c,b]=j(null),d=s.goQuota,k=s.config,g=a?.goQuota?.enabled??k.goQuota?.enabled??!0,h=(N,f)=>{a!==null&&l({...a,goQuota:{...a.goQuota??k.goQuota,[N]:f}})},p=async()=>{if(!(r||g===!1)){i(!0),b(null);try{const N=await o.refreshGoQuota();b({kind:N.ok?"ok":"err",text:N.message})}catch(N){b({kind:"err",text:n("syncFailed",{message:N?.message??String(N)})})}finally{i(!1)}}},v=k.goQuota?.main==="weekly"||k.goQuota?.main==="monthly"?k.goQuota.main:"rolling",S=[v,...["rolling","weekly","monthly"].filter(N=>N!==v)],C=N=>N==="rolling"?"goWindowRolling":N==="weekly"?"goWindowWeekly":"goWindowMonthly",P=N=>N==="rolling"?d.rolling:N==="weekly"?d.weekly:d.monthly,w=(N,f,M)=>{const T=f!==null&&typeof f=="object"&&typeof f.percent=="number",B=T?Math.max(0,Math.min(100,Number(f.percent)||0)):null,O=ue(B,ae(k,"go")),A=T&&typeof f.resetsAt=="string"&&f.resetsAt.length>0?n("goResetAt",{time:new Date(f.resetsAt).toLocaleString()}):"";return e("div",{className:"cm-go-row"+(M?" main":"")},e("span",{className:"cm-go-label"},n(N)),e("div",{className:"cm-go-bar"},B===null?null:e("div",{className:"cm-go-fill",style:{width:O.width+"%"}})),e("span",{className:"cm-go-num"},O.label===null?"—":n("goQuotaPercent",{percent:String(Math.round(O.label))})),A?e("span",{className:"cm-go-reset"},A):null)},x=g===!1?e("p",{className:"cm-note"},n("goQuotaDisabledNote")):d.status==="ok"?e("div",{className:"cm-go-list"},S.map(N=>w(C(N),P(N),N===v)),e("div",{className:"cm-go-time"},n("goQuotaFetchedAt",{time:d.fetchedAt>0?new Date(d.fetchedAt).toLocaleTimeString():"—"}))):d.status==="error"?e("div",{className:"cm-bal-line err"},d.message||n("unknownError")):d.status==="off"&&d.message?e("p",{className:"cm-note"},d.message):e("div",{className:"cm-bal-line"},n("goQuotaNotQueried"));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("goQuotaTitle")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:g===!0,onChange:N=>h("enabled",N.target.checked)}),e("span",null,n("enableGoQuota"))),e("button",{className:"cm-btn small",onClick:p,disabled:r||g===!1},n(r?"refreshing":"refreshGoQuota"))),x,Ie(c))}const ss=(t,s)=>{if(typeof t?.keyVar=="string"&&t.keyVar.length>0)return t.keyVar;const n="CLIPROXYAPI_MANAGEMENT_KEY_"+(String(t?.id??"").toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"GATEWAY");return Object.keys(s??{}).find(a=>a===n||a.startsWith(n+"_"))??n};function os(t){const{state:s,api:o,t:n,draft:a,setDraft:l}=t,[r,i]=j(null),[c,b]=j({}),[d,k]=j({}),g=s.config,p=(a??g).gatewayQuotas?.sources??[],v=Array.isArray(s.gatewayQuotas)?s.gatewayQuotas:[],S=A=>{a!==null&&l({...a,gatewayQuotas:{...a.gatewayQuotas??g.gatewayQuotas??{},sources:A}})},C=(A,m)=>S(p.map((E,K)=>K===A?{...E,...m}:E)),P=A=>k(m=>({...m,[A]:m[A]!==!0})),w=async A=>{if(r!==null)return;const m=(g.gatewayQuotas?.sources??[]).find(E=>E.id===A);if(!(!m||m.enabled!==!0||m.display==="off")){i(A),b(E=>({...E,[A]:null}));try{const E=await o.refreshGatewayQuota(A);b(K=>({...K,[A]:{kind:E.ok?"ok":"err",text:E.message}}))}catch(E){b(K=>({...K,[A]:{kind:"err",text:E?.message??String(E)}}))}finally{i(null)}}},x=()=>{if(p.length>=4)return;const A="gateway-"+Date.now().toString(36);k(m=>({...m,[A]:!0})),S([...p,{id:A,type:"cliproxyapi",label:"CLIProxyAPI",baseURL:"http://127.0.0.1:8317",enabled:!1,display:"both",refreshMinutes:15,includeProviders:st,allowedHosts:[],allowInsecureHttp:!1}])},N=(A,m,E)=>e("div",{className:"cm-field"},e("label",null,A),e("input",{className:"cm-input",value:m??"",onChange:E})),f=(A,m)=>{const E=je(A?.label||A?.id||n("gatewaySourceUnknown"),A,ae(g,"plan"),n);return e(I,{key:A?.id||m},E.row,A?.resetsAt?e("div",{className:"cm-note"},Ee(A,n)):null)},M=A=>e("div",{className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},A.label||"package"),e("span",{className:"cm-bbox-pct cm-num"},(A.used??"—")+" / "+(A.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(A.remaining??"—")+" remaining")),T=A=>A==null?null:e(I,null,e("div",{className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},A.unit||"credits"),e("span",{className:"cm-bbox-pct cm-num"},(A.used??"—")+" / "+(A.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(A.remaining??"—")+" remaining")),(A.packages??[]).map(M)),B=(A,m)=>e("div",{key:A.id||m,className:"cm-budget",style:{marginTop:"8px",padding:"10px 12px"}},e("div",{className:"cm-budget-head"},e("strong",null,(Lt[A.provider]??A.provider??n("gatewaySourceUnknown"))+" · "+(A.label||n("gatewaySourceUnknown"))),e("span",{className:"cm-hint"},A.status)),A.plan?e("div",{className:"cm-note"},A.plan):null,A.windows.length>0?e("div",{className:"cm-go-list"},A.windows.map(f)):null,T(A.credits),A.message?e("div",{className:"cm-note"},A.message):null),O=(A,m)=>{const E=v.find(R=>R.id===A.id)??{id:A.id,status:"off",accounts:[],unsupportedProviders:[]},K=ss(A,s.customVarStatus),ne=d[A.id]===!0;return e("div",{key:A.id||m,className:"cm-budget"},e("div",{className:"cm-budget-head"},Me(ne,()=>P(A.id),A.label||A.id||n("gatewayQuotaTitle")),ne?null:e("span",{className:"cm-hint"},E.status??n("gatewaySourceUnknown")),e("button",{className:"cm-btn small",onClick:()=>w(A.id),disabled:r!==null||A.enabled!==!0},r===A.id?n("gatewaySourceRefreshing"):n("refreshGoQuota")),e("button",{className:"cm-btn small",onClick:()=>S(p.filter((R,q)=>q!==m))},n("gatewaySourceRemove"))),ne?e("div",{className:"cm-collapse-body"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:A.enabled===!0,onChange:R=>C(m,{enabled:R.target.checked})}),n("gatewaySourceEnabled")),e("div",{className:"cm-grid"},N(n("gatewaySourceLabel"),A.label,R=>C(m,{label:R.target.value})),N(n("gatewaySourceBaseURL"),A.baseURL,R=>C(m,{baseURL:R.target.value})),e("div",{className:"cm-field"},e("label",null,n("gatewaySourceDisplay")),e("select",{className:"cm-input",value:A.display??"both",onChange:R=>C(m,{display:R.target.value})},...qe(n))),N(n("gatewaySourceAllowlist"),(A.allowedHosts??[]).join(", "),R=>C(m,{allowedHosts:R.target.value.split(/[\s,;]+/).filter(Boolean)}))),K?e("div",{className:"cm-field"},e("label",null,n("gatewaySourceCredential")),e(Pe,{target:"customVar:"+K,configured:s.customVarStatus?.[K]?.configured===!0,source:s.customVarStatus?.[K]?.source??"",t:n,api:o,placeholder:K})):null,e("div",{className:"cm-note"},n("gatewaySourceStatus")+": "+(E.status??n("gatewaySourceUnknown"))+(E.serverVersion?" · "+E.serverVersion:"")+(E.fetchedAt>0?" · "+n("gatewaySourceFetchedAt",{time:new Date(E.fetchedAt).toLocaleTimeString()}):"")+(E.message?" · "+E.message:"")),E.unsupportedProviders.length>0?e("div",{className:"cm-note"},n("gatewaySourceUnsupported")+": "+E.unsupportedProviders.join(", ")):null,E.accounts.length>0?E.accounts.map(B):e("div",{className:"cm-bal-line"},n("gatewaySourceNoAccounts")),c[A.id]?e("div",{className:"cm-msg "+c[A.id].kind},c[A.id].text):null):null)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("gatewayQuotaTitle")),e("button",{className:"cm-btn small",onClick:x,disabled:p.length>=4},n("gatewaySourceAdd")),e("button",{className:"cm-btn small",onClick:()=>o.refreshGatewayQuota(),disabled:r!==null||p.length===0},n(r===null?"refreshGoQuota":"gatewaySourceRefreshing"))),e("p",{className:"cm-note"},n("gatewayQuotaNote")),p.length===0?e("p",{className:"cm-hint"},n("gatewaySourceEmpty")):p.map(O))}const Te=[{id:"anthropic",labelKey:"codingPlanAnthropic"},{id:"zai",labelKey:"codingPlanZai"},{id:"minimax",labelKey:"codingPlanMinimax"},{id:"kimi",labelKey:"codingPlanKimi"},{id:"openrouter",labelKey:"codingPlanOpenrouter"},{id:"siliconflow",labelKey:"codingPlanSiliconflow"},{id:"commandcode",labelKey:"codingPlanCommandcode"},{id:"scnet",labelKey:"codingPlanScnet"},{id:"volcengine",labelKey:"codingPlanVolcengine"},{id:"qwen",labelKey:"codingPlanQwen"}],ma="dsh-cost-meter.codingPlans.open";function ls(){try{return window.localStorage.getItem(ma)==="1"}catch{return!1}}function rs(t){const{state:s,api:o,t:n,draft:a,setDraft:l}=t,[r,i]=j(null),[c,b]=j({}),[d,k]=j(ls),g=()=>{k(R=>{const q=!R;try{window.localStorage.setItem(ma,q?"1":"0")}catch{}return q})},h=s.codingPlans??{},p=s.config,v=R=>a?.codingPlans?.[R]??p.codingPlans?.[R]??{},S=R=>h[R]??{status:"off",message:"",fetchedAt:0,windows:{}},C=(R,q,L)=>{if(a===null)return;const H=a.codingPlans??p.codingPlans??{};l({...a,codingPlans:{...H,[R]:{...H[R]??{},[q]:L}}})},[P,w]=j(""),[x,N]=j({}),f=R=>R?.rates!==null&&typeof R?.rates=="object"&&!Array.isArray(R.rates)?R.rates:{},M=["input","cachedInput","output"],T=R=>x[R]??f(v("qwen"))[R]??{},B=R=>M.every(q=>Number.isFinite(Number(R[q]))&&Number(R[q])>0),O=(R,q,L)=>{if(a===null)return;const H={...T(R),[q]:String(L)};N(y=>({...y,[R]:H}));const Z=M.every(y=>String(H[y]??"").trim()==="");if(!Z&&!B(H))return;const oe=a.codingPlans??p.codingPlans??{},u={...(oe.qwen??{}).rates??{}};Z?delete u[R]:u[R]=Object.fromEntries(M.map(y=>[y,Number(H[y])])),l({...a,codingPlans:{...oe,qwen:{...oe.qwen??{},rates:u}}})},A=R=>{a!==null&&N(q=>({...q,[R]:q[R]??f(v("qwen"))[R]??{}}))},m=R=>{if(a===null)return;N(H=>{const Z={...H};return delete Z[R],Z});const q=a.codingPlans??p.codingPlans??{},L={...(q.qwen??{}).rates??{}};delete L[R],l({...a,codingPlans:{...q,qwen:{...q.qwen??{},rates:L}}})},E=async R=>{if(r===null){i(R),b(q=>({...q,[R]:null}));try{const q=await o.refreshCodingPlan(R);b(L=>({...L,[R]:{kind:q.ok?"ok":"err",text:q.message}}))}catch(q){b(L=>({...L,[R]:{kind:"err",text:n("syncFailed",{message:q?.message??String(q)})}}))}finally{i(null)}}},K=(R,q)=>{if(typeof q?.percent!="number")return e("div",{className:"cm-go-row"},e("span",{className:"cm-go-label"},R.replace(/_/g," ")),e("span",{className:"cm-go-num"},typeof q?.text=="string"?q.text:"—"));const L=q?Math.max(0,Math.min(100,Number(q.percent)||0)):0,H=ue(L,ae(p,"plan")),Z=q&&typeof q.resetsAt=="string"&&q.resetsAt.length>0?n("goResetAt",{time:new Date(q.resetsAt).toLocaleString()}):"";return e("div",{className:"cm-go-row"},e("span",{className:"cm-go-label"},R.replace(/_/g," ")),e("div",{className:"cm-go-bar"},e("div",{className:"cm-go-fill",style:{width:H.width+"%"}})),e("span",{className:"cm-go-num"},n("goQuotaPercent",{percent:String(Math.round(H.label))})),Z?e("span",{className:"cm-go-reset"},Z):null)},ne=({id:R,labelKey:q})=>{const L=v(R),H=S(R),Z=L.enabled===!0,oe=H.windows!==null&&typeof H.windows=="object"?H.windows:{},u=Z===!1?e("p",{className:"cm-note"},n("codingPlanDisabledNote")):H.status==="ok"?e("div",{className:"cm-go-list"},Object.keys(oe).length>0?R==="minimax"&&(Oe(oe).five!=null||Oe(oe).seven!=null)?e(na,{five:Oe(oe).five,seven:Oe(oe).seven,fetchedAt:H.fetchedAt,t:n,wide:!0,direction:ae(p,"plan")}):Object.entries(oe).map(([y,D])=>K(y,D)):e("div",{className:"cm-bal-line"},n("codingPlanNotQueried")),e("div",{className:"cm-go-time"},n("goQuotaFetchedAt",{time:H.fetchedAt>0?new Date(H.fetchedAt).toLocaleTimeString():"—"}))):H.status==="error"?e("div",{className:"cm-bal-line err"},H.message||n("unknownError")):H.status==="off"&&H.message?e("p",{className:"cm-note"},H.message):e("div",{className:"cm-bal-line"},n("codingPlanNotQueried"));return e("div",{key:R,className:"cm-budget",style:{marginTop:"8px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n(q)),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:Z,onChange:y=>C(R,"enabled",y.target.checked)}),e("span",null,n("enableCodingPlan"))),e("button",{className:"cm-btn small",onClick:()=>{E(R)},disabled:r!==null||Z===!1},n(r===R?"refreshing":"refreshCodingPlan"))),Z?e("div",{className:"cm-field"},e("label",null,n("codingPlanDisplayLabel")),e("select",{className:"cm-input",value:typeof L.display=="string"?L.display:R==="minimax"?"both":"settings",onChange:y=>C(R,"display",y.target.value)},e("option",{value:"sidebar"},n("balanceSidebar")),e("option",{value:"settings"},n("balanceSettings")),e("option",{value:"both"},n("balanceBoth")),e("option",{value:"off"},n("off"))),e("span",{className:"cm-hint"},n("codingPlanDisplayNote"))):null,Z&&R!=="scnet"&&R!=="qwen"?e("div",{className:"cm-field"},e("label",null,n("codingPlanRefreshIntervalLabel")),ie({value:typeof L.refreshMinutes=="number"&&Number.isFinite(L.refreshMinutes)&&L.refreshMinutes>0?L.refreshMinutes:15},y=>{C(R,"refreshMinutes",Math.min(1440,Math.max(1,Math.floor(y))))})):null,Z?R==="scnet"||R==="qwen"?e(I,null,e("div",{className:"cm-field"},e("label",null,n(R==="qwen"?"qwenPlanCreditsLabel":"scnetPlanCreditsLabel")),e("input",{className:"cm-input",type:"number",min:"1",step:"1000",value:typeof L.planCredits=="number"&&Number.isFinite(L.planCredits)&&L.planCredits>0?L.planCredits:R==="qwen"?5e5:24e4,onChange:y=>{const D=Number(y.target.value);Number.isFinite(D)&&D>0&&C(R,"planCredits",Math.floor(D))}})),e("div",{className:"cm-field"},e("label",null,n(R==="qwen"?"qwenPlanStartLabel":"scnetPlanStartLabel")),e("input",{className:"cm-input",type:"date",value:typeof L.planStart=="string"?L.planStart:"",onChange:y=>C(R,"planStart",y.target.value)})),R==="qwen"?e(I,null,e("div",{className:"cm-field"},e("label",null,n("qwenRatesLabel"))),[...new Set([...Object.keys(f(L)),...Object.keys(x)])].sort().map(y=>e("div",{key:y,className:"cm-match-row"},e("span",{style:{minWidth:"120px"}},y),M.map(D=>e("input",{key:D,className:"cm-input narrow",type:"number",min:"0",step:"0.1",value:T(y)[D]??"",placeholder:n("qwenRate_"+D),"aria-label":y+" · "+n("qwenRate_"+D),onChange:z=>{const W=z.target.value;O(y,D,W)}})),e("button",{className:"cm-btn small",onClick:()=>m(y)},n("overrideRemove")),y in x&&!B(T(y))?e("span",{className:"cm-note"},n("qwenRateDraftNote")):null)),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:n("qwenRatesModelPlaceholder"),value:P,onChange:y=>w(y.target.value)}),e("button",{className:"cm-btn small",onClick:()=>{const y=P.trim();y.length!==0&&(A(y),w(""))},disabled:P.trim().length===0},n("qwenRatesAdd")))):null,e("p",{className:"cm-note"},n(R==="qwen"?"qwenLocalNote":"scnetLocalNote"))):R==="volcengine"?e(I,null,e("div",{className:"cm-field"},e("label",null,n("volcengineAccessKeyIdLabel"))),e(Pe,{target:"codingPlans.volcengine.ak",configured:H.keyConfigured===!0,source:H.keySource,t:n,api:o,placeholder:n("volcengineAccessKeyPlaceholder")}),e("div",{className:"cm-field"},e("label",null,n("volcengineSecretAccessKeyLabel"))),e(Pe,{target:"codingPlans.volcengine.sk",configured:H.keyConfigured===!0,source:H.keySource,t:n,api:o,placeholder:n("volcengineSecretPlaceholder")}),e("p",{className:"cm-note"},n("volcengineNote"))):e(I,null,e("div",{className:"cm-field"},e("label",null,n("codingPlanKeyLabel"))),e(Pe,{target:"codingPlans."+R,configured:H.keyConfigured===!0,source:H.keySource,t:n,api:o,placeholder:"sk-…"})):null,u,c[R]!=null?e("div",{className:"cm-msg "+c[R].kind},c[R].text):null)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("codingPlansTitle")),e("button",{className:"cm-toggle-btn",onClick:g},n(d?"codingPlansCollapse":"codingPlansOpen"))),d?e(I,null,e("p",{className:"cm-note"},n("codingPlansNote")),Te.map(ne)):e("p",{className:"cm-note cm-collapsed-note"},n("codingPlansCollapsedHint")))}const is=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],pa=t=>(t.input??0)+(t.output??0)+(t.cacheRead??0)+(t.cacheWrite??0);function Ct(t){const s=t.useCost?t.useCost(x=>x):void 0,o=t.state??s?.state;if(!o)return null;const n=o.config,a=F(n?.locale),l=t.t??V(a),r=Array.isArray(o.history)?o.history:[];if(r.length===0)return e("div",null,e("h3",{className:"cm-h"},l("usageTitle")),e("p",{className:"cm-empty"},l("usageEmpty")));const i=o.meta?.dayKey??"",c=new Map(r.map(x=>[x.date,x])),b=x=>{const N=f=>String(f).padStart(2,"0");return x.getFullYear()+"-"+N(x.getMonth()+1)+"-"+N(x.getDate())},d=new Date;d.setHours(0,0,0,0);const k=new Date(d);k.setDate(k.getDate()+(6-(d.getDay()+6)%7));const g=26,h=[],p=[];let v=-1;for(let x=g-1;x>=0;x-=1){for(let f=0;f<7;f+=1){const M=new Date(k);M.setDate(M.getDate()-(x*7+(6-f)));const T=c.get(b(M));h.push(T!==void 0?{day:T,tokens:pa(T)}:{day:{date:b(M)},tokens:0})}const N=new Date(k);N.setDate(N.getDate()-(x*7+6)),p.push(N.getMonth()!==v?a==="en"?is[N.getMonth()]:String(N.getMonth()+1)+"月":""),v=N.getMonth()}const S=Math.max(...h.map(x=>x.tokens),1),C=x=>{const N=x/S;return N<.25?1:N<.5?2:N<.75?3:4},P=x=>{const{day:N,tokens:f}=x,M="cm-ug-cell"+(f>0?" l"+C(f):"")+(N.date===i?" today":""),T=l("usageDay",{date:N.date,tokens:Q(f),input:Q(N.input??0),cache:Q((N.cacheRead??0)+(N.cacheWrite??0)),output:Q(N.output??0),calls:N.calls??0,cost:J(_(N,n),n)});return e(ee,{key:N.date,label:T,side:"top",delayMs:200},e("div",{className:M}))},w=o.total;return e("div",{className:"cm-ug"},e("h3",{className:"cm-h"},l("usageTitle")),e("div",{className:"cm-ug-total"},l("usageTotal",{tokens:Q(pa(w)),input:Q(w.input??0),cache:Q((w.cacheRead??0)+(w.cacheWrite??0)),output:Q(w.output??0),calls:w.calls??0})),e("div",{className:"cm-ug-grid",style:{gridTemplateColumns:"repeat("+g+",1fr)"}},h.map(P)),e("div",{className:"cm-ug-months",style:{gridTemplateColumns:"repeat("+g+",1fr)"}},p.map((x,N)=>e("span",{key:"m"+String(N),className:"cm-ug-monthc"},x))))}function cs(t){const s=t.useCost?t.useCost(u=>u):void 0,o=t.api,n=s?.state??null,[a,l]=j(null),[r,i]=j(null),[c,b]=j(!1),[d,k]=j(!1),[g,h]=j(!1),[p,v]=j(""),[S,C]=j(!1),[P,w]=j(!1),[x,N]=j("overview"),[f,M]=j({status:"idle",at:0,error:null}),T=De.useRef(null),B=De.useRef(null),O=De.useRef(null);se(()=>{if(n!==null){const u=JSON.stringify(n.config);l(y=>{const D=y!==null&&JSON.stringify(y)!==T.current;return D||(B.current=n.config,O.current=n.config),D?y:JSON.parse(u)}),T.current=u}},[n]),se(()=>{a!==null&&O.current===null&&B.current!==null&&(O.current=B.current)},[a]),se(()=>{if(a===null||o===void 0)return;const u=JSON.stringify(a);if(u===T.current)return;M(D=>D.status==="saving"?D:{...D,status:"saving"});const y=setTimeout(()=>{const D={},z=O.current??B.current;if(z!==null&&typeof z=="object")for(const W of Object.keys(a))JSON.stringify(a[W])!==JSON.stringify(z[W])&&(D[W]=a[W]);if(Object.keys(D).length===0){T.current=u,M({status:"saved",at:Date.now(),error:null});return}o.updateConfig(D).then(()=>{T.current=u,z!==null&&typeof z=="object"&&(O.current={...z,...D}),M({status:"saved",at:Date.now(),error:null})},W=>{M({status:"error",at:0,error:W?.message??String(W)})})},600);return()=>{clearTimeout(y)}},[a,o]),se(()=>{s?.status==="error"&&s.error&&i({kind:"err",text:m("ledgerReadFailed",{message:s.error})})},[s?.status,s?.error]);const A=F((a??n?.config)?.locale),m=V(A);if(s===void 0||n===null)return e("div",{className:"cm-section"},e("p",{className:"cm-empty"},s?.status==="loading"?m("readingLedger"):m("ledgerUnavailable")));const E=n.config,K=async()=>{if(!S){C(!0),i(null);try{const u=await o.fetchPrices();if(i({kind:u.ok?"ok":"err",text:u.message}),u.ok&&u.state&&typeof u.state.config=="object"){const y=JSON.stringify(u.state.config);l(JSON.parse(y)),T.current=y}}catch(u){i({kind:"err",text:m("syncFailed",{message:u?.message??String(u)})})}finally{C(!1),b(!1)}}},ne=async()=>{if(!S){C(!0);try{await o.resetHistory(),i({kind:"ok",text:m("historyCleared")})}catch(u){i({kind:"err",text:m("clearFailed",{message:u?.message??String(u)})})}finally{C(!1),k(!1)}}},R=async()=>{if(!S){C(!0),i(null);try{const u=await o.importLegacyHistory();i({kind:"ok",text:u.message})}catch(u){i({kind:"err",text:m("legacyImportFailed",{message:u?.message??String(u)})})}finally{C(!1),h(!1)}}},q=(u,y)=>{a!==null&&l({...a,[u]:y})},L=()=>{if(a===null)return;const u=p.trim().toLowerCase();if(u.length===0||!/^[a-z0-9_.-]+$/.test(u)||a?.prices.models[u]!==void 0)return;const y={...a.prices.models,[u]:{cacheHit:0,cacheMiss:0,output:0}};l({...a,prices:{...a.prices,models:y}}),v("")},H=a===null?[]:Object.keys(a.prices.models).filter(u=>{const D=(a?.priceTableDisplay??E.priceTableDisplay??{})["deepseek:"+u];return typeof D=="boolean"?D:!0}).map(u=>e(St,{key:u,modelId:u,entry:a.prices.models[u]??{cacheHit:0,cacheMiss:0,output:0},isDefault:!1,draft:a,setDraft:l,t:m})),Z=[["overview",m("tabOverview")],["quotas",m("tabQuotas")],["usage",m("tabUsage")],["pricing",m("tabPricing")],["display",m("tabDisplay")]],oe=f.status==="saving"?e("span",{className:"cm-hint"},m("saving")):f.status==="error"?e("span",{className:"cm-msg err"},m("autoSaveFailed",{message:f.error??""})):e("span",{className:"cm-hint"},f.status==="saved"?m("autoSavedAt",{time:new Date(f.at).toLocaleTimeString()}):m("autoSaveHint"));return e("div",{className:"cm-section"},e("div",{className:"cm-tabs-row"},e("div",{className:"cm-tabs",role:"tablist"},Z.map(([u,y])=>e("button",{key:u,type:"button",role:"tab","aria-selected":String(x===u),className:"cm-tab"+(x===u?" active":""),onClick:()=>N(u)},y))),oe),Ie(r),x==="overview"?e(I,{key:"overview"},e("div",{className:"cm-cards"},E.hideTodayCost===!0?null:e(vt,{title:m("cardToday"),value:J(_(n.today,E),E),sub:m("callsTokens",{calls:n.today.calls,input:Q(n.today.input),cache:Q(n.today.cacheRead+n.today.cacheWrite),output:Q(n.today.output)})}),e(vt,{title:m("cardMonth"),value:J(_(n.month,E),E),sub:m("callsTokens",{calls:n.month.calls,input:Q(n.month.input),cache:Q(n.month.cacheRead+n.month.cacheWrite),output:Q(n.month.output)})}),e(vt,{title:m("cardTotal"),value:J(_(n.total,E),E),sub:m("cardTotalSub",{calls:n.total.calls})})),e("p",{className:"cm-note",key:"cards-footnote"},m("cardsFootnote")),(()=>{const u=Ka(n);return u!==null?e("p",{className:"cm-note",key:"tz-hint"},m("timezoneHint",{host:u.hostLabel,browser:u.browserLabel})):null})(),e("label",{className:"cm-cards-toggle",title:m("cardsTogglePlanTotalHint")},e("input",{type:"checkbox",checked:(a??E).showTotalWithPlan===!0,onChange:u=>{const y=a??E;y!=null&&l({...y,showTotalWithPlan:u.target.checked})}}),e("span",null,m("cardsTogglePlanTotal"))),e("div",null,e("h3",{className:"cm-h"},m("todaySessions")),e(Wn,{state:n,t:m})),e(zn,{state:n,draft:a,setDraft:l,t:m}),(E.balance?.display==="settings"||E.balance?.display==="both")&&E.hideOfficialBalance!==!0?e(es,{state:n,api:o,t:m,draft:a,setDraft:l}):null):null,x==="quotas"?e(I,{key:"quotas"},e(os,{state:n,api:o,t:m,draft:a,setDraft:l}),e(ns,{state:n,api:o,t:m,draft:a,setDraft:l}),e(rs,{state:n,api:o,t:m,draft:a,setDraft:l}),e(ts,{state:n,api:o,t:m,draft:a,setDraft:l})):null,x==="usage"?e(I,{key:"usage"},!He||(E.usage?.position??"cost")==="cost"?e(Ct,{state:n,t:m,locale:A}):null,e(Yn,{state:n,config:a??E,t:m}),e(Xn,{state:n,config:a??E,t:m}),e(Qn,{state:n,api:o}),e(Fn,{state:n,api:o}),e("div",null,e("h3",{className:"cm-h"},m("historyDataTitle")),e("div",{className:"cm-buttons"},g?e(I,null,e("span",{className:"cm-hint"},m("confirmImportLegacy")),e("button",{className:"cm-btn",onClick:R,disabled:S},m("apply")),e("button",{className:"cm-btn",onClick:()=>h(!1)},m("cancel"))):e("button",{className:"cm-btn",onClick:()=>h(!0),disabled:S},m("importLegacy")),d?e(I,null,e("span",{className:"cm-hint"},m("confirmReset")),e("button",{className:"cm-btn danger",onClick:ne,disabled:S},m("confirmClear")),e("button",{className:"cm-btn",onClick:()=>k(!1)},m("cancel"))):e("button",{className:"cm-btn danger",onClick:()=>k(!0),disabled:S},m("clearAllHistory"))),e("p",{className:"cm-note"},m("legacyImportNote")))):null,x==="display"?e(I,{key:"display"},n?.secretMigration?.pending?.length>0?e(Ya,{pending:n.secretMigration.pending,t:m}):null,e("div",{className:"cm-toolbar"},e("div",{className:"cm-field"},e("label",null,m("languageLabel")),e("select",{className:"cm-input",value:a?.locale??"auto",onChange:u=>q("locale",u.target.value)},e("option",{value:"auto"},m("localeAuto")),e("option",{value:"zh"},m("localeZh")),e("option",{value:"en"},m("localeEn"))))),e("div",null,e("h3",{className:"cm-h"},m("displaySettings")),e("div",{className:"cm-grid"},e("div",{className:"cm-grid-group"},m("groupGeneral")),...["includeSubagentCost","codexQuotaEnabled"].map(u=>e("label",{key:u,className:"cm-check"},e("input",{type:"checkbox",checked:a?.[u]===!0,onChange:y=>q(u,y.target.checked)}),e("span",null,m(u)))),He?e("div",{className:"cm-field"},e("label",null,m("usagePositionLabel")),e("select",{className:"cm-input",value:a?.usage?.position??"cost",onChange:u=>{a!==null&&l({...a,usage:{...a.usage??{position:"cost"},position:u.target.value}})}},e("option",{value:"cost"},m("usagePositionCost")),e("option",{value:"general"},m("usagePositionGeneral")),e("option",{value:"section"},m("usagePositionSection")))):null,e("div",{className:"cm-field"},e("label",null,m("positionLabel")),e("select",{className:"cm-input",value:a?.position??"dock",onChange:u=>q("position",u.target.value)},e("option",{value:"dock"},m("positionDock")),e("option",{value:"header"},m("positionHeader")),e("option",{value:"off"},m("off")))),e("div",{className:"cm-field"},e("label",null,m("sidebarLabel")),e("select",{className:"cm-input",value:a?.sidebar===!1?"off":"on",onChange:u=>q("sidebar",u.target.value==="on")},e("option",{value:"on"},m("sidebarOn")),e("option",{value:"off"},m("off")))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.showSessionId===!0,onChange:u=>q("showSessionId",u.target.checked)}),e("span",null,m("showSessionIdLabel"))),e("div",{className:"cm-grid-group"},m("groupMoney")),e("div",{className:"cm-field"},e("label",null,m("currencyLabel")),e("select",{className:"cm-input",value:a?.currency??"CNY",onChange:u=>{const y=_n[u.target.value];y!==void 0&&a!==null&&l({...a,currency:u.target.value,...y})}},e("option",{value:"CNY"},m("currencyCny")),e("option",{value:"USD"},m("currencyUsd")),e("option",{value:"EUR"},m("currencyEur")))),e("div",{className:"cm-field"},e("label",null,m("symbolLabel")),e("input",{className:"cm-input narrow",type:"text",value:a?.symbol??"",onChange:u=>q("symbol",u.target.value)})),e("div",{className:"cm-field"},e("label",null,m("rateLabel")),ie({value:a?.exchangeRate??1,emptyMode:"ignore"},u=>q("exchangeRate",u))),e("div",{className:"cm-field"},e("label",null,m("decimalsLabel")),ie({value:a?.decimals??2},u=>q("decimals",Math.min(10,Math.floor(u))))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.hideOfficialBalance===!0,onChange:u=>q("hideOfficialBalance",u.target.checked)}),e("span",null,m("hideOfficialBalanceLabel"))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.hideTodayCost===!0,onChange:u=>q("hideTodayCost",u.target.checked)}),e("span",null,m("hideTodayCostLabel"))),e("div",{className:"cm-grid-group"},m("groupSidebar")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.sidebarSimple===!0,onChange:u=>{a&&l({...a,sidebarSimple:u.target.checked,sidebarSimplePromptSeen:!0})}}),e("span",null,m("sidebarSimple"))),e("div",{className:"cm-field"},e("span",{className:"cm-hint"},m("sidebarSimpleNote"))),e("div",{className:"cm-field"},e("label",null,m("sidebarStyleLabel")),e("select",{className:"cm-input",value:a?.sidebarStyle??"standard",disabled:a?.sidebarSimple===!0,onChange:u=>q("sidebarStyle",u.target.value)},e("option",{value:"standard"},m("sidebarStyleStandard")),e("option",{value:"compact"},m("sidebarStyleCompact")))),e("div",{className:"cm-field"},e("label",null,m("balanceDisplayLabel")),e("select",{className:"cm-input",value:a?.balance?.display??"both",onChange:u=>{a!==null&&l({...a,balance:{...a.balance??{display:"both",refreshMinutes:5},display:u.target.value}})}},...qe(m))),e("div",{className:"cm-field"},e("label",null,m("refreshIntervalLabel")),ie({value:a?.balance?.refreshMinutes??5},u=>{a!==null&&l({...a,balance:{...a.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(u)))}})})),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.balance?.showProgressBar===!0,onChange:u=>{a!==null&&l({...a,balance:{...a.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},showProgressBar:u.target.checked}})}}),e("span",null,m("balanceShowProgressBar")))),e("div",{className:"cm-field"},e("label",null,m("balanceBudgetCapLabel")),ie({value:a?.balance?.budgetCap??""},u=>{a!==null&&l({...a,balance:{...a.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},budgetCap:u>0?u:null}})}),e("span",{className:"cm-hint"},m("balanceBudgetCapHint"))),e("div",{className:"cm-field"},e("label",null,m("barDirectionsTitle")),["balance","budget","go","plan"].map(u=>e("div",{className:"cm-dir-row",key:u},e("span",{className:"cm-dir-label"},m("barDirection_"+u)),e("select",{className:"cm-input",value:a?.barDirections?.[u]??(u==="balance"?"remaining":"used"),onChange:y=>{if(a===null)return;const D={balance:"remaining",budget:"used",go:"used",plan:"used"};l({...a,barDirections:{...a.barDirections??D,[u]:y.target.value}})}},e("option",{value:"remaining"},m("barDirectionRemaining")),e("option",{value:"used"},m("barDirectionUsed"))))),e("span",{className:"cm-hint"},m("barDirectionsHint"))),e("div",{className:"cm-field"},e("label",null,m("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:a?.customBalance?.display??E.customBalance?.display??"both",onChange:u=>{a!==null&&l({...a,customBalance:{...a.customBalance??E.customBalance??{},display:u.target.value}})}},...qe(m))),e("div",{className:"cm-field"},e("label",null,m("customBalanceRefreshInterval")),ie({value:a?.customBalance?.refreshMinutes??E.customBalance?.refreshMinutes??15},u=>{a!==null&&l({...a,customBalance:{...a.customBalance??E.customBalance??{},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(u)))}})})),e("div",{className:"cm-field"},e("label",null,m("goQuotaDisplayLabel")),e("select",{className:"cm-input",value:a?.goQuota?.display??"both",onChange:u=>{a!==null&&l({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:""},display:u.target.value}})}},...qe(m))),e("div",{className:"cm-field"},e("label",null,m("goMainLabel")),e("select",{className:"cm-input",value:a?.goQuota?.main??"rolling",onChange:u=>{a!==null&&l({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:"",main:"rolling"},main:u.target.value}})}},e("option",{value:"rolling"},m("goWindowRolling")),e("option",{value:"weekly"},m("goWindowWeekly")),e("option",{value:"monthly"},m("goWindowMonthly")))),e("div",{className:"cm-field"},e("label",null,m("goQuotaRefreshIntervalLabel")),e("div",{className:"cm-range-row"},e("input",{className:"cm-range",type:"range",min:"1",max:"60",step:"1",value:Math.min(60,Math.max(1,Math.floor(Number(a?.goQuota?.refreshMinutes)||15))),onChange:u=>{a!==null&&l({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:""},refreshMinutes:Math.min(60,Math.max(1,Math.floor(Number(u.target.value)||15)))}})}}),e("span",{className:"cm-range-value"},`${Math.min(60,Math.max(1,Math.floor(Number(a?.goQuota?.refreshMinutes)||15)))} ${m("goQuotaRefreshMinutesUnit")}`))),e("div",{className:"cm-field"},e("label",null,m("goQuotaKeyLabel"))),e(Pe,{target:"goQuota",configured:E.goQuota?.keyConfigured===!0,source:E.goQuota?.keySource,t:m,api:o,placeholder:"sk-…"}),e("div",{className:"cm-grid-group"},m("quotaStripGroup")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.quotaStrip?.enabled===!0,onChange:u=>{a!==null&&l({...a,quotaStrip:{...a.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0},enabled:u.target.checked,promptSeen:!0}})}}),e("span",null,m("quotaStripEnable")))),a?.quotaStrip?.enabled===!0?[["budget","quotaStripShowBudget"],["go","quotaStripShowGo"],["plans","quotaStripShowPlans"]].map(([u,y])=>e("label",{key:u,className:"cm-check"},e("input",{type:"checkbox",checked:a.quotaStrip[u]!==!1,onChange:D=>{a!==null&&l({...a,quotaStrip:{...a.quotaStrip,[u]:D.target.checked}})}}),e("span",null,m(y)))):null,e("div",{className:"cm-field"},e("span",{className:"cm-hint"},m("quotaStripNote"))),e("div",{className:"cm-grid-group"},m("groupCorner")),e("div",{className:"cm-field"},e("label",null,m("cornerLabel")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.corner?.enabled===!0,onChange:u=>{a!==null&&l({...a,corner:{...a.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},enabled:u.target.checked}})}}),e("span",null,m("cornerEnabledLabel"))),a?.corner?.enabled===!0?[["goRolling","cornerGoRolling"],["goWeekly","cornerGoWeekly"],["goMonthly","cornerGoMonthly"],["budget","cornerBudget"]].map(([u,y])=>e("label",{key:u,className:"cm-check"},e("input",{type:"checkbox",checked:a.corner[u]!==!1,onChange:D=>{a!==null&&l({...a,corner:{...a.corner,[u]:D.target.checked}})}}),e("span",null,m(y)))):null),e("div",{className:"cm-grid-group"},m("groupDetail")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.goQuota?.detail!==!1,onChange:u=>{a!==null&&l({...a,goQuota:{...a.goQuota??{display:"both",refreshMinutes:15,apiKey:"",main:"rolling",detail:!0},detail:u.target.checked}})}}),e("span",null,m("goDetailLabel")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:a?.budget?.detail!==!1,onChange:u=>{a!==null&&l({...a,budget:{...a.budget??{enabled:!1,amount:100,period:"month",customStart:null,customEnd:null,detail:!0},detail:u.target.checked}})}}),e("span",null,m("budgetDetailLabel"))))),e("p",{className:"cm-note"},m("badgeNote")))):null,x==="pricing"?e(I,{key:"pricing"},e(Gn,{state:n,draft:a,setDraft:l,t:m}),e("div",null,Me(P,()=>w(!P),m("priceTableTitle")),P?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-note"},m("priceTableNote")),e("p",{className:"cm-hint"},m("priceTableDisplayHint")),e("div",{className:"cm-catalog-vendor"},m("deepseekMountedHeader")),H,e(St,{key:"__default__",modelId:m("defaultModelId"),entry:a?.prices.default??{cacheHit:0,cacheMiss:0,output:0},isDefault:!0,draft:a,setDraft:l,t:m}),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:m("newModelPlaceholder"),value:p,onChange:u=>v(u.target.value)}),e("button",{className:"cm-btn small",onClick:L,disabled:p.trim().length===0},m("addModel"))),(()=>{const u=a?.priceTableDisplay??E.priceTableDisplay??{},y=a?.prices?.providers??{},D=W=>Object.keys(y[W]?.models??{}).filter(le=>u[W+":"+le]===!0),z=Object.keys(y).filter(W=>D(W).length>0).sort((W,le)=>W.localeCompare(le));return z.length===0?null:z.map(W=>e("div",{key:W},e("div",{className:"cm-catalog-vendor"},(ra[W]??W)+" · "+m("mountedSuffix")),D(W).sort().map(le=>e(da,{key:W+":"+le,provider:W,modelId:le,entry:y[W].models[le],draft:a,setDraft:l,t:m}))))})()):null),(()=>{const u=a?.priceOverrides??E.priceOverrides??{},y=a?.priceMatchDismissed??E.priceMatchDismissed??[],D=a?.prices??E.prices,z=n.today.byProviderModel??{},W={prices:D,priceMatch:a?.priceMatch??E.priceMatch},le=Object.keys(z).filter(U=>{if(y.includes(U)||u[U]!==void 0)return!1;const G=U.indexOf(":"),be=(G>0?U.slice(0,G):"deepseek").toLowerCase(),At=G>0?U.slice(G+1):U;return lt(be,At,W).matched!==!0}),pe=[...new Set([...le,...Object.keys(u)])].filter(U=>!y.includes(U)),xe=n.month?.byProviderModel??{},ve=Object.keys(xe).filter(U=>{if(y.includes(U)||u[U]!==void 0)return!1;const G=U.indexOf(":"),be=(G>0?U.slice(0,G):"deepseek").toLowerCase(),At=G>0?U.slice(G+1):U;return lt(be,At,W).matched===!0}).sort(),Be=[{value:"__local__",label:m("overrideTargetLocal")},{value:"deepseek:__default__",label:m("overrideTargetDefault")},...Object.keys(D.models??{}).map(U=>({value:"deepseek:"+U,label:"DeepSeek · "+U})),...Object.entries(D.providers??{}).flatMap(([U,G])=>Object.keys(G?.models??{}).map(be=>({value:U+":"+be,label:U+" · "+be})))],fa=(U,G)=>{if(a===null)return;const be={...a.priceOverrides??{}};G===""?delete be[U]:be[U]=G,l({...a,priceOverrides:be})},ms=U=>{if(a===null)return;const G={...a.priceOverrides??{}};delete G[U],l({...a,priceOverrides:G,priceMatchDismissed:[...new Set([...y,U])]})};return e("div",null,e("h3",{className:"cm-h"},m("priceMatchLabel")),e("div",{className:"cm-field"},e("select",{className:"cm-input",value:a?.priceMatch==="exact"?"exact":"auto",onChange:U=>q("priceMatch",U.target.value)},e("option",{value:"auto"},m("priceMatchAuto")),e("option",{value:"exact"},m("priceMatchExact")))),e("p",{className:"cm-note"},m("priceMatchNote")),pe.length>0?e(I,null,e("h3",{className:"cm-h"},m("unmatchedTitle")),e("p",{className:"cm-hint"},m("unmatchedHint")),pe.map(U=>e("div",{key:U,className:"cm-match-row"},e("span",null,ca(U)),e("select",{className:"cm-input",value:u[U]??"",onChange:G=>fa(U,G.target.value)},e("option",{value:""},"—"),Be.map(G=>e("option",{key:G.value,value:G.value},G.label))),e("button",{className:"cm-btn small",title:m("removePriceMatchHint"),onClick:()=>ms(U)},m("overrideRemove"))))):e("p",{className:"cm-hint"},m("overrideNone")),y.length>0?e("button",{className:"cm-btn small",onClick:()=>q("priceMatchDismissed",[])},m("restorePriceMatches",{count:y.length})):null,ve.length>0?e(I,null,e("h3",{className:"cm-h"},m("matchedTitle")),e("p",{className:"cm-hint"},m("matchedHint")),ve.map(U=>e("div",{key:U,className:"cm-match-row"},e("span",null,ca(U)),e("select",{className:"cm-input",value:"",onChange:G=>{G.target.value!==""&&fa(U,G.target.value)}},e("option",{value:""},m("matchedKeepAuto")),Be.map(G=>e("option",{key:G.value,value:G.value},G.label)))))):null)})(),e(Vn,{state:n,draft:a,setDraft:l,t:m}),e("div",null,e("h3",{className:"cm-h"},m("dataSync")),e("div",{className:"cm-field"},e("label",null,m("pricingCurrencyLabel")),e("select",{className:"cm-input",value:a?.pricingCurrency==="CNY"?"CNY":"USD",onChange:u=>q("pricingCurrency",u.target.value)},e("option",{value:"USD"},m("pricingCurrencyUsd")),e("option",{value:"CNY"},m("pricingCurrencyCny"))),e("p",{className:"cm-note"},m("pricingCurrencyNote"))),e("div",{className:"cm-buttons"},c?e(I,null,e("span",{className:"cm-hint"},m("confirmFetch")),e("button",{className:"cm-btn",onClick:K,disabled:S},m("apply")),e("button",{className:"cm-btn",onClick:()=>b(!1)},m("cancel"))):e("button",{className:"cm-btn",onClick:()=>b(!0),disabled:S},m("syncFromDocs"))),e("p",{className:"cm-note"},m("lastSync",{time:E.fetchedAt!==null?new Date(E.fetchedAt).toLocaleString():m("neverSynced")})+m("source",{source:E.priceSource==="official"?m("sourceOfficial"):m("sourceBundled")})),e("p",{className:"cm-note"},m("syncScopeNote")))):null)}const us=["remote"];async function ds(t){const s=t.remote;if(s===void 0||typeof s.$mount!="function")return;const o=await s.$mount(Ea);t.effect(()=>()=>{o()},"cost-meter: remote contribution");const n=t.get("remote.costMeter");if(n===void 0)return;const a=Va({status:"loading",error:null,state:null}),l=()=>V(F(a.getSnapshot().state?.config?.locale)),r=async(u,y)=>{const D=await n[u](...y??[]);if(D===null||typeof D!="object"||D.ok!==!0)throw new Error(D?.error?.message??l()("rpcFailed",{method:u}));return D.value};let i=!1;const c=async()=>{if(i)return;i=!0;const u=a.getSnapshot();try{const y=await r("getState");a.set({status:"ready",error:null,state:y})}catch(y){a.set({status:"error",error:y?.message??String(y),state:u.state})}finally{i=!1}};t.effect(()=>t.on("connection/reset",()=>{c()}),"cost-meter: reconnect reload");const b=setInterval(()=>{document.hidden||c()},6e4);t.effect(()=>()=>{clearInterval(b)},"cost-meter: poll timer");const d=()=>{document.visibilityState==="visible"&&c()};document.addEventListener("visibilitychange",d),t.effect(()=>()=>{document.removeEventListener("visibilitychange",d)},"cost-meter: visibility reload");const k={reload:c,updateConfig:async u=>{const y=await r("updateConfig",[u]);return a.set({status:"ready",error:null,state:y}),y},fetchPrices:async()=>{const u=await n.fetchPrices();if(u===null||typeof u!="object"||u.ok!==!0)throw new Error(u?.error?.message??l()("rpcSyncFailed"));return u.value.state!==void 0&&a.set({status:"ready",error:null,state:u.value.state}),u.value},resetHistory:async()=>{const u=await r("resetHistory");return a.set({status:"ready",error:null,state:u}),u},importLegacyHistory:async()=>{const u=await n.importLegacyHistory();if(u===null||typeof u!="object"||u.ok!==!0)throw new Error(u?.error?.message??u?.value?.message??l()("legacyImportFailed",{message:"RPC failed"}));return u.value.state!==void 0&&a.set({status:"ready",error:null,state:u.value.state}),u.value},getDaySessions:async u=>r("getDaySessions",[u]),getSessionCost:async u=>r("getSessionCost",[u]),getTopSessions:async(u,y,D)=>r("getTopSessions",[u,y,D]),refreshBalance:async()=>{const u=await n.refreshBalance();if(u===null||typeof u!="object"||u.ok!==!0)throw new Error(u?.error?.message??l()("rpcBalanceFailed"));return u.value.state!==void 0&&a.set({status:"ready",error:null,state:u.value.state}),u.value},refreshGoQuota:async()=>{const u=await n.refreshGoQuota();if(u===null||typeof u!="object"||u.ok!==!0)throw new Error(u?.error?.message??l()("rpcSyncFailed"));return u.value.state!==void 0&&a.set({status:"ready",error:null,state:u.value.state}),u.value},refreshGatewayQuota:async(u=null)=>{const y=u==null?await n.refreshGatewayQuota():await n.refreshGatewayQuota(u);if(y===null||typeof y!="object"||y.ok!==!0)throw new Error(y?.error?.message??l()("rpcSyncFailed"));return y.value.state!==void 0&&a.set({status:"ready",error:null,state:y.value.state}),y.value},refreshCustomBalance:async(u=null)=>{const y=u==null?await n.refreshCustomBalance():await n.refreshCustomBalance(u);if(y===null||typeof y!="object"||y.ok!==!0)throw new Error(y?.error?.message??l()("rpcSyncFailed"));return y.value.state!==void 0&&a.set({status:"ready",error:null,state:y.value.state}),y.value},refreshCodingPlan:async u=>{const y=await n.refreshCodingPlan(u);if(y===null||typeof y!="object"||y.ok!==!0)throw new Error(y?.error?.message??l()("rpcSyncFailed"));return y.value.state!==void 0&&a.set({status:"ready",error:null,state:y.value.state}),y.value},setCredential:async(u,y)=>{const D=await n.setCredential(u,y);if(D===null||typeof D!="object"||D.ok!==!0)throw new Error(D?.error?.message??D?.value?.message??l()("rpcSyncFailed"));return D.value.state!==void 0&&a.set({status:"ready",error:null,state:D.value.state}),D.value},clearCredential:async u=>{const y=await n.clearCredential(u);if(y===null||typeof y!="object"||y.ok!==!0)throw new Error(y?.error?.message??y?.value?.message??l()("rpcSyncFailed"));return y.value.state!==void 0&&a.set({status:"ready",error:null,state:y.value.state}),y.value}};c();const g=t.get("slots");if(g===void 0)return;const h=()=>({hooks:{cost:a},api:k}),p=()=>({gen:0,dispose:null}),v=(u,y,D,z,W=!0)=>{u.dispose!==null&&(u.dispose(),u.dispose=null),u.gen+=1;const le=u.gen;W&&g.inject(y,()=>{if(u.gen!==le)return;const pe=typeof D=="function"?D():g.register(D,z);if(u.gen!==le){pe();return}return u.dispose=pe,()=>{u.dispose===pe&&(u.dispose=null),pe()}})},S=p(),C=u=>{const y=u==="header"?"conversation.session.header.actions":"conversation.composer.dock";v(S,y,u==="header"?{name:y,id:"cost-meter",order:-5,inject:h}:{name:y,id:"cost-meter",order:5,inject:h},u==="header"?Ja:Za,u!=="off")},P=p(),w=u=>{v(P,"sidebar.footer.action",{name:"sidebar.footer.action",id:"cost-meter",order:0,inject:h},Hn,u)},x=p(),N=u=>{v(x,"conversation.composer.dock",{name:"conversation.composer.dock",id:"cost-meter-corner",order:9,inject:h},dn,u)};g.inject("conversation.input.dock",()=>g.register({name:"conversation.input.dock",id:"cost-meter-qstrip",order:5,inject:h},Ln)),g.inject("sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-simple-guide",order:1,inject:h},On)),g.inject("sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-qstrip-guide",order:1,inject:h},En)),g.inject("sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-balance-click-guide",order:2,inject:h},In));const f=p(),M=u=>{v(f,"sidebar.footer.action",()=>g.register({name:"sidebar.footer.action",id:"cost-meter-peak-alert",order:0,inject:h},mn),null,u)};window.cmPeakAlertPreview=u=>{if(window.__cmPeakAlertLive!==!0){console.warn("[dsh-cost-meter] 弹窗组件未挂载:需启用峰谷计价并重启 dsh web 后再预览。");return}window.dispatchEvent(new CustomEvent(bt,{detail:{kind:u==="offpeak"?"offpeak":"peak"}}))};const T=p(),B=u=>{v(T,"settings.section",{name:"settings.section",id:"cost-meter",order:30,label:u==="en"?Ne.en.sectionLabel:Ne.zh.sectionLabel,inject:h},cs,!0)},O=p(),A=u=>{v(O,"settings.general.item",{name:"settings.general.item",id:"cost-meter-usage",order:30,inject:h},Ct,u)},m=p(),E=(u,y)=>{v(m,"settings.section",{name:"settings.section",id:"cost-meter-usage",order:31,label:y==="en"?Ne.en.usageSectionLabel:Ne.zh.usageSectionLabel,inject:h},Ct,u)};let K=null,ne=null,R=null,q=null,L=null,H=null;const Z=()=>{const u=a.getSnapshot().state,y=u?.config?.position??"dock",D=u?.config?.sidebar!==!1&&u?.config?.hideTodayCost!==!0,z=u?.config?.balance?.display??"both",W=(z==="sidebar"||z==="both")&&u?.config?.hideOfficialBalance!==!0,le=D||W||u?.config?.codexQuotaEnabled===!0,pe=u?.config?.corner?.enabled===!0,xe=F(u?.config?.locale),ve=u?.config?.usage?.position??"cost";y!==K&&(C(y),K=y),le!==ne&&(w(le),ne=le),pe!==R&&(N(pe),R=pe);const Be=u?.config?.peakEnabled===!0;Be!==H&&(M(Be),H=Be),xe!==q&&(B(xe),q=xe),ve!==L?(He&&(A(ve==="general"),E(ve==="section",xe)),L=ve):He&&ve==="section"&&xe!==q&&E(!0,xe)};Z();const oe=a.subscribe(Z);return()=>{oe()}}return Xe.apply=ds,Xe.inject=us,Mt.exports}});
|