dsh-cost-meter 1.7.49 → 1.8.0
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.md +7 -6
- package/README.zh-CN.md +6 -6
- package/docs/billing-statistics.md +49 -0
- package/lib/billing-statistics.js +70 -0
- package/lib/client.js +5 -5
- package/lib/client.statistics.js +19 -0
- package/lib/index.js +4 -1
- package/lib/turn-cost.js +38 -6
- package/lib/typert.host.js +21 -0
- package/package.json +2 -1
package/lib/client.js
CHANGED
|
@@ -1,6 +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:Qt=>{var Ft={exports:{}},ct=Ft.exports;Object.defineProperty(ct,Symbol.toStringTag,{value:"Module"});const qe=Qt("react"),{Tooltip:$}=Qt("@deepseek-ai/dsh-client-ui-primitives"),Ye=!1,Ia='.cm-root{flex:0 1 auto;min-width:0;max-width:100%;text-align:center;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,.cm-foot-rail:hover,.cm-corner-chip:hover,.cm-qchip:hover,.cm-tab:hover,.cm-btn: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-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-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 .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.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.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-quota-name{flex:1;min-width:0}.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-model-costs{font-size:12px}.cm-model-costs .cm-bal-label{white-space:nowrap}.cm-model-top{gap:4px;max-width:180px;overflow:hidden;text-overflow:ellipsis}.cm-model-costs .cm-collapse-h{min-width:0;width:100%;white-space:nowrap}.cm-model-costs .cm-bbox-bar{margin-top:3px}.cm-bal-label{min-width:0;overflow:hidden;text-overflow:ellipsis}.cm-bal-amt{margin-left:auto;text-align:right;flex-shrink:0}.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-mm-reset{font-size:11px;color:var(--dsw-alias-label-tertiary);grid-column:1/-1}.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)}:has(>.cm-footer-stack),:has(>[data-slot="sidebar.footer.action"]>.cm-footer-stack){flex-wrap:wrap}:has(>.cm-footer-stack.rail),:has(>[data-slot="sidebar.footer.action"]>.cm-footer-stack.rail){flex-direction:column;flex-wrap:nowrap;align-items:center;gap:6px}.cm-footer-stack{display:flex;flex:none;order:-1;flex-direction:column;gap:6px;width:100%;min-width:0;max-width:100%;align-items:stretch;box-sizing:border-box}.cm-footer-stack.rail{align-items:center;order:1}.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}}',Wt="dsh-cost-meter/client.css";if(typeof document<"u"&&document.querySelector("style[data-plugin-css="+JSON.stringify(Wt)+"]")===null){const t=document.createElement("style");t.dataset.plugin="dsh-cost-meter",t.dataset.pluginCss=Wt,t.textContent=Ia,document.head.appendChild(t)}const Oe=Object.fromEntries([["zh",["本会话费用(按每次调用实际时刻精确计费)","输入 {input} · 缓存 {cache} · 输出 {output}","缓存:读 {read} · 写 {write}(写入按命中价计费)","费用 {amount}","本会话 {amount} · 命中 {hitRate} · 输入 {input} · 缓存 {cache} · 输出 {output}","无限制","当前人民币金额来自美元价格 × 汇率 {rate}。对照官方人民币账单,请选择 CNY,再同步价格;同步会更新历史费用。","余额查询失败:{message}","未知错误","余额","查询失败","DeepSeek 开放平台账户余额","官方余额变动与本地账本交叉对账(偏差超阈时提示)","总余额 {amount}","赠送 {granted} · 充值 {toppedUp}","更新时间 {time}","预算({period})","已用 {used} / {amount}","今日 {amount} · 占预算 {pct}","本月 {month} · 累计 {total}","预算","今日费用(按官方价格精确计费)","今日 Token 用量","tokens","调用 {calls} 次 · 输入 {input} · 缓存 {cache} · 输出 {output}","本月 {amount}","累计 {amount}","今日","侧边栏今日显示","费用","Token 用量","今日","本月","累计","自定义区间","暂无历史记录。开始对话后,费用将按天汇总在这里。","日期","调用","输入 tok","缓存 tok","输出 tok","费用","今日暂无会话记录。","会话","启用预算","预算额度(按显示币种)","预算周期","开始日期","结束日期(留空 = 今日)","统计区间:{range}","启用预算后显示额度、已用金额及比例(按显示币种换算);可选今日、本月、累计或自定义周期。","{period}预算 {amount} · 已用 {used} · {pct}%","(已超出)","(接近上限)","旧模型","默认回退","移除","基础","谷时","峰时","余额专用 API Key","优先使用此开放平台 Key;未配置时沿用模型凭据。账号登录令牌不能查询余额。","总余额 {total} · 赠送 {granted} · 充值 {toppedUp} · 更新于 {time}","余额查询失败:{message}","未查询余额","官方账户余额","刷新中…","刷新余额","自定义 Provider 余额","添加配置","添加千问 / 阿里云余额","查询阿里云中国站可用金。RAM AccessKey 需 bss:DescribeBillingAccount 权限。前两项必填;STS 才需 Security Token。密钥存凭据库。","extract 支持点路径、数值和 add/subtract/divide 运算;NewApi quota 除以 500000 得到美元。","中文名称","英文名称","请求 URL","请求方法","请求头 (JSON)","请求体 (JSON)","留空不发送;JSON 原文保存并发送。默认 Content-Type 为 application/json,可在请求头覆盖。","解析规则 (JSON)","自定义余额显示位置","刷新间隔 (分钟)","余额原币种","按显示币种折算(USD 余额)","使用显示汇率与精度;余额币种保持端点原币种。其他币种及积分不折算。","余额 {amount}","当日已用 {amount}","已用 {amount}","余额进度条 (蓝=余额,橙=当日,灰=已用)","进度条方向","各组进度条可独立选择填充方向:「剩余方向」满条起步、随消耗递减;「已用方向」空条起步、随消耗填满。","余额条(官方/自定义)","预算条","Go 额度条","Plan / Codex 额度条","剩余方向(满 → 空)","已用方向(空 → 满)","额度上限 (可选)","留空则优先使用 API 返回的 max_budget;仍无则显示整条浅蓝","JSON 格式无效","{{VAR_NAME}} 从凭据库或环境变量读取。<ROUTE>_API_KEY 中 ROUTE 为大写 Provider ID,符号改下划线,如 openai→OPENAI_API_KEY。同名共用密钥。","凭据白名单 (逗号分隔)","请求头带密钥时仅放行列表内主机,留空则放行并警告,防导入他人配置外带密钥。","凭据输入","为上方 {{VAR}} 占位符存入密钥(write-only,只写凭据库,不回显):",'请求头还没有 {{VAR}} 占位符:填入如 "Authorization": "Bearer {{MY_API_KEY}}" 后这里会出现凭据输入框。',"启用","剩余 {remaining} · 已用 {spend} / 额度 {maxBudget} · 更新于 {time}","剩余 {amount}","刷新自定义余额","OpenCode Go 订阅额度","Go","滚动 5 小时","本周","本月","重置:{time}","已到重置时间","剩余 {d}天{h}小时","剩余 {h}小时{m}分","剩余 {m}分钟","已用 {pct}%","剩余 {pct}%","{percent}%","更新于 {time}","Go 额度显示位置","Go 额度刷新间隔(分钟)","分钟","OpenCode Go API Key(可选,留空自动发现)","Go 额度主档位","Go 图框详细信息","已配置(来源:{source})","未配置","保存","清除","保存中…","密钥只写入 DSH 凭据库,不保存在账本里,也不会回显。","以下密钥仍在本地账本,未迁入凭据库。请导出对应环境变量后重启:","预算图框详细信息","刷新额度","未查询额度","Anthropic(Claude Pro/Max)","Z.ai / 智谱 GLM Coding Plan","MiniMax Token Plan","MiniMax Plan","查询域名(HTTPS)","留空自动选择官方站点。填写后 Key 仅发往该域名;使用可信地址,不含路径。","5h","7d","打开 DeepSeek 充值页(platform.deepseek.com/usage)","ChatGPT (Codex) 周额度","显示 Codex 额度(需安装并登录 dsh-openai-codex)","在侧栏显示 Codex 额度(关闭后仍保留会话额度条)","本会话费用包含子代理","暂无额度数据","显示位置","选「主页面侧边栏 / 两者」后显示额度卡片;窄栏显示百分比。","API Key(可选,留空自动发现)","刷新间隔(分钟)","刷新","未查询额度","CLIProxyAPI 网关额度","添加来源","来源名称","Base URL","显示位置","允许的 Host","Management Key(只写)","状态","不支持的 Provider","未知","未发现账号","抓取于 {time}","切换账号 (当前: {account})","只显示 Gemini 额度","刷新","先勾选启用这一项","启用并保存显示位置后可刷新","删除","勾选启用后会排到最上面;点名称可展开该项自己的配置。自定义余额最多 8 条,网关来源最多 4 条。","未启用。开启后将按刷新间隔查询该厂商的 coding plan 额度并显示在这里。","开启后读取 OpenCode Go 的滚动 5 小时、周、月额度,显示在侧栏、设置页及右下角;无订阅时提示原因。","右下角显示(dock)","在右下角显示 OpenCode Go 额度 / 预算","滚动 5 小时额度","本周额度","本月额度","预算已用%","5h","周","月","日","预算","账本读取失败:{message}","正在读取账本…","账本不可用","同步失败:{message}","历史记录已清除。","清除失败:{message}","峰谷计价已关闭,按基础价格计费","尚未生效(生效时间:{time}),当前按基础价格计费","当前处于峰时段,按峰时价计费","当前为 DeepSeek 峰时高价时段,按峰时价计费","当前处于谷时段,按谷时价计费","周末时段——全谷价(周六及周日全天按谷时价计费)","周末时段——全谷价","周末全谷","法定假日——全天谷价","法定假日——全谷价","假日","法定假日(北京日期,逗号分隔)","自 2026-08-23 北京时间 00:00 起,周末和中国公众假期全天谷价;调休上班的周末仍按谷价。","峰时","平价","峰谷时段条样式","简洁(单行紧凑)","经典(分段与胶囊芯片)","峰/谷切换前弹窗提醒","提前提醒(分钟,1-30)","提醒类型","进入峰时","进入谷时","峰和谷","即将进入峰时","即将进入谷时","约 {time} 后计费档位切换为{phase}价,请注意本时段调用成本。","峰时","谷时","知道了","峰价提醒","谷价提醒","弹窗位置","右下角","屏幕中心","同步发送系统通知","开关后请在浏览器地址栏允许通知权限,才能在页面最小化/切走时收到提醒。","预览弹窗","预览 进入峰","预览 进入谷","(预览)","峰谷计价与提示","提示已隐藏:需启用峰谷计价并开启「峰时高价时段显著提示」。","常规","金额与币种","侧边栏显示","简化侧栏显示","精简卡片,保留金额、额度和悬停详情;高度最多占屏幕 38%,超出可滚动。关闭后恢复。","试试更轻巧的侧栏","简化显示可以为会话列表留出更多空间。要现在开启吗?之后可在「设置 → 费用 → 显示」中切换。","开启简化显示","保留当前显示","设置未能保存。可重试,或关闭提示后在设置中调整。","关闭提示","今日 / {period}预算","侧边栏进度条样式","标准","紧凑(两列)","恢复已移除的模型 ({count})","移除会清除手动映射并隐藏此行,可恢复;不会删除用量记录,后续按自动匹配规则计价。","右下角角标","图框详细信息","拓展价格表","按厂商和模型分类的参考价。挂载后可编辑并计费;DeepSeek 取消挂载后用默认价。","展开拓展价格表","收起拓展价格表","挂载","取消挂载","已挂载","未核价","DeepSeek 取消挂载后按默认价计费。","按模型统计(token 与费用)","侧栏模型花费","{n} 模型","其它","显示模型花费卡片","默认展开","记住展开状态","显示 Token","显示费用占比条","右下角显示 Top-1 模型","默认周期","收起摘要","卡片位置","模型行数(1–10)","刷新间隔(10–60 秒)","周期总额与模型数","Top-1 模型与金额","顶部","余额之后","底部","今日","近 90 天","费用排行","Token 消耗","缓存命中率","未上报?","长调用无缓存命中:代理可能移除缓存字段。金额按全未命中计,是上界;可直连核对。","性价比 · 每美元 token 数","输入","缓存","输出","该时段暂无用量数据。","综合单价 {price}/M","命中率=缓存读÷(缓存读+普通输入);「未上报?」表示缓存字段可能缺失,金额为上界。单价=费用÷token×1M;性价比=token÷费用。","未分模型(早期数据 · 按当时记录计费)","本会话 {amount}(API)· Plan 等值 {planAmount} · 命中 {hitRate} · 输入 {input} · 缓存 {cache} · 输出 {output}","费用 {amount}(+Plan)","Plan 订阅额度消耗(等值){amount}","Token Plan 用量统计(每 1% 与满窗估算)","尚无 Coding Plan 额度数据;请在「额度」页开启并刷新厂商。","窗口","已用 %","本周期实际(本地账本)","每 1% 额度 ≈","满窗 100% ≈","重置 {time}","采样差分","当前用量折算","样本不足","{method}(基准 {time})","读数精度受限","Plan 用量曲线(按采样区间聚合)","每日","每周","每月","采样不足:至少两次成功刷新,且额度百分比发生变化。","{date}:满窗估计 ≈ {full}(每 1% ≈ {per1})· 实际 {tokens} / {cost} · {intervals} 个采样区间","金额是目录价等值;订阅耗额度,预算只计 API。估算仅含 dsh 调用;服务端百分比含全账号。短时样本精度有限;5h 滚动,周/月按本地日历。","计费方式","Plan 订阅","自动","API 按量","在费用设置直接显示","仅控制是否在费用价格表直接显示;不影响挂载和计费。隐藏的已挂载模型仍可在拓展表编辑。","可逐模型切换显示位置。DeepSeek 默认直接显示,第三方默认在拓展表。","手动新增模型","未知模型名自动匹配","自动(去后缀 / 前缀 / 家族相似)","仅精确匹配","手动指定优先;自动匹配只接受同名及日期、版本、上下文后缀。未命中的 DeepSeek 用默认价,其他渠道不计价。","最近出现但未命中价格的模型","这些模型没有价格。可手动指定;「默认价」使用 DeepSeek 默认价。本地推理默认零费用。","DeepSeek 默认价","移除","本地模型(零消耗)","本月已命中价格的模型","这些模型自动匹配价格。可改选价格或零费用;token 仍统计。保存后移入手动指定区。","保持自动命中","暂无手动匹配覆盖。","已挂载(参与计费)","输入","缓存","输出","DeepSeek 价格表(已挂载)","Kimi / Moonshot","OpenRouter","SiliconFlow 硅基流动","CommandCode","SCNet 超算互联网 Token Plan","火山方舟 Volcano Ark Coding Plan","千问 Qwen Token Plan","小米 MiMo Token Plan","套餐积分","补偿积分","余额","额度来源","本地估算","官方 CLI","百炼 CLI","CLI 模式需在 DSH 主机安装 @qianwenai/qianwen-cli,并以同一系统账号运行 qianwen auth login。","百炼 CLI:在 DSH 主机安装 bailian-cli 并以同一系统账号运行 bl auth login --console。","月度 Credits 额度(个人版 Lite 5 万 / 标准版 50 万,以订阅页为准)","订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)","Credits 抵扣率覆盖(可选;每百万 token 抵扣的 Credits,留空用内置表)","模型名,如 qwen3.8-max-preview","费率","输入","缓存读","输出","待填齐三项正数后自动保存;全部清空恢复内置表。","添加","Credits 本地估算,以控制台为准。只计 qwen 及 qwen/qianwen-tokenplan 订阅渠道,含 llm- 前缀;不计按量 API。表外模型需设抵扣率。","本地估算月度 Credits 额度(基础 60,000 / 标准 240,000 / 高级 600,000)","订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)","优先用 24 小时内的控制台快照,否则按本地账本和官方 Credits 表估算。其他工具和表外模型不计入。","火山引擎 AccessKey ID","火山引擎 SecretAccessKey","火山方舟需 AK/SK、ArkReadOnlyAccess 和 BillingCenterReadOnlyAccess;可填凭据或导出 VOLC_ACCESSKEY/VOLC_SECRETKEY。只连接 open.volcengineapi.com。","AK...","SK...","{h}小时","{h}小时{m}分","{m}分钟","{time}后进入平价","{time}后进入高峰","峰时段(UTC):{windows};生效时间:{time}。{status}","未配置峰谷时段。{status}","未知","今日费用","本月费用","累计费用","自账本建立以来 · 调用 {calls} 次","外部用量","DSH + 外部合计","外部快照超过 24 小时未更新","近期每日记录","金额取最近快照,可能比官方账单晚几分钟。tokens 含输入、输出、缓存和推理;推理并入输出计费。以金额对账。","今日/本月按宿主时区 {host},浏览器为 {browser}。时区不同会影响日界和对账;可将 dsh 改为本地时区。","今日会话","点击日期行可展开当日会话明细","会话明细加载中…","该日无会话明细(早期数据或会话日志已清理)","会话明细加载失败","按会话统计(全部历史)","不按日期分组,全部历史会话;排序与条数可切换","暂无会话数据","会话排行加载中…","会话排行加载失败","显示条数","会话列表附显会话 ID","金额含 Plan 总额","开启后所有金额按含 Plan 订阅等值的总费用展示;关闭(默认)仅计真金白银 API 渠道","隐藏官方账户余额(开启后侧边栏与设置页不再显示官方余额)","隐藏今日消耗金额(开启后侧边栏/预算明细/概览卡片不再显示今日费用)","排序","费用 高→低","费用 低→高","时间 新→旧","时间 旧→新","实时顺序","历史记录","Token 用量统计","累计 {tokens} tokens · 输入 {input} · 缓存 {cache} · 输出 {output} · {calls} 次调用","{date}:共 {tokens} tokens(输入 {input} · 缓存 {cache} · 输出 {output})· {calls} 次调用 · {cost}","暂无历史数据,开始对话后每日用量会汇总在这里","用量","Token 用量统计位置","费用设置","通用设置","独立分节(用量)","显示设置","概览","额度","用量","价格","显示","历史数据","会话费用显示位置","输入区下方","会话标题栏","关闭","输入框上方额度横条","启用额度横条(输入框上方一条横排显示)","横条含预算已用%","横条含 Go 额度","横条含 Coding Plan 额度","横条悬停可见各窗口重置时刻与更新时间;无可用额度数据时自动隐藏。","新增:输入框上方额度横条","在输入框上方显示预算及 OpenCode Go/Coding Plan 额度百分比。现在开启吗?可在「设置 → 显示设置」修改。","开启横条","暂不开启","点击立即刷新","新增:余额图框点击刷新","点击侧边栏余额或 Coding Plan 图框即可刷新;刷新时图框闪烁,失败时保留原值并在悬停提示中说明原因。","知道了","当日费用显示","侧边栏底部","货币单位","人民币 CNY","美元 USD","欧元 EUR","货币符号","汇率(1 美元 = ? 目标币种)","小数位数","余额显示位置","主页面侧边栏","设置页","两者都显示","余额刷新间隔(分钟)","启用 DeepSeek 峰谷时段价格","峰时高价时段显著提示(侧边栏预算框/今日费用;设置页峰谷面板内预览)","会话按调用时价格计费(含峰谷与历史档位)。输入、输出、缓存读写分开统计;独立缓存写入价与长上下文档位按配置生效。","价格表(美元 / 1M tokens)","官方价格币种","美元(英文官方页)","人民币(中文官方页)","决定同步价格所用的官方页语言。切换并同步后后台重算历史;日志不全的会话保留原价。完成后提示。","按调用时间计价:Flash 自 9 月 10 日北京 12:00 用新价,V4 Pro 自 9 月 14 日同刻用 Flash 价;此前用历史价。工作日 09–12、14–18 峰价翻倍;周末及中国公众假期全天谷价。缓存写入按命中价。","这里显示当前适用价格。手工编辑会取消此条后续预定调价,已发生的历史价格仍保留。","default(未匹配模型时回退)","新模型 ID(如 deepseek-v4-pro)","添加模型","数据与同步","保存中…","自动保存失败:{message}","已自动保存 {time}","配置修改后自动保存","确认用官方文档价格覆盖价格表?","应用","取消","从官方文档同步价格","官方同步只更新 DeepSeek 价格(含峰谷);z-ai/Kimi/Qwen/Volcano 等第三方价格随版本更新,也可在拓展价格表或模型名匹配中调整。","确认清除全部历史?","导入安装前历史","确认导入?将回放全部会话日志,只补账本缺失的日期与会话,不影响已有记录。","导入安装前历史失败:{message}","首次启动自动导入旧记录;拷入日志后可重跑。按当前价格回推;已删除日志无法回放,跨安装时刻的会话不计此前用量。","确认清除","清除全部历史","最近同步:{time}","从未(使用内置价格)",";来源:{source}","官方文档","内置默认","界面语言","跟随浏览器(自动)","简体中文","English","费用","{method} 调用失败","同步调用失败","余额刷新调用失败"]],["en",["Cost of this session (billed exactly at each call time)","Input {input} · Cache {cache} · Output {output}","Cache: read {read} · write {write} (writes billed at the hit price)","Cost {amount}","This session {amount} · Hit {hitRate} · Input {input} · Cache {cache} · Output {output}","Unlimited","CNY totals use USD prices × {rate}. To compare official CNY bills, select CNY, then sync prices; syncing also updates historical costs.","Balance query failed: {message}","Unknown error","Balance","Query failed","DeepSeek open-platform account balance","Cross-check official balance changes against the local ledger (warn when they diverge)","Total {amount}","Granted {granted} · Topped-up {toppedUp}","Updated {time}","Budget ({period})","Used {used} / {amount}","Today {amount} · {pct} of budget","This month {month} · All time {total}","Budget","Today's cost (billed exactly at official prices)","Today's token usage","tokens","Calls {calls} · Input {input} · Cache {cache} · Output {output}","This month {amount}","All time {amount}","Today","Sidebar today display","Cost","Token usage","Today","This month","All time","Custom range","No history yet. Once you start chatting, costs are aggregated here per day.","Date","Calls","In tok","Cache tok","Out tok","Cost","No sessions recorded today.","Session","Enable budget","Budget amount (in display currency)","Budget period","Start date","End date (empty = today)","Range: {range}","Enable a budget to see its limit, used amount and percentage in the display currency. Choose today, month, all time or a custom range.","{period} budget {amount} · Used {used} · {pct}%"," (over limit)"," (near limit)","Legacy","Default fallback","Remove","Base","Off-peak","Peak","Balance API key","This Open Platform key takes priority over model credentials. Account-login tokens cannot query balances.","Total {total} · Granted {granted} · Topped-up {toppedUp} · Updated {time}","Balance query failed: {message}","Balance not queried","Account balance","Refreshing…","Refresh balance","Custom provider balance","Add entry","Add Qianwen / Alibaba Cloud balance","Shows Alibaba Cloud China funds. RAM AccessKey needs bss:DescribeBillingAccount. The first two fields are required; Security Token is for STS. Secrets stay in the credential store.","Extract accepts paths, numbers and add/subtract/divide. Divide NewApi quota by 500000 for USD.","Chinese name","English name","Request URL","HTTP method","Headers (JSON)","Request body (JSON)","Blank sends no body; JSON text is saved and sent as entered. Content-Type defaults to application/json; headers can override it.","Extract rules (JSON)","Custom balance display","Refresh interval (minutes)","Source currency","Convert USD balance to display currency","Uses the display rate and precision. Keep the source currency; other currencies and credits stay unchanged.","Balance {amount}","Today {amount}","Spent {amount}","Balance progress bar (blue=balance, orange=today, gray=spent)","Progress bar direction",'Each group of bars can independently choose its fill direction: "Remaining" starts full and drains with usage; "Used" starts empty and fills up.',"Balance bars (official/custom)","Budget bar","Go quota bar","Plan / Codex quota bars","Remaining (full → empty)","Used (empty → full)","Budget cap (optional)","Leave empty to use API max_budget; if still missing, show full light-blue bar","Invalid JSON","{{VAR_NAME}} reads a credential or environment variable. <ROUTE>_API_KEY uses an uppercase Provider ID with underscores, such as openai→OPENAI_API_KEY. Names can share a key.","Allowed hosts (comma-separated)","When headers carry credentials only listed hosts are allowed; leave empty to allow with a warning. Protects keys when importing someone else's config.","Credential input","Store the key for each {{VAR}} placeholder above (write-only: stored in the DSH credential store, never echoed back):",'No {{VAR}} placeholders in the headers yet — add e.g. "Authorization": "Bearer {{MY_API_KEY}}" and a credential input will appear here.',"Enable","Remaining {remaining} · Spent {spend} / Budget {maxBudget} · Updated {time}","Remaining {amount}","Refresh custom balance","OpenCode Go subscription quota","Go","Rolling 5h","Weekly","Monthly","Resets: {time}","Reset time reached","{d}d {h}h left","{h}h {m}m left","{m}m left","{pct}% used","{pct}% remaining","{percent}%","Updated {time}","Go quota display position","Go quota refresh interval (minutes)","min","OpenCode Go API key (optional; empty = auto-detect)","Go quota primary window","Go box details","Configured (source: {source})","Not configured","Save","Clear","Saving…","The key is written to the DSH credential store only — it is never saved in the ledger and never echoed back.","These credentials remain in the local ledger. Export the matching environment variables and restart:","Budget box details","Refresh quota","Quota not queried","Anthropic (Claude Pro/Max)","Z.ai / Zhipu GLM Coding Plan","MiniMax Token Plan","MiniMax Plan","Quota origin (HTTPS)","Empty: official sites. Otherwise the Key is sent only to this origin. Use a trusted address without a path.","5h","7d","Open DeepSeek top-up page (platform.deepseek.com/usage)","ChatGPT (Codex) weekly quota","Show Codex quota (requires signed-in dsh-openai-codex)","Show Codex quota in sidebar (keep the conversation strip when hidden)","Include subagents in session cost","No quota data","Display position","“Main sidebar / Both” shows a quota card; the narrow rail shows percentages.","API key (optional; empty = auto-detect)","Refresh interval (minutes)","Refresh","Quota not queried","CLIProxyAPI gateway quotas","Add source","Source label","Base URL","Display","Allowed hosts","Management key (write-only)","Status","Unsupported providers","Unknown","No accounts","fetched {time}","Switch account (current: {account})","Gemini quota only","Refresh","Enable this item first","Enable and save a display position to refresh","Remove","Enabled items move to the top; click a name to expand its own settings. Up to 8 custom balances and 4 gateway sources.","Disabled. Enable it to query this vendor's coding plan quota on the refresh interval and show it here.","Enable OpenCode Go rolling 5h, weekly and monthly quotas in the sidebar, Settings and bottom-right corner. Missing subscriptions show a reason.","Bottom-right (dock) display","Show OpenCode Go quota / budget at the bottom-right","Rolling-5h quota","Weekly quota","Monthly quota","Budget used %","5h","Wk","Mo","Daily","Budget","Ledger read failed: {message}","Reading ledger…","Ledger unavailable","Sync failed: {message}","History cleared.","Clear failed: {message}","Peak/off-peak pricing is off; base prices are used","Not yet effective (effective at {time}); base prices are currently used","Peak hour now; peak prices apply","DeepSeek peak-hour pricing is active; current calls are billed at peak prices","Off-peak now; off-peak prices apply","Weekend — all off-peak (Sat & Sun billed at off-peak prices all day)","Weekend — all off-peak","Weekend","Chinese public holiday — off-peak all day","Public holiday — all off-peak","Holiday","Public holidays (Beijing dates, comma separated)","Since Aug 23, 2026 (Beijing time), weekends and Chinese public holidays are off-peak all day, including work-shift weekends.","Peak","Off-peak","Peak period strip style","Compact (one-line)","Classic (segments & chip)","Popup alert before peak/off-peak switch","Lead time (minutes, 1-30)","Alert type","Entering peak","Entering off-peak","Both","Entering peak hours soon","Entering off-peak hours soon","Billing switches to {phase} pricing in about {time}; mind your call costs in this window.","peak","off-peak","Got it","Peak alert","Off-peak alert","Popup position","Bottom-right","Screen center","Also send a system notification","When enabled, allow notification permission in the browser address bar so you get alerted even when the page is minimized or backgrounded.","Preview the popup","Preview entering peak","Preview entering off-peak"," (preview)","Peak/off-peak pricing & notice","Notice hidden: enable peak/off-peak pricing and the “prominent notice” toggle.","General","Money & currency","Sidebar display","Simplify the sidebar","Condense cards but keep amounts, quotas and hover details. Height is capped at 38% of the viewport with scrolling. Turn off to restore.","A lighter sidebar","Simple display leaves more room for conversations. Enable it now? You can change it in Settings → Cost → Display anytime.","Enable simple display","Keep current display","Settings could not be saved. Retry or dismiss this guide and change them later in Settings.","Dismiss guide","Today / {period} budget","Sidebar progress style","Standard","Compact (2 columns)","Restore removed models ({count})","Remove clears the override and hides the row until restored. Usage records are kept; automatic price matching applies.","Corner chips","Box details","Extended price catalog","Reference prices by vendor and model. Mount to edit and bill; unmounted DeepSeek uses its default price.","Expand extended price catalog","Collapse extended price catalog","Mount","Unmount","Mounted","Unpriced","Unmounted DeepSeek models use the default price.","Per-model statistics (tokens & cost)","Sidebar model costs","{n} models","Other","Show model cost card","Expand by default","Remember expansion","Show tokens","Show cost shares","Top model in corner dock","Default period","Collapsed summary","Card position","Model rows (1–10)","Refresh interval (10–60 seconds)","Period total and model count","Top model and cost","Top","After balances","Bottom","Today","Last 90 days","Cost ranking","Token usage","Cache hit rate","unreported?","Zero cache hits on long calls may mean a relay removed cache fields. All-miss cost is an upper bound; check with the direct API.","Value · tokens per USD","Input","Cache","Output","No usage data for this period.","blended {price}/M","Hit rate = cache reads ÷ (reads + uncached input). “Unreported?” means cache data may be missing, so cost is an upper bound. Unit price = cost ÷ tokens × 1M; value = tokens ÷ cost.","Unattributed (early data · billed as recorded)","This session {amount} (API) · Plan equiv. {planAmount} · Hit {hitRate} · Input {input} · Cache {cache} · Output {output}","Cost {amount} (+Plan)","Plan subscription quota usage (equiv.) {amount}","Token Plan usage stats (per-1% & full-window estimates)","No Coding Plan quota data yet. Enable and refresh a provider under Quotas.","Window","Used %","This period actual (local ledger)","Per 1% quota ≈","Full window (100%) ≈","resets {time}","sample delta","current usage ratio","not enough samples","{method} (as of {time})","low reading precision","Plan usage curves (aggregated from sample intervals)","Daily","Weekly","Monthly","Not enough samples: refresh successfully twice with a quota percentage change.","{date}: full-window est. ≈ {full} (per 1% ≈ {per1}) · actual {tokens} / {cost} · {intervals} sample interval(s)","Amounts are catalog-price equivalents. Plans use quota; budgets count API only. Estimates cover dsh calls, while server percentages cover the account. Short samples are less precise. 5h rolls; week/month use local dates.","Billing class","Plan subscription","Auto","API usage","Show directly in Cost settings","Controls direct display in Cost settings; mounting and billing stay unchanged. Hidden models remain editable in this catalog.","Choose where each model appears. DeepSeek shows directly; other vendors default to the catalog.","Custom models","Auto-match unknown model names","Auto (strip suffix / prefix / family similarity)","Exact match only","Manual overrides take priority. Auto-match accepts only the same name or date, version and context suffixes. Unknown DeepSeek models use the default price; other providers stay unpriced.","Recently seen models without a price hit","These models have no price. Assign one manually; “Default price” uses DeepSeek defaults. Local inference costs zero until assigned.","DeepSeek default price","Remove","Local model (zero cost)","Models matched this month","These models matched automatically. Choose another price or zero cost; tokens still count. Saved overrides move to the manual list.","Keep auto match","No manual match overrides.","Mounted (billed)","Input","Cached","Output","DeepSeek price table (mounted)","Kimi / Moonshot","OpenRouter","SiliconFlow","CommandCode","SCNet Token Plan","Volcano Ark Coding Plan","Qwen Token Plan (qianwenai.com)","Xiaomi MiMo Token Plan","Plan credits","Compensation","Balance","Quota source","Local estimate","Official CLI","Bailian CLI","Install @qianwenai/qianwen-cli on the DSH host and run qianwen auth login as the same OS user.","Bailian CLI: install bailian-cli on the DSH host and run bl auth login --console as the same OS user.","Monthly credits quota (personal Lite 50K / Standard 500K; see your plan page)","Plan start date (optional, YYYY-MM-DD; empty = calendar month)","Credits rate overrides (optional; credits deducted per 1M tokens; empty = built-in table)","Model name, e.g. qwen3.8-max-preview","rate","Input","Cached input","Output","Enter all three positive rates to save automatically; clear all to restore the built-in table.","Add","Local Credits estimate; console is authoritative. Counts qwen and qwen/qianwen-tokenplan subscription routes, including llm- prefix. Excludes pay-as-you-go API. Add rates for other models.","Monthly credits quota for local estimates (Basic 60,000 / Standard 240,000 / Pro 600,000)","Plan start date (optional, YYYY-MM-DD; empty = calendar month)","Uses console snapshots newer than 24h, then estimates from local records and official Credits rates. Other tools and unlisted models are excluded.","Volcengine AccessKey ID","Volcengine SecretAccessKey","Volcano Ark needs AK/SK, ArkReadOnlyAccess and BillingCenterReadOnlyAccess. Enter credentials or export VOLC_ACCESSKEY/VOLC_SECRETKEY. Only open.volcengineapi.com is contacted.","AK...","SK...","{h}h","{h}h {m}m","{m}m","Off-peak in {time}","Peak in {time}","Peak hours (UTC): {windows}; effective: {time}. {status}","No peak windows configured. {status}","unknown","Today","This month","All time","Since the ledger was created · Calls {calls}","External usage","DSH + external total","External snapshot has not been updated for 24 hours","Recent daily records","Amounts use the latest snapshot and may lag the official bill by minutes. Tokens include input, output, cache and reasoning; reasoning is billed with output. Reconcile by amount.","Today/month use host timezone {host}; this browser uses {browser}. Different day boundaries affect reconciliation. Set dsh to your local timezone to align.","Today's sessions","Click a date row to expand its session details","Loading session details…","No session details for this day (early data or session logs cleaned)","Failed to load session details","By session (all history)","All historical sessions, not grouped by date; sort and row count are switchable","No session data yet","Loading session ranking…","Failed to load session ranking","Rows","Show session IDs in session lists","Include plan totals","When on, every amount shows total equivalent cost including plan subscriptions; off (default) counts real-money API channels only","Hide official account balance (balance UI removed from sidebar and settings)","Hide today's cost (today's amount removed from sidebar, budget details and overview card)","Sort","Cost high→low","Cost low→high","Time new→old","Time old→new","Recent order","History","Token usage stats","All-time {tokens} tokens · input {input} · cache {cache} · output {output} · {calls} calls","{date}: {tokens} tokens (input {input} · cache {cache} · output {output}) · {calls} calls · {cost}","No history yet — daily usage will accumulate here","Usage","Token usage stats position","Cost settings","General settings","Own section (Usage)","Display settings","Overview","Quotas","Usage","Pricing","Display","History data","Session cost display position","Below the composer","Session title bar","Off","Quota strip above the input","Enable the quota strip (one row above the input box)","Strip includes budget used %","Strip includes the Go quota","Strip includes coding plan quotas","Hover a chip for reset times and the last refresh; the strip hides itself when there is no quota data.","New: quota strip above the input","Show budget and OpenCode Go/coding-plan percentages above the input box. Enable now? Change it anytime in Settings → Display.","Enable the strip","Not now","Click to refresh now","New: click the balance box to refresh","Click a sidebar balance or plan box to refresh. It pulses while loading; on failure it keeps the old value and shows the reason on hover.","Got it","Today cost display","Sidebar footer","Currency","Chinese Yuan (CNY)","US Dollar (USD)","Euro (EUR)","Currency symbol","Exchange rate (1 USD = ? target currency)","Decimal places","Balance display position","Main sidebar","Settings page","Both","Balance refresh interval (minutes)","Use DeepSeek peak-hour prices","Prominent notice during peak hours (sidebar budget box, today's cost; previewed in the Settings peak panel)","Session cost uses call-time prices, including peak and historical rates. Input, output, cache reads and writes are separate; configured cache-write and long-context rates apply.","Price table (USD / 1M tokens)","Official price currency","USD (English official page)","CNY (Chinese official page)","Selects the official pricing-page language. Sync then recalculates history in the background; sessions without full logs keep their earlier basis.","Call-time prices: Flash changes Sep 10 04:00 UTC; V4 Pro uses Flash prices from Sep 14 04:00 UTC. Earlier calls retain history. Mon–Fri peaks 01–04 and 06–10 UTC cost 2×; weekends and Chinese public holidays are off-peak. Cache writes use hit rates.","Current rates are shown here. Editing cancels any future scheduled change for this entry; earlier historical rates are retained.","default (fallback for unmatched models)","New model ID (e.g. deepseek-v4-pro)","Add model","Data & sync","Saving…","Auto-save failed: {message}","Auto-saved {time}","Settings are auto-saved","Overwrite the price table with prices from the official docs?","Apply","Cancel","Sync prices from official docs","Official sync updates DeepSeek prices (including peak rates). Third-party prices (z-ai/Kimi/Qwen/Volcano) follow releases; edit in the extended catalog or model matching.","Clear all history?","Import pre-install history","Confirm import? Replays all session logs and only fills dates/sessions missing from the ledger; existing records are untouched.","Failed to import pre-install history: {message}","Pre-install history imports at first launch; rerun after copying old logs. Costs use current prices. Deleted logs cannot replay; sessions spanning installation exclude earlier usage.","Confirm clear","Clear all history","Last sync: {time}","Never (bundled prices)","; Source: {source}","Official docs","Bundled","Language","Follow browser (auto)","Simplified Chinese","English","Cost","{method} call failed","Sync call failed","Balance refresh call failed"]]].map(([t,s])=>[t,Object.fromEntries(["sessionCostTitle","sessionDetailTokens","sessionDetailCache","cost","sessionLine","quotaUnlimited","pricingCnyHint","balanceQueryFailed","unknownError","balance","queryFailed","balanceTitle","reconcileLabel","totalBalance","grantedToppedUp","updatedAt","budgetOf","usedOf","todayShare","monthTotal","budget","todayCostTitle","todayTokensTitle","tokensUnit","callsTokens","monthCost","totalCost","today","sidebarTodayMetric","sidebarTodayCost","sidebarTodayTokens","periodDay","periodMonth","periodAll","periodCustomRange","noHistory","colDate","colCalls","colInTok","colCacheTok","colOutTok","colCost","noSessionsToday","colSession","enableBudget","budgetAmountLabel","budgetPeriodLabel","startDate","endDate","rangeText","budgetDisabledNote","budgetStatus","overLimit","nearLimit","legacyModel","defaultFallback","remove","tierBase","tierOffPeak","tierPeak","balanceApiKey","balanceKeyHint","balanceLine","balanceQueryFailedHint","balanceNotQueried","accountBalance","refreshing","refreshBalance","customBalanceTitle","customBalanceAdd","aliyunBalanceAdd","aliyunBalanceNote","customBalanceConfigNote","customBalanceLabelZh","customBalanceLabelEn","customBalanceUrl","customBalanceMethod","customBalanceHeaders","customBalanceBody","customBalanceBodyNote","customBalanceExtract","customBalanceDisplayLabel","customBalanceRefreshInterval","customBalanceUnitLabel","customBalanceConvert","customBalanceConvertNote","balanceBarRemaining","balanceBarToday","balanceBarSpent","balanceShowProgressBar","barDirectionsTitle","barDirectionsHint","barDirection_balance","barDirection_budget","barDirection_go","barDirection_plan","barDirectionRemaining","barDirectionUsed","balanceBudgetCapLabel","balanceBudgetCapHint","customBalanceInvalidJson","customBalanceHeadersVarNote","customBalanceAllowedHosts","customBalanceAllowedHostsHint","customBalanceCredentialsTitle","customBalanceCredentialsHint","customBalanceNoPlaceholders","enable","customBalanceLine","customBalanceRemaining","refreshCustomBalance","goQuotaTitle","goQuotaRowLabel","goWindowRolling","goWindowWeekly","goWindowMonthly","goResetAt","resetReached","resetDays","resetHours","resetMinutes","quotaUsed","quotaRemaining","goQuotaPercent","goQuotaFetchedAt","goQuotaDisplayLabel","goQuotaRefreshIntervalLabel","goQuotaRefreshMinutesUnit","goQuotaKeyLabel","goMainLabel","goDetailLabel","credentialConfiguredOf","credentialNotConfigured","credentialSave","credentialClear","credentialSaving","credentialInputHint","secretMigrationPending","budgetDetailLabel","refreshGoQuota","goQuotaNotQueried","codingPlanAnthropic","codingPlanZai","codingPlanMinimax","codingPlanMinimaxTitle","minimaxOrigin","minimaxOriginNote","codingPlanRemain5h","codingPlanRemain7d","balanceRechargeLink","codexQuotaTitle","codexQuotaEnabled","codexQuotaSidebar","includeSubagentCost","gatewayQuotaEmpty","codingPlanDisplayLabel","codingPlanDisplayNote","codingPlanKeyLabel","codingPlanRefreshIntervalLabel","refreshCodingPlan","codingPlanNotQueried","gatewayQuotaTitle","gatewaySourceAdd","gatewaySourceLabel","gatewaySourceBaseURL","gatewaySourceDisplay","gatewaySourceAllowlist","gatewaySourceCredential","gatewaySourceStatus","gatewaySourceUnsupported","gatewaySourceUnknown","gatewaySourceNoAccounts","gatewaySourceFetchedAt","gatewaySwitchAccount","gatewayOnlyGemini","refresh","quotaEnableFirst","quotaRefreshReady","quotaRemove","quotaSectionNote","codingPlanDisabledNote","goQuotaDisabledNote","cornerLabel","cornerEnabledLabel","cornerGoRolling","cornerGoWeekly","cornerGoMonthly","cornerBudget","goShortRolling","goShortWeekly","goShortMonthly","goShortDaily","budgetShort","ledgerReadFailed","readingLedger","ledgerUnavailable","syncFailed","historyCleared","clearFailed","peakOff","peakNotEffective","peakActive","peakNotice","offPeakActive","weekendAllOffPeak","weekendChip","weekendShort","holidayAllOffPeak","holidayChip","holidayShort","peakHolidaysLabel","weekendRuleNote","peakShort","offPeakShort","peakStyleLabel","peakStyleCompact","peakStyleClassic","peakAlertLabel","peakAlertAheadLabel","peakAlertTargetLabel","peakAlertTargetPeak","peakAlertTargetOffPeak","peakAlertTargetBoth","peakAlertTitlePeak","peakAlertTitleOffPeak","peakAlertBody","peakAlertPhasePeak","peakAlertPhaseOffPeak","peakAlertBtn","peakAlertBadgePeak","peakAlertBadgeOffPeak","peakAlertPositionLabel","peakAlertPositionCorner","peakAlertPositionCenter","peakAlertWebNotifyLabel","peakAlertWebNotifyHint","peakAlertPreviewLabel","peakAlertPreviewPeak","peakAlertPreviewOffPeak","peakAlertPreviewTag","peakPanelTitle","peakNoticeHiddenHint","groupGeneral","groupMoney","groupSidebar","sidebarSimple","sidebarSimpleNote","sidebarSimpleTitle","sidebarSimpleBody","sidebarSimpleOn","sidebarSimpleOff","sidebarSimpleError","closeGuide","todayBudget","sidebarStyleLabel","sidebarStyleStandard","sidebarStyleCompact","restorePriceMatches","removePriceMatchHint","groupCorner","groupDetail","catalogTitle","catalogNote","catalogOpen","catalogCollapse","mountBtn","unmountBtn","mountedTag","catalogUnpriced","catalogDeepseekNote","modelStatsTitle","modelsTitle","modelsCount","modelsOther","models_enabled","models_defaultOpen","models_remember","models_tokens","models_shares","models_dock","models_period","models_summary","models_position","models_topN","models_refreshSeconds","modelsTotal","modelsTop","modelsFirst","modelsAfter","modelsLast","modelStatsToday","modelStatsHistory","modelStatsCostH","modelStatsTokensH","modelStatsHitH","modelStatsHitUnreported","modelStatsHitUnreportedTip","modelStatsValueH","modelStatsInput","modelStatsCache","modelStatsOutput","modelStatsEmpty","modelStatsBlended","modelStatsNote","modelStatsLegacy","sessionLineSplit","costChipPlan","sessionDetailPlan","planStatsTitle","planStatsEmpty","planStatsWindow","planStatsPercent","planStatsLocal","planStatsPer1","planStatsFull","planStatsResets","planStatsMethodSample","planStatsMethodLive","planStatsMethodNone","planStatsMethodSampleAt","planStatsConfidenceLow","planStatsCurveTitle","planStatsDaily","planStatsWeekly","planStatsMonthly","planStatsCurveEmpty","planStatsBarTip","planStatsNote","billingClassLabel","billingClassPlan","billingClassAuto","billingClassApi","catalogDisplayLabel","catalogDisplayHint","priceTableDisplayHint","catalogCustomModels","priceMatchLabel","priceMatchAuto","priceMatchExact","priceMatchNote","unmatchedTitle","unmatchedHint","overrideTargetDefault","overrideRemove","overrideTargetLocal","matchedTitle","matchedHint","matchedKeepAuto","overrideNone","mountedSuffix","flatInput","flatCached","flatOutput","deepseekMountedHeader","codingPlanKimi","codingPlanOpenrouter","codingPlanSiliconflow","codingPlanCommandcode","codingPlanScnet","codingPlanVolcengine","codingPlanQwen","codingPlanMimo","mimoWindowPlan","mimoWindowCompensation","codingPlanWindowBalance","qwenSource","qwenSourceLocal","qwenSourceCli","qwenSourceBailian","qwenCliNote","qwenBailianNote","qwenPlanCreditsLabel","qwenPlanStartLabel","qwenRatesLabel","qwenRatesModelPlaceholder","qwenRatePlaceholder","qwenRate_input","qwenRate_cachedInput","qwenRate_output","qwenRateDraftNote","qwenRatesAdd","qwenLocalNote","scnetPlanCreditsLabel","scnetPlanStartLabel","scnetLocalNote","volcengineAccessKeyIdLabel","volcengineSecretAccessKeyLabel","volcengineNote","volcengineAccessKeyPlaceholder","volcengineSecretPlaceholder","countdownHoursOnly","countdownHourMinute","countdownMinute","nextOffPeakIn","nextPeakIn","peakSummary","noPeakWindows","unknown","cardToday","cardMonth","cardTotal","cardTotalSub","externalUsage","combinedUsage","externalStale","externalHistory","cardsFootnote","timezoneHint","todaySessions","historyExpandHint","historySessionsLoading","historyNoSessions","historySessionsError","sessionRankTitle","sessionRankHint","sessionRankEmpty","sessionRankLoading","sessionRankError","sessionRankLimit","showSessionIdLabel","cardsTogglePlanTotal","cardsTogglePlanTotalHint","hideOfficialBalanceLabel","hideTodayCostLabel","sessionRankSort","sessionSortCostDesc","sessionSortCostAsc","sessionSortTimeDesc","sessionSortTimeAsc","sessionSortRecent","history","usageTitle","usageTotal","usageDay","usageEmpty","usageSectionLabel","usagePositionLabel","usagePositionCost","usagePositionGeneral","usagePositionSection","displaySettings","tabOverview","tabQuotas","tabUsage","tabPricing","tabDisplay","historyDataTitle","positionLabel","positionDock","positionHeader","off","quotaStripGroup","quotaStripEnable","quotaStripShowBudget","quotaStripShowGo","quotaStripShowPlans","quotaStripNote","quotaStripGuideTitle","quotaStripGuideBody","quotaStripGuideOn","quotaStripGuideOff","clickToRefresh","balanceClickGuideTitle","balanceClickGuideBody","balanceClickGuideOk","sidebarLabel","sidebarOn","currencyLabel","currencyCny","currencyUsd","currencyEur","symbolLabel","rateLabel","decimalsLabel","balanceDisplayLabel","balanceSidebar","balanceSettings","balanceBoth","refreshIntervalLabel","peakEnabledLabel","peakNoticeLabel","badgeNote","priceTableTitle","pricingCurrencyLabel","pricingCurrencyUsd","pricingCurrencyCny","pricingCurrencyNote","priceTableNote","datedPriceNote","defaultModelId","newModelPlaceholder","addModel","dataSync","saving","autoSaveFailed","autoSavedAt","autoSaveHint","confirmFetch","apply","cancel","syncFromDocs","syncScopeNote","confirmReset","importLegacy","confirmImportLegacy","legacyImportFailed","legacyImportNote","confirmClear","clearAllHistory","lastSync","neverSynced","source","sourceOfficial","sourceBundled","languageLabel","localeAuto","localeZh","localeEn","sectionLabel","rpcFailed","rpcSyncFailed","rpcBalanceFailed"].map((o,a)=>[o,s[a]]).filter(([,o])=>o!==null))]));function Ua(){return(typeof navigator<"u"&&typeof navigator.language=="string"?navigator.language:"").toLowerCase().startsWith("zh")?"zh":"en"}function W(t){return t==="zh"||t==="en"?t:Ua()}function K(t){const s=t==="zh"?Oe.zh:Oe.en;return(o,a)=>{let n=s[o]??Oe.en[o]??o;if(a)for(const l of Object.keys(a))n=n.split("{"+l+"}").join(String(a[l]));return n}}const je={day:"periodDay",month:"periodMonth",all:"periodAll",custom:"periodCustomRange"};function le(t,s){throw new Error("dsh-cost-meter: 服务端数据非法 ("+t+": "+s+")")}function be(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&le(s,"object"),t}function X(t,s){return(typeof t!="number"||!Number.isFinite(t))&&le(s,"number"),t}function se(t,s){return typeof t!="string"&&le(s,"string"),t}const Ve=(t,s,o)=>typeof t=="string"&&s.includes(t)?t:o;function _t(t,s=!1){return t===null||typeof t!="object"||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(([o,a])=>s?o.length>0&&["plan","api"].includes(a):["auto","plan","api"].includes(a)))}function Ce(t,s){return typeof t!="boolean"&&le(s,"boolean"),t}const Je=(t,s,o)=>Object.fromEntries(s.map(a=>[a,o(t[a])]));function zt(t,s){const o={};if(t!==null&&typeof t=="object"&&!Array.isArray(t))for(const a of Object.keys(t)){const n=t[a];if(n===null||typeof n!="object"||Array.isArray(n))continue;const l=i=>typeof i=="number"&&Number.isFinite(i)&&i>=0?i:0;o[a]={...Je(n,["input","output","cacheRead","cacheWrite","reasoning","cost"],l),apiCost:n.apiCost===void 0?l(n.cost):l(n.apiCost)}}return o}function Gt(t,s){be(t,s);const o={reasoning:t.reasoning===void 0?0:X(t.reasoning,s+".reasoning"),apiCost:t.apiCost===void 0?void 0:X(t.apiCost,s+".apiCost"),byModel:zt(t.byModel,s+".byModel"),byProviderModel:zt(t.byProviderModel,s+".byProviderModel")};for(const a of["input","output","cacheRead","cacheWrite","calls","cost"])o[a]=X(t[a],s+"."+a);return o}function Kt(t){return(Array.isArray(t)?t:le("rows","array")).map(s=>({provider:se(s.provider,"provider"),model:se(s.model,"model"),bucket:se(s.bucket,"bucket"),tokens:X(s.tokens,"tokens"),rate:X(s.rate,"rate"),cost:X(s.cost,"cost"),priced:Ce(s.priced,"priced"),plan:Ce(s.plan,"plan")}))}function dt(t,s){return{...Gt(t,s),id:se(t.id,s+".id"),provider:typeof t.provider=="string"?t.provider:"",model:typeof t.model=="string"?t.model:""}}function ge(t,s){const o={...Gt(t,s),date:se(t.date,s+".date"),sessions:[]};return t.sessions!==void 0&&(Array.isArray(t.sessions)||le(s+".sessions","array"),o.sessions=t.sessions.map((a,n)=>dt(a,s+".sessions["+n+"]"))),o}function ut(t,s,o=["cacheWrite","reasoning"]){const a={};for(const n of["cacheHit","cacheMiss","output"])a[n]=X(t[n],s+"."+n);for(const n of o)t[n]!==void 0&&(a[n]=X(t[n],s+"."+n));return a}function mt(t,s){be(t,s);const o=ut(t,s);for(const a of["offPeak","peak","legacyBase","longContext"])t[a]!==void 0&&(o[a]=ut(t[a],s+"."+a,["cacheWrite","reasoning","aboveInputTokens"]));t.cny!==void 0&&(o.cny=ut(t.cny,s+".cny")),t.legacy!==void 0&&(o.legacy=Ce(t.legacy,s+".legacy")),t.rateHistory!==void 0&&((!Array.isArray(t.rateHistory)||t.rateHistory.length>16)&&le(s+".rateHistory","price history"),o.rateHistory=t.rateHistory.map((a,n)=>((!a||typeof a.before!="string"||!Number.isFinite(Date.parse(a.before)))&&le(s+".rateHistory","dated price"),{...mt({...a,rateHistory:void 0},s+".rateHistory."+n),before:a.before})));for(const a of["billingMode","sourceUrl","checkedAt","notes"])typeof t[a]=="string"&&(o[a]=t[a]);return o}function Ha(t,s){const o=n=>n==null?void 0:{...n.adapter==="aliyun"?{adapter:"aliyun"}:{},enabled:n.enabled===!0,label:typeof n.label=="string"?n.label:"",labelEn:typeof n.labelEn=="string"?n.labelEn:"",display:Ve(n.display,["sidebar","settings","off"],"both"),unit:["CNY","EUR","CREDITS"].includes(n.unit)?n.unit:"USD",convertToDisplayCurrency:n.convertToDisplayCurrency===!0,refreshMinutes:typeof n.refreshMinutes=="number"&&Number.isFinite(n.refreshMinutes)?n.refreshMinutes:15,request:n.request&&typeof n.request=="object"?n.request:{url:""},extract:n.extract&&typeof n.extract=="object"?n.extract:{},allowedHosts:Array.isArray(n?.allowedHosts)?n.allowedHosts.filter(l=>typeof l=="string"):[]};be(t,s);const a={};if(t.prices!==null&&typeof t.prices=="object"&&t.prices.models!==null&&typeof t.prices.models=="object")for(const n of Object.keys(t.prices.models))a[n]=mt(t.prices.models[n],s+".prices.models."+n);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,sidebarTodayMetric:t.sidebarTodayMetric==="tokens"?"tokens":"cost",showTotalWithPlan:t.showTotalWithPlan===!0,sidebarSimple:t.sidebarSimple===!0,sidebarSimplePromptSeen:t.sidebarSimplePromptSeen===!0,sidebarModels:Object.fromEntries(Object.entries(Lt).map(([n,l])=>[n,t.sidebarModels?.[n]??l])),codexQuotaEnabled:t.codexQuotaEnabled===!0,codexQuotaSidebar:t.codexQuotaSidebar!==!1,includeSubagentCost:t.includeSubagentCost===!0,sidebarStyle:t.sidebarStyle==="compact"?"compact":"standard",priceMatchDismissed:Array.isArray(t.priceMatchDismissed)?t.priceMatchDismissed.filter(n=>typeof n=="string"):[],pricingCurrency:t.pricingCurrency==="CNY"?"CNY":"USD",currency:typeof t.currency=="string"?t.currency:"CNY",symbol:typeof t.symbol=="string"?t.symbol:"¥",decimals:X(t.decimals,s+".decimals"),exchangeRate:X(t.exchangeRate,s+".exchangeRate"),peakEnabled:t.peakEnabled===!0,peakEffectiveAt:typeof t.peakEffectiveAt=="string"?t.peakEffectiveAt:"",peakWindows:Array.isArray(t.peakWindows)?t.peakWindows.map((n,l)=>({start:X(n.start,s+".peakWindows["+l+"].start"),end:X(n.end,s+".peakWindows["+l+"].end")})):[],peakHolidays:Array.isArray(t.peakHolidays)?t.peakHolidays.filter(n=>typeof n=="string"):[],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 n={};if(t.priceOverrides!==null&&typeof t.priceOverrides=="object"&&!Array.isArray(t.priceOverrides))for(const[l,i]of Object.entries(t.priceOverrides))typeof l=="string"&&typeof i=="string"&&(n[l]=i);return n})(),priceTableDisplay:(()=>{const n={};if(t.priceTableDisplay!==null&&typeof t.priceTableDisplay=="object"&&!Array.isArray(t.priceTableDisplay))for(const[l,i]of Object.entries(t.priceTableDisplay))typeof l=="string"&&(n[l]=i===!0);return n})(),codingPlans:(()=>{const n={};if(t.codingPlans!==null&&typeof t.codingPlans=="object"&&!Array.isArray(t.codingPlans))for(const l of Object.keys(t.codingPlans)){const i=t.codingPlans[l];i===null||typeof i!="object"||Array.isArray(i)||(n[l]={enabled:i.enabled===!0,display:i.display==="sidebar"||i.display==="both"||i.display==="off"?i.display:"settings",refreshMinutes:typeof i.refreshMinutes=="number"&&Number.isFinite(i.refreshMinutes)?i.refreshMinutes:15,apiKey:typeof i.apiKey=="string"?i.apiKey:"",...l==="minimax"?{baseUrl:typeof i.baseUrl=="string"?i.baseUrl:""}:{},...l==="qwen"?{quotaSource:["cli","bailian"].includes(i.quotaSource)?i.quotaSource:"local"}:{},...typeof i.planCredits=="number"&&Number.isFinite(i.planCredits)&&i.planCredits>0?{planCredits:i.planCredits}:{},...typeof i.planStart=="string"?{planStart:i.planStart}:{},...i.rates!==null&&typeof i.rates=="object"&&!Array.isArray(i.rates)?{rates:i.rates}:{},...typeof i.accessKeyId=="string"?{accessKeyId:i.accessKeyId}:{},...typeof i.secretAccessKey=="string"?{secretAccessKey:i.secretAccessKey}:{}})}return n})(),prices:{models:a,default:mt(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:X(t.historyDays,s+".historyDays"),fetchedAt:t.fetchedAt===null||t.fetchedAt===void 0?null:se(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:Ve(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:Ve(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 n=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:t.gatewayQuotas?.sources;return{sources:Array.isArray(n)?n.slice(0,4).filter(i=>i!==null&&typeof i=="object"&&!Array.isArray(i)).map(i=>({id:typeof i.id=="string"?i.id.slice(0,48):"",type:"cliproxyapi",label:typeof i.label=="string"?i.label.slice(0,80):"",baseURL:typeof i.baseURL=="string"?i.baseURL:"",enabled:i.enabled!==!1,display:Ve(i.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof i.refreshMinutes=="number"&&Number.isFinite(i.refreshMinutes)?Math.min(1440,Math.max(1,Math.floor(i.refreshMinutes))):15,includeProviders:Array.isArray(i.includeProviders)?[...new Set(i.includeProviders.filter(r=>typeof r=="string").map(r=>r.toLowerCase()).filter(r=>bt.includes(r)))]:bt,allowedHosts:Array.isArray(i.allowedHosts)?i.allowedHosts.filter(r=>typeof r=="string").slice(0,16):[],allowInsecureHttp:i.allowInsecureHttp===!0,antigravityOnlyGemini:i.antigravityOnlyGemini===!0,keyVar:typeof i.keyVar=="string"?i.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 n=o(t.customBalance);return n?[n]:[]})(),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 n=t.barDirections!==null&&typeof t.barDirections=="object"&&!Array.isArray(t.barDirections)?t.barDirections:{},l=(i,r)=>n[i]==="remaining"||n[i]==="used"?n[i]:r;return{balance:l("balance","remaining"),budget:l("budget","used"),go:l("go","used"),plan:l("plan","used")}})(),planBilling:{providers:_t(t.planBilling?.providers),models:_t(t.planBilling?.models,!0)}}}const Ie=t=>typeof t=="number"&&Number.isFinite(t)?t:null,Ae=t=>Ie(t)??0,Qa={status:"off",message:"",fetchedAt:0,currency:"",totalBalance:0,grantedBalance:0,toppedUpBalance:0},Fa={status:"off",message:"",fetchedAt:0,rolling:null,weekly:null,monthly:null},Yt=(t=null)=>({status:"off",message:"",fetchedAt:0,label:"",unit:"USD",remaining:0,maxBudget:null,spend:null,index:t});function pt(t,s){return be(t,s),{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}}function Wa(t,s){return{...pt(t,s),keyConfigured:t.keyConfigured===!0,keySource:typeof t.keySource=="string"?t.keySource:"",currency:typeof t.currency=="string"?t.currency:"",totalBalance:Ae(t.totalBalance),grantedBalance:Ae(t.grantedBalance),toppedUpBalance:Ae(t.toppedUpBalance)}}function ft(t,s){return t==null?null:((typeof t!="object"||Array.isArray(t))&&le(s,"object"),{percent:Ae(t.percent),resetsAt:typeof t.resetsAt=="string"?t.resetsAt:""})}function _a(t,s){return{...pt(t,s),rolling:ft(t.rolling,s+".rolling"),weekly:ft(t.weekly,s+".weekly"),monthly:ft(t.monthly,s+".monthly")}}function Vt(t,s){return{...pt(t,s),label:typeof t.label=="string"?t.label:"",unit:typeof t.unit=="string"?t.unit:"USD",remaining:Ae(t.remaining),maxBudget:Ie(t.maxBudget),spend:Ie(t.spend),index:typeof t.index=="number"&&Number.isFinite(t.index)&&t.index>=0?Math.floor(t.index):null}}const za=new Set(["ok","partial","unknown","error","stale","unsupported","capability_missing"]),Ga=new Set(["off","loading","ok","partial","stale","error"]),bt=["antigravity","claude","codex","kimi","xai","workbuddy"],Jt={antigravity:"Antigravity",claude:"Claude",codex:"Codex",kimi:"Kimi",xai:"xAI",workbuddy:"WorkBuddy"};function Ka(t,s){be(t,s);const o=(i,r="")=>typeof i=="string"?i:r,a=i=>Ie(i),n=i=>i!==null&&typeof i=="object"&&!Array.isArray(i)?{id:o(i.id),label:o(i.label),...a(i.percent)===null?{}:{percent:a(i.percent)},resetsAt:o(i.resetsAt),periodHours:a(i.periodHours),scope:o(i.scope)}:null,l=i=>i!==null&&typeof i=="object"&&!Array.isArray(i)?{unit:o(i.unit,"credits"),used:a(i.used),remaining:a(i.remaining),limit:a(i.limit),fetchedAt:o(i.fetchedAt),packages:Array.isArray(i.packages)?i.packages.filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)).map(r=>({id:o(r.id),label:o(r.label),used:a(r.used),remaining:a(r.remaining),limit:a(r.limit),startsAt:o(r.startsAt),resetsAt:o(r.resetsAt)})):[]}:void 0;return{id:o(t.id),type:"cliproxyapi",label:o(t.label),status:Ga.has(t.status)?t.status:"error",message:o(t.message),fetchedAt:a(t.fetchedAt)??0,attemptedAt:a(t.attemptedAt)??0,serverVersion:o(t.serverVersion),keyConfigured:t.keyConfigured===!0,keySource:o(t.keySource,"none"),accounts:Array.isArray(t.accounts)?t.accounts.filter(i=>i!==null&&typeof i=="object"&&!Array.isArray(i)).slice(0,16).map(i=>({id:o(i.id),provider:o(i.provider,"unknown"),label:o(i.label,"unknown"),status:za.has(i.status)?i.status:"unknown",message:o(i.message),plan:o(i.plan),windows:Array.isArray(i.windows)?i.windows.map(n).filter(Boolean):[],credits:l(i.credits)})):[],unsupportedProviders:Array.isArray(t.unsupportedProviders)?t.unsupportedProviders.filter(i=>typeof i=="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,a]of Object.entries(t.providers)){if(a===null||typeof a!="object"||Array.isArray(a))continue;const n={},l={};if(a.windows!==null&&typeof a.windows=="object"&&!Array.isArray(a.windows))for(const[i,r]of Object.entries(a.windows))r===null||typeof r!="object"||Array.isArray(r)||(n[i]={...Je(r,["percent","localTokens","localCost","sampleCount"],Ae),...Je(r,["sampleAt","per1Tokens","per1Cost","fullTokens","fullCost"],Ie),resetsAt:typeof r.resetsAt=="string"?r.resetsAt:"",method:r.method==="sample"||r.method==="live"?r.method:"none",confidence:r.confidence==="high"||r.confidence==="low"?r.confidence:null});if(a.intervals!==null&&typeof a.intervals=="object"&&!Array.isArray(a.intervals))for(const[i,r]of Object.entries(a.intervals))Array.isArray(r)&&(l[i]=r.filter(u=>u!==null&&typeof u=="object"&&!Array.isArray(u)).map(u=>Je(u,["t0","t1","tokens","cost","pct","per1Tokens","per1Cost"],Ae)));s[o]={windows:n,intervals:l}}return{generatedAt:Ae(t.generatedAt),providers:s}}function $t(t,s){return be(t,s),{today:ge(t.today,s+".today"),month:ge(t.month,s+".month"),total:ge(t.total,s+".total"),budgetUsed:typeof t.budgetUsed=="number"&&Number.isFinite(t.budgetUsed)?t.budgetUsed:void 0,balance:t.balance==null?Qa:Wa(t.balance,s+".balance"),goQuota:t.goQuota==null?Fa:_a(t.goQuota,s+".goQuota"),customBalance:t.customBalance==null?Yt():Vt(t.customBalance,s+".customBalance"),customBalances:Array.isArray(t.customBalances)?t.customBalances.filter(o=>o!==null&&typeof o=="object").map((o,a)=>Vt(o,s+".customBalances["+a+"]")):[],gatewayQuotas:Array.isArray(t.gatewayQuotas)?t.gatewayQuotas.filter(o=>o!==null&&typeof o=="object"&&!Array.isArray(o)).map((o,a)=>Ka(o,s+".gatewayQuotas["+a+"]")):[],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,a])=>[o,{configured:a.configured===!0,source:typeof a.source=="string"?a.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,a)=>ge(o,s+".history["+a+"]")):[],externalUsage:t.externalUsage&&Array.isArray(t.externalUsage.sources)?{fetchedAt:Number(t.externalUsage.fetchedAt)||0,stale:t.externalUsage.stale===!0,sources:t.externalUsage.sources.map(o=>({source:String(o.source),today:ge(o.today,s+".external.today"),month:ge(o.month,s+".external.month"),total:ge(o.total,s+".external.total"),history:(o.history??[]).map(a=>ge(a,s+".external.history"))})),combined:Object.fromEntries(["today","month","total","history"].map(o=>[o,o==="history"?(t.externalUsage.combined.history??[]).map(a=>ge(a,s+".external.history")):ge(t.externalUsage.combined[o],s+".external."+o)]))}:null,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 Va(t,s){be(t,s);const o={ok:t.ok===!0,message:typeof t.message=="string"?t.message:""};return t.state!==void 0&&t.state!==null&&(o.state=$t(t.state,s+".state")),o}function ae(t){return{parse:t}}const gt=ae($t),Ja=ae(t=>be(t,"patch")),$a=ae(Va),Zt=ae(t=>se(t,"provider")),Za=ae(t=>{if(t!=null)return(typeof t!="number"||!Number.isInteger(t)||t<0||t>7)&&le("index","0-7 integer"),t}),Xa=ae(t=>se(t,"date")),en=ae(t=>be(t,"day")),tn=ae(t=>(Number.isFinite(Number(t))||le("limit","number"),Number(t))),Xt=ae(t=>se(t,"sort")),an=ae(t=>be(t,"topSessions")),ea=ae(t=>se(t,"target")),nn=ae(t=>se(t,"value")),xe=(t,s)=>({mode:"strict",typeSymbol:"dsh-cost-meter#"+t,schema:s,create:()=>s}),ie=(t,s,o,a=!1)=>({name:t,wire:t,source:"json",codec:xe(s,o),...a?{acceptsUndefined:!0}:{}}),sn={package:"dsh-cost-meter",descriptors:[{method:"getState",result:xe("CostState",gt)},{method:"updateConfig",parameters:[ie("patch","ConfigPatch",Ja)],result:xe("CostState",gt)},{method:"fetchPrices"},{method:"refreshBalance"},{method:"refreshGoQuota"},{method:"refreshCustomBalance",parameters:[ie("index","CustomBalanceIndex",Za,!0)]},{method:"refreshCodingPlan",parameters:[ie("provider","CodingPlanProvider",Zt)]},{method:"refreshGatewayQuota",parameters:[ie("sourceId","GatewayQuotaSourceId",ae(t=>{if(t!=null)return(typeof t!="string"||t.length>48||!/^[a-z0-9][a-z0-9_-]*$/.test(t))&&le("sourceId","gateway source id"),t}),!0)]},{method:"resetHistory",result:xe("CostState",gt)},{method:"importLegacyHistory"},{method:"getDaySessions",parameters:[ie("date","DayKey",Xa)],result:xe("DayRecord",en)},{method:"getSessionCost",parameters:[ie("sessionId","SessionId",Zt)],result:xe("SessionCost",ae(t=>({own:dt(t.own,"own"),subagents:dt(t.subagents,"subagents"),found:Ce(t.found,"found"),subagentCount:X(t.subagentCount,"subagentCount")})))},{id:"dsh-cost-meter#costMeter/getTurnCost",service:"costMeter",namespace:"costMeter",method:"getTurnCost",invocation:{kind:"direct"},parameters:[ie("sessionId","SessionId",ae(t=>se(t,"sessionId"))),...["startSeq","endSeq"].map(t=>ie(t,"TurnSeq",ae(s=>((!Number.isSafeInteger(s)||s<0)&&le(t,"nonnegative integer"),s))))],result:xe("TurnCost",ae(t=>({found:Ce(t.found,"found"),cost:X(t.cost,"cost"),apiCost:X(t.apiCost,"apiCost"),rows:Kt(t.rows),calls:(Array.isArray(t.calls)?t.calls:le("calls","array")).map(s=>({kind:se(s.kind,"kind"),provider:se(s.provider,"provider"),model:se(s.model,"model"),atMs:X(s.atMs,"atMs"),cost:X(s.cost,"cost"),apiCost:X(s.apiCost,"apiCost"),plan:Ce(s.plan,"plan"),priced:Ce(s.priced,"priced"),longContext:Ce(s.longContext,"longContext"),rows:Kt(s.rows)}))})))},{method:"getTopSessions",parameters:[ie("limit","SessionLimit",tn),ie("sort","SessionSort",Xt,!0),ie("dir","SessionSortDir",Xt,!0)],result:xe("TopSessions",an)},{method:"setCredential",parameters:[ie("target","CredentialTarget",ea),ie("value","CredentialValue",nn)]},{method:"clearCredential",parameters:[ie("target","CredentialTarget",ea)]}].map(t=>({id:"dsh-cost-meter#costMeter/"+t.method,service:"costMeter",namespace:"costMeter",invocation:{kind:"direct"},parameters:[],result:xe("FetchPricesResult",$a),...t}))};function on(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 Ue(t){if(t===null||typeof t!="object")return;const s=i=>{const r=t[i];return typeof r=="number"&&Number.isFinite(r)&&r>=0?r:void 0},o=s("cacheMiss")??s("input")??0,n={cacheHit:s("cacheHit")??s("cachedInput")??s("cacheRead")??o,cacheMiss:o,output:s("output")??0},l=s("reasoning");return l!==void 0&&(n.reasoning=l),s("cacheWrite")!==void 0&&(n.cacheWrite=s("cacheWrite")),n}function ln(t){const s=Ue(t);if(s===void 0)return null;for(const o of["offPeak","peak","legacyBase"]){const a=Ue(t[o]);a!==void 0&&(s[o]=a)}return Number.isFinite(t.longContext?.aboveInputTokens)&&t.longContext.aboveInputTokens>0&&(s.longContext={...Ue(t.longContext),aboveInputTokens:t.longContext.aboveInputTokens}),Array.isArray(t.rateHistory)&&(s.rateHistory=t.rateHistory.slice(0,16).map(o=>{const a={...Ue(o),before:o.before};for(const n of["offPeak","peak"]){const l=Ue(o[n]);l!==void 0&&(a[n]=l)}return a})),s}function $e(t,s=Date.now()){if(!t||!Number.isFinite(s)||!Array.isArray(t.rateHistory))return t;let o=null,a=1/0;for(const i of t.rateHistory){const r=Date.parse(i.before);s<r&&r<a&&(o=i,a=r)}if(!o)return t;const{before:n,...l}=o;return{...t,...l}}const ht=Date.parse("2026-08-22T16:00:00Z");function ta(t){if(!Number.isFinite(t)||t<ht)return null;const s=Math.floor((t+8*36e5)/864e5),o=(s+4)%7;if(o!==6&&o!==0)return null;const a=o===6?s:s-1;return{start:Math.max(a*864e5-8*36e5,ht),end:(a+2)*864e5-8*36e5}}function aa(t,s){if(!Number.isFinite(t)||t<ht||!Array.isArray(s))return null;const o=Math.floor((t+8*36e5)/864e5);return s.includes(new Date(o*864e5).toISOString().slice(0,10))?{start:o*864e5-8*36e5,end:(o+1)*864e5-8*36e5}:null}const rn=(t,s)=>aa(t,s)??ta(t);function Ze(t,s,o,a){if(!Array.isArray(o)||o.length===0||rn(t,a)!==null||Number.isFinite(s)&&t<s)return!1;const n=new Date(t).getUTCHours();return o.some(l=>{const i=Number(l.start),r=Number(l.end);return!Number.isFinite(i)||!Number.isFinite(r)?!1:i<r?n>=i&&n<r:n>=i||n<r})}const cn=Date.parse("2026-08-16T16:00:00Z");function na(t,s,o){const a=$e(t,s)??{cacheHit:0,cacheMiss:0,output:0},n=i=>({cacheHit:i.cacheHit,cacheMiss:i.cacheMiss,output:i.output,reasoning:i.reasoning??0,...i.cacheWrite===void 0?{}:{cacheWrite:i.cacheWrite},...i.longContext===void 0?{}:{longContext:i.longContext}});if(Number.isFinite(s)&&s<cn){const i=a.legacyBase;return n(i===void 0?a:i)}if(o?.enabled!==!0)return n(a);const l=typeof o.effectiveAtMs=="number"&&Number.isFinite(o.effectiveAtMs)?o.effectiveAtMs:void 0;if(Ze(s,l,o.windows,o.holidays)){const i=a.peak;return n(i===void 0?a:i)}if(l!==void 0&&s>=l){const i=a.offPeak;return n(i===void 0?a:i)}return n(a)}function sa(t,s){const o=Math.max(0,Number(t.input)||0),a=Math.max(0,Number(t.output)||0),n=Math.max(0,Number(t.cacheRead)||0),l=Math.max(0,Number(t.cacheWrite)||0),i=Math.max(0,Number(t.reasoning)||0);return s.longContext&&o+n+l>s.longContext.aboveInputTokens&&(s=s.longContext),(o*s.cacheMiss+a*s.output+n*s.cacheHit+l*(s.cacheWrite??s.cacheHit)+i*(s.reasoning??0))/1e6}function oa(t,s,o){const a=Number(t);if(!Number.isFinite(a)||a<0||a===0)return 0;if(s!=="CNY")return a;const n=Number(o);return!Number.isFinite(n)||n<=0?a:a/n}function ne(t,s){const o=t?.barDirections,a=s==="balance"?"remaining":"used";if(o===null||typeof o!="object"||Array.isArray(o))return a;const n=o[s];return n==="remaining"||n==="used"?n:a}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))),a=s==="remaining"?Math.round((100-o)*10)/10:Math.round(o*10)/10;return{width:a,label:a}}const la=(t,s)=>t.toFixed(s).replace(/(\.\d*?[1-9])0+$|\.0+$/,"$1");function re(t,s){const o=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$",a=Number(s?.decimals),n=Math.max(0,Math.min(10,Number.isFinite(a)?Math.floor(a):2));let l=n;return t>0&&t<Math.pow(10,-n)&&(l=n+2),o+la(t,l)}function Y(t,s){const o=Number(s?.exchangeRate),a=t*(Number.isFinite(o)&&o>0?o:1);return re(a,s)}function j(t){const s=Math.max(0,Number(t)||0),o=a=>a>=100?String(Math.round(a)):String(Math.round(a*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 me(t){return String(t??"").toLowerCase().replace(/\([^)]*\)/g," ").replace(/([^)]*)/g," ").replace(/[^a-z0-9]+/g,"")}function Be(t,s){if(typeof t!="string"||t.length===0)return null;const o=Array.isArray(s)?s.filter(c=>typeof c=="string"&&c.length>0):[];if(o.length===0)return null;const a=c=>String(c).toLowerCase().replace(/[-@]\d{4}-?\d{2}-?\d{2}$/,"").replace(/[-@]v\d+(\.\d+)*$/,""),n=o.find(c=>c===t);if(n!==void 0)return n;const l=me(t);if(l.length===0)return null;const i=o.find(c=>me(c)===l);if(i!==void 0)return i;const r=a(t),u=o.find(c=>a(c)===r);if(u!==void 0)return u;const d=/^(?:[-_./:@](?:\d{4}-?\d{2}-?\d{2}|v\d+(?:\.\d+)*|\d+k|latest))+$/;return o.filter(c=>r.startsWith(a(c))&&d.test(r.slice(a(c).length))).sort((c,m)=>m.length-c.length)[0]??null}const dn=new Set(["lmstudio","ollama","jan","gpt4all","koboldcpp","llamacpp","llama-cpp","localai","vllm","sglang","tabbyapi","lmdeploy","oobabooga","text-generation-webui","llama-server"]),un=["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 mn(t,s){if(typeof t=="string"&&dn.has(t))return!0;const o=typeof s=="string"?s.toLowerCase():"";return un.some(a=>o.startsWith(a))}function pn(t,s,o){const a=o?.prices??{},n=o?.priceMatch==="exact"?"exact":"auto",l=o?.priceOverrides&&typeof o.priceOverrides=="object"?o.priceOverrides:{};let i=String(t??"").trim().toLowerCase();i.startsWith("llm-")&&(i=i.slice(4)),i===""&&(i="deepseek");let r=i,u=s;const d=l[i+":"+s];if(d==="__local__")return{entry:null,priced:!1,billingMode:"flat",matched:!0};if(typeof d=="string"&&d.length>0){const p=d.indexOf(":");if(p>0&&d.slice(p+1).length>0?(r=d.slice(0,p).trim().toLowerCase(),u=d.slice(p+1)):u=d,r==="deepseek"&&u==="__default__")return{entry:a.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}if(mn(r,u))return{entry:null,priced:!1,billingMode:"flat",matched:!1};if(r==="deepseek"||r.includes("deepseek")){const p=a.models??{},f=p[u]!==void 0?u:n==="auto"?Be(u,Object.keys(p)):null;if(f!==null)return{entry:p[f],priced:!0,billingMode:"deepseek-peak",matched:!0};if(n==="auto"){let g=null,h=-1,w="flat";for(const[N,P]of Object.entries(a.providers??{})){const x=P?.models??{},b=Be(u,Object.keys(x));if(b===null||x[b]?.unpriced===!0)continue;const y=(b===u||me(b)===me(u)?1e3:0)+me(b).length;y>h&&(g=x[b],h=y,w=x[b]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(g!==null)return{entry:g,priced:!0,billingMode:w,matched:!0}}return{entry:a.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}const c=a.providers?.[r]?.models??{},m=c[u]!==void 0?u:n==="auto"?Be(u,Object.keys(c)):null;if(m!==null)return{entry:c[m],priced:c[m]?.unpriced!==!0,billingMode:"flat",matched:!0};if(r==="opencode-go")return{entry:null,priced:!1,billingMode:"flat",matched:!1};if(n==="auto"){const p=a.models??{},f=Be(u,Object.keys(p));if(f!==null)return{entry:p[f],priced:!0,billingMode:"deepseek-peak",matched:!0};let g=null,h=-1,w="flat";for(const[N,P]of Object.entries(a.providers??{})){if(N===r)continue;const x=P?.models??{},b=Be(u,Object.keys(x));if(b===null||x[b]?.unpriced===!0)continue;const y=(b===u||me(b)===me(u)?1e3:0)+me(b).length;y>h&&(g=x[b],h=y,w=x[b]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(g!==null)return{entry:g,priced:!0,billingMode:w,matched:!0}}if(i!=="deepseek"&&!i.includes("deepseek")&&typeof d=="string"&&d.length>0&&!d.includes(":")){const p=a.models??{},f=p[d]!==void 0?d:n==="auto"?Be(d,Object.keys(p)):null;if(f!==null)return{entry:p[f],priced:!0,billingMode:"deepseek-peak",matched:!0}}return{entry:null,priced:!1,billingMode:"flat",matched:!1}}function yt(t,s,o){const a=pn(t,s,o);return a.priced&&o?.prices?.currency==="CNY"&&a.entry?.cny?{...a,entry:a.entry.cny,currency:"CNY"}:{...a,currency:a.billingMode==="deepseek-peak"&&o?.prices?.currency==="CNY"?"CNY":"USD"}}function fn(t){const s=Number(t?.calls)||0,o=Number(t?.input)||0,a=Number(t?.cacheRead)||0;return s>=3&&o>=1e5&&a===0}function Xe(t,s){return!t||!s?0:typeof t.cost=="number"&&Number.isFinite(t.cost)?t.cost:ra(t,s).total}function kt(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:kt(t)}const bn={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"],mimo:["mimo","xiaomimimo","mimo-token-plan","xiaomi-token-plan","xiaomi-token-plan-cn","xiaomi-token-plan-sgp","xiaomi-token-plan-ams"]},ia=["anthropic","zai","minimax","kimi","openrouter","siliconflow","commandcode","scnet","volcengine","qwen","mimo","go"];function gn(t){const s=String(t??"").trim().toLowerCase().replace(/^llm-/,"");if(s.length===0)return null;for(const[o,a]of Object.entries(bn))if(a.includes(s))return o;return ia.includes(s)?s:null}function hn(t){const s=new Set,o=t?.codingPlans;if(o!==null&&typeof o=="object")for(const a of ia)a!=="go"&&o[a]?.enabled===!0&&s.add(a);return t?.goQuota?.enabled===!0&&s.add("go"),s}function yn(t,s,o){const a=String(t??"").trim().toLowerCase();if(a.length>0&&a!=="deepseek"&&!a.includes("deepseek"))return!1;const n=me(s);if(n.length===0)return!1;const l=o?.prices,i=l?.models??{};for(const r of Object.keys(i))if(me(r)===n)return!1;for(const r of Object.values(l?.providers??{}))for(const u of Object.keys(r?.models??{}))if(me(u)===n)return!0;return!1}function He(t,s,o){let a=gn(t);a===null&&yn(t,s,o)&&(a="go");const n=o?.planBilling?.models;if(n!==null&&typeof n=="object"){const i=n[t+":"+s];if(i==="plan"||i==="api")return i;if(a!==null){const r=n[a+":"+s];if(r==="plan"||r==="api")return r}}if(a===null)return"api";const l=o?.planBilling?.providers?.[a];return l==="plan"||l==="api"?l:hn(o).has(a)?"plan":"api"}function ra(t,s){if(!t||!s)return{total:0,api:0};const o={enabled:s.peakEnabled===!0,effectiveAtMs:Date.parse(s.peakEffectiveAt||""),windows:s.peakWindows,holidays:s.peakHolidays},a=Date.now(),n=t.byProviderModel??t.byModel??{};let l=0,i=0;for(const m of Object.keys(n)){const p=m.indexOf(":"),f=p>0?m.slice(0,p):"deepseek",g=p>0?m.slice(p+1):m,h=yt(f,g,s);if(h.priced){const w=sa(n[m],na(ln(h.entry),a,{...o,enabled:h.billingMode==="deepseek-peak"&&o.enabled})),N=oa(w,h.currency,s.exchangeRate);l+=N,He(f,g,s)==="api"&&(i+=N)}}const r={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0};for(const m of Object.keys(n))r.input+=n[m].input??0,r.output+=n[m].output??0,r.cacheRead+=n[m].cacheRead??0,r.cacheWrite+=n[m].cacheWrite??0,r.reasoning+=n[m].reasoning??0;const u={input:Math.max(0,(t.input??0)-r.input),output:Math.max(0,(t.output??0)-r.output),cacheRead:Math.max(0,(t.cacheRead??0)-r.cacheRead),cacheWrite:Math.max(0,(t.cacheWrite??0)-r.cacheWrite),reasoning:Math.max(0,(t.reasoning??0)-r.reasoning)},d=sa(u,na(on("default",s.prices),a,o)),c=oa(d,s.prices?.currency==="CNY"?"CNY":"USD",s.exchangeRate);return l+=c,i+=c,{total:l,api:i}}function ca(t,s){if(!t||!s)return!1;const o=t.byProviderModel??{};for(const a of Object.keys(o)){const n=a.indexOf(":"),l=n>0?a.slice(0,n):"deepseek",i=n>0?a.slice(n+1):a;if(He(l,i,s)==="plan")return!0}return!1}function wt(t){return(t?.input??0)+(t?.cacheRead??0)+(t?.cacheWrite??0)}function da(t,s){if(t?.apiCost!==void 0)return kt(t);if(!ca(t,s))return Xe(t,s);let o=0;for(const[a,n]of Object.entries(t.byProviderModel??{})){if(!Number.isFinite(n.cost))return ra(t,s).api;const l=a.indexOf(":");He(a.slice(0,l),a.slice(l+1),s)==="plan"&&(o+=n.cost)}return Math.max(0,Xe(t,s)-o)}function xt(t){const s=Math.abs(Math.round(Number(t)||0)),o=Math.floor(s/60),a=s%60;return"UTC"+(Number(t)<0?"-":"+")+o+(a>0?":"+String(a).padStart(2,"0"):"")}function kn(t){const s=t?.meta,o=Number(s?.timezoneOffsetMinutes);if(!Number.isFinite(o))return null;const a=-new Date().getTimezoneOffset();if(a===o)return null;const n=typeof s?.timezone=="string"&&s.timezone.length>0?s.timezone:"";return{hostLabel:n?n+" ("+xt(o)+")":xt(o),browserLabel:xt(a)}}function wn(t){let s=t;const o=new Set;return{getSnapshot:()=>s,subscribe:a=>(o.add(a),()=>{o.delete(a)}),set:a=>{if(a!==s){s=a;for(const n of[...o])n()}}}}const{createElement:e,Fragment:E,useState:L,useEffect:ee,useRef:Me}=qe;function De({target:t,configured:s,source:o,t:a,api:n,placeholder:l,disabled:i}){const[r,u]=L(""),[d,c]=L(!1),[m,p]=L(null),f=i===!0||d,g=async()=>{const w=r.trim();if(!(w.length===0||f)){c(!0),p(null);try{const N=await n.setCredential(t,w);u(""),p({kind:"ok",text:N?.message??a("credentialSave")})}catch(N){p({kind:"err",text:String(N?.message??N)})}finally{c(!1)}}},h=async()=>{if(!f){c(!0),p(null);try{const w=await n.clearCredential(t);u(""),p({kind:"ok",text:w?.message??a("credentialClear")})}catch(w){p({kind:"err",text:String(w?.message??w)})}finally{c(!1)}}};return e("div",{className:"cm-field"},e("input",{className:"cm-input",type:"password",value:r,placeholder:typeof l=="string"?l:"",disabled:f,autoComplete:"off",onChange:w=>u(w.target.value)}),e("div",{className:"cm-buttons"},e("button",{className:"cm-btn small",onClick:g,disabled:f||r.trim().length===0},a(d?"credentialSaving":"credentialSave")),s===!0?e("button",{className:"cm-btn small",onClick:h,disabled:f},a("credentialClear")):null),e("span",{className:"cm-hint"},s===!0?a("credentialConfiguredOf",{source:typeof o=="string"&&o.length>0?o:"unknown"}):a("credentialNotConfigured")),e("span",{className:"cm-hint"},a("credentialInputHint")),It(m))}function xn({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 et({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 ua(t,s){const o=Me(!1),a=Me(""),n=s!==null&&typeof s=="object"?[s.input,s.cacheRead,s.cacheWrite,s.output,s.reasoning,s.cost].map(l=>String(l??0)).join("|"):"";ee(()=>{if(!o.current){o.current=!0,a.current=n;return}if(n===""||n===a.current)return;a.current=n;const l=setTimeout(()=>{t.api?.reload?.()},800);return()=>clearTimeout(l)},[n])}function vn(t,s,o,a){const n=u=>["input","output","cacheRead","cacheWrite"].reduce((d,c)=>d+(u?.[c]??0),0),l=s?.found&&n(s.own)>=n(t)?s.own:t;if(!o||!s?.subagentCount)return l;const i=s.subagents,r={...l};for(const u of["input","output","cacheRead","cacheWrite","reasoning","cost"])r[u]=(l?.[u]??0)+(i?.[u]??0);r.apiCost=da(l,a)+kt(i);for(const u of["byModel","byProviderModel"]){r[u]={...l?.[u]};for(const[d,c]of Object.entries(i?.[u]??{})){const m={...r[u][d]};for(const p of["input","output","cacheRead","cacheWrite","reasoning","cost"])m[p]=(m[p]??0)+(c[p]??0);delete m.apiCost,r[u][d]=m}}return r}function ma(t){const s=t.useProjection?t.useProjection("costUsage"):void 0,o=t.useCost?.(r=>r)?.state,a=o?.config,[n,l]=L(null);ua(t,s),ee(()=>{if(!t.sessionId||!t.api?.getSessionCost)return;let r=!0,u=!1;const d=async()=>{if(!u){u=!0;try{const m=await t.api.getSessionCost(t.sessionId);r&&l({id:t.sessionId,include:a?.includeSubagentCost===!0,value:m})}catch{}finally{u=!1}}};d();const c=a?.includeSubagentCost===!0?setInterval(d,1e4):null;return()=>{r=!1,c!==null&&clearInterval(c)}},[t.sessionId,o?.meta?.now,s,a?.includeSubagentCost]);const i=n&&n.id===t.sessionId&&n.include===(a?.includeSubagentCost===!0)?n.value:null;return{usage:vn(s,i,a?.includeSubagentCost===!0,a),config:a}}function pa(t,s){let o=0,a=Xe(t,s);if(s.showTotalWithPlan!==!0&&(t.apiCost!==void 0||ca(t,s))){const n={total:Xe(t,s),api:da(t,s)};o=Math.max(0,n.total-n.api),o>0&&(a=n.api)}return{cost:a,planPart:o}}function fa(t,s){return Object.entries(t?.byProviderModel??{}).filter(([,o])=>o.input||o.output||o.cacheRead||o.cacheWrite||o.reasoning).map(([o,a])=>o+" "+Y(a.cost,s)).join("; ")}function Nn(t){const s=t.useCost?.(h=>h)?.state?.config,[o,a]=L(null),[n,l]=L(""),i=t.turn?.start?.seq,r=t.turn?.end?.seq,u=t.sessionId,d=JSON.stringify([s?.prices,s?.priceOverrides,s?.priceMatch,s?.planBilling,s?.codingPlans,s?.goQuota?.enabled,s?.peakEnabled,s?.peakEffectiveAt,s?.peakWindows,s?.peakHolidays,s?.exchangeRate]);if(ee(()=>{let h=!0;if(a(null),l(""),!(!u||i==null||r==null))return t.api.getTurnCost(u,i,r).then(w=>{h&&a(w)},w=>{h&&l(String(w.message??w))}),()=>{h=!1}},[u,i,r,d]),!s||i==null||r==null)return null;const c=W(s.locale)==="en",m=c?{input:"Input",output:"Output",cacheRead:"Cache read",cacheWrite:"Cache write",reasoning:"Reasoning"}:{input:"输入",output:"输出",cacheRead:"缓存读取",cacheWrite:"缓存写入",reasoning:"推理"},p=h=>Y(h,{...s,decimals:Math.max(8,s.decimals??2)}),f=c?{model:"Model call",compaction:"Context compaction",search:"Native search"}:{model:"模型调用",compaction:"上下文压缩",search:"原生搜索"},g=(h,w)=>e("div",{key:w,style:{marginBottom:4,overflowWrap:"anywhere"}},h.provider+":"+h.model+" · "+m[h.bucket]+(h.plan?" (Plan)":"")+": "+h.tokens.toLocaleString()+" × "+(h.priced?p(h.rate):"?")+" / 1,000,000 ≈ "+(h.priced?p(h.cost):"?"),h.priced?h.bucket==="reasoning"&&h.rate===0?c?" (no separate charge)":"(不单独收费)":"":c?" (price unavailable)":"(未配置价格)");return e("details",{className:"cm-note",style:{fontSize:12,marginTop:6}},e("summary",{style:{cursor:"pointer"}},c?"Turn cost":"本轮费用",o?.found?" ≈ "+p(s.showTotalWithPlan?o.cost:o.apiCost)+(o.rows.some(h=>!h.priced)?c?" + unpriced usage":" + 未定价用量":""):n?" ⚠":""),n?e("div",{role:"alert"},n):o?o.found?e(E,null,e("p",null,c?"Estimated from recorded usage and configured prices; rates per 1M tokens.":"按已记录用量和配置价格估算;单价单位为每百万 Token。"),e("p",null,"API ≈ "+p(o.apiCost)+" · Plan ≈ "+p(o.cost-o.apiCost)+(c?" (equivalent)":"(等值)")),o.rows.map(g),e("details",null,e("summary",{style:{cursor:"pointer"}},(c?"Individual calls":"逐次调用明细")+" ("+o.calls.length+")"),o.calls.map((h,w)=>e("details",{key:w,style:{margin:"6px 0"}},e("summary",{style:{cursor:"pointer",overflowWrap:"anywhere"}},"#"+(w+1)+" "+f[h.kind]+" · "+h.provider+":"+h.model+" · "+new Date(h.atMs).toLocaleTimeString()+" · "+(h.plan?"Plan ":"API ")+(h.priced?"≈ "+p(h.cost):c?"price unavailable":"未配置价格")+(h.longContext?c?" · long context":" · 长上下文价格":"")),h.rows.map(g))))):c?"Complete usage records unavailable":"没有完整用量记录":c?"Loading…":"加载中…")}function Sn(t){const{usage:s,config:o}=ma(t);if(!s||!o||wt(s)+(s?.output??0)===0)return null;const a=K(W(o.locale)),{cost:n,planPart:l}=pa(s,o),i=[a("sessionCostTitle"),a("sessionDetailTokens",{input:j(s?.input??0),cache:j((s?.cacheRead??0)+(s?.cacheWrite??0)),output:j(s?.output??0)}),a("sessionDetailCache",{read:j(s?.cacheRead??0),write:j(s?.cacheWrite??0)}),a("cost",{amount:Y(n,o)}),...l>0?[a("sessionDetailPlan",{amount:Y(l,o)})]:[],fa(s,o)].filter(Boolean).join("; ");return e($,{label:i,side:"top",delayMs:500},e("div",{className:"cm-chip"},l>0?a("costChipPlan",{amount:Y(n,o)}):a("cost",{amount:Y(n,o)})))}function Cn(t){const{usage:s,config:o}=ma(t);if(!s||!o)return null;const a=s.input??0,n=(s.cacheRead??0)+(s.cacheWrite??0),l=s.output??0;if(a+n+l===0)return null;const i=K(W(o.locale)),{cost:r,planPart:u}=pa(s,o),d=wt(s)>0?((s.cacheRead??0)/wt(s)*100).toFixed(1)+"%":"—";return e("div",{className:"cm-root",title:fa(s,o)},i(u>0?"sessionLineSplit":"sessionLine",{amount:Y(r,o),planAmount:Y(u,o),hitRate:d,input:j(a),cache:j(n),output:j(l)}))}const An={USD:"$",CNY:"¥",EUR:"€"};function ve(t,s,o){const a=typeof o=="string"?o.toUpperCase():"",n=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$";return re(t,{symbol:An[a]??n,decimals:Math.max(2,Math.min(10,Math.floor(Number(s?.decimals)||2)))})}function ba(t,s){const o=Number(t?.balance?.budgetCap);if(Number.isFinite(o)&&o>0)return o;const a=Number(s?.maxBudget);return Number.isFinite(a)&&a>0?a:null}function Mn(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 a=0;for(const[n,l]of Object.entries(o)){const i=n.indexOf(":");let r=i>=0?n.slice(0,i):n;r.startsWith("llm-")&&(r=r.slice(4)),!(r!=="deepseek"&&r!=="deepseek-official")&&(a+=Number(l?.cost)||0)}return a}function ga(t,s,o,a,n=null){const l=o==="official"?Mn(t):Number(t.today?.cost)||0;if(o==="custom"){const r=Qe(s,a,n);if(r==="USD")return l;if(r==="CREDITS")return 0;const u=Number(s?.exchangeRate);return l*(Number.isFinite(u)&&u>0?u:1)}const i=Number(s?.exchangeRate);return l*(Number.isFinite(i)&&i>0?i:1)}function ha({remaining:t,spend:s,todayUsed:o,cap:a}){if(a===null||a<=0)return{remainingPct:100,todayPct:0,spentPct:0,hasCap:!1,pastSpend:0,today:0};const n=Math.max(0,Number(t)||0),l=Math.max(0,Number(s)||0),i=Math.max(0,Math.min(l,Number(o)||0)),r=Math.max(0,l-i),u=Math.max(0,Math.min(100,n/a*100)),d=Math.max(0,Math.min(100-u,i/a*100)),c=Math.max(0,Math.min(100-u-d,r/a*100));return{remainingPct:u,todayPct:d,spentPct:c,hasCap:!0,pastSpend:r,today:i}}function vt(t,s,o=null,a=null){const n=o??t.customBalance,l=ba(Qe(s,n,a)==="CREDITS"?null:s,n),i=Number(n?.remaining)||0,r=Number(n?.spend)||0,u=ga(t,s,"custom",n,a);return{cap:l,...ha({remaining:i,spend:r,todayUsed:u,cap:l})}}function Pn(t,s){const o=t.balance,a=ba(s,null),n=Number(o?.totalBalance)||0,l=ga(t,s,"official",null),i=a!==null?Math.max(0,a-n):0;return{cap:a,...ha({remaining:n,spend:i,todayUsed:l,cap:a})}}function Nt(t){const{segments:s,direction:o="remaining"}=t,{remainingPct:a,todayPct:n,spentPct:l}=s,i=[];a>0&&i.push(e("div",{className:"cm-bbox-fill",style:{width:a+"%"}})),n>0&&i.push(e("div",{className:"cm-bbox-seg-today",style:{width:n+"%"}})),l>0&&i.push(e("div",{className:"cm-bbox-seg-spent",style:{width:l+"%"}})),i.length===0&&i.push(e("div",{className:"cm-bbox-fill",style:{width:"100%"}}));const r=o==="used"?[...i].reverse():i;return e("div",{className:"cm-bbox-bar segments"+(o==="used"?" rev":"")},...r)}function ya(t,s,o,a,n){const l=[t("balanceBarRemaining",{amount:a})];return o.today>0&&l.push(t("balanceBarToday",{amount:s(o.today)})),o.pastSpend>0&&l.push(t("balanceBarSpent",{amount:s(o.pastSpend)})),n!==null&&n>0&&l.push(t("balanceBudgetCapLabel")+": "+s(n)),l.join(" · ")}function Pe(t){const[s,o]=L(!1),[a,n]=L(null);return{busy:s,err:a,run:()=>{s||typeof t!="function"||(o(!0),n(null),Promise.resolve().then(t).catch(i=>{n(i?.message??String(i))}).finally(()=>{o(!1)}))}}}const pe=(t,s)=>({role:"button",tabIndex:0,"aria-busy":t?"true":"false",onClick:s,onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),s())}});function he(t,s){const o=[t("clickToRefresh")];return s.busy&&o.push(t("refreshing")),s.err&&o.push("⚠ "+t("balanceRefreshFailed",{message:s.err})),o}const Tn="https://platform.deepseek.com/usage";function ka(t){return e("a",{className:"cm-bal-link",href:Tn,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 On(t){const{state:s,wide:o,api:a}=t,n=s.balance,l=K(W(s.config?.locale)),i=Pe(a?()=>a.refreshBalance():null);if(!n||n.status==="off")return null;if(n.status==="error")return e($,{label:[l("balanceQueryFailed",{message:n.message||l("unknownError")}),...he(l,i)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(i.busy?" busy":""),...pe(i.busy,i.run)},o?e(E,null,l("balance")," ",e("span",{className:"cm-num"},l("queryFailed"))):"⚠"));const r=[l("balanceTitle"),l("totalBalance",{amount:ve(n.totalBalance,s.config,n.currency)}),l("grantedToppedUp",{granted:ve(n.grantedBalance,s.config,n.currency),toppedUp:ve(n.toppedUpBalance,s.config,n.currency)}),l("updatedAt",{time:n.fetchedAt>0?new Date(n.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...he(l,i)].join("; ");return e($,{label:r,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(i.busy?" busy":""),...pe(i.busy,i.run)},o?e(E,null,e("span",{className:"cm-balance-name"},l("balance"),ka(l)),e("span",{className:"cm-num cm-bal-amt"},ve(n.totalBalance,s.config,n.currency)),s.reconcile?.ok===!1?" ⚠":""):e(et,{size:16})))}function Dn(t){const{state:s,wide:o,api:a}=t,n=s.config,l=s.balance,i=K(W(n?.locale)),r=Pe(a?()=>a.refreshBalance():null);if(!l||l.status!=="ok")return null;const u=Pn(s,n),d=ve(l.totalBalance,n,l.currency),c=f=>ve(f,n,l.currency),m=[i("balanceTitle"),ya(i,c,u,d,u.cap),i("grantedToppedUp",{granted:ve(l.grantedBalance,n,l.currency),toppedUp:ve(l.toppedUpBalance,n,l.currency)}),i("updatedAt",{time:l.fetchedAt>0?new Date(l.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...he(i,r)].join("; "),p=e(E,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-balance-name"},e("span",{className:"cm-bbox-label"},i("balance")),ka(i)),e("span",{className:"cm-bbox-pct cm-num cm-bal-amt"},d)),e(Nt,{segments:u,direction:ne(n,"balance")}));return e($,{label:m,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(o?"":" rail")+(r.busy?" busy":""),...pe(r.busy,r.run)},o?p:e("div",{className:"cm-bbox-rail cm-num"},Math.round(u.remainingPct)+"%")))}function St(t,s){const o=typeof t?.label=="string"?t.label:"",a=typeof t?.labelEn=="string"?t.labelEn:"";return s==="en"?a||o||"Custom balance":o||a||"自定义余额"}function Qe(t,s,o){if((o??t?.customBalance)?.adapter==="aliyun"&&["CNY","USD","EUR"].includes(s?.unit))return s.unit;const a=o?.unit??t?.customBalance?.unit;return["CNY","EUR","USD","CREDITS"].includes(a)?a:["CNY","EUR","CREDITS"].includes(s?.unit)?s.unit:"USD"}function Fe(t,s,o,a){const n=Qe(s,o,a),l=Number(t);if(!Number.isFinite(l))return"—";const i=s?.currency==="USD"?1:Number(s?.exchangeRate);if((a??s?.customBalance)?.convertToDisplayCurrency===!0&&n==="USD"&&Number.isFinite(i)&&i>0){const c=l*i;return Number.isFinite(c)?re(c,s):"—"}const r=n==="CREDITS",u=Math.max(2,Math.min(6,Math.floor(Number(s?.decimals)||4)));return(r?"":n==="CNY"?"¥":n==="EUR"?"€":"$")+la(l,u)+(r?" Credits":"")}function Ct(t,s,o,a,n=null){const l=Fe(t.remaining,s,t,n),i=p=>Fe(p,s,t,n);if(a&&s.balance?.showProgressBar===!0){const p=vt(a,s,t,n);return[ya(o,i,p,l,p.cap),o("updatedAt",{time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"})].join(" · ")}const r=t.spend!==null?i(t.spend):"—",u=t.maxBudget!==null?i(t.maxBudget):"—",d=Qe(s,t,n)==="CREDITS"?NaN:Number(s?.balance?.budgetCap),c=Number.isFinite(d)&&d>0?o("balanceBudgetCapLabel")+": "+i(d):"",m=t.maxBudget!==null&&t.spend!==null?o("customBalanceLine",{remaining:l,spend:r,maxBudget:u,time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"}):o("customBalanceRemaining",{amount:l});return c?m+" · "+c:m}function Bn(t,s,o,a,n){const l=St(n??s.customBalance??{},W(s?.locale)),i=Fe(a.remaining,s,a,n),r=vt(t,s,a,n);return{level:"ok",rail:Math.round(r.remainingPct)+"%",body:e(E,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"},i)),e(Nt,{segments:r,direction:ne(s,"balance")}))}}function At(t,s){const o=s?.customBalances??[],a=Array.isArray(t?.customBalances)?t.customBalances:[],n=[];return o.forEach((l,i)=>{if(l?.enabled!==!0||l.display!=="sidebar"&&l.display!=="both")return;const r=a.find(u=>u.index===i)??(a.length===1&&o.length===1?a[0]:null);n.push({index:i,entry:l,snapshot:r})}),n.length===0&&a.length===0&&s?.customBalance?.enabled===!0&&(s.customBalance.display==="sidebar"||s.customBalance.display==="both")&&t?.customBalance?.status&&t.customBalance.status!=="off"&&n.push({index:null,entry:s.customBalance,snapshot:t.customBalance}),n}function Rn(t){const{state:s,wide:o,api:a}=t,n=s.config,l=K(W(n?.locale)),i=At(s,n);return i.length===0?null:e(E,null,i.map(({index:r,entry:u,snapshot:d})=>e(Ln,{key:"cb-"+r,state:s,wide:o,api:a,t:l,index:r,entry:u,snapshot:d})))}function Ln(t){const{state:s,wide:o,api:a,t:n,index:l,entry:i,snapshot:r}=t,u=s.config;if(r==null||r.status!=="ok")return null;const d=Pe(a?()=>a.refreshCustomBalance(l):null),c=Bn(s,u,n,r,i),m=[Ct(r,u,n,s,i),...he(n,d)].join(" · ");return e($,{label:m,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(c.level==="ok"?"":" "+c.level)+(o?"":" rail")+(d.busy?" busy":""),...pe(d.busy,d.run)},o?c.body:e("div",{className:"cm-bbox-rail cm-num"},c.rail)))}function En(t){const{state:s,wide:o,api:a}=t,n=s.config,l=K(W(n?.locale)),i=At(s,n);return i.length===0?null:e(E,null,i.map(({index:r,entry:u,snapshot:d})=>e(qn,{key:"cbr-"+r,state:s,wide:o,api:a,t:l,index:r,entry:u,snapshot:d})))}function qn(t){const{state:s,wide:o,api:a,t:n,index:l,entry:i,snapshot:r}=t,u=s.config,d=r??Yt(l);if(d.status==="off")return null;const c=Pe(a?()=>a.refreshCustomBalance(l):null),m=St(i??u.customBalance??{},W(u?.locale));if(d.status==="error")return e($,{label:[d.message||n("unknownError"),...he(n,c)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(c.busy?" busy":""),...pe(c.busy,c.run)},o?e(E,null,e("span",{className:"cm-bal-label",title:m},m),e("span",{className:"cm-num cm-bal-amt"},n("queryFailed"))):"⚠"));const p=Fe(d.remaining,u,d,i),f=[Ct(d,u,n,s,i),...he(n,c)].join(" · ");return e($,{label:f,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(c.busy?" busy":""),...pe(c.busy,c.run)},o?e(E,null,e("span",{className:"cm-bal-label",title:m},m),e("span",{className:"cm-num cm-bal-amt"},p)):e(et,{size:16})))}function jn(t){const o=(t.useCost?t.useCost(g=>g):void 0)?.state;if(!o)return null;const a=o.config,n=K(W(a?.locale)),l=a.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},i=o.goQuota,r=a?.goQuota?.enabled!==!1&&i?.status==="ok",u=g=>g!==null&&typeof g?.percent=="number"?Math.round(Math.max(0,Math.min(100,g.percent))):null,d=[];if(a.sidebarModels?.dock){const g=Ta(o,a.sidebarModels.period,n);g.length&&d.push({key:"model-top",text:e(E,null,e("span",{className:"cm-bal-label"},g[0].label),e("span",{className:"cm-bal-amt"},Y(g[0].cost,a))),tip:g[0].label+" "+Y(g[0].cost,a),level:"ok"})}const c=(g,h,w,N)=>{if(!l.enabled||!g||!r)return;const P=u(h);if(P===null)return;const x=typeof h.resetsAt=="string"&&h.resetsAt.length>0?n("goResetAt",{time:new Date(h.resetsAt).toLocaleString()}):"";d.push({key:w,text:n(w)+" "+P+"%",tip:n(N)+": "+P+"%"+(x?" · "+x:""),level:P>=100?"over":P>=80?"warn":"ok"})},m=a?.goQuota?.main==="weekly"||a?.goQuota?.main==="monthly"?a.goQuota.main:"rolling",p=[m,...["rolling","weekly","monthly"].filter(g=>g!==m)],f=g=>g==="rolling"?["goRolling",i?.rolling,"goShortRolling","cornerGoRolling"]:g==="weekly"?["goWeekly",i?.weekly,"goShortWeekly","cornerGoWeekly"]:["goMonthly",i?.monthly,"goShortMonthly","cornerGoMonthly"];for(const g of p){const[h,w,N,P]=f(g);c(l[h]===!0,w,N,P)}if(l.enabled&&l.budget===!0){const g=a.budget??{enabled:!1,amount:100,period:"month"};if(g.enabled===!0){const h=Number(a.exchangeRate),N=(o.budgetUsed??(g.period==="day"?_(o.today,a):g.period==="all"?_(o.total,a):_(o.month,a)))*(Number.isFinite(h)&&h>0?h:1),P=Math.max(0,Number(g.amount)||0),x=P>0?Math.min(999,N/P*100):null;if(x!==null){const b=x>=100?"over":x>=80?"warn":"ok";d.push({key:"budget",text:n("budgetShort")+" "+x.toFixed(1)+"%",tip:n("budgetOf",{period:n(je[g.period]??"periodMonth")})+" · "+n("usedOf",{used:re(N,a),amount:re(P,a)}),level:b})}}}return d.length===0?null:e("div",{className:"cm-corner"},d.map(g=>e($,{key:g.key,label:g.tip,side:"top",delayMs:500},e("span",{className:"cm-corner-chip"+(g.key==="model-top"?" cm-model-top":"")+(g.level==="ok"?"":" "+g.level)},g.text))))}function tt(t,s,o){if(!Array.isArray(s)||s.length===0||!Number.isFinite(t))return null;const a=(p,f)=>{const g=new Date(t);return g.setUTCDate(g.getUTCDate()+p),g.setUTCHours(f,0,0,0),g.getTime()},n=new Set,l=Math.max(12,Math.min(380,(Array.isArray(o)?o.length:0)+7));for(let p=-l;p<=l;p+=1){n.add(a(p,16));for(const f of s){const g=Number(f?.start),h=Number(f?.end);!Number.isFinite(g)||!Number.isFinite(h)||(n.add(a(p,g)),n.add(a(h<=g?p+1:p,h)))}}const i=[...n].sort((p,f)=>p-f).flatMap(p=>{const f=Ze(p-1,void 0,s,o),g=Ze(p,void 0,s,o);return f===g?[]:[{at:p,intoPeak:g}]});let r=null,u=null;for(const p of i)p.at<=t&&(r===null||p.at>r.at)&&(r=p),p.at>t&&(u===null||p.at<u.at)&&(u=p);const d=aa(t,o),c=d??ta(t);return c!==null?u===null?null:{inPeak:!1,weekend:d===null,...d?{holiday:!0}:{},prevAtMs:c.start,nextAtMs:u.at,nextIntoPeak:u.intoPeak}:r===null||u===null?null:{inPeak:Ze(t,void 0,s,o),weekend:!1,prevAtMs:r.at,nextAtMs:u.at,nextIntoPeak:u.intoPeak}}function at(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 a=Array.isArray(t.peakWindows)?t.peakWindows:[];return tt(s,a,t.peakHolidays)}function nt(t){return t.holiday===!0?{short:"holidayShort",chip:"holidayChip",notice:"holidayAllOffPeak"}:t.weekend===!0?{short:"weekendShort",chip:"weekendChip",notice:"weekendAllOffPeak"}:t.inPeak?{short:"peakShort",chip:"peakShort",notice:"peakNotice"}:{short:"offPeakShort",chip:"offPeakShort",notice:"offPeakActive"}}function ye(t,s,o){const a=Math.max(0,t.nextAtMs-s),n=Math.max(1,Math.ceil(a/6e4)),l=Math.floor(n/60),i=n%60;return l>0?i>0?o("countdownHourMinute",{h:l,m:i}):o("countdownHoursOnly",{h:l}):o("countdownMinute",{m:n})}const Mt="cm-peak-alert-preview";let wa=0;function In(t){const s=t.useCost?t.useCost(h=>h):void 0,o=s?.state?.config,[a,n]=L(Date.now()),[l,i]=L(null),[r,u]=L(null);if(ee(()=>{const h=window.setInterval(()=>n(Date.now()),1e4);return()=>window.clearInterval(h)},[]),ee(()=>{const h=w=>{const N=w.detail?.kind==="offpeak"?"offpeak":"peak";u(N);const P=s?.state?.config;if(P?.peakAlertWebNotify===!0&&window.Notification&&Notification.permission==="granted"){const x=K(W(P.locale));try{new Notification(x(N==="peak"?"peakAlertTitlePeak":"peakAlertTitleOffPeak")+x("peakAlertPreviewTag"),{body:x("peakAlertBody",{time:x("countdownMinute",{m:2}),phase:x(N==="peak"?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}}};return window.addEventListener(Mt,h),window.__cmPeakAlertLive=!0,()=>{window.removeEventListener(Mt,h),window.__cmPeakAlertLive=!1}},[]),ee(()=>{if(!o||o.peakAlertEnabled!==!0||o.peakEnabled!==!0||o.peakAlertWebNotify!==!0||!window.Notification||Notification.permission!=="granted")return;const h=tt(a,Array.isArray(o.peakWindows)?o.peakWindows:[],o.peakHolidays);if(h===null)return;const w=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",N=h.nextIntoPeak===!0;if(w!=="both"&&w!==(N?"peak":"offpeak"))return;const P=Number(o.peakAlertAhead),x=(Number.isFinite(P)&&P>=1?P:2)*6e4;if(a<h.nextAtMs-x||a>=h.nextAtMs||wa===h.nextAtMs)return;const b=K(W(o.locale));wa=h.nextAtMs;try{new Notification(b(N?"peakAlertTitlePeak":"peakAlertTitleOffPeak"),{body:b("peakAlertBody",{time:ye(h,a,b),phase:b(N?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}},[a]),!o||o.peakEnabled!==!0)return null;let d=null;if(o.peakAlertEnabled===!0){const h=Date.parse(o.peakEffectiveAt||"");if(!(Number.isFinite(h)&&a<h)){const w=tt(a,Array.isArray(o.peakWindows)?o.peakWindows:[],o.peakHolidays);if(w!==null){const N=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",P=Number(o.peakAlertAhead),x=(Number.isFinite(P)&&P>=1?P:2)*6e4;(N==="both"||N===(w.nextIntoPeak?"peak":"offpeak"))&&a>=w.nextAtMs-x&&a<w.nextAtMs&&l!==w.nextAtMs&&(d=w)}}}let c=null,m=!1,p=null;if(d!==null)c=d,m=d.nextIntoPeak===!0,p=()=>i(d.nextAtMs);else if(r!==null)c={nextAtMs:a+2*6e4,nextIntoPeak:r==="peak"},m=r==="peak",p=()=>u(null);else return null;const f=K(W(o.locale)),g=o.peakAlertPosition==="center"?"cm-peak-alert-center":"cm-peak-alert-corner";return e("div",{className:"cm-peak-alert "+g+" "+(m?"cm-peak-alert-peak":"cm-peak-alert-offpeak"),role:"alert"},e("div",{className:"cm-peak-alert-badge"},f(m?"peakAlertBadgePeak":"peakAlertBadgeOffPeak")),e("div",{className:"cm-peak-alert-title"},f(m?"peakAlertTitlePeak":"peakAlertTitleOffPeak")),e("div",{className:"cm-peak-alert-body"},f("peakAlertBody",{time:ye(c,a,f),phase:f(m?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})),e("div",{className:"cm-peak-alert-actions"},e("button",{className:"cm-btn",onClick:p},f("peakAlertBtn"))))}function Un(t){const{config:s,t:o}=t,[a,n]=L(Date.now());ee(()=>{const u=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(u)},[]);const l=at(s,a);if(l===null)return null;const i=nt(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ye(l,a,o)}):o("nextOffPeakIn",{time:ye(l,a,o)});return e($,{label:o(i.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-strip "+(l.weekend||l.holiday?"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||l.holiday?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-chip"},o(i.chip)+" · "+r)))}function Hn(t){const{config:s,t:o}=t,[a,n]=L(Date.now());ee(()=>{const u=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(u)},[]);const l=at(s,a);if(l===null)return null;const i=nt(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ye(l,a,o)}):o("nextOffPeakIn",{time:ye(l,a,o)});return e($,{label:o(i.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-classic "+(l.weekend||l.holiday?"weekend":l.inPeak?"peak":"off")},e("div",{className:"cm-peak-classic-marker",style:{left:l.weekend||l.holiday?"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(i.chip)+" · "+r)))}function st(t,s,o){return e(s?.peakStyle==="classic"?Hn:Un,{config:s,t:o})}function Qn(t){const{config:s,t:o}=t,[a,n]=L(Date.now());ee(()=>{const d=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(d)},[]);const l=at(s,a);if(l===null)return null;const i=nt(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ye(l,a,o)}):o("nextOffPeakIn",{time:ye(l,a,o)}),u=[o(i.notice),r];return e($,{label:u,side:"right",delayMs:300},e("div",{className:"cm-peak-rail "+(l.weekend||l.holiday?"weekend":l.inPeak?"peak":"off"),"aria-label":u.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||l.holiday?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-label"},o(i.short))))}function Fn(t){const{config:s,t:o}=t,[a,n]=L(Date.now());ee(()=>{const d=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(d)},[]);const l=at(s,a);if(l===null)return null;const i=nt(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ye(l,a,o)}):o("nextOffPeakIn",{time:ye(l,a,o)}),u=[o(i.notice),r];return e($,{label:u,side:"right",delayMs:300},e("div",{className:"cm-peak-rail-classic "+(l.weekend||l.holiday?"weekend":l.inPeak?"peak":"off"),"aria-label":u.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||l.holiday?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-classic-label"},o(i.short))))}function Wn(t,s,o){return e(s?.peakStyle==="classic"?Fn:Qn,{config:s,t:o})}function xa(t,s,o){const a=t.today,n=s.budget??{enabled:!1,amount:100,period:"month"},l=Number(s.exchangeRate),r=(t.budgetUsed??(n.period==="day"?_(t.today,s):n.period==="all"?_(t.total,s):_(t.month,s)))*(Number.isFinite(l)&&l>0?l:1),u=Math.max(0,Number(n.amount)||0),d=u>0?Math.min(999,r/u*100):null,c=ue(d===null?null:Math.min(100,d),ne(s,"budget")),m=_(a,s)*(Number.isFinite(l)&&l>0?l:1),p=u>0?Math.min(999,m/u*100):null,f=n.detail!==!1;return{level:d===null?"ok":d>=100?"over":d>=80?"warn":"ok",rail:c.label===null?"—":Math.round(c.label)+"%",body:e(E,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("budget")),e("span",{className:"cm-bbox-pct cm-num"},c.label===null?"—":c.label.toFixed(1)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:c.width+"%"}})),f?e(E,null,s.hideTodayCost===!0?null:e("div",{className:"cm-bbox-line cm-num"},s.sidebarTodayMetric==="tokens"?o("today")+" "+Bt(a,s,o):o("todayShare",{amount:Y(_(a,s),s),pct:p===null?"—":p.toFixed(1)+"%"})),e("div",{className:"cm-bbox-line cm-num"},o("usedOf",{used:re(r,s),amount:re(u,s)}))):null,st(t,s,o))}}function va(t,s,o){const a=t.goQuota,n=s?.goQuota?.main==="weekly"||s?.goQuota?.main==="monthly"?s.goQuota.main:"rolling",l=a[n],i=l!==null&&typeof l?.percent=="number"?Math.max(0,Math.min(100,Number(l.percent)||0)):0,r=f=>f!==null&&typeof f?.percent=="number"?Math.round(Math.max(0,Math.min(100,f.percent)))+"%":"—",u=f=>o(f==="rolling"?"goShortRolling":f==="weekly"?"goShortWeekly":"goShortMonthly"),d=["rolling","weekly","monthly"].filter(f=>f!==n),c=l!==null&&typeof l?.resetsAt=="string"&&l.resetsAt.length>0?o("goResetAt",{time:new Date(l.resetsAt).toLocaleString()}):"",m=s?.goQuota?.detail!==!1,p=ue(i,ne(s,"go"));return{level:i>=100?"over":i>=80?"warn":"ok",rail:p.label===null?"—":Math.round(p.label)+"%",body:e(E,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("goQuotaRowLabel")+" "+u(n)),e("span",{className:"cm-bbox-pct cm-num"},p.label===null?"—":Math.round(p.label)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:p.width+"%"}})),m?e(E,null,e("div",{className:"cm-bbox-line cm-num"},d.map(f=>u(f)+" "+r(a[f])).join(" · ")),c?e("div",{className:"cm-bbox-line"},c):null):null)}}function _n(t){const{state:s,wide:o}=t,a=s.goQuota,n=K(W(s.config?.locale));if(!a||a.status!=="ok")return null;const l=s.config?.goQuota?.main==="weekly"||s.config?.goQuota?.main==="monthly"?s.config.goQuota.main:"rolling";if(a[l]===null||typeof a[l]?.percent!="number")return null;const i=va(s,s.config,n),r=[n("goQuotaTitle"),n("goWindowRolling")+": "+(a.rolling===null?"—":Math.round(a.rolling.percent)+"%"),n("goWindowWeekly")+": "+(a.weekly===null?"—":Math.round(a.weekly.percent)+"%"),n("goWindowMonthly")+": "+(a.monthly===null?"—":Math.round(a.monthly.percent)+"%"+(a.monthly!==null&&typeof a.monthly.resetsAt=="string"&&a.monthly.resetsAt.length>0?" · "+n("goResetAt",{time:new Date(a.monthly.resetsAt).toLocaleString()}):"")),n("goQuotaFetchedAt",{time:a.fetchedAt>0?new Date(a.fetchedAt).toLocaleTimeString():"—"})].join("; ");return e($,{label:r,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(i.level==="ok"?"":" "+i.level)+(o?"":" rail")},o?i.body:e("div",{className:"cm-bbox-rail cm-num"},i.rail)))}function zn(t){return t===null||typeof t!="object"||t.unlimited||typeof t.percent!="number"?null:Math.max(0,Math.min(100,Math.round(Number(t.percent)||0)))}function We(t){const s=t!==null&&typeof t=="object"?t:{};return{five:s["5h"]??null,seven:s["7d"]??s.week??s.weekly??null}}function Na(t,s,o=Date.now()){if(typeof t!="string"||!t)return"";const a=Date.parse(t);if(!Number.isFinite(a))return"";const n=a-o;if(n<=0)return s("resetReached");const l=Math.ceil(n/6e4),i=Math.floor(l/1440),r=Math.floor(l%1440/60),u=l%60;return i>0?s("resetDays",{d:i,h:r}):r>0?s("resetHours",{h:r,m:u}):s("resetMinutes",{m:u})}function _e(t,s,o=Date.now()){const a=Na(t?.resetsAt,s,o);return a?s("goResetAt",{time:new Date(t.resetsAt).toLocaleString()})+" ("+a+")":""}function ot(t,s,o){return t===null?"—":o(s==="remaining"?"quotaRemaining":"quotaUsed",{pct:t})}function lt(t){const[,s]=L(0),o=()=>s(Date.now());return ee(()=>{if(!t)return;const a=setInterval(o,6e4);return()=>clearInterval(a)},[t]),{onMouseEnter:o,onFocus:o}}function ze(t,s,o,a){const n=zn(s),l=n===null?"ok":n>=100?"over":n>=80?"warn":"ok",i=ue(n,o),r=s?.unlimited?"∞":i.label===null?"—":i.label+"%";return{level:l,pct:n,text:r,label:i.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:i.width+"%"}})),e("span",{className:"cm-bbox-pct cm-num"},r))}}function Sa(t){const{five:s,seven:o,fetchedAt:a,t:n,wide:l,refresh:i,direction:r="used"}=t,u=lt(s?.resetsAt),d=Na(s?.resetsAt,n),c=ze(n("codingPlanRemain5h"),s,r,n),m=ze(n("codingPlanRemain7d"),o,r,n),p=c.level==="over"||m.level==="over"?"over":c.level==="warn"||m.level==="warn"?"warn":"ok",f=(N,P,x)=>{const b=P?.unlimited?n("quotaUnlimited"):ot(x.label,r,n),S=_e(P,n);return N+" "+b+(S?" · "+S:"")},g=[n("codingPlanMinimaxTitle"),f(n("codingPlanRemain5h"),s,c),f(n("codingPlanRemain7d"),o,m),a>0?n("goQuotaFetchedAt",{time:new Date(a).toLocaleTimeString()}):null,...i?he(n,i):[]].filter(Boolean).join(`
|
|
3
|
-
`),h=e(E,null,e("div",{className:"cm-mm-title"},n("codingPlanMinimaxTitle")),c.row,m.row,d?e("div",{className:"cm-mm-reset"},"5h · "+d):null),
|
|
4
|
-
`),p=e(E,null,e("div",{className:"cm-mm-title"},n("codexQuotaTitle")),c.row),
|
|
5
|
-
`),N=m.map(([,
|
|
6
|
-
`),R=b.map((D,G)=>D.text!=null?e("div",{key:G,className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},D.name),e("span",{className:"cm-mm-text cm-num"},D.text)):e(E,{key:G},D.view.row)),M=D=>{if(!D.key||D.key==="Enter"||D.key===" "){D.stopPropagation(),D.preventDefault?.();const G=a.accounts[(h+1)%a.accounts.length];es(o.id,G.id),d({source:o.id,id:G.id})}},I=p?e("span",{className:"cm-gw-switcher","aria-label":r("gatewaySwitchAccount",{account:N||h+1}),onClick:M,onKeyDown:M,role:"button",tabIndex:0},`${h+1}/${a.accounts.length} ⇄`):null,k=p?e("div",{className:"cm-bbox-head"},e("div",{className:"cm-mm-title"},o.label||o.id),I):e("div",{className:"cm-mm-title"},o.label||o.id),U=p&&N?e("div",{className:"cm-gw-sub"},N):null,ce=e(E,null,k,U,...R),ke=b.filter(D=>D.view).map(D=>D.view.label).filter(D=>D!==null),Ne=ke.length>0?ke.slice(0,2).map(D=>D+"%").join(" "):b[0].text??"—",O=e("div",{className:"cm-bbox-rail cm-num"},Ne);return e($,{label:e("span",{style:{whiteSpace:"pre-line"}},A),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(S==="ok"?"":" "+S)+(l===!1?" rail":"")+(c.busy?" busy":""),...pe(c.busy,c.run)},l===!1?e(E,null,O,I):ce))}function as(t,s,o,a){const n=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:[],l=[];for(const i of s.gatewayQuotas?.sources??[]){if(i.enabled===!1||i.display!=="sidebar"&&i.display!=="both")continue;const r=n.find(u=>u.id===i.id);!r||r.status!=="ok"&&r.status!=="partial"&&r.status!=="stale"||r.accounts.length===0||l.push(e(ts,{source:i,snapshot:r,state:t,wide:o,api:a}))}return l}const ns={anthropic:"Claude",zai:"Z.ai",minimax:"MM",kimi:"Kimi",openrouter:"OR",siliconflow:"SF",commandcode:"CC",scnet:"SCNet",volcengine:"Ark",qwen:"Qwen",mimo:"MiMo"};function ss(t){const s=t.useCost?t.useCost(g=>g):void 0;Tt(s?.state?.config?.codexQuotaEnabled===!0);const[o,a]=L(null),[n,l]=L({}),i=s?.state,r=t.api;if(!i)return null;const u=i.config,d=u.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};if(d.enabled!==!0)return null;const c=K(W(u?.locale)),m=[];if(d.budget!==!1){const g=u.budget??{enabled:!1,amount:100,period:"month"};if(g.enabled===!0){const h=Number(u.exchangeRate),N=(i.budgetUsed??(g.period==="day"?_(i.today,u):g.period==="all"?_(i.total,u):_(i.month,u)))*(Number.isFinite(h)&&h>0?h:1),P=Math.max(0,Number(g.amount)||0);if(P>0){const x=Math.min(999,N/P*100),b=x>=100?"over":x>=80?"warn":"ok";m.push({key:"budget",label:c("budgetShort"),level:b,tip:c("budgetOf",{period:c(je[g.period]??"periodMonth")})+" · "+c("usedOf",{used:re(N,u),amount:re(P,u)})+" · "+x.toFixed(1)+"%",segs:[{name:"main",pct:Math.round(ue(Math.min(100,x),ne(u,"budget")).width)}]})}}}if(d.go!==!1){const g=i.goQuota;if(u?.goQuota?.enabled!==!1&&g?.status==="ok"){const h=u.goQuota.main==="weekly"||u.goQuota.main==="monthly"?u.goQuota.main:"rolling",w=h==="rolling"?g.rolling:h==="weekly"?g.weekly:g.monthly;if(w!==null&&typeof w=="object"&&typeof w.percent=="number"){const N=Math.max(0,Math.min(100,Math.round(Number(w.percent)||0))),P=N>=100?"over":N>=80?"warn":"ok",x=typeof w.resetsAt=="string"&&w.resetsAt.length>0?" · "+c("goResetAt",{time:new Date(w.resetsAt).toLocaleString()}):"";m.push({key:"go",label:"Go "+c(h==="rolling"?"goShortRolling":h==="weekly"?"goShortWeekly":"goShortMonthly"),level:P,tip:"Go: "+N+"%"+x,segs:[{name:"main",pct:Math.round(ue(N,ne(u,"go")).width)}]})}}}if(d.plans!==!1)for(const g of Le){const h=i.codingPlans?.[g.id];if(u.codingPlans?.[g.id]?.enabled!==!0||!h||h.status!=="ok")continue;const w=h.windows!==null&&typeof h.windows=="object"?h.windows:{},N=Object.entries(w);if(N.length===0)continue;const P=ns[g.id]??g.id,x=[],b=[];let S=0,y=0;for(const[T,A]of N){const R=Ot(T,c),M=typeof A?.resetsAt=="string"&&A.resetsAt.length>0?" · "+c("goResetAt",{time:new Date(A.resetsAt).toLocaleString()}):"",I=A!==null&&typeof A=="object"&&typeof A.percent=="number"?Math.max(0,Math.min(100,Math.round(Number(A.percent)||0))):null;if(b.push(R+" "+(I===null?typeof A?.text=="string"?A.text:"—":I+"%")+M),I===null){x.push({name:T,pct:null,text:typeof A?.text=="string"?A.text:"—"});continue}y>=2||(y+=1,x.push({name:T,pct:Math.round(ue(I,ne(u,"plan")).width)}),S=Math.max(S,I>=100?2:I>=80?1:0))}h.fetchedAt>0&&b.push(c("goQuotaFetchedAt",{time:new Date(h.fetchedAt).toLocaleTimeString()})),x.length!==0&&m.push({key:g.id,label:P,level:["ok","warn","over"][S],tip:b.join("; "),segs:x})}const p=u.codexQuotaEnabled===!0&&J.status==="ok"?J.windows.weekly??null:null;if(p!==null&&typeof p.percent=="number"){const g=Math.max(0,Math.min(100,Math.round(Number(p.percent)||0))),h=typeof p.resetsAt=="string"&&p.resetsAt.length>0?" · "+c("goResetAt",{time:new Date(p.resetsAt).toLocaleString()}):"";m.push({key:"codex",label:"Codex",level:g>=100?"over":g>=80?"warn":"ok",tip:c("codexQuotaTitle")+": "+g+"%"+h,segs:[{name:"weekly",pct:Math.round(ue(g,ne(u,"plan")).width)}]})}if(m.length===0)return null;const f=g=>{o!==null||!r||(a(g),l(h=>({...h,[g]:null})),Promise.resolve().then(()=>g==="budget"?r.reload():g==="go"?r.refreshGoQuota():g==="codex"?Pt(!0,u.codexQuotaEnabled===!0):r.refreshCodingPlan(g)).catch(h=>{l(w=>({...w,[g]:h?.message??String(h)}))}).finally(()=>a(null)))};return e("div",{className:"cm-qstrip"},m.map(g=>{const h=o===g.key,w=n[g.key],N=[e("span",{className:"cm-qlabel",key:"l"},g.label)];h?N.push(e("span",{className:"cm-qtext",key:"busy"},c("refreshing"))):g.segs.forEach((x,b)=>{b>0&&N.push(e("span",{className:"cm-qsep",key:"sep"+b,"aria-hidden":"true"})),x.pct===null?N.push(e("span",{className:"cm-qtext",key:x.name},x.text)):N.push(e("span",{className:"cm-qseg",key:x.name},e("span",{className:"cm-qbar"},e("span",{className:"cm-qfill",style:{width:x.pct+"%"}})),e("span",null,x.pct+"%")))});const P=[g.tip];return!h&&r&&P.push(c("clickToRefresh")),h&&P.push(c("refreshing")),w&&P.push("⚠ "+c("balanceRefreshFailed",{message:w})),e($,{key:g.key,label:P.join("; "),side:"bottom",delayMs:400},e("span",{className:"cm-qchip"+(r?" action":"")+(g.level==="ok"?"":" "+g.level),...r?pe(h,()=>f(g.key)):{}},N))}))}const Aa="dsh-cost-meter:simple-guide-dismissed";function Dt(t){if(t?.sidebarSimplePromptSeen===!0)return!0;try{return window.localStorage.getItem(Aa)==="1"}catch{return!1}}function os(t){const s=t.useCost?t.useCost(f=>f):void 0,o=Me(!1),[a,n]=L(!1),[l,i]=L(!1),[r,u]=L(!1),d=s?.state?.config;if(!d||r||Dt(d))return null;const c=K(W(d.locale)),m=()=>{u(!0);try{window.localStorage.setItem(Aa,"1")}catch{}},p=async f=>{if(!o.current){o.current=!0,n(!0),i(!1);try{if((await t.api.updateConfig({sidebarSimple:f,sidebarSimplePromptSeen:!0}))?.config?.sidebarSimple!==f)throw new Error;m()}catch{i(!0)}finally{o.current=!1,n(!1)}}};return e("div",{className:"cm-qguide",role:"dialog","aria-label":c("sidebarSimpleTitle"),"aria-busy":a,onKeyDown:f=>{f.key==="Escape"&&(f.stopPropagation(),m())}},e("div",{className:"cm-bbox-head"},e("h4",null,c("sidebarSimpleTitle")),e("button",{type:"button",className:"cm-btn small","aria-label":c("closeGuide"),onClick:m},"×")),e("p",null,c("sidebarSimpleBody")),l?e("p",{role:"alert"},c("sidebarSimpleError")):null,e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small",disabled:a,onClick:()=>p(!1)},c("sidebarSimpleOff")),e("button",{type:"button",className:"cm-btn small primary",disabled:a,onClick:()=>p(!0)},c("sidebarSimpleOn"))))}function ls(t){const s=t.useCost?t.useCost(r=>r):void 0,o=Me(!1),a=s?.state;if(!a)return null;const n=a.config;if(!Dt(n)||n.quotaStrip?.promptSeen===!0)return null;const l=K(W(n?.locale)),i=r=>{if(o.current===!0)return;o.current=!0;const u=n.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};t.api.updateConfig({quotaStrip:{...u,enabled:r,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:()=>i(!1)},l("quotaStripGuideOff")),e("button",{type:"button",className:"cm-btn small primary",onClick:()=>i(!0)},l("quotaStripGuideOn"))))}const Ma="dsh-cost-meter:balance-click-hint-seen",is=()=>{try{return window.localStorage.getItem(Ma)==="1"}catch{return!1}},rs=()=>{try{window.localStorage.setItem(Ma,"1")}catch{}};function cs(t){const s=t.useCost?t.useCost(f=>f):void 0,o=Me(!1),[a,n]=L(!1),[l]=L(is),i=s?.state;if(!i)return null;const r=i.config,u=r.balance?.display==="sidebar"||r.balance?.display==="both",d=(r?.customBalances??[]).some(f=>f?.enabled===!0&&(f.display==="sidebar"||f.display==="both"))||r.customBalance?.enabled===!0&&(r.customBalance?.display==="sidebar"||r.customBalance?.display==="both"),c=Le.some(f=>{const g=r.codingPlans?.[f.id];return g?.enabled===!0&&(g.display==="sidebar"||g.display==="both")});if(a||l||r.balance?.clickHintSeen===!0||!u&&!d&&!c||!Dt(r)||r.quotaStrip?.promptSeen!==!0)return null;const m=K(W(r?.locale)),p=()=>{o.current!==!0&&(n(!0),o.current=!0,rs(),t.api.updateConfig({balance:{...r.balance??{},clickHintSeen:!0}}).catch(()=>{o.current=!1,n(!1)}))};return e("div",{className:"cm-qguide",role:"dialog","aria-label":m("balanceClickGuideTitle")},e("h4",null,m("balanceClickGuideTitle")),e("p",null,m("balanceClickGuideBody")),e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small primary",onClick:p},m("balanceClickGuideOk"))))}function Bt(t,s,o){return s.sidebarTodayMetric==="tokens"?j(["input","output","cacheRead","cacheWrite","reasoning"].reduce((a,n)=>a+(Number(t?.[n])||0),0))+" "+o("tokensUnit"):Y(_(t,s),s)}function Rt(t){const{state:s,wide:o}=t,a=s.today,n=s.config,l=K(W(n?.locale)),i=Bt(a,n,l),r=n.budget??{enabled:!1,amount:100,period:"month"},u=Number(n.exchangeRate),c=(s.budgetUsed??(r.period==="day"?_(s.today,n):r.period==="all"?_(s.total,n):_(s.month,n)))*(Number.isFinite(u)&&u>0?u:1),m=Math.max(0,Number(r.amount)||0),p=m>0?Math.min(999,c/m*100):null,f=p===null?"ok":p>=100?"over":p>=80?"warn":"ok";if(r.enabled===!0){const w=_(a,n)*(Number.isFinite(u)&&u>0?u:1),N=m>0?Math.min(999,w/m*100):null,P=[l("budgetOf",{period:l(je[r.period]??"periodMonth")}),l("usedOf",{used:re(c,n),amount:re(m,n)})+" · "+(p===null?"—":p.toFixed(1)+"%"),...n.hideTodayCost===!0?[]:[n.sidebarTodayMetric==="tokens"?l("today")+" "+i:l("todayShare",{amount:i,pct:N===null?"—":N.toFixed(1)+"%"})],l("monthTotal",{month:Y(_(s.month,n),n),total:Y(_(s.total,n),n)})].join("; ");if(t.summary===!0)return e($,{label:P,side:"right",delayMs:300},e("div",{className:"cm-simple-summary"+(f==="ok"?"":" "+f),tabIndex:0},e("span",null,l("todayBudget",{period:l(je[r.period]??"periodMonth")})),e("span",{className:"cm-num"},i+" / "+re(m,n))));const x=xa(s,n,l);return e($,{label:P,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(f==="ok"?"":" "+f)+(o?"":" rail")},o?x.body:e("div",{className:"cm-bbox-rail cm-num"},x.rail)))}const g=[n.sidebarTodayMetric==="tokens"?l("todayTokensTitle"):l("todayCostTitle"),l("callsTokens",{calls:a.calls,input:j(a.input),cache:j(a.cacheRead+a.cacheWrite),output:j(a.output)}),l("monthCost",{amount:Y(_(s.month,n),n)}),l("totalCost",{amount:Y(_(s.total,n),n)})].join("; ");return e($,{label:g,side:"right",delayMs:300},e(E,null,e("div",{className:"cm-foot"+(o?"":" cm-foot-rail")},o?e(E,null,l("today")," ",e("span",{className:"cm-num"},i)):e(et,{size:16})),o?st(s,n,l):null))}function ds(t){const s=t.useCost?t.useCost(M=>M):void 0;Tt(s?.state?.config?.codexQuotaEnabled===!0&&s?.state?.config?.codexQuotaSidebar!==!1);let o;if(t.useProjection)try{o=t.useProjection("costUsage")}catch{o=void 0}ua(t,o);const a=s?.state,n=!!t.wide;if(!a)return null;const l=a.config,i=K(W(l?.locale)),r=(l.balance?.display==="sidebar"||l.balance?.display==="both")&&l.hideOfficialBalance!==!0,d=At(a,l).length>0,c=r&&l.balance?.showProgressBar===!0&&a.balance?.status==="ok",m=d&&l.balance?.showProgressBar===!0,p=l.goQuota?.main==="weekly"||l.goQuota?.main==="monthly"?l.goQuota.main:"rolling",f=l.goQuota?.enabled!==!1&&(l.goQuota?.display==="sidebar"||l.goQuota?.display==="both")&&a.goQuota?.status==="ok"&&a.goQuota?.[p]!==null,g=Le.map(M=>M.id).filter(M=>{const I=l.codingPlans?.[M];if(I?.enabled!==!0||I.display!=="sidebar"&&I.display!=="both")return!1;const k=a.codingPlans?.[M];if(k?.status!=="ok")return!1;const U=k.windows!==null&&typeof k.windows=="object"?k.windows:{};return Object.keys(U).length>0}),h=g.length>0,w=as(a,l,n,t.api),N=l.codexQuotaEnabled===!0&&l.codexQuotaSidebar!==!1&&J.status==="ok"&&J.windows.weekly!==null,P=(l.budget??{}).enabled===!0,x=l.sidebar!==!1&&l.hideTodayCost!==!0,b=l.sidebarModels?.enabled===!0;if(!b&&!r&&!d&&!f&&!h&&!N&&!P&&!x&&w.length===0)return null;const S=l.sidebarSimple===!0,y=!S&&n&&l.sidebarStyle==="compact",T=S&&n&&x&&P,A=[];T?A.push(e(Rt,{state:a,wide:n,summary:!0})):S&&n&&x&&A.push(e("div",{className:"cm-simple-summary"},e("span",null,i("today")),e("span",{className:"cm-num"},Bt(a.today,l,i)))),c?A.push(e(Dn,{state:a,wide:n,api:t.api})):r&&A.push(e(On,{state:a,wide:n,api:t.api})),m?A.push(e(Rn,{state:a,wide:n,api:t.api})):d&&A.push(e(En,{state:a,wide:n,api:t.api}));const R=A.length;if(h&&A.push(...g.map(M=>M==="minimax"?e(Gn,{state:a,wide:n,api:t.api}):e(Xn,{id:M,state:a,wide:n,api:t.api}))),A.push(...w),N&&A.push(e(Zn,{state:a,wide:n,api:t.api})),f&&P&&n&&!S){const M=va(a,l,i),I=xa(a,l,i),k=M.level==="over"||I.level==="over"?"over":M.level==="warn"||I.level==="warn"?"warn":"ok";A.push(e("div",{className:"cm-bbox cm-bbox-pair"+(k==="ok"?"":" "+k)},e("div",{className:"cm-bbox-section"+(M.level==="ok"?"":" "+M.level)},M.body),e("div",{className:"cm-bbox-divider"}),e("div",{className:"cm-bbox-section"+(I.level==="ok"?"":" "+I.level)},I.body)))}else f&&A.push(e(_n,{state:a,wide:n})),P&&!T&&A.push(e(Rt,{state:a,wide:n}));return!P&&x&&!(S&&n)&&A.push(e(Rt,{state:a,wide:n})),S&&n&&x&&A.push(st(a,l,i)),n||A.push(Wn(a,l,i)),b&&A.splice(l.sidebarModels.position==="first"?0:l.sidebarModels.position==="afterBalance"?R:A.length,0,e(us,{key:"models",state:a,wide:n})),e("div",{...S?{tabIndex:0,role:"region","aria-label":i("sidebarSimple")}:{},className:"cm-footer-stack"+(n?"":" rail")+(y?" compact":"")+(S?" simple":"")},...A)}const Lt={enabled:!1,period:"today",topN:5,summary:"total",position:"last",defaultOpen:!1,remember:!0,tokens:!1,shares:!0,refreshSeconds:60,dock:!1},Pa="dsh-cost-meter:models-open";function Ta(t,s,o){return Ba(t,t.config,o,s).map(a=>({...a,label:a.key==="deepseek:legacy"?a.label:jt(a.key),cost:_(a,t.config)})).sort((a,n)=>n.cost-a.cost||n.tokens-a.tokens||a.key.localeCompare(n.key))}function us({state:t,wide:s}){const o={...Lt,...t.config.sidebarModels},a=K(W(t.config.locale)),n=()=>{try{const N=o.remember?window.localStorage.getItem(Pa):null;if(N!==null)return N==="1"}catch{}return o.defaultOpen},[l,i]=L(n),[r,u]=L(o.period);ee(()=>u(o.period),[o.period]),ee(()=>i(n()),[o.defaultOpen,o.remember]);const d=Ta(t,r,a),c=d.reduce((N,P)=>N+P.cost,0),m=N=>Y(N,t.config),p=a(r==="history"?"modelStatsHistory":"modelStatsToday")+" "+m(c)+" · "+a("modelsCount",{n:d.length}),f=o.summary==="top"&&d.length?d[0].label+" "+m(d[0].cost):p,g=o.summary==="top"&&d.length?e(E,null,e("span",{className:"cm-bal-label"},d[0].label),e("span",{className:"cm-bal-amt"},m(d[0].cost))):e("span",{className:"cm-bal-label"},f),h=()=>{i(!l);try{o.remember&&window.localStorage.setItem(Pa,l?"0":"1")}catch{}};if(!s||t.config.sidebarSimple)return e("div",{className:"cm-foot cm-num"+(s?"":" cm-foot-rail"),title:f+" · "+p},s?g:e(et,{size:16}));const w=d.slice(0,o.topN);return d.length>o.topN&&w.push(d.slice(o.topN).reduce((N,P)=>{for(const x of["cost","input","output","cacheRead","cacheWrite"])N[x]+=P[x];return N},{key:"other",label:a("modelsOther"),cost:0,input:0,output:0,cacheRead:0,cacheWrite:0})),e("div",{className:"cm-bbox cm-model-costs"},e("button",{type:"button",className:"cm-collapse-h","aria-expanded":String(l),title:p,onClick:h},e("span",{className:"cm-caret"+(l?" open":"")}),g),l?e(E,null,e("div",{className:"cm-buttons"},["today","history"].map(N=>e("button",{key:N,type:"button",className:"cm-mstats-tab"+(r===N?" active":""),"aria-pressed":r===N,onClick:()=>u(N)},a(N==="today"?"modelStatsToday":"modelStatsHistory")))),w.length?w.map(N=>e("div",{key:N.key},e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bal-label",title:N.label},N.label),e("span",{className:"cm-num cm-bal-amt"},m(N.cost))),o.shares?e("div",{className:"cm-bbox-bar",title:(c>0?N.cost/c*100:0).toFixed(1)+"%"},e("div",{className:"cm-bbox-fill",style:{width:(c>0?N.cost/c*100:0)+"%"}})):null,o.tokens?e("div",{className:"cm-mstats-note"},a("modelStatsInput")+" "+j(N.input)+" · "+a("modelStatsCache")+" "+j(N.cacheRead+N.cacheWrite)+" · "+a("modelStatsOutput")+" "+j(N.output)):null)):e("span",{className:"cm-note"},a("modelStatsEmpty"))):null)}function ms({draft:t,setDraft:s,t:o}){const a={...Lt,...t?.sidebarModels},n=(i,r)=>{t&&s({...t,sidebarModels:{...a,[i]:r}})},l=(i,r)=>e("div",{className:"cm-field",key:i},e("label",null,o("models_"+i)),e("select",{className:"cm-input",value:a[i],onChange:u=>n(i,u.target.value)},r.map(([u,d])=>e("option",{key:u,value:u},o(d)))));return e("div",{className:"cm-grid"},e("div",{className:"cm-grid-group"},o("modelsTitle")),["enabled","defaultOpen","remember","tokens","shares","dock"].map(i=>e("label",{key:i,className:"cm-check"},e("input",{type:"checkbox",checked:a[i],onChange:r=>n(i,r.target.checked)}),o("models_"+i))),l("period",[["today","modelStatsToday"],["history","modelStatsHistory"]]),l("summary",[["total","modelsTotal"],["top","modelsTop"]]),l("position",[["first","modelsFirst"],["afterBalance","modelsAfter"],["last","modelsLast"]]),["topN","refreshSeconds"].map(i=>e("div",{key:i,className:"cm-field"},e("label",null,o("models_"+i)),te({value:a[i]},r=>n(i,Math.max(i==="topN"?1:10,Math.min(i==="topN"?10:60,Math.floor(r))))))))}function it(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))}function ps({state:t,t:s}){const o=t.externalUsage;if(!o)return null;const a=t.config,n=d=>Y(_(d,a),a),l=d=>s("callsTokens",{calls:d.calls,input:j(d.input),cache:j(d.cacheRead+d.cacheWrite),output:j(d.output)}),i=(d,c)=>({calls:d.calls+c.calls,input:d.input+c.input,output:d.output+c.output,cacheRead:d.cacheRead+c.cacheRead,cacheWrite:d.cacheWrite+c.cacheWrite,cost:_(d,a)+c.cost,apiCost:_(d,a)+c.cost}),r=(d,c)=>e("tr",{key:d},e("td",null,d),e("td",{className:"num"},String(c.calls)),e("td",{className:"num"},j(c.input)),e("td",{className:"num"},j(c.cacheRead+c.cacheWrite)),e("td",{className:"num"},j(c.output)),e("td",{className:"num"},n(c))),u=d=>e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,s("colDate")),...["colCalls","colInTok","colCacheTok","colOutTok","colCost"].map(c=>e("th",{className:"num"},s(c))))),e("tbody",null,d)));return e("section",{className:"cm-budget"},e("h3",{className:"cm-h"},s("externalUsage")),o.stale?e("p",{className:"cm-note"},s("externalStale")):null,e("div",{className:"cm-cards"},["today","month","total"].map((d,c)=>{const m=i(t[d],o.combined[d]);return e(it,{key:d,title:s("combinedUsage")+" · "+s(["cardToday","cardMonth","cardTotal"][c]),value:n(m),sub:l(m)})})),...o.sources.map(d=>e("details",{key:d.source},e("summary",null,d.source+" · "+s("cardToday")+" "+n(d.today)+" · "+s("cardMonth")+" "+n(d.month)+" · "+l(d.today)),u(["today","month","total"].map((c,m)=>r(s(["cardToday","cardMonth","cardTotal"][m]),d[c]))),e("p",{className:"cm-note"},s("externalHistory")),u(d.history.map(c=>r(c.date,c))))))}const Re=(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 fs(t){const{state:s,api:o}=t,a=K(W(s.config?.locale)),[n,l]=L(!1);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Re(n,()=>l(!n),a("history"))),n?e("div",{className:"cm-collapse-body"},e(bs,{state:s,api:o})):null)}function bs(t){const{state:s,api:o}=t,a=K(W(s.config?.locale)),[n,l]=L(null),[i,r]=L({}),[u,d]=L(()=>new Set),c=s.history??[];if(c.length===0)return e("p",{className:"cm-empty"},a("noHistory"));const m=f=>{if(n===f){l(null);return}l(f),!(i[f]!==void 0||u.has(f))&&(d(g=>{const h=new Set(g);return h.add(f),h}),o.getDaySessions(f).then(g=>r(h=>({...h,[f]:Array.isArray(g?.sessions)?g.sessions:[]}))).catch(()=>r(g=>({...g,[f]:"error"}))).finally(()=>d(g=>{const h=new Set(g);return h.delete(f),h})))},p=f=>f.map(g=>e("tr",{key:g.id},Et(g,s.config?.showSessionId===!0,a),e("td",{className:"num"},String(g.calls)),e("td",{className:"num"},j(g.input)),e("td",{className:"num"},j(g.cacheRead+g.cacheWrite)),e("td",{className:"num"},j(g.output)),e("td",{className:"num"},Y(_(g,s.config),s.config))));return e("div",{className:"cm-scroll"},e("p",{className:"cm-hint",style:{padding:"6px 10px 0"}},a("historyExpandHint")),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("colDate")),e("th",{className:"num"},a("colCalls")),e("th",{className:"num"},a("colInTok")),e("th",{className:"num"},a("colCacheTok")),e("th",{className:"num"},a("colOutTok")),e("th",{className:"num"},a("colCost")))),e("tbody",null,c.flatMap(f=>{const g=e("tr",{key:f.date,className:"cm-row-click",onClick:()=>m(f.date)},e("td",null,(n===f.date?"▾ ":"▸ ")+f.date),e("td",{className:"num"},String(f.calls)),e("td",{className:"num"},j(f.input)),e("td",{className:"num"},j(f.cacheRead+f.cacheWrite)),e("td",{className:"num"},j(f.output)),e("td",{className:"num"},Y(_(f,s.config),s.config)));if(n!==f.date)return[g];const h=i[f.date],w=u.has(f.date)&&h===void 0?e("p",{className:"cm-empty"},a("historySessionsLoading")):h==="error"?e("p",{className:"cm-empty"},a("historySessionsError")):!Array.isArray(h)||h.length===0?e("p",{className:"cm-empty"},a("historyNoSessions")):e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("colSession")),e("th",{className:"num"},a("colCalls")),e("th",{className:"num"},a("colInTok")),e("th",{className:"num"},a("colCacheTok")),e("th",{className:"num"},a("colOutTok")),e("th",{className:"num"},a("colCost")))),e("tbody",null,p(h)));return[g,e("tr",{key:f.date+"-sessions"},e("td",{colSpan:6},w))]}))))}function gs(t){const{state:s,api:o}=t,a=K(W(s.config?.locale)),[n,l]=L(!1),[i,r]=L(100),[u,d]=L("cost-desc"),[c,m]=L(null),[p,f]=L(!1),[g,h]=L(!1),w=qe.useRef(0),N=(S,y)=>{const[T,A]=y==="recent"?["recent","desc"]:y.split("-"),R=++w.current;f(!0),h(!1),o.getTopSessions(S,T,A).then(M=>{R===w.current&&m(Array.isArray(M?.sessions)?M.sessions:[])}).catch(()=>{R===w.current&&h(!0)}).finally(()=>{R===w.current&&f(!1)})},P=()=>{l(S=>{const y=!S;return y&&c===null&&!p&&N(i,u),y})},x=S=>{r(S),(n||c!==null)&&N(S,u)},b=S=>{d(S),(n||c!==null)&&N(i,S)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Re(n,P,a("sessionRankTitle"))),n?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-hint"},a("sessionRankHint")),e("div",{style:{display:"flex",gap:"12px",flexWrap:"wrap",margin:"6px 0"}},e("div",{className:"cm-field"},e("label",null,a("sessionRankSort")),e("select",{className:"cm-input",value:u,onChange:S=>b(S.target.value)},e("option",{value:"cost-desc"},a("sessionSortCostDesc")),e("option",{value:"cost-asc"},a("sessionSortCostAsc")),e("option",{value:"time-desc"},a("sessionSortTimeDesc")),e("option",{value:"time-asc"},a("sessionSortTimeAsc")),e("option",{value:"recent"},a("sessionSortRecent")))),e("div",{className:"cm-field"},e("label",null,a("sessionRankLimit")),e("select",{className:"cm-input",value:String(i),onChange:S=>x(Number(S.target.value))},e("option",{value:"50"},"50"),e("option",{value:"100"},"100"),e("option",{value:"200"},"200")))),p?e("p",{className:"cm-empty"},a("sessionRankLoading")):g?e("p",{className:"cm-empty"},a("sessionRankError")):c===null||c.length===0?e("p",{className:"cm-empty"},a("sessionRankEmpty")):e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("colDate")),e("th",null,a("colSession")),e("th",{className:"num"},a("colCalls")),e("th",{className:"num"},a("colInTok")),e("th",{className:"num"},a("colCacheTok")),e("th",{className:"num"},a("colOutTok")),e("th",{className:"num"},a("colCost")))),e("tbody",null,c.map(S=>e("tr",{key:S.date+":"+S.id},e("td",null,S.date),Et(S,s.config?.showSessionId===!0,a),e("td",{className:"num"},String(S.calls)),e("td",{className:"num"},j(S.input)),e("td",{className:"num"},j((S.cacheRead??0)+(S.cacheWrite??0))),e("td",{className:"num"},j(S.output)),e("td",{className:"num"},Y(_(S,s.config),s.config)))))))):null)}function hs(t){const{state:s}=t,o=K(W(s.config?.locale)),a=s.today.sessions??[];if(a.length===0)return e("p",{className:"cm-empty"},o("noSessionsToday"));const n=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,a.map(l=>e("tr",{key:l.id},Et(l,n,o),e("td",{className:"num"},String(l.calls)),e("td",{className:"num"},j(l.input)),e("td",{className:"num"},j(l.cacheRead+l.cacheWrite)),e("td",{className:"num"},j(l.output)),e("td",{className:"num"},Y(_(l,s.config),s.config)))))))}function Et(t,s,o){const a=typeof t.title=="string"?t.title.trim():"",n=String(t.id).slice(0,14)+"…",l=a.length>0?a:n,i=a.length>0?a+" · "+t.id:t.id;return e("td",{title:i},e("div",{className:"cm-sess-title"+(a.length===0?" cm-sess-id":"")},l),s&&a.length>0?e("div",{className:"cm-sess-id"},n):null)}const ys={CNY:{symbol:"¥",decimals:4,exchangeRate:7.2},USD:{symbol:"$",decimals:6,exchangeRate:1},EUR:{symbol:"€",decimals:6,exchangeRate:.92}};function ks(t){const{state:s,draft:o,setDraft:a,t:n}=t,l=s.config,i=o?.budget??l.budget,r=Number(l.exchangeRate),d=(s.budgetUsed??(i.period==="day"?_(s.today,l):i.period==="all"?_(s.total,l):_(s.month,l)))*(Number.isFinite(r)&&r>0?r:1),c=Math.max(0,Number(i.amount)||0),m=i.enabled&&c>0?Math.min(999,d/c*100):null,p=m===null?"ok":m>=100?"over":m>=80?"warn":"ok",f=(w,N)=>{o!==null&&a({...o,budget:{...o.budget??l.budget,[w]:N}})},g=i.period==="custom"?i.customStart+" → "+(i.customEnd??n("periodDay")):null,h=i.enabled&&m!==null?n("budgetStatus",{period:n(je[i.period]??"periodMonth"),amount:re(c,l),used:re(d,l),pct:m.toFixed(1)})+(p==="over"?n("overLimit"):p==="warn"?n("nearLimit"):""):null;return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("budget")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:i.enabled===!0,onChange:w=>f("enabled",w.target.checked)}),e("span",null,n("enableBudget")))),i.enabled?e(E,null,e("div",{className:"cm-budget-bar"},e("div",{className:"cm-budget-fill "+(p==="ok"?"":p),style:{width:(m===null?0:Math.min(100,m))+"%"}})),e("div",{className:"cm-budget-line"+(p==="over"?" over":"")+" cm-num"},h),e("div",{className:"cm-budget-controls"},e("div",{className:"cm-field"},e("label",null,n("budgetAmountLabel")),te({value:i.amount},w=>f("amount",w))),e("div",{className:"cm-field"},e("label",null,n("budgetPeriodLabel")),e("select",{className:"cm-input",value:i.period,onChange:w=>f("period",w.target.value)},e("option",{value:"day"},n("periodDay")),e("option",{value:"month"},n("periodMonth")),e("option",{value:"all"},n("periodAll")),e("option",{value:"custom"},n("periodCustomRange")))),i.period==="custom"?e(E,null,e("div",{className:"cm-field"},e("label",null,n("startDate")),e("input",{className:"cm-input",type:"date",value:i.customStart??"",onChange:w=>f("customStart",w.target.value===""?null:w.target.value)})),e("div",{className:"cm-field"},e("label",null,n("endDate")),e("input",{className:"cm-input",type:"date",value:i.customEnd??"",onChange:w=>f("customEnd",w.target.value===""?null:w.target.value)}))):null),g!==null?e("p",{className:"cm-hint"},n("rangeText",{range:g})):null):e("p",{className:"cm-note"},n("budgetDisabledNote")))}function ws(t){const{state:s,draft:o,setDraft:a,t:n}=t,l=s.config,i=(c,m)=>{o!==null&&a({...o,[c]:m})},r=o===null?l:{...l,...o},u=(()=>{if(r.peakEnabled!==!0)return n("peakOff");const c=Date.parse(r.peakEffectiveAt||""),m=Date.now();if(Number.isFinite(c)&&m<c)return n("peakNotEffective",{time:new Date(c).toLocaleString()});const p=r.peakWindows??[],f=tt(m,p,r.peakHolidays);return f===null?n("offPeakActive"):f.holiday===!0?n("holidayAllOffPeak"):f.weekend===!0?n("weekendAllOffPeak"):f.inPeak?n("peakActive"):n("offPeakActive")})(),d=(r.peakWindows?.length??0)>0?n("peakSummary",{windows:r.peakWindows.map(c=>c.start+":00-"+c.end+":00").join(W(r.locale)==="zh"?"、":", "),time:r.peakEffectiveAt||n("unknown"),status:u}):n("noPeakWindows",{status:u});return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("peakPanelTitle")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakEnabled!==!1,onChange:c=>i("peakEnabled",c.target.checked)}),e("span",null,n("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:c=>i("peakNotice",c.target.checked)}),e("span",null,n("peakNoticeLabel")))),e("div",{className:"cm-field"},e("label",null,n("peakStyleLabel")),e("select",{className:"cm-input",value:o?.peakStyle==="classic"?"classic":"compact",onChange:c=>i("peakStyle",c.target.value)},e("option",{value:"compact"},n("peakStyleCompact")),e("option",{value:"classic"},n("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:c=>i("peakAlertEnabled",c.target.checked)}),e("span",null,n("peakAlertLabel")))),e("div",{className:"cm-field"},e("label",null,n("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:c=>{const m=Number(c.target.value);Number.isInteger(m)&&m>=1&&m<=30&&i("peakAlertAhead",m)}})),e("div",{className:"cm-field"},e("label",null,n("peakAlertTargetLabel")),e("select",{className:"cm-input",value:o?.peakAlertTarget==="peak"||o?.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",onChange:c=>i("peakAlertTarget",c.target.value)},e("option",{value:"both"},n("peakAlertTargetBoth")),e("option",{value:"peak"},n("peakAlertTargetPeak")),e("option",{value:"offpeak"},n("peakAlertTargetOffPeak"))))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",null,n("peakAlertPositionLabel")),e("select",{className:"cm-input",value:o?.peakAlertPosition==="center"?"center":"corner",onChange:c=>i("peakAlertPosition",c.target.value)},e("option",{value:"corner"},n("peakAlertPositionCorner")),e("option",{value:"center"},n("peakAlertPositionCenter")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakAlertWebNotify===!0,onChange:c=>{i("peakAlertWebNotify",c.target.checked),c.target.checked&&window.Notification&&Notification.permission==="default"&&Promise.resolve(Notification.requestPermission()).catch(()=>{})}}),e("span",null,n("peakAlertWebNotifyLabel"))),e("p",{className:"cm-hint"},n("peakAlertWebNotifyHint")))),e("div",{className:"cm-field"},e("label",null,n("peakAlertPreviewLabel")),e("div",{className:"cm-row"},e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("peak")},n("peakAlertPreviewPeak")),e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("offpeak")},n("peakAlertPreviewOffPeak")))),e("div",{className:"cm-peak-preview"},o?.peakEnabled!==!1&&o?.peakNotice!==!1?st(s,r,n):e("p",{className:"cm-hint"},n("peakNoticeHiddenHint"))),e("p",{className:"cm-hint"},d),e("div",{className:"cm-field"},e("label",null,n("peakHolidaysLabel")),e("input",{className:"cm-input",defaultValue:(r.peakHolidays??[]).join(", "),onBlur:c=>i("peakHolidays",c.target.value.split(/[,,\s]+/).filter(Boolean))})),e("p",{className:"cm-hint"},n("weekendRuleNote")))}function te(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:a=>{const n=a.target.value;if(n===""){if(t.emptyMode==="clear"){s(null);return}if(t.emptyMode==="ignore")return;s(0);return}const l=Number(n);Number.isFinite(l)&&l>=0&&s(l)}})}function qt(t){const{modelId:s,entry:o,isDefault:a,draft:n,setDraft:l,t:i}=t,r=$e(o),u=p=>{const f={...$e(p)};if(Array.isArray(p.rateHistory)){const g=p.rateHistory.filter(h=>Date.parse(h.before)<=Date.now());g.length>0?f.rateHistory=g:delete f.rateHistory}return f},d=(p,f,g)=>{if(g===null){if(a){const T=u(n.prices.default??{cacheHit:0,cacheMiss:0,output:0}),A={...T[p]??{}};delete A[f];const R={...T};Object.keys(A).length>0?R[p]=A:delete R[p],l({...n,prices:{...n.prices,default:R}});return}const x={...n.prices.models},b=u(x[s]??{cacheHit:0,cacheMiss:0,output:0}),S={...b[p]??{}};delete S[f];const y={...b};Object.keys(S).length>0?y[p]=S:delete y[p],x[s]=y,l({...n,prices:{...n.prices,models:x}});return}const h=Math.max(0,g);if(a){let b={...u(n.prices.default??{cacheHit:0,cacheMiss:0,output:0})};if(p==="base")b[f]=h;else{const S={...b[p]??{},[f]:h};b={...b,[p]:S}}l({...n,prices:{...n.prices,default:b}});return}const w={...n.prices.models},N=u(w[s]??{cacheHit:0,cacheMiss:0,output:0});let P={...N};if(p==="base")P[f]=h;else{const x={...N[p]??{},[f]:h};P={...N,[p]:x}}w[s]=P,l({...n,prices:{...n.prices,models:w}})},c=()=>{const p={...n.prices.models};delete p[s],l({...n,prices:{...n.prices,models:p}})},m=(p,f)=>{const g=f==="base"?r:r[f]??null,h=f==="base"?"ignore":"clear";return e("div",{className:"cm-price-row",key:f},e("span",null,p),te({value:g?.cacheHit??null,emptyMode:h},w=>d(f,"cacheHit",w)),te({value:g?.cacheMiss??null,emptyMode:h},w=>d(f,"cacheMiss",w)),te({value:g?.output??null,emptyMode:h},w=>d(f,"output",w)))};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},s),e(E,null,r?.legacy===!0?e("span",{className:"cm-price-legacy"},i("legacyModel")):null,a?e("span",{className:"cm-price-legacy"},i("defaultFallback")):null,a?null:e("button",{className:"cm-btn small danger",onClick:c},i("remove")))),e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,i("flatCached")),e("span",null,i("flatInput")),e("span",null,i("flatOutput"))),m(i("tierBase"),"base"),m(i("tierOffPeak"),"offPeak"),m(i("tierPeak"),"peak"),Array.isArray(o?.rateHistory)&&o.rateHistory.length>0?e("p",{className:"cm-note"},i("datedPriceNote")):null)}const Oa={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 xs(t,s,o="USD"){if(t=$e(t),t===null||typeof t!="object")return"";if(t.unpriced===!0)return s("catalogUnpriced");o==="CNY"&&t.cny&&(t=t.cny);const a=l=>(o==="CNY"?"¥":"$")+String(l),n=t.peak!==null&&typeof t.peak=="object"?t.peak:null;return n!==null?a(t.cacheMiss)+"/"+a(n.cacheMiss)+" in · "+a(t.output)+"/"+a(n.output)+" out":a(t.cacheMiss??t.input??0)+" in · "+a(t.output??0)+" out"}function vs(t){const{state:s,draft:o,setDraft:a,t:n}=t,[l,i]=L(!1),[r,u]=L({}),d=s.priceCatalog;if(d===null||typeof d!="object")return null;const c=o?.prices??s.config.prices,m=o?.priceTableDisplay??s.config.priceTableDisplay??{},p=(y,T)=>{const A=m[y+":"+T];return typeof A=="boolean"?A:y==="deepseek"},f=(y,T,A)=>{o!==null&&a({...o,priceTableDisplay:{...m,[y+":"+T]:A}})},g=(y,T)=>y==="deepseek"?c.models?.[T]!==void 0:c.providers?.[y]?.models?.[T]!==void 0,h=(y,T,A)=>{if(o===null)return;const R=JSON.parse(JSON.stringify(A));if(y==="deepseek"){a({...o,prices:{...o.prices,models:{...o.prices.models,[T]:R}}});return}const M={...o.prices.providers??{}},I=M[y]??{};M[y]={...I,models:{...I.models??{},[T]:R}},a({...o,prices:{...o.prices,providers:M}})},w=(y,T)=>{if(o===null)return;if(y==="deepseek"){const M={...o.prices.models};delete M[T],a({...o,prices:{...o.prices,models:M}});return}const A={...o.prices.providers??{}},R=A[y];if(R!==void 0&&R.models!==void 0){const M={...R.models};delete M[T],A[y]={...R,models:M},a({...o,prices:{...o.prices,providers:A}})}},N=Object.keys(d).sort((y,T)=>y==="deepseek"?-1:T==="deepseek"?1:y.localeCompare(T)),P=y=>Object.values(d[y]).reduce((T,A)=>T+Object.keys(A).length,0),x=new Set(Object.values(d.deepseek??{}).flatMap(y=>Object.keys(y))),b=Object.keys(c.models??{}).filter(y=>!x.has(y)).sort(),S=(y,T,A)=>{const R=g(y,T),M=p(y,T),I=R?e("label",{className:"cm-check cm-vendor-display",title:n("catalogDisplayHint")},e("input",{type:"checkbox",checked:M,onChange:k=>f(y,T,k.target.checked)}),e("span",null,n("catalogDisplayLabel"))):null;if(R&&!M&&o!==null){const k=y==="deepseek"?e(qt,{key:T,modelId:T,entry:c.models[T],isDefault:!1,draft:o,setDraft:a,t:n}):e(La,{key:T,provider:y,modelId:T,entry:c.providers?.[y]?.models?.[T],draft:o,setDraft:a,t:n});return e("div",{key:T,className:"cm-catalog-mounted"},I,k)}return e("div",{key:T,className:"cm-catalog-row"},e("span",{className:"cm-catalog-id"},T),e("span",{className:"cm-catalog-price"},xs(A,n,y==="deepseek"||A?.cny?c.currency:"USD")),R?e("span",{className:"cm-catalog-tag"},n("mountedTag")):null,I,e("button",{className:"cm-btn small",disabled:!R&&A?.unpriced===!0,onClick:()=>R?w(y,T):h(y,T,A)},n(R?"unmountBtn":"mountBtn")))};return e("div",{className:"cm-budget",style:{marginTop:"8px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("catalogTitle")),e("button",{className:"cm-toggle-btn",onClick:()=>i(y=>!y)},n(l?"catalogCollapse":"catalogOpen"))),l?e(E,null,e("p",{className:"cm-note"},n("catalogNote")),N.map(y=>{const T=r[y]===!0;return e("div",{key:y},e("div",{className:"cm-catalog-vendor cm-vendor-toggle",onClick:()=>u(A=>({...A,[y]:!T}))},e("span",null,(T?"▾ ":"▸ ")+(Oa[y]??y)+" · "+P(y))),T?e(E,null,y==="deepseek"?e("p",{className:"cm-hint"},n("catalogDeepseekNote")):null,Object.keys(d[y]).sort().map(A=>e("div",{key:A},e("div",{className:"cm-catalog-family"},A),Object.keys(d[y][A]).sort().map(R=>S(y,R,d[y][A][R])))),y==="deepseek"&&b.length>0?e("div",null,e("div",{className:"cm-catalog-family"},n("catalogCustomModels")),b.map(A=>S("deepseek",A,null))):null):null)})):null)}const Da=t=>t==="zen"?"go":t,jt=t=>{const s=t.indexOf(":");return s<=0?t:Da(t.slice(0,s).toLowerCase())+t.slice(s)};function Ba(t,s,o,a){const n=["input","output","cacheRead","cacheWrite","reasoning","cost","calls"],l=d=>Number.isFinite(Number(d))&&Number(d)>0?Number(d):0,i=(d,c,m)=>{if(!m||typeof m!="object")return;const p=d[c]??(d[c]=Object.fromEntries([...n,"apiCost"].map(g=>[g,0])));for(const g of n)p[g]+=l(m[g]);const f=c.indexOf(":");p.apiCost+=l(m.apiCost??(He(f>0?c.slice(0,f):"deepseek",f>0?c.slice(f+1):c,s)==="plan"?0:m.cost))},r=d=>{if(!d||typeof d!="object")return{};if(d.byProviderModel&&Object.keys(d.byProviderModel).length)return d.byProviderModel;if(d.byModel&&Object.keys(d.byModel).length)return Object.fromEntries(Object.entries(d.byModel).map(([m,p])=>[m.includes(":")?m:"deepseek:"+m,p]));const c={};for(const m of Array.isArray(d.sessions)?d.sessions:[])if(!(!m||typeof m!="object"))if(m.byProviderModel&&Object.keys(m.byProviderModel).length)for(const[p,f]of Object.entries(m.byProviderModel))i(c,p,f);else i(c,(m.provider||"deepseek")+":"+(m.model||"unknown"),m);return Object.keys(c).length?c:n.some(m=>l(d[m])>0)?{"deepseek:legacy":d}:{}};return(d=>{const c={},m=p=>{for(const[f,g]of Object.entries(p??{}))i(c,f,g)};if(d==="today")m(r(t.today));else{const p=Date.parse((t.meta?.dayKey||new Date().toISOString().slice(0,10))+"T00:00:00Z");for(const f of t.history??[]){const g=Date.parse(f.date+"T00:00:00Z");g<=p&&g>=p-76896e5&&m(r(f))}}return Object.entries(c).map(([p,f])=>{const g=p.indexOf(":"),h=(g>0?p.slice(0,g):"deepseek").toLowerCase(),w=g>0?p.slice(g+1):p,N=f.input+f.output+f.cacheRead+f.cacheWrite+f.reasoning,P=f.cacheRead+f.input;return{label:p==="deepseek:legacy"?o("modelStatsLegacy"):h==="deepseek"||h===""?w:Da(h)+":"+w,key:p,...f,tokens:N,cls:He(h,w,s),hitRate:P>0?f.cacheRead/P:null,cacheUnreported:fn(f),blended:N>0&&f.cost>0?f.cost/N*1e6:null,perUsd:f.cost>0?N/f.cost:null}}).filter(p=>p.tokens>0||p.cost>0)})(a).sort((d,c)=>c.cost-d.cost||c.tokens-d.tokens)}function Ns(t){const{state:s,config:o,t:a,initialTab:n,draft:l,setDraft:i}=t,[r,u]=L(n==="history"?"history":"today"),[d,c]=L(!1),m=Ba(s,o,a,r),p=b=>(Math.max(0,Math.min(1,b))*100).toFixed(1)+"%",f=m.reduce((b,S)=>Math.max(b,S.cost),0),g=m.reduce((b,S)=>Math.max(b,S.tokens),0),h=m.reduce((b,S)=>Math.max(b,S.perUsd??0),0),w=(b,S)=>e("button",{className:"cm-mstats-tab"+(r===b?" active":""),onClick:()=>u(b)},S),N=b=>b.cls==="plan"?e("span",{className:"cm-plan-tag",title:a("billingClassLabel")},a("billingClassPlan")):null,P=b=>e("select",{className:"cm-input",title:a("billingClassLabel"),value:o.planBilling?.models?.[b.key]??"auto",disabled:l===null,onChange:S=>{const y={...l.planBilling?.models??{}};S.target.value==="auto"?delete y[b.key]:y[b.key]=S.target.value,i({...l,planBilling:{...l.planBilling,models:y}})}},e("option",{value:"auto"},a("billingClassAuto")),e("option",{value:"plan"},a("billingClassPlan")),e("option",{value:"api"},a("billingClassApi"))),x=(b,S,y,T,A)=>e("div",{className:"cm-mstats-row"},e("span",{className:"cm-mstats-name",title:b},b,A??null),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar "+y,style:{width:p(S)}})),e("span",{className:"cm-mstats-val"},T));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Re(d,()=>c(!d),a("modelStatsTitle"))),d?e("div",{className:"cm-collapse-body"},e("div",{className:"cm-mstats-tabs"},w("today",a("modelStatsToday")),w("history",a("modelStatsHistory"))),m.length===0?e("p",{className:"cm-note"},a("modelStatsEmpty")):e(E,null,e("div",{className:"cm-mstats-h"},a("modelStatsCostH")),m.map(b=>e(E,{key:"c:"+b.label},x(b.label,f>0?b.cost/f:0,"cost",Y(b.cost,o),e(E,null,N(b),P(b),b.cacheUnreported?e("span",{className:"cm-plan-tag",title:a("modelStatsHitUnreportedTip")},"⚠"):null)))),e("div",{className:"cm-mstats-h"},a("modelStatsTokensH")),e("div",{className:"cm-mstats-legend"},e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"var(--dsw-alias-state-business-primary)"}}),a("modelStatsInput")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#ff9800"}}),a("modelStatsCache")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#34a853"}}),a("modelStatsOutput"))),[...m].sort((b,S)=>S.tokens-b.tokens).map(b=>e("div",{className:"cm-mstats-row",key:"t:"+b.label},e("span",{className:"cm-mstats-name",title:b.label},b.label),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-seg in",style:{width:p(g>0?b.input/g:0)}}),e("div",{className:"cm-mstats-seg cache",style:{width:p(g>0?(b.cacheRead+b.cacheWrite)/g:0)}}),e("div",{className:"cm-mstats-seg out",style:{width:p(g>0?(b.output+b.reasoning)/g:0)}})),e("span",{className:"cm-mstats-val"},j(b.tokens)))),e("div",{className:"cm-mstats-h"},a("modelStatsHitH")),[...m].sort((b,S)=>(S.hitRate??-1)-(b.hitRate??-1)).map(b=>e(E,{key:"h:"+b.label},x(b.label,b.hitRate??0,"hit",b.cacheUnreported?a("modelStatsHitUnreported"):b.hitRate===null?"—":(b.hitRate*100).toFixed(1)+"%",b.cacheUnreported?e("span",{className:"cm-plan-tag",title:a("modelStatsHitUnreportedTip")},"⚠"):null))),e("div",{className:"cm-mstats-h"},a("modelStatsValueH")),[...m].sort((b,S)=>(S.perUsd??-1)-(b.perUsd??-1)).map(b=>e(E,{key:"v:"+b.label},x(b.label,h>0?(b.perUsd??0)/h:0,"value",b.perUsd===null?"—":j(b.perUsd)+" tok/$"+(b.blended!==null?" · "+a("modelStatsBlended",{price:"$"+b.blended.toFixed(2)}):"")))),e("p",{className:"cm-mstats-note"},a("modelStatsNote")))):null)}function Ss(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 Cs(t,s){if(t==="go")return"OpenCode Go";const o=Le.find(a=>a.id===t);return o!==void 0?s(o.labelKey):t}const Ra=["fiveHour","weekly","monthly","daily"];function As(t,s){const o=new Map,a=n=>{const l=new Date(n),i=r=>String(r).padStart(2,"0");if(s==="monthly")return l.getFullYear()+"-"+i(l.getMonth()+1);if(s==="weekly"){const r=new Date(l.getFullYear(),l.getMonth(),l.getDate()-(l.getDay()+6)%7);return r.getFullYear()+"-"+i(r.getMonth()+1)+"-"+i(r.getDate())}return l.getFullYear()+"-"+i(l.getMonth()+1)+"-"+i(l.getDate())};for(const n of Object.values(t??{}))for(const l of n??[]){if(l===null||typeof l!="object"||!(l.tokens>0)&&!(l.cost>0))continue;const i=a(Number(l.t1)||Number(l.t0)),r=o.get(i)??{key:i,tokens:0,cost:0,pct:0,intervals:0};r.tokens+=Number(l.tokens)||0,r.cost+=Number(l.cost)||0,r.pct+=Number(l.pct)||0,r.intervals+=1,o.set(i,r)}return[...o.values()].map(n=>({...n,per1Tokens:n.pct>0?n.tokens/n.pct:null,fullTokens:n.pct>0?n.tokens/n.pct*100:null})).sort((n,l)=>n.key<l.key?-1:n.key>l.key?1:0)}function Ms(t){const{state:s,config:o,t:a}=t,[n,l]=L(!1),[i,r]=L("daily"),u=W(o?.locale),d=s?.planStats,c=d!=null&&typeof d.providers=="object"?d.providers:{},m=Object.keys(c).sort(),p=y=>Y(Number(y)||0,o??s?.config),f=y=>y.method==="none"||y.per1Tokens===null?"—":j(y.per1Tokens)+" tok · "+p(y.per1Cost),g=y=>y.method==="none"||y.fullTokens===null?"—":j(y.fullTokens)+" tok · "+p(y.fullCost),h=y=>y.method==="sample"?a("planStatsMethodSample"):y.method==="live"?a("planStatsMethodLive"):a("planStatsMethodNone"),w=y=>{let T=h(y);return y.method==="sample"&&Number(y.sampleAt)>0&&(T=a("planStatsMethodSampleAt",{method:T,time:new Date(Number(y.sampleAt)).toLocaleString(u==="en"?"en-US":"zh-CN")})),(y.method==="sample"||y.method==="live")&&y.confidence==="low"&&(T+=" · "+a("planStatsConfidenceLow")),T},N=([y,T,A])=>e("tr",{key:T+":"+y},e("td",null,Ss(y,u)),e("td",{className:"num"},Math.round(A.percent*10)/10+"%"),e("td",{className:"num"},j(A.localTokens)+" tok · "+p(A.localCost)),e("td",{className:"num"},f(A)),e("td",{className:"num"},g(A)),e("td",{className:"num cm-plan-reset"},A.resetsAt.length>0?a("planStatsResets",{time:new Date(A.resetsAt).toLocaleString(u==="en"?"en-US":"zh-CN")}):"—"),e("td",{className:"cm-plan-method"},w(A))),P=n?m.flatMap(y=>Object.entries(c[y]?.intervals??{})).map(([y,T])=>({winKey:y,list:T})):[],x=As(Object.fromEntries(P.map(y=>[y.winKey,y.list])),i),b=x.reduce((y,T)=>Math.max(y,T.fullTokens??0),0),S=(y,T)=>e("button",{key:y,className:"cm-mstats-tab"+(i===y?" active":""),onClick:()=>r(y)},T);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Re(n,()=>l(!n),a("planStatsTitle"))),n?e("div",{className:"cm-collapse-body"},m.length===0?e("p",{className:"cm-empty"},a("planStatsEmpty")):e(E,null,m.map(y=>{const T=c[y]?.windows??{},A=[...Ra.filter(R=>T[R]!==void 0).map(R=>[R,y,T[R]]),...Object.keys(T).filter(R=>!Ra.includes(R)).map(R=>[R,y,T[R]])];return e("div",{key:y,className:"cm-plan-provider"},e("div",{className:"cm-plan-provider-name"},Cs(y,a),e("span",{className:"cm-plan-updated"},(()=>{const R=Number(c[y]?.generatedAt)||Number(d?.generatedAt)||0;return R>0?new Date(R).toLocaleTimeString(u==="en"?"en-US":"zh-CN"):""})())),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("planStatsWindow")),e("th",{className:"num"},a("planStatsPercent")),e("th",null,a("planStatsLocal")),e("th",null,a("planStatsPer1")),e("th",null,a("planStatsFull")),e("th",null,""),e("th",null,""))),e("tbody",null,A.map(N))))}),e("div",{className:"cm-mstats-h",style:{marginTop:"10px"}},a("planStatsCurveTitle")),e("div",{className:"cm-mstats-tabs"},S("daily",a("planStatsDaily")),S("weekly",a("planStatsWeekly")),S("monthly",a("planStatsMonthly"))),x.length===0?e("p",{className:"cm-note"},a("planStatsCurveEmpty")):e(E,null,[...x].reverse().map(y=>e("div",{className:"cm-mstats-row",key:y.key},e("span",{className:"cm-mstats-name"},y.key),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar value",style:{width:(b>0?(y.fullTokens??0)/b*100:0).toFixed(1)+"%"}})),e($,{label:a("planStatsBarTip",{date:y.key,full:y.fullTokens===null?"—":j(y.fullTokens),per1:y.per1Tokens===null?"—":j(y.per1Tokens),tokens:j(y.tokens),cost:p(y.cost),intervals:y.intervals}),side:"top",delayMs:200},e("span",{className:"cm-mstats-val"},y.fullTokens===null?"—":j(y.fullTokens)))))),e("p",{className:"cm-note"},a("planStatsNote")))):null)}function La(t){const{provider:s,modelId:o,entry:a,draft:n,setDraft:l,t:i}=t,r=m=>{const p={...n.prices.providers??{}},f=p[s]??{};p[s]={...f,models:m},l({...n,prices:{...n.prices,providers:p}})},u=(m,p)=>{if(n===null)return;const f={...(n.prices.providers??{})[s]?.models??{}};f[o]={...f[o]??{},[m]:Math.max(0,p)},r(f)},d=(m,p)=>{if(n===null)return;const f={...(n.prices.providers??{})[s]?.models??{}},g=f[o]??{};f[o]={...g,cny:{...g.cny,[m]:Math.max(0,p)}},r(f)},c=()=>{if(n===null)return;const m={...(n.prices.providers??{})[s]?.models??{}};delete m[o],r(m)};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},o),e(E,null,a?.unpriced===!0?e("span",{className:"cm-price-legacy"},i("catalogUnpriced")):null,e("button",{className:"cm-btn small danger",onClick:c},i("unmountBtn")))),a?.unpriced===!0?null:e(E,null,e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,i("flatInput")),e("span",null,i("flatCached")),e("span",null,i("flatOutput"))),e("div",{className:"cm-price-row"},e("span",null,"USD"),te({value:a?.input??null,emptyMode:"ignore"},m=>u("input",m)),te({value:a?.cachedInput??null,emptyMode:"ignore"},m=>u("cachedInput",m)),te({value:a?.output??null,emptyMode:"ignore"},m=>u("output",m))),a?.cny?e("div",{className:"cm-price-row"},e("span",null,"CNY"),te({value:a.cny.cacheMiss,emptyMode:"ignore"},m=>d("cacheMiss",m)),te({value:a.cny.cacheHit,emptyMode:"ignore"},m=>d("cacheHit",m)),te({value:a.cny.output,emptyMode:"ignore"},m=>d("output",m))):null))}const Ge=t=>[e("option",{key:"sidebar",value:"sidebar"},t("balanceSidebar")),e("option",{key:"settings",value:"settings"},t("balanceSettings")),e("option",{key:"both",value:"both"},t("balanceBoth")),e("option",{key:"off",value:"off"},t("off"))],It=t=>t!=null?e("div",{className:"cm-msg "+t.kind},t.text):null;function Ps(t){const{state:s,api:o,t:a,draft:n,setDraft:l}=t,[i,r,u]=Ke(a,()=>o.refreshBalance()),d=s.balance,c=s.config,m=s.reconcile,p=(n?.balance??c.balance??{}).reconcile!==!1,f=w=>{n===null||typeof l!="function"||l({...n,balance:{...n.balance??c.balance??{},reconcile:w.target.checked}})},g=w=>ve(w,c,d?.currency),h=d.status==="ok"?e("div",{className:"cm-bal-line"},e("span",null,a("balanceLine",{total:g(d.totalBalance),granted:g(d.grantedBalance),toppedUp:g(d.toppedUpBalance),time:d.fetchedAt>0?new Date(d.fetchedAt).toLocaleTimeString():"—"}))):d.status==="error"?e("div",{className:"cm-bal-line err"},a("balanceQueryFailedHint",{message:d.message||a("unknownError")})):e("div",{className:"cm-bal-line"},a("balanceNotQueried"));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("accountBalance")),e("button",{className:"cm-btn small",onClick:u,disabled:i},a(i?"refreshing":"refreshBalance"))),h,e("label",null,a("balanceApiKey")),e(De,{target:"balance",configured:d.keyConfigured,source:d.keySource,t:a,api:o,placeholder:"sk-…"}),e("p",{className:"cm-hint"},a("balanceKeyHint")),m!==void 0&&m.ok===!1?e("div",{className:"cm-bal-line warn"},"⚠ "+m.message):null,e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:p,onChange:f}),a("reconcileLabel")),It(r))}function rt(t){const{name:s,enabled:o,saved:a,busy:n,open:l,statusNode:i,configNode:r,errorMsg:u,onToggle:d,onRefresh:c,onRemove:m,onToggleOpen:p,t:f}=t,g=r!=null;return e("div",{className:"cm-budget cm-quota-card"},e("div",{className:"cm-budget-head"},e("label",{className:"cm-check"},e("input",{type:"checkbox","aria-label":f("enable")+": "+s,checked:o===!0,onChange:h=>d(h.target.checked)})),e("div",{className:"cm-quota-name"},g?Re(l===!0,p,s):e("h3",{className:"cm-h"},s)),m?e("button",{className:"cm-btn small",onClick:m},f("quotaRemove")):null,e("button",{className:"cm-btn small",onClick:c,disabled:n===!0||o!==!0||a?.enabled!==!0||a.display==="off",title:o!==!0?f("quotaEnableFirst"):a?.enabled!==!0||a.display==="off"?f("quotaRefreshReady"):f("refresh")},f(n===!0?"refreshing":"refresh"))),i,g&&l===!0?e("div",{className:"cm-collapse-body"},r):null,u!=null?e("div",{className:"cm-msg "+u.kind},u.text):null)}function Ke(t,s){const[o,a]=L(!1),[n,l]=L(null),i=Me(!1);return[o,n,async()=>{if(!i.current){i.current=!0,a(!0),l(null);try{const u=await s();l({kind:u.ok?"ok":"err",text:u.message})}catch(u){l({kind:"err",text:t("syncFailed",{message:u?.message??String(u)})})}finally{i.current=!1,a(!1)}}}]}const Ts=t=>{const s=t.filter(a=>a.enabled===!0),o=t.filter(a=>a.enabled!==!0);return[...s,...o]},Ea=(t,s,o,a,n,l=s)=>{if(typeof o?.percent!="number")return e("div",{key:l,className:"cm-go-row"+(n?" main":"")},e("span",{className:"cm-go-label"},s),e("span",{className:"cm-go-num"},typeof o?.text=="string"?o.text:"—"));const i=Math.max(0,Math.min(100,Number(o.percent)||0)),r=ue(i,a),u=typeof o.resetsAt=="string"&&o.resetsAt.length>0?t("goResetAt",{time:new Date(o.resetsAt).toLocaleString()}):"";return e("div",{key:l,className:"cm-go-row"+(n?" main":"")},e("span",{className:"cm-go-label"},s),e("div",{className:"cm-go-bar"},e("div",{className:"cm-go-fill",style:{width:r.width+"%"}})),e("span",{className:"cm-go-num"},r.label===null?"—":t("goQuotaPercent",{percent:String(Math.round(r.label))})),u?e("span",{className:"cm-go-reset"},u):null)};function Os(t){const{state:s,api:o,t:a,entry:n,index:l,canRemove:i,onPatch:r,onRemove:u}=t,d=n.adapter==="aliyun",[c,m]=L(!1),p=()=>({headers:JSON.stringify(n.request?.headers??{},null,2),extract:JSON.stringify(n.extract??{},null,2),body:typeof n.request?.body=="string"?n.request.body:JSON.stringify(n.request?.body,null,2)??""}),[f,g]=L(p),[h,w]=L(()=>(n.allowedHosts??[]).join(", ")),[N,P]=L({}),x=Me(!1),b=s.config,y=(Array.isArray(s.customBalances)?s.customBalances:[]).find(B=>B.index===l)??null,T=n.enabled===!0,A=()=>{m(B=>!B)};ee(()=>{c&&!x.current&&(g(p()),w((n.allowedHosts??[]).join(", ")),P({})),x.current=c},[c]);const R=(B,V)=>r({[B]:V}),M=(B,V)=>r({request:{...n.request??{},[B]:V}}),I=d?["ALIBABA_CLOUD_ACCESS_KEY_ID","ALIBABA_CLOUD_ACCESS_KEY_SECRET","ALIBABA_CLOUD_SECURITY_TOKEN"]:[...new Set(Object.values(n.request?.headers??{}).flatMap(B=>typeof B=="string"?[...B.matchAll(/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/g)].map(V=>V[1]):[]))],k=(B,V)=>{g(v=>({...v,[B]:V}));try{const v=B==="body",q=v&&!V.trim()?void 0:JSON.parse(V);if(!v&&(q===null||typeof q!="object"||Array.isArray(q)))throw new Error("invalid");if(B==="headers"&&Object.values(q).some(Q=>typeof Q!="string"))throw new Error("invalid");P(Q=>({...Q,[B]:""})),B==="extract"?R(B,q):M(B,v?q===void 0?void 0:V:q)}catch{P(v=>({...v,[B]:a("customBalanceInvalidJson")}))}},U=(B,V,v,q)=>!d&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a(V)),q&&e("span",{className:"cm-hint"},a(q)),e("textarea",{className:"cm-input",rows:v,value:f[B],onChange:Q=>k(B,Q.target.value)}),N[B]?e("span",{className:"cm-hint err"},N[B]):null),ce=B=>{w(B);const V=B.split(/[\s,;]+/).map(v=>v.trim()).filter(v=>v.length>0);R("allowedHosts",V)},[ke,Ne,O]=Ke(a,()=>(b.customBalances??[])[l]?.enabled!==!0?Promise.resolve({ok:!1,message:a("quotaEnableFirst")}):o.refreshCustomBalance(l)),D=y!==null&&y.status==="ok"?e(E,null,b.balance?.showProgressBar===!0?e("div",{className:"cm-budget",style:{marginTop:"8px"}},e(Nt,{segments:vt(s,b,y,n),direction:ne(b,"balance")}),e("div",{className:"cm-bal-line"},Ct(y,b,a,s,n))):e("div",{className:"cm-bal-line"},a("customBalanceRemaining",{amount:Fe(y.remaining,b,y,n)}))):y!==null&&y.status==="error"?e("div",{className:"cm-bal-line err"},y.message||a("unknownError")):e("div",{className:"cm-bal-line"},y?.message||a("balanceNotQueried")),G=e(E,null,e("p",{className:"cm-note"},a(d?"aliyunBalanceNote":"customBalanceConfigNote")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n.convertToDisplayCurrency===!0,disabled:Qe(b,y,n)!=="USD",onChange:B=>R("convertToDisplayCurrency",B.target.checked)}),a("customBalanceConvert")),e("p",{className:"cm-note"},a("customBalanceConvertNote")),e("div",{className:"cm-grid"},[["label","customBalanceLabelZh"],["labelEn","customBalanceLabelEn"]].map(([B,V])=>e("div",{key:B,className:"cm-field"},e("label",null,a(V)),e("input",{className:"cm-input",value:n[B]??"",onChange:v=>R(B,v.target.value)}))),!d&&e("div",{className:"cm-field"},e("label",null,a("customBalanceUnitLabel")),e("select",{className:"cm-input",value:["CNY","EUR","CREDITS"].includes(n.unit)?n.unit:"USD",onChange:B=>R("unit",B.target.value)},e("option",{value:"USD"},"USD ($)"),e("option",{value:"CNY"},"CNY (¥)"),e("option",{value:"EUR"},"EUR (€)"),e("option",{value:"CREDITS"},"CREDITS"))),e("div",{className:"cm-field"},e("label",null,a("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:n.display??"both",onChange:B=>R("display",B.target.value)},...Ge(a))),e("div",{className:"cm-field"},e("label",null,a("customBalanceRefreshInterval")),te({value:n.refreshMinutes??15},B=>R("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(B)))))),!d&&e("div",{className:"cm-field"},e("label",null,a("customBalanceMethod")),e("select",{className:"cm-input",value:n.request?.method??"GET",onChange:B=>M("method",B.target.value)},e("option",{value:"GET"},"GET"),e("option",{value:"POST"},"POST"))),!d&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a("customBalanceUrl")),e("input",{className:"cm-input",value:n.request?.url??"",placeholder:"https://example.com/key/info",onChange:B=>M("url",B.target.value)})),U("headers","customBalanceHeaders",5,"customBalanceHeadersVarNote"),!["GET","HEAD"].includes((n.request?.method??"GET").toUpperCase())&&U("body","customBalanceBody",5,"customBalanceBodyNote"),e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a("customBalanceCredentialsTitle")),I.length>0?e(E,null,!d&&e("span",{className:"cm-hint"},a("customBalanceCredentialsHint")),I.map(B=>e(De,{key:"cb-var-"+B,target:"customVar:"+B,configured:(s.customVarStatus?.[B]?.configured??!1)===!0,source:s.customVarStatus?.[B]?.source??"",t:a,api:o,placeholder:"{{"+B+"}}"}))):e("span",{className:"cm-hint"},a("customBalanceNoPlaceholders"))),!d&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a("customBalanceAllowedHosts")),e("input",{className:"cm-input",value:h,placeholder:"api.example.com, relay.example.org",onChange:B=>ce(B.target.value)}),e("span",{className:"cm-hint"},a("customBalanceAllowedHostsHint"))),U("extract","customBalanceExtract",8)));return e(rt,{name:`#${l+1} · `+(St(n,W(b?.locale))||a("customBalanceTitle")),enabled:T,saved:JSON.stringify(n)===JSON.stringify(b.customBalances?.[l])?b.customBalances[l]:null,busy:ke,open:c,statusNode:D,configNode:G,errorMsg:Ne,onToggle:B=>R("enabled",B),onRefresh:O,onRemove:i?u:null,onToggleOpen:A,t:a})}function qa({config:t,draft:s,setDraft:o,t:a,api:n}){const l=s?.goQuota??t.goQuota,i=(r,u)=>{s&&o({...s,goQuota:{...l,[r]:u}})};return e(E,null,[["display","goQuotaDisplayLabel"],["main","goMainLabel"]].map(([r,u])=>e("div",{key:r,className:"cm-field"},e("label",null,a(u)),e("select",{className:"cm-input",value:l[r],onChange:d=>i(r,d.target.value)},r==="display"?Ge(a):["rolling","weekly","monthly"].map((d,c)=>e("option",{key:d,value:d},a(["goWindowRolling","goWindowWeekly","goWindowMonthly"][c])))))),e("div",{className:"cm-field"},e("label",null,a("goQuotaRefreshIntervalLabel")),te({value:l.refreshMinutes},r=>i("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(r)))))),e("label",null,a("goQuotaKeyLabel")),e(De,{target:"goQuota",configured:t.goQuota?.keyConfigured===!0,source:t.goQuota?.keySource,t:a,api:n,placeholder:"sk-…"}))}function Ds(t){const{state:s,api:o,t:a,draft:n,setDraft:l}=t,[i,r]=L(!1),u=s.goQuota,d=s.config,c=n?.goQuota?.enabled??d.goQuota?.enabled??!0,m=(b,S)=>{n!==null&&l({...n,goQuota:{...n.goQuota??d.goQuota,[b]:S}})},[p,f,g]=Ke(a,()=>o.refreshGoQuota()),h=d.goQuota?.main==="weekly"||d.goQuota?.main==="monthly"?d.goQuota.main:"rolling",w=[h,...["rolling","weekly","monthly"].filter(b=>b!==h)],N=b=>b==="rolling"?"goWindowRolling":b==="weekly"?"goWindowWeekly":"goWindowMonthly",P=b=>b==="rolling"?u.rolling:b==="weekly"?u.weekly:u.monthly,x=c===!1?e("p",{className:"cm-note"},a("goQuotaDisabledNote")):u.status==="ok"?e("div",{className:"cm-go-list"},w.map(b=>Ea(a,a(N(b)),P(b),ne(d,"go"),b===h)),e("div",{className:"cm-go-time"},a("goQuotaFetchedAt",{time:u.fetchedAt>0?new Date(u.fetchedAt).toLocaleTimeString():"—"}))):u.status==="error"?e("div",{className:"cm-bal-line err"},u.message||a("unknownError")):u.status==="off"&&u.message?e("p",{className:"cm-note"},u.message):e("div",{className:"cm-bal-line"},a("goQuotaNotQueried"));return e(rt,{name:a("goQuotaTitle"),enabled:c,saved:d.goQuota,busy:p,open:i,statusNode:x,errorMsg:f,configNode:e(qa,{config:d,draft:n,setDraft:l,t:a,api:o}),onToggleOpen:()=>r(b=>!b),onToggle:b=>m("enabled",b),onRefresh:g,t:a})}const Bs=(t,s)=>{if(typeof t?.keyVar=="string"&&t.keyVar.length>0)return t.keyVar;const a="CLIPROXYAPI_MANAGEMENT_KEY_"+(String(t?.id??"").toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"GATEWAY");return Object.keys(s??{}).find(n=>n===a||n.startsWith(a+"_"))??a};function Rs(t){const{state:s,api:o,t:a,draft:n,setDraft:l,index:i}=t,r=s.config,d=(n??r).gatewayQuotas?.sources??[],c=d[i]??{},p=(Array.isArray(s.gatewayQuotas)?s.gatewayQuotas:[]).find(M=>M.id===c.id)??{id:c.id,status:"off",accounts:[],unsupportedProviders:[]},f=Bs(c,s.customVarStatus),[g,h]=L(!1),[w,N,P]=Ke(a,()=>o.refreshGatewayQuota(c.id)),x=M=>{n!==null&&l({...n,gatewayQuotas:{...n.gatewayQuotas??r.gatewayQuotas??{},sources:M}})},b=M=>x(d.map((I,k)=>k===i?{...I,...M}:I)),S=(M,I,k)=>e("div",{className:"cm-field"},e("label",null,M),e("input",{className:"cm-input",value:I??"",onChange:k})),y=(M,I)=>{const k=ze(M?.label||M?.id||a("gatewaySourceUnknown"),M,ne(r,"plan"),a);return e(E,{key:M?.id||I},k.row,M?.resetsAt?e("div",{className:"cm-note"},_e(M,a)):null)},T=(M,I)=>e("div",{key:M.id||I,className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},M.label||"package"),e("span",{className:"cm-bbox-pct cm-num"},(M.used??"—")+" / "+(M.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(M.remaining??"—")+" remaining")),A=M=>M==null?null:e(E,null,e("div",{className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},M.unit||"credits"),e("span",{className:"cm-bbox-pct cm-num"},(M.used??"—")+" / "+(M.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(M.remaining??"—")+" remaining")),(M.packages??[]).map(T)),R=(M,I)=>e("div",{key:M.id||I,className:"cm-budget",style:{marginTop:"8px",padding:"10px 12px"}},e("div",{className:"cm-budget-head"},e("strong",null,(Jt[M.provider]??M.provider??a("gatewaySourceUnknown"))+" · "+(M.label||a("gatewaySourceUnknown"))),e("span",{className:"cm-hint"},M.status)),M.plan?e("div",{className:"cm-note"},M.plan):null,M.windows.length>0?e("div",{className:"cm-go-list"},M.windows.map(y)):null,A(M.credits),M.message?e("div",{className:"cm-note"},M.message):null);return e(rt,{name:c.label||c.id||a("gatewayQuotaTitle"),enabled:c.enabled===!0,saved:r.gatewayQuotas?.sources?.find(M=>M.id===c.id),busy:w,open:g,errorMsg:N,statusNode:e("div",{className:"cm-note"},a("gatewaySourceStatus")+": "+(p.status??a("gatewaySourceUnknown"))+(p.serverVersion?" · "+p.serverVersion:"")+(p.fetchedAt>0?" · "+a("gatewaySourceFetchedAt",{time:new Date(p.fetchedAt).toLocaleTimeString()}):"")+(p.message?" · "+p.message:"")),configNode:e(E,null,e("div",{className:"cm-grid"},S(a("gatewaySourceLabel"),c.label,M=>b({label:M.target.value})),S(a("gatewaySourceBaseURL"),c.baseURL,M=>b({baseURL:M.target.value})),e("div",{className:"cm-field"},e("label",null,a("gatewaySourceDisplay")),e("select",{className:"cm-input",value:c.display??"both",onChange:M=>b({display:M.target.value})},...Ge(a))),S(a("gatewaySourceAllowlist"),(c.allowedHosts??[]).join(", "),M=>b({allowedHosts:M.target.value.split(/[\s,;]+/).filter(Boolean)})),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:c.antigravityOnlyGemini===!0,onChange:M=>b({antigravityOnlyGemini:M.target.checked})}),e("span",null,a("gatewayOnlyGemini")))),f?e("div",{className:"cm-field"},e("label",null,a("gatewaySourceCredential")),e(De,{target:"customVar:"+f,configured:s.customVarStatus?.[f]?.configured===!0,source:s.customVarStatus?.[f]?.source??"",t:a,api:o,placeholder:f})):null,p.unsupportedProviders.length>0?e("div",{className:"cm-note"},a("gatewaySourceUnsupported")+": "+p.unsupportedProviders.join(", ")):null,p.accounts.length>0?p.accounts.map(R):e("div",{className:"cm-bal-line"},a("gatewaySourceNoAccounts"))),onToggle:M=>b({enabled:M}),onRefresh:P,onRemove:()=>x(d.filter((M,I)=>I!==i)),onToggleOpen:()=>h(M=>!M),t:a})}const Le=[{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"},{id:"mimo",labelKey:"codingPlanMimo"}];function Ls(t){const{state:s,api:o,t:a,draft:n,setDraft:l,planId:i,labelKey:r}=t,u=s.config,d=s.codingPlans??{},c=n?.codingPlans?.[i]??u.codingPlans?.[i]??{},m=d[i]??{status:"off",message:"",fetchedAt:0,windows:{}},p=c.enabled===!0,[f,g]=L(!1),[h,w,N]=Ke(a,()=>o.refreshCodingPlan(i)),P=(O,D)=>{if(n===null)return;const G=n.codingPlans??u.codingPlans??{};l({...n,codingPlans:{...G,[i]:{...G[i]??{},[O]:D}}})},[x,b]=L(""),[S,y]=L({}),T=O=>O?.rates!==null&&typeof O?.rates=="object"&&!Array.isArray(O.rates)?O.rates:{},A=["input","cachedInput","output"],R=O=>S[O]??T(c)[O]??{},M=O=>A.every(D=>Number.isFinite(Number(O[D]))&&Number(O[D])>0),I=(O,D,G)=>{if(n===null)return;const B={...R(O),[D]:String(G)};y(Q=>({...Q,[O]:B}));const V=A.every(Q=>String(B[Q]??"").trim()==="");if(!V&&!M(B))return;const v=n.codingPlans??u.codingPlans??{},q={...(v.qwen??{}).rates??{}};V?delete q[O]:q[O]=Object.fromEntries(A.map(Q=>[Q,Number(B[Q])])),l({...n,codingPlans:{...v,qwen:{...v.qwen??{},rates:q}}})},k=O=>{n!==null&&y(D=>({...D,[O]:D[O]??T(c)[O]??{}}))},U=O=>{if(n===null)return;y(B=>{const V={...B};return delete V[O],V});const D=n.codingPlans??u.codingPlans??{},G={...(D.qwen??{}).rates??{}};delete G[O],l({...n,codingPlans:{...D,qwen:{...D.qwen??{},rates:G}}})},ce=m.windows!==null&&typeof m.windows=="object"?m.windows:{},ke=p===!1?e("p",{className:"cm-note"},a("codingPlanDisabledNote")):m.status==="ok"?e("div",{className:"cm-go-list"},Object.keys(ce).length>0?i==="minimax"&&(We(ce).five!=null||We(ce).seven!=null)?e(Sa,{five:We(ce).five,seven:We(ce).seven,fetchedAt:m.fetchedAt,t:a,wide:!0,direction:ne(u,"plan")}):Object.entries(ce).map(([O,D])=>Ea(a,O.replace(/_/g," "),D,ne(u,"plan"),!1,O)):e("div",{className:"cm-bal-line"},a("codingPlanNotQueried")),e("div",{className:"cm-go-time"},a("goQuotaFetchedAt",{time:m.fetchedAt>0?new Date(m.fetchedAt).toLocaleTimeString():"—"}))):m.status==="error"?e("div",{className:"cm-bal-line err"},m.message||a("unknownError")):m.status==="off"&&m.message?e("p",{className:"cm-note"},m.message):e("div",{className:"cm-bal-line"},a("codingPlanNotQueried")),Ne=e(E,null,i==="minimax"?e("div",{className:"cm-field"},e("label",null,a("minimaxOrigin")),e("input",{className:"cm-input",type:"url",value:c.baseUrl??"",placeholder:"https://www.minimax.cn","aria-label":a("minimaxOrigin"),onChange:O=>P("baseUrl",O.target.value)}),e("p",{className:"cm-note"},a("minimaxOriginNote"))):null,i==="qwen"?e("div",{className:"cm-field"},e("label",null,a("qwenSource")),e("select",{className:"cm-input",value:c.quotaSource??"local",onChange:O=>P("quotaSource",O.target.value)},e("option",{value:"local"},a("qwenSourceLocal")),e("option",{value:"cli"},a("qwenSourceCli")),e("option",{value:"bailian"},a("qwenSourceBailian"))),e("p",{className:"cm-note"},a(c.quotaSource==="bailian"?"qwenBailianNote":"qwenCliNote"))):null,e("div",{className:"cm-field"},e("label",null,a("codingPlanDisplayLabel")),e("select",{className:"cm-input",value:typeof c.display=="string"?c.display:i==="minimax"?"both":"settings",onChange:O=>P("display",O.target.value)},e("option",{value:"sidebar"},a("balanceSidebar")),e("option",{value:"settings"},a("balanceSettings")),e("option",{value:"both"},a("balanceBoth")),e("option",{value:"off"},a("off"))),e("span",{className:"cm-hint"},a("codingPlanDisplayNote"))),i!=="scnet"&&(i!=="qwen"||(c.quotaSource??"local")!=="local")?e("div",{className:"cm-field"},e("label",null,a("codingPlanRefreshIntervalLabel")),te({value:typeof c.refreshMinutes=="number"&&Number.isFinite(c.refreshMinutes)&&c.refreshMinutes>0?c.refreshMinutes:15},O=>{P("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(O))))})):null,i==="scnet"||i==="qwen"&&(c.quotaSource??"local")==="local"?e(E,null,e("div",{className:"cm-field"},e("label",null,a(i==="qwen"?"qwenPlanCreditsLabel":"scnetPlanCreditsLabel")),e("input",{className:"cm-input",type:"number",min:"1",step:"1000",value:typeof c.planCredits=="number"&&Number.isFinite(c.planCredits)&&c.planCredits>0?c.planCredits:i==="qwen"?5e5:24e4,onChange:O=>{const D=Number(O.target.value);Number.isFinite(D)&&D>0&&P("planCredits",Math.floor(D))}})),e("div",{className:"cm-field"},e("label",null,a(i==="qwen"?"qwenPlanStartLabel":"scnetPlanStartLabel")),e("input",{className:"cm-input",type:"date",value:typeof c.planStart=="string"?c.planStart:"",onChange:O=>P("planStart",O.target.value)})),i==="qwen"?e(E,null,e("div",{className:"cm-field"},e("label",null,a("qwenRatesLabel"))),[...new Set([...Object.keys(T(c)),...Object.keys(S)])].sort().map(O=>e("div",{key:O,className:"cm-match-row"},e("span",{style:{minWidth:"120px"}},O),A.map(D=>e("input",{key:D,className:"cm-input narrow",type:"number",min:"0",step:"0.1",value:R(O)[D]??"",placeholder:a("qwenRate_"+D),"aria-label":O+" · "+a("qwenRate_"+D),onChange:G=>{const B=G.target.value;I(O,D,B)}})),e("button",{className:"cm-btn small",onClick:()=>U(O)},a("overrideRemove")),O in S&&!M(R(O))?e("span",{className:"cm-note"},a("qwenRateDraftNote")):null)),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:a("qwenRatesModelPlaceholder"),value:x,onChange:O=>b(O.target.value)}),e("button",{className:"cm-btn small",onClick:()=>{const O=x.trim();O.length!==0&&(k(O),b(""))},disabled:x.trim().length===0},a("qwenRatesAdd")))):null,e("p",{className:"cm-note"},a(i==="qwen"?"qwenLocalNote":"scnetLocalNote"))):i==="qwen"?null:i==="volcengine"?e(E,null,e("div",{className:"cm-field"},e("label",null,a("volcengineAccessKeyIdLabel"))),e(De,{target:"codingPlans.volcengine.ak",configured:m.keyConfigured===!0,source:m.keySource,t:a,api:o,placeholder:a("volcengineAccessKeyPlaceholder")}),e("div",{className:"cm-field"},e("label",null,a("volcengineSecretAccessKeyLabel"))),e(De,{target:"codingPlans.volcengine.sk",configured:m.keyConfigured===!0,source:m.keySource,t:a,api:o,placeholder:a("volcengineSecretPlaceholder")}),e("p",{className:"cm-note"},a("volcengineNote"))):e(E,null,e("div",{className:"cm-field"},e("label",null,i==="mimo"?"Cookie (platform.xiaomimimo.com)":a("codingPlanKeyLabel"))),e(De,{target:"codingPlans."+i,configured:m.keyConfigured===!0,source:m.keySource,t:a,api:o,placeholder:i==="mimo"?"api-platform_serviceToken=…; userId=…":"sk-…"})));return e(rt,{name:a(r),enabled:p,saved:u.codingPlans?.[i],busy:h,open:f,errorMsg:w,statusNode:ke,configNode:Ne,onToggle:O=>P("enabled",O),onRefresh:N,onToggleOpen:()=>g(O=>!O),t:a})}function Es(t){const{state:s,api:o,t:a,draft:n,setDraft:l}=t,i=s.config,r=n??i,u=r.codingPlans??{},d=r.gatewayQuotas?.sources??[],c=n?.customBalances??i.customBalances??[],m=x=>{n!==null&&l({...n,customBalances:x,...x.length===0?{customBalance:{...i.customBalance??{},enabled:!1,request:{url:"",headers:{}}}}:{}})},p=Me({next:0,keys:[]}).current;for(;p.keys.length<c.length;)p.keys.push(p.next++);p.keys.length=c.length;const f=x=>{p.keys.splice(x,1),m(c.filter((b,S)=>S!==x))},g=(x,b)=>m(c.map((S,y)=>y===x?{...S,...b}:S)),h=(x="custom")=>{c.length>=8||m([...c,{...x==="aliyun"?{adapter:x}:{},enabled:!1,label:x==="aliyun"?"千问 / 阿里云":"",labelEn:x==="aliyun"?"Qianwen / Alibaba Cloud":"",display:"both",unit:x==="aliyun"?"CNY":"USD",refreshMinutes:15,request:{url:x==="aliyun"?"https://business.aliyuncs.com/":"",method:x==="aliyun"?"POST":"GET",headers:{}},extract:{},allowedHosts:[]}])},w=()=>{d.length>=4||n===null||l({...n,gatewayQuotas:{...n.gatewayQuotas??i.gatewayQuotas??{},sources:[...d,{id:"gateway-"+Date.now().toString(36),type:"cliproxyapi",label:"CLIProxyAPI",baseURL:"http://127.0.0.1:8317",enabled:!1,display:"both",refreshMinutes:15,includeProviders:bt,allowedHosts:[],allowInsecureHttp:!1}]}})},N=[...d.map((x,b)=>({kind:"gateway",key:"gw-"+(x.id??b),index:b,enabled:x.enabled===!0})),{kind:"go",key:"go",enabled:r.goQuota?.enabled!==!1},...Le.map(x=>({kind:"plan",key:"plan-"+x.id,planId:x.id,labelKey:x.labelKey,enabled:u[x.id]?.enabled===!0})),...c.map((x,b)=>({kind:"custom",key:"cb-"+p.keys[b],index:b,enabled:x.enabled===!0}))],P=x=>x.kind==="plan"?e(Ls,{key:x.key,planId:x.planId,labelKey:x.labelKey,state:s,api:o,t:a,draft:n,setDraft:l}):x.kind==="go"?e(Ds,{key:x.key,state:s,api:o,t:a,draft:n,setDraft:l}):x.kind==="gateway"?e(Rs,{key:x.key,index:x.index,state:s,api:o,t:a,draft:n,setDraft:l}):e(Os,{key:x.key,state:s,api:o,t:a,entry:c[x.index],index:x.index,canRemove:!0,onPatch:b=>g(x.index,b),onRemove:()=>f(x.index)});return e("div",null,e("p",{className:"cm-note"},a("quotaSectionNote")),e("div",{className:"cm-quota-list"},Ts(N).map(P)),e("div",{className:"cm-buttons"},e("button",{className:"cm-btn small",onClick:w,disabled:d.length>=4},a("gatewaySourceAdd")),e("button",{className:"cm-btn small",onClick:()=>h(),disabled:c.length>=8},a("customBalanceAdd")),e("button",{className:"cm-btn small",onClick:()=>h("aliyun"),disabled:c.length>=8},a("aliyunBalanceAdd"))))}const qs=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ja=t=>(t.input??0)+(t.output??0)+(t.cacheRead??0)+(t.cacheWrite??0);function Ut(t){const s=t.useCost?t.useCost(b=>b):void 0,o=t.state??s?.state;if(!o)return null;const a=o.config,n=W(a?.locale),l=t.t??K(n),i=Array.isArray(o.history)?o.history:[];if(i.length===0)return e("div",null,e("h3",{className:"cm-h"},l("usageTitle")),e("p",{className:"cm-empty"},l("usageEmpty")));const r=o.meta?.dayKey??"",u=new Map(i.map(b=>[b.date,b])),d=b=>{const S=y=>String(y).padStart(2,"0");return b.getFullYear()+"-"+S(b.getMonth()+1)+"-"+S(b.getDate())},c=new Date;c.setHours(0,0,0,0);const m=new Date(c);m.setDate(m.getDate()+(6-(c.getDay()+6)%7));const p=26,f=[],g=[];let h=-1;for(let b=p-1;b>=0;b-=1){for(let y=0;y<7;y+=1){const T=new Date(m);T.setDate(T.getDate()-(b*7+(6-y)));const A=u.get(d(T));f.push(A!==void 0?{day:A,tokens:ja(A)}:{day:{date:d(T)},tokens:0})}const S=new Date(m);S.setDate(S.getDate()-(b*7+6)),g.push(S.getMonth()!==h?n==="en"?qs[S.getMonth()]:String(S.getMonth()+1)+"月":""),h=S.getMonth()}const w=Math.max(...f.map(b=>b.tokens),1),N=b=>{const S=b/w;return S<.25?1:S<.5?2:S<.75?3:4},P=b=>{const{day:S,tokens:y}=b,T="cm-ug-cell"+(y>0?" l"+N(y):"")+(S.date===r?" today":""),A=l("usageDay",{date:S.date,tokens:j(y),input:j(S.input??0),cache:j((S.cacheRead??0)+(S.cacheWrite??0)),output:j(S.output??0),calls:S.calls??0,cost:Y(_(S,a),a)});return e($,{key:S.date,label:A,side:"top",delayMs:200},e("div",{className:T}))},x=o.total;return e("div",{className:"cm-ug"},e("h3",{className:"cm-h"},l("usageTitle")),e("div",{className:"cm-ug-total"},l("usageTotal",{tokens:j(ja(x)),input:j(x.input??0),cache:j((x.cacheRead??0)+(x.cacheWrite??0)),output:j(x.output??0),calls:x.calls??0})),e("div",{className:"cm-ug-grid",style:{gridTemplateColumns:"repeat("+p+",1fr)"}},f.map(P)),e("div",{className:"cm-ug-months",style:{gridTemplateColumns:"repeat("+p+",1fr)"}},g.map((b,S)=>e("span",{key:"m"+String(S),className:"cm-ug-monthc"},b))))}function js(t){const s=t.useCost?t.useCost(v=>v):void 0,o=t.api,a=s?.state??null,[n,l]=L(null),[i,r]=L(null),[u,d]=L(!1),[c,m]=L(!1),[p,f]=L(!1),[g,h]=L(""),[w,N]=L(!1),[P,x]=L(!1),[b,S]=L("overview"),[y,T]=L({status:"idle",at:0,error:null}),A=qe.useRef(null),R=qe.useRef(null),M=qe.useRef(null);ee(()=>{if(a!==null){const v=JSON.stringify(a.config);l(q=>{const Q=q!==null&&JSON.stringify(q)!==A.current;return Q||(R.current=a.config,M.current=a.config),Q?q:JSON.parse(v)}),A.current=v}},[a]),ee(()=>{n!==null&&M.current===null&&R.current!==null&&(M.current=R.current)},[n]),ee(()=>{if(n===null||o===void 0)return;const v=JSON.stringify(n);if(v===A.current)return;T(Q=>Q.status==="saving"?Q:{...Q,status:"saving"});const q=setTimeout(()=>{const Q={},de=M.current??R.current;if(de!==null&&typeof de=="object")for(const C of Object.keys(n))JSON.stringify(n[C])!==JSON.stringify(de[C])&&(Q[C]=n[C]);if(Object.keys(Q).length===0){A.current=v,T({status:"saved",at:Date.now(),error:null});return}o.updateConfig(Q).then(()=>{A.current=v,de!==null&&typeof de=="object"&&(M.current={...de,...Q}),T({status:"saved",at:Date.now(),error:null})},C=>{T({status:"error",at:0,error:C?.message??String(C)})})},600);return()=>{clearTimeout(q)}},[n,o]),ee(()=>{a!==null&&s?.status==="error"&&s.error&&r({kind:"err",text:k("ledgerReadFailed",{message:s.error})})},[s?.status,s?.error]);const I=W((n??a?.config)?.locale),k=K(I);if(s===void 0||a===null)return e("div",{className:"cm-section"},e("p",{className:"cm-empty"},s?.status==="loading"?k("readingLedger"):k("ledgerUnavailable")),s?.error&&e("p",{className:"cm-err",role:"alert"},k("ledgerReadFailed",{message:s.error})),e("button",{className:"cm-btn",disabled:s?.status==="loading"||!o?.reload,onClick:o?.reload},k("refresh")));const U=a.config,ce=async()=>{if(!w){N(!0),r(null);try{const v=await o.fetchPrices();if(r({kind:v.ok?"ok":"err",text:v.message}),v.ok&&v.state&&typeof v.state.config=="object"){const q=JSON.stringify(v.state.config);l(JSON.parse(q)),A.current=q}}catch(v){r({kind:"err",text:k("syncFailed",{message:v?.message??String(v)})})}finally{N(!1),d(!1)}}},ke=async()=>{if(!w){N(!0);try{await o.resetHistory(),r({kind:"ok",text:k("historyCleared")})}catch(v){r({kind:"err",text:k("clearFailed",{message:v?.message??String(v)})})}finally{N(!1),m(!1)}}},Ne=async()=>{if(!w){N(!0),r(null);try{const v=await o.importLegacyHistory();r({kind:"ok",text:v.message})}catch(v){r({kind:"err",text:k("legacyImportFailed",{message:v?.message??String(v)})})}finally{N(!1),f(!1)}}},O=(v,q)=>{n!==null&&l({...n,[v]:q})},D=()=>{if(n===null)return;const v=g.trim().toLowerCase();if(v.length===0||!/^[a-z0-9_.-]+$/.test(v)||n?.prices.models[v]!==void 0)return;const q={...n.prices.models,[v]:{cacheHit:0,cacheMiss:0,output:0}};l({...n,prices:{...n.prices,models:q}}),h("")},G=n===null?[]:Object.keys(n.prices.models).filter(v=>{const Q=(n?.priceTableDisplay??U.priceTableDisplay??{})["deepseek:"+v];return typeof Q=="boolean"?Q:!0}).map(v=>e(qt,{key:v,modelId:v,entry:n.prices.models[v]??{cacheHit:0,cacheMiss:0,output:0},isDefault:!1,draft:n,setDraft:l,t:k})),B=[["overview",k("tabOverview")],["quotas",k("tabQuotas")],["usage",k("tabUsage")],["pricing",k("tabPricing")],["display",k("tabDisplay")]],V=y.status==="saving"?e("span",{className:"cm-hint"},k("saving")):y.status==="error"?e("span",{className:"cm-msg err"},k("autoSaveFailed",{message:y.error??""})):e("span",{className:"cm-hint"},y.status==="saved"?k("autoSavedAt",{time:new Date(y.at).toLocaleTimeString()}):k("autoSaveHint"));return e("div",{className:"cm-section"},e("div",{className:"cm-tabs-row"},e("div",{className:"cm-tabs",role:"tablist"},B.map(([v,q])=>e("button",{key:v,type:"button",role:"tab","aria-selected":String(b===v),className:"cm-tab"+(b===v?" active":""),onClick:()=>S(v)},q))),V),It(i),b==="overview"?e(E,{key:"overview"},e("div",{className:"cm-cards"},U.hideTodayCost===!0?null:e(it,{title:k("cardToday"),value:Y(_(a.today,U),U),sub:k("callsTokens",{calls:a.today.calls,input:j(a.today.input),cache:j(a.today.cacheRead+a.today.cacheWrite),output:j(a.today.output)})}),e(it,{title:k("cardMonth"),value:Y(_(a.month,U),U),sub:k("callsTokens",{calls:a.month.calls,input:j(a.month.input),cache:j(a.month.cacheRead+a.month.cacheWrite),output:j(a.month.output)})}),e(it,{title:k("cardTotal"),value:Y(_(a.total,U),U),sub:k("cardTotalSub",{calls:a.total.calls})})),e(ps,{state:a,t:k}),e("p",{className:"cm-note",key:"cards-footnote"},k("cardsFootnote")),(()=>{const v=kn(a);return v!==null?e("p",{className:"cm-note",key:"tz-hint"},k("timezoneHint",{host:v.hostLabel,browser:v.browserLabel})):null})(),e("label",{className:"cm-cards-toggle",title:k("cardsTogglePlanTotalHint")},e("input",{type:"checkbox",checked:(n??U).showTotalWithPlan===!0,onChange:v=>{const q=n??U;q!=null&&l({...q,showTotalWithPlan:v.target.checked})}}),e("span",null,k("cardsTogglePlanTotal"))),e("div",null,e("h3",{className:"cm-h"},k("todaySessions")),e(hs,{state:a,t:k})),e(ks,{state:a,draft:n,setDraft:l,t:k}),(U.balance?.display==="settings"||U.balance?.display==="both")&&U.hideOfficialBalance!==!0?e(Ps,{state:a,api:o,t:k,draft:n,setDraft:l}):null):null,b==="quotas"?e(Es,{key:"quotas",state:a,api:o,t:k,draft:n,setDraft:l}):null,b==="usage"?e(E,{key:"usage"},!Ye||(U.usage?.position??"cost")==="cost"?e(Ut,{state:a,t:k,locale:I}):null,e(Ns,{state:a,config:n??U,t:k,draft:n,setDraft:l}),e(Ms,{state:a,config:n??U,t:k}),e(fs,{state:a,api:o}),e(gs,{state:a,api:o}),e("div",null,e("h3",{className:"cm-h"},k("historyDataTitle")),e("div",{className:"cm-buttons"},p?e(E,null,e("span",{className:"cm-hint"},k("confirmImportLegacy")),e("button",{className:"cm-btn",onClick:Ne,disabled:w},k("apply")),e("button",{className:"cm-btn",onClick:()=>f(!1)},k("cancel"))):e("button",{className:"cm-btn",onClick:()=>f(!0),disabled:w},k("importLegacy")),c?e(E,null,e("span",{className:"cm-hint"},k("confirmReset")),e("button",{className:"cm-btn danger",onClick:ke,disabled:w},k("confirmClear")),e("button",{className:"cm-btn",onClick:()=>m(!1)},k("cancel"))):e("button",{className:"cm-btn danger",onClick:()=>m(!0),disabled:w},k("clearAllHistory"))),e("p",{className:"cm-note"},k("legacyImportNote")))):null,b==="display"?e(E,{key:"display"},e(ms,{draft:n,setDraft:l,t:k}),a?.secretMigration?.pending?.length>0?e(xn,{pending:a.secretMigration.pending,t:k}):null,e("div",{className:"cm-toolbar"},e("div",{className:"cm-field"},e("label",null,k("languageLabel")),e("select",{className:"cm-input",value:n?.locale??"auto",onChange:v=>O("locale",v.target.value)},e("option",{value:"auto"},k("localeAuto")),e("option",{value:"zh"},k("localeZh")),e("option",{value:"en"},k("localeEn"))))),e("div",null,e("h3",{className:"cm-h"},k("displaySettings")),e("div",{className:"cm-grid"},e("div",{className:"cm-grid-group"},k("groupGeneral")),...["includeSubagentCost","codexQuotaEnabled","codexQuotaSidebar"].map(v=>e("label",{key:v,className:"cm-check"},e("input",{type:"checkbox",checked:n?.[v]===!0,onChange:q=>O(v,q.target.checked)}),e("span",null,k(v)))),Ye?e("div",{className:"cm-field"},e("label",null,k("usagePositionLabel")),e("select",{className:"cm-input",value:n?.usage?.position??"cost",onChange:v=>{n!==null&&l({...n,usage:{...n.usage??{position:"cost"},position:v.target.value}})}},e("option",{value:"cost"},k("usagePositionCost")),e("option",{value:"general"},k("usagePositionGeneral")),e("option",{value:"section"},k("usagePositionSection")))):null,e("div",{className:"cm-field"},e("label",null,k("positionLabel")),e("select",{className:"cm-input",value:n?.position??"dock",onChange:v=>O("position",v.target.value)},e("option",{value:"dock"},k("positionDock")),e("option",{value:"header"},k("positionHeader")),e("option",{value:"off"},k("off")))),e("div",{className:"cm-field"},e("label",null,k("sidebarLabel")),e("select",{className:"cm-input",value:n?.sidebar===!1?"off":"on",onChange:v=>O("sidebar",v.target.value==="on")},e("option",{value:"on"},k("sidebarOn")),e("option",{value:"off"},k("off")))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.showSessionId===!0,onChange:v=>O("showSessionId",v.target.checked)}),e("span",null,k("showSessionIdLabel"))),e("div",{className:"cm-grid-group"},k("groupMoney")),e("div",{className:"cm-field"},e("label",null,k("currencyLabel")),e("select",{className:"cm-input",value:n?.currency??"CNY",onChange:v=>{const q=ys[v.target.value];q!==void 0&&n!==null&&l({...n,currency:v.target.value,...q})}},e("option",{value:"CNY"},k("currencyCny")),e("option",{value:"USD"},k("currencyUsd")),e("option",{value:"EUR"},k("currencyEur")))),e("div",{className:"cm-field"},e("label",null,k("symbolLabel")),e("input",{className:"cm-input narrow",type:"text",value:n?.symbol??"",onChange:v=>O("symbol",v.target.value)})),e("div",{className:"cm-field"},e("label",null,k("rateLabel")),te({value:n?.exchangeRate??1,emptyMode:"ignore"},v=>O("exchangeRate",v))),e("div",{className:"cm-field"},e("label",null,k("decimalsLabel")),te({value:n?.decimals??2},v=>O("decimals",Math.min(10,Math.floor(v))))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.hideOfficialBalance===!0,onChange:v=>O("hideOfficialBalance",v.target.checked)}),e("span",null,k("hideOfficialBalanceLabel"))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.hideTodayCost===!0,onChange:v=>O("hideTodayCost",v.target.checked)}),e("span",null,k("hideTodayCostLabel"))),e("div",{className:"cm-grid-group"},k("groupSidebar")),e("div",{className:"cm-field"},e("label",null,k("sidebarTodayMetric")),e("select",{className:"cm-input",value:n?.sidebarTodayMetric??"cost",onChange:v=>O("sidebarTodayMetric",v.target.value)},e("option",{value:"cost"},k("sidebarTodayCost")),e("option",{value:"tokens"},k("sidebarTodayTokens")))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.sidebarSimple===!0,onChange:v=>{n&&l({...n,sidebarSimple:v.target.checked,sidebarSimplePromptSeen:!0})}}),e("span",null,k("sidebarSimple"))),e("div",{className:"cm-field"},e("span",{className:"cm-hint"},k("sidebarSimpleNote"))),e("div",{className:"cm-field"},e("label",null,k("sidebarStyleLabel")),e("select",{className:"cm-input",value:n?.sidebarStyle??"standard",disabled:n?.sidebarSimple===!0,onChange:v=>O("sidebarStyle",v.target.value)},e("option",{value:"standard"},k("sidebarStyleStandard")),e("option",{value:"compact"},k("sidebarStyleCompact")))),e("div",{className:"cm-field"},e("label",null,k("balanceDisplayLabel")),e("select",{className:"cm-input",value:n?.balance?.display??"both",onChange:v=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5},display:v.target.value}})}},...Ge(k))),e("div",{className:"cm-field"},e("label",null,k("refreshIntervalLabel")),te({value:n?.balance?.refreshMinutes??5},v=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(v)))}})})),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.balance?.showProgressBar===!0,onChange:v=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},showProgressBar:v.target.checked}})}}),e("span",null,k("balanceShowProgressBar")))),e("div",{className:"cm-field"},e("label",null,k("balanceBudgetCapLabel")),te({value:n?.balance?.budgetCap??""},v=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},budgetCap:v>0?v:null}})}),e("span",{className:"cm-hint"},k("balanceBudgetCapHint"))),e("div",{className:"cm-field"},e("label",null,k("barDirectionsTitle")),["balance","budget","go","plan"].map(v=>e("div",{className:"cm-dir-row",key:v},e("span",{className:"cm-dir-label"},k("barDirection_"+v)),e("select",{className:"cm-input",value:n?.barDirections?.[v]??(v==="balance"?"remaining":"used"),onChange:q=>{if(n===null)return;const Q={balance:"remaining",budget:"used",go:"used",plan:"used"};l({...n,barDirections:{...n.barDirections??Q,[v]:q.target.value}})}},e("option",{value:"remaining"},k("barDirectionRemaining")),e("option",{value:"used"},k("barDirectionUsed"))))),e("span",{className:"cm-hint"},k("barDirectionsHint"))),e("div",{className:"cm-field"},e("label",null,k("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:n?.customBalance?.display??U.customBalance?.display??"both",onChange:v=>{n!==null&&l({...n,customBalance:{...n.customBalance??U.customBalance??{},display:v.target.value}})}},...Ge(k))),e("div",{className:"cm-field"},e("label",null,k("customBalanceRefreshInterval")),te({value:n?.customBalance?.refreshMinutes??U.customBalance?.refreshMinutes??15},v=>{n!==null&&l({...n,customBalance:{...n.customBalance??U.customBalance??{},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(v)))}})})),e(qa,{config:U,draft:n,setDraft:l,t:k,api:o}),e("div",{className:"cm-grid-group"},k("quotaStripGroup")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.quotaStrip?.enabled===!0,onChange:v=>{n!==null&&l({...n,quotaStrip:{...n.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0},enabled:v.target.checked,promptSeen:!0}})}}),e("span",null,k("quotaStripEnable")))),n?.quotaStrip?.enabled===!0?[["budget","quotaStripShowBudget"],["go","quotaStripShowGo"],["plans","quotaStripShowPlans"]].map(([v,q])=>e("label",{key:v,className:"cm-check"},e("input",{type:"checkbox",checked:n.quotaStrip[v]!==!1,onChange:Q=>{n!==null&&l({...n,quotaStrip:{...n.quotaStrip,[v]:Q.target.checked}})}}),e("span",null,k(q)))):null,e("div",{className:"cm-field"},e("span",{className:"cm-hint"},k("quotaStripNote"))),e("div",{className:"cm-grid-group"},k("groupCorner")),e("div",{className:"cm-field"},e("label",null,k("cornerLabel")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.corner?.enabled===!0,onChange:v=>{n!==null&&l({...n,corner:{...n.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},enabled:v.target.checked}})}}),e("span",null,k("cornerEnabledLabel"))),n?.corner?.enabled===!0?[["goRolling","cornerGoRolling"],["goWeekly","cornerGoWeekly"],["goMonthly","cornerGoMonthly"],["budget","cornerBudget"]].map(([v,q])=>e("label",{key:v,className:"cm-check"},e("input",{type:"checkbox",checked:n.corner[v]!==!1,onChange:Q=>{n!==null&&l({...n,corner:{...n.corner,[v]:Q.target.checked}})}}),e("span",null,k(q)))):null),e("div",{className:"cm-grid-group"},k("groupDetail")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.goQuota?.detail!==!1,onChange:v=>{n!==null&&l({...n,goQuota:{...n.goQuota??{display:"both",refreshMinutes:15,apiKey:"",main:"rolling",detail:!0},detail:v.target.checked}})}}),e("span",null,k("goDetailLabel")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.budget?.detail!==!1,onChange:v=>{n!==null&&l({...n,budget:{...n.budget??{enabled:!1,amount:100,period:"month",customStart:null,customEnd:null,detail:!0},detail:v.target.checked}})}}),e("span",null,k("budgetDetailLabel"))))),e("p",{className:"cm-note"},k("badgeNote")))):null,b==="pricing"?e(E,{key:"pricing"},e(ws,{state:a,draft:n,setDraft:l,t:k}),e("div",null,Re(P,()=>x(!P),k("priceTableTitle")),P?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-note"},k("priceTableNote")),e("p",{className:"cm-hint"},k("priceTableDisplayHint")),e("div",{className:"cm-catalog-vendor"},k("deepseekMountedHeader")),G,e(qt,{key:"__default__",modelId:k("defaultModelId"),entry:n?.prices.default??{cacheHit:0,cacheMiss:0,output:0},isDefault:!0,draft:n,setDraft:l,t:k}),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:k("newModelPlaceholder"),value:g,onChange:v=>h(v.target.value)}),e("button",{className:"cm-btn small",onClick:D,disabled:g.trim().length===0},k("addModel"))),(()=>{const v=n?.priceTableDisplay??U.priceTableDisplay??{},q=n?.prices?.providers??{},Q=C=>Object.keys(q[C]?.models??{}).filter(F=>v[C+":"+F]===!0),de=Object.keys(q).filter(C=>Q(C).length>0).sort((C,F)=>C.localeCompare(F));return de.length===0?null:de.map(C=>e("div",{key:C},e("div",{className:"cm-catalog-vendor"},(Oa[C]??C)+" · "+k("mountedSuffix")),Q(C).sort().map(F=>e(La,{key:C+":"+F,provider:C,modelId:F,entry:q[C].models[F],draft:n,setDraft:l,t:k}))))})()):null),(()=>{const v=n?.priceOverrides??U.priceOverrides??{},q=n?.priceMatchDismissed??U.priceMatchDismissed??[],Q=n?.prices??U.prices,de=a.today.byProviderModel??{},C={prices:Q,priceMatch:n?.priceMatch??U.priceMatch},F=Object.keys(de).filter(H=>{if(q.includes(H)||v[H]!==void 0)return!1;const z=H.indexOf(":"),we=(z>0?H.slice(0,z):"deepseek").toLowerCase(),Ht=z>0?H.slice(z+1):H;return yt(we,Ht,C).matched!==!0}),Z=[...new Set([...F,...Object.keys(v)])].filter(H=>!q.includes(H)),oe=a.month?.byProviderModel??{},Ee=Object.keys(oe).filter(H=>{if(q.includes(H)||v[H]!==void 0)return!1;const z=H.indexOf(":"),we=(z>0?H.slice(0,z):"deepseek").toLowerCase(),Ht=z>0?H.slice(z+1):H;return yt(we,Ht,C).matched===!0}).sort(),Se=[{value:"__local__",label:k("overrideTargetLocal")},{value:"deepseek:__default__",label:k("overrideTargetDefault")},...Object.keys(Q.models??{}).map(H=>({value:"deepseek:"+H,label:"DeepSeek · "+H})),...Object.entries(Q.providers??{}).flatMap(([H,z])=>Object.keys(z?.models??{}).map(we=>({value:H+":"+we,label:H+" · "+we})))],fe=(H,z)=>{if(n===null)return;const we={...n.priceOverrides??{}};z===""?delete we[H]:we[H]=z,l({...n,priceOverrides:we})},Te=H=>{if(n===null)return;const z={...n.priceOverrides??{}};delete z[H],l({...n,priceOverrides:z,priceMatchDismissed:[...new Set([...q,H])]})};return e("div",null,e("h3",{className:"cm-h"},k("priceMatchLabel")),e("div",{className:"cm-field"},e("select",{className:"cm-input",value:n?.priceMatch==="exact"?"exact":"auto",onChange:H=>O("priceMatch",H.target.value)},e("option",{value:"auto"},k("priceMatchAuto")),e("option",{value:"exact"},k("priceMatchExact")))),e("p",{className:"cm-note"},k("priceMatchNote")),Z.length>0?e(E,null,e("h3",{className:"cm-h"},k("unmatchedTitle")),e("p",{className:"cm-hint"},k("unmatchedHint")),Z.map(H=>e("div",{key:H,className:"cm-match-row"},e("span",null,jt(H)),e("select",{className:"cm-input",value:v[H]??"",onChange:z=>fe(H,z.target.value)},e("option",{value:""},"—"),Se.map(z=>e("option",{key:z.value,value:z.value},z.label))),e("button",{className:"cm-btn small",title:k("removePriceMatchHint"),onClick:()=>Te(H)},k("overrideRemove"))))):e("p",{className:"cm-hint"},k("overrideNone")),q.length>0?e("button",{className:"cm-btn small",onClick:()=>O("priceMatchDismissed",[])},k("restorePriceMatches",{count:q.length})):null,Ee.length>0?e(E,null,e("h3",{className:"cm-h"},k("matchedTitle")),e("p",{className:"cm-hint"},k("matchedHint")),Ee.map(H=>e("div",{key:H,className:"cm-match-row"},e("span",null,jt(H)),e("select",{className:"cm-input",value:"",onChange:z=>{z.target.value!==""&&fe(H,z.target.value)}},e("option",{value:""},k("matchedKeepAuto")),Se.map(z=>e("option",{key:z.value,value:z.value},z.label)))))):null)})(),e(vs,{state:a,draft:n,setDraft:l,t:k}),e("div",null,e("h3",{className:"cm-h"},k("dataSync")),(n??U).currency==="CNY"&&(n??U).prices?.currency!=="CNY"?e("div",{className:"cm-note",role:"status"},k("pricingCnyHint",{rate:(n??U).exchangeRate}),(n??U).pricingCurrency!=="CNY"?e("button",{className:"cm-btn small",disabled:w,onClick:()=>O("pricingCurrency","CNY")},k("pricingCurrencyCny")):null):null,e("div",{className:"cm-field"},e("label",null,k("pricingCurrencyLabel")),e("select",{className:"cm-input",value:n?.pricingCurrency==="CNY"?"CNY":"USD",onChange:v=>O("pricingCurrency",v.target.value)},e("option",{value:"USD"},k("pricingCurrencyUsd")),e("option",{value:"CNY"},k("pricingCurrencyCny"))),e("p",{className:"cm-note"},k("pricingCurrencyNote"))),e("div",{className:"cm-buttons"},u?e(E,null,e("span",{className:"cm-hint"},k("confirmFetch")),e("button",{className:"cm-btn",onClick:ce,disabled:w},k("apply")),e("button",{className:"cm-btn",onClick:()=>d(!1)},k("cancel"))):e("button",{className:"cm-btn",onClick:()=>d(!0),disabled:w},k("syncFromDocs"))),e("p",{className:"cm-note"},k("lastSync",{time:U.fetchedAt!==null?new Date(U.fetchedAt).toLocaleString():k("neverSynced")})+k("source",{source:U.priceSource==="official"?k("sourceOfficial"):k("sourceBundled")})),e("p",{className:"cm-note"},k("syncScopeNote")))):null)}const Is=["remote"];async function Us(t){const s=t.remote;if(s===void 0||typeof s.$mount!="function")return;const o=await s.$mount(sn);t.effect(()=>()=>{o()},"cost-meter: remote contribution");const a=t.get("remote.costMeter");if(a===void 0)return;const n=wn({status:"loading",error:null,state:null}),l=()=>K(W(n.getSnapshot().state?.config?.locale)),i=async(C,F)=>{const Z=await a[C](...F??[]);if(Z===null||typeof Z!="object"||Z.ok!==!0)throw new Error(Z?.error?.message??l()("rpcFailed",{method:C}));return Z.value};let r=Date.now(),u=!1,d=!0,c=1;const m=async()=>{if(!d||u)return;u=!0,r=Date.now();const C=n.getSnapshot();C.state===null&&n.set({...C,status:"loading"});try{const F=await i("getState");if(!d)return;c=1,n.set({status:"ready",error:null,state:F})}catch(F){if(!d)return;C.state===null&&(r=Date.now()),c=Math.min(c*2,60),n.set({status:"error",error:F?.message??String(F),state:C.state})}finally{u=!1}};t.effect(()=>t.on("connection/reset",()=>{m()}),"cost-meter: reconnect reload");const p=setInterval(()=>{const C=n.getSnapshot().state,F=C?.config.sidebarModels,Z=C?F?.enabled||F?.dock?F.refreshSeconds:60:c;!document.hidden&&Date.now()-r>=(Z||60)*1e3&&m()},1e3);t.effect(()=>()=>{d=!1,clearInterval(p)},"cost-meter: poll timer");const f=()=>{document.visibilityState==="visible"&&m()};document.addEventListener("visibilitychange",f),t.effect(()=>()=>{document.removeEventListener("visibilitychange",f)},"cost-meter: visibility reload");const g=async(C,F="rpcSyncFailed",Z=!1)=>{const oe=await C;if(oe===null||typeof oe!="object"||oe.ok!==!0)throw new Error(oe?.error?.message??(Z?oe?.value?.message:void 0)??l()(F));return oe.value.state!==void 0&&n.set({status:"ready",error:null,state:oe.value.state}),oe.value},h={reload:m,updateConfig:async C=>{const F=await i("updateConfig",[C]);return n.set({status:"ready",error:null,state:F}),F},fetchPrices:async()=>g(a.fetchPrices()),resetHistory:async()=>{const C=await i("resetHistory");return n.set({status:"ready",error:null,state:C}),C},importLegacyHistory:async()=>{const C=await a.importLegacyHistory();if(C===null||typeof C!="object"||C.ok!==!0)throw new Error(C?.error?.message??C?.value?.message??l()("legacyImportFailed",{message:"RPC failed"}));return C.value.state!==void 0&&n.set({status:"ready",error:null,state:C.value.state}),C.value},getDaySessions:async C=>i("getDaySessions",[C]),getSessionCost:async C=>i("getSessionCost",[C]),getTurnCost:async(C,F,Z)=>i("getTurnCost",[C,F,Z]),getTopSessions:async(C,F,Z)=>i("getTopSessions",[C,F,Z]),refreshBalance:async()=>g(a.refreshBalance(),"rpcBalanceFailed"),refreshGoQuota:async()=>g(a.refreshGoQuota()),refreshGatewayQuota:async(C=null)=>g(C==null?a.refreshGatewayQuota():a.refreshGatewayQuota(C)),refreshCustomBalance:async(C=null)=>g(C==null?a.refreshCustomBalance():a.refreshCustomBalance(C)),refreshCodingPlan:async C=>g(a.refreshCodingPlan(C)),setCredential:async(C,F)=>g(a.setCredential(C,F),"rpcSyncFailed",!0),clearCredential:async C=>g(a.clearCredential(C),"rpcSyncFailed",!0)};m();const w=t.get("slots");if(w===void 0)return;const N=()=>({hooks:{cost:n},api:h});w.inject("conversation.chat.turnTail",()=>w.register({name:"conversation.chat.turnTail",id:"cost-meter-turn",order:10,inject:N},Nn));const P=()=>({gen:0,dispose:null}),x=(C,F,Z,oe,Ee=!0)=>{C.dispose!==null&&(C.dispose(),C.dispose=null),C.gen+=1;const Se=C.gen;Ee&&w.inject(F,()=>{if(C.gen!==Se)return;const fe=typeof Z=="function"?Z():w.register(Z,oe);if(C.gen!==Se){fe();return}return C.dispose=fe,()=>{C.dispose===fe&&(C.dispose=null),fe()}})},b=P(),S=C=>{const F=C==="header"?"conversation.session.header.actions":"conversation.composer.dock";x(b,F,C==="header"?{name:F,id:"cost-meter",order:-5,inject:N}:{name:F,id:"cost-meter",order:5,inject:N},C==="header"?Sn:Cn,C!=="off")},y=P(),T=C=>{x(y,"sidebar.footer.action",{name:"sidebar.footer.action",id:"cost-meter",order:0,inject:N},ds,C)},A=P(),R=C=>{x(A,"conversation.composer.dock",{name:"conversation.composer.dock",id:"cost-meter-corner",order:9,inject:N},jn,C)};w.inject("conversation.input.dock",()=>w.register({name:"conversation.input.dock",id:"cost-meter-qstrip",order:5,inject:N},ss)),w.inject("sidebar.footer.action",()=>w.register({name:"sidebar.footer.action",id:"cost-meter-simple-guide",order:1,inject:N},os)),w.inject("sidebar.footer.action",()=>w.register({name:"sidebar.footer.action",id:"cost-meter-qstrip-guide",order:1,inject:N},ls)),w.inject("sidebar.footer.action",()=>w.register({name:"sidebar.footer.action",id:"cost-meter-balance-click-guide",order:2,inject:N},cs));const M=P(),I=C=>{x(M,"sidebar.footer.action",()=>w.register({name:"sidebar.footer.action",id:"cost-meter-peak-alert",order:0,inject:N},In),null,C)};window.cmPeakAlertPreview=C=>{if(window.__cmPeakAlertLive!==!0){console.warn("[dsh-cost-meter] 弹窗组件未挂载:需启用峰谷计价并重启 dsh web 后再预览。");return}window.dispatchEvent(new CustomEvent(Mt,{detail:{kind:C==="offpeak"?"offpeak":"peak"}}))};const k=P(),U=C=>{x(k,"settings.section",{name:"settings.section",id:"cost-meter",order:30,label:C==="en"?Oe.en.sectionLabel:Oe.zh.sectionLabel,inject:N},js,!0)},ce=P(),ke=C=>{x(ce,"settings.general.item",{name:"settings.general.item",id:"cost-meter-usage",order:30,inject:N},Ut,C)},Ne=P(),O=(C,F)=>{x(Ne,"settings.section",{name:"settings.section",id:"cost-meter-usage",order:31,label:F==="en"?Oe.en.usageSectionLabel:Oe.zh.usageSectionLabel,inject:N},Ut,C)};let D=null,G=null,B=null,V=null,v=null,q=null;const Q=()=>{const C=n.getSnapshot().state,F=C?.config?.position??"dock",Z=C?.config?.sidebar!==!1&&C?.config?.hideTodayCost!==!0,oe=C?.config?.balance?.display??"both",Ee=(oe==="sidebar"||oe==="both")&&C?.config?.hideOfficialBalance!==!0,Se=Z||Ee||C?.config?.codexQuotaEnabled===!0||C?.config?.sidebarModels?.enabled===!0,fe=C?.config?.corner?.enabled===!0||C?.config?.sidebarModels?.dock===!0,Te=W(C?.config?.locale),H=C?.config?.usage?.position??"cost";F!==D&&(S(F),D=F),Se!==G&&(T(Se),G=Se),fe!==B&&(R(fe),B=fe);const z=C?.config?.peakEnabled===!0;z!==q&&(I(z),q=z),Te!==V&&(U(Te),V=Te),H!==v?(Ye&&(ke(H==="general"),O(H==="section",Te)),v=H):Ye&&H==="section"&&Te!==V&&O(!0,Te)};Q();const de=n.subscribe(Q);return()=>{de()}}return ct.apply=Us,ct.inject=Is,Ft.exports}});
|
|
2
|
+
window.__ModuleLoader__.load({id:"dsh-cost-meter",factory:Ye=>{var Ft={exports:{}},dt=Ft.exports;Object.defineProperty(dt,Symbol.toStringTag,{value:"Module"});const Be=Ye("react"),{Tooltip:Z}=Ye("@deepseek-ai/dsh-client-ui-primitives"),Ve=!1,Ua='.cm-root{flex:0 1 auto;min-width:0;max-width:100%;text-align:center;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,.cm-foot-rail:hover,.cm-corner-chip:hover,.cm-qchip:hover,.cm-tab:hover,.cm-btn: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-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-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 .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.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.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-quota-name{flex:1;min-width:0}.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-model-costs{font-size:12px}.cm-model-costs .cm-bal-label{white-space:nowrap}.cm-model-top{gap:4px;max-width:180px;overflow:hidden;text-overflow:ellipsis}.cm-model-costs .cm-collapse-h{min-width:0;width:100%;white-space:nowrap}.cm-model-costs .cm-bbox-bar{margin-top:3px}.cm-bal-label{min-width:0;overflow:hidden;text-overflow:ellipsis}.cm-bal-amt{margin-left:auto;text-align:right;flex-shrink:0}.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-mm-reset{font-size:11px;color:var(--dsw-alias-label-tertiary);grid-column:1/-1}.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)}:has(>.cm-footer-stack),:has(>[data-slot="sidebar.footer.action"]>.cm-footer-stack){flex-wrap:wrap}:has(>.cm-footer-stack.rail),:has(>[data-slot="sidebar.footer.action"]>.cm-footer-stack.rail){flex-direction:column;flex-wrap:nowrap;align-items:center;gap:6px}.cm-footer-stack{display:flex;flex:none;order:-1;flex-direction:column;gap:6px;width:100%;min-width:0;max-width:100%;align-items:stretch;box-sizing:border-box}.cm-footer-stack.rail{align-items:center;order:1}.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}}',Wt="dsh-cost-meter/client.css";if(typeof document<"u"&&document.querySelector("style[data-plugin-css="+JSON.stringify(Wt)+"]")===null){const t=document.createElement("style");t.dataset.plugin="dsh-cost-meter",t.dataset.pluginCss=Wt,t.textContent=Ua,document.head.appendChild(t)}const Oe=Object.fromEntries([["zh",["本会话费用(按每次调用实际时刻精确计费)","输入 {input} · 缓存 {cache} · 输出 {output}","缓存:读 {read} · 写 {write}(写入按命中价计费)","费用 {amount}","本会话 {amount} · 命中 {hitRate} · 输入 {input} · 缓存 {cache} · 输出 {output}","无限制","当前人民币金额来自美元价格 × 汇率 {rate}。对照官方人民币账单,请选择 CNY,再同步价格;同步会更新历史费用。","余额查询失败:{message}","未知错误","余额","查询失败","DeepSeek 开放平台账户余额","官方余额变动与本地账本交叉对账(偏差超阈时提示)","总余额 {amount}","赠送 {granted} · 充值 {toppedUp}","更新时间 {time}","预算({period})","已用 {used} / {amount}","今日 {amount} · 占预算 {pct}","本月 {month} · 累计 {total}","预算","今日费用(按官方价格精确计费)","今日 Token 用量","tokens","调用 {calls} 次 · 输入 {input} · 缓存 {cache} · 输出 {output}","本月 {amount}","累计 {amount}","今日","侧边栏今日显示","费用","Token 用量","今日","本月","累计","自定义区间","暂无历史记录。开始对话后,费用将按天汇总在这里。","日期","调用","输入 tok","缓存 tok","输出 tok","费用","今日暂无会话记录。","会话","启用预算","预算额度(按显示币种)","预算周期","开始日期","结束日期(留空 = 今日)","统计区间:{range}","启用预算后显示额度、已用金额及比例(按显示币种换算);可选今日、本月、累计或自定义周期。","{period}预算 {amount} · 已用 {used} · {pct}%","(已超出)","(接近上限)","旧模型","默认回退","移除","基础","谷时","峰时","余额专用 API Key","优先使用此开放平台 Key;未配置时沿用模型凭据。账号登录令牌不能查询余额。","总余额 {total} · 赠送 {granted} · 充值 {toppedUp} · 更新于 {time}","余额查询失败:{message}","未查询余额","官方账户余额","刷新中…","刷新余额","自定义 Provider 余额","添加配置","添加千问 / 阿里云余额","查询阿里云中国站可用金。RAM AccessKey 需 bss:DescribeBillingAccount 权限。前两项必填;STS 才需 Security Token。密钥存凭据库。","extract 支持点路径、数值和 add/subtract/divide 运算;NewApi quota 除以 500000 得到美元。","中文名称","英文名称","请求 URL","请求方法","请求头 (JSON)","请求体 (JSON)","留空不发送;JSON 原文保存并发送。默认 Content-Type 为 application/json,可在请求头覆盖。","解析规则 (JSON)","自定义余额显示位置","刷新间隔 (分钟)","余额原币种","按显示币种折算(USD 余额)","使用显示汇率与精度;余额币种保持端点原币种。其他币种及积分不折算。","余额 {amount}","当日已用 {amount}","已用 {amount}","余额进度条 (蓝=余额,橙=当日,灰=已用)","进度条方向","各组进度条可独立选择填充方向:「剩余方向」满条起步、随消耗递减;「已用方向」空条起步、随消耗填满。","余额条(官方/自定义)","预算条","Go 额度条","Plan / Codex 额度条","剩余方向(满 → 空)","已用方向(空 → 满)","额度上限 (可选)","留空则优先使用 API 返回的 max_budget;仍无则显示整条浅蓝","JSON 格式无效","{{VAR_NAME}} 从凭据库或环境变量读取。<ROUTE>_API_KEY 中 ROUTE 为大写 Provider ID,符号改下划线,如 openai→OPENAI_API_KEY。同名共用密钥。","凭据白名单 (逗号分隔)","请求头带密钥时仅放行列表内主机,留空则放行并警告,防导入他人配置外带密钥。","凭据输入","为上方 {{VAR}} 占位符存入密钥(write-only,只写凭据库,不回显):",'请求头还没有 {{VAR}} 占位符:填入如 "Authorization": "Bearer {{MY_API_KEY}}" 后这里会出现凭据输入框。',"启用","剩余 {remaining} · 已用 {spend} / 额度 {maxBudget} · 更新于 {time}","剩余 {amount}","刷新自定义余额","OpenCode Go 订阅额度","Go","滚动 5 小时","本周","本月","重置:{time}","已到重置时间","剩余 {d}天{h}小时","剩余 {h}小时{m}分","剩余 {m}分钟","已用 {pct}%","剩余 {pct}%","{percent}%","更新于 {time}","Go 额度显示位置","Go 额度刷新间隔(分钟)","分钟","OpenCode Go API Key(可选,留空自动发现)","Go 额度主档位","Go 图框详细信息","已配置(来源:{source})","未配置","保存","清除","保存中…","密钥只写入 DSH 凭据库,不保存在账本里,也不会回显。","以下密钥仍在本地账本,未迁入凭据库。请导出对应环境变量后重启:","预算图框详细信息","刷新额度","未查询额度","Anthropic(Claude Pro/Max)","Z.ai / 智谱 GLM Coding Plan","MiniMax Token Plan","MiniMax Plan","查询域名(HTTPS)","留空自动选择官方站点。填写后 Key 仅发往该域名;使用可信地址,不含路径。","5h","7d","打开 DeepSeek 充值页(platform.deepseek.com/usage)","ChatGPT (Codex) 周额度","显示 Codex 额度(需安装并登录 dsh-openai-codex)","在侧栏显示 Codex 额度(关闭后仍保留会话额度条)","本会话费用包含子代理","暂无额度数据","显示位置","选「主页面侧边栏 / 两者」后显示额度卡片;窄栏显示百分比。","API Key(可选,留空自动发现)","刷新间隔(分钟)","刷新","未查询额度","CLIProxyAPI 网关额度","添加来源","来源名称","Base URL","显示位置","允许的 Host","Management Key(只写)","状态","不支持的 Provider","未知","未发现账号","抓取于 {time}","切换账号 (当前: {account})","只显示 Gemini 额度","刷新","先勾选启用这一项","启用并保存显示位置后可刷新","删除","勾选启用后会排到最上面;点名称可展开该项自己的配置。自定义余额最多 8 条,网关来源最多 4 条。","未启用。开启后将按刷新间隔查询该厂商的 coding plan 额度并显示在这里。","开启后读取 OpenCode Go 的滚动 5 小时、周、月额度,显示在侧栏、设置页及右下角;无订阅时提示原因。","右下角显示(dock)","在右下角显示 OpenCode Go 额度 / 预算","滚动 5 小时额度","本周额度","本月额度","预算已用%","5h","周","月","日","预算","账本读取失败:{message}","正在读取账本…","账本不可用","同步失败:{message}","历史记录已清除。","清除失败:{message}","峰谷计价已关闭,按基础价格计费","尚未生效(生效时间:{time}),当前按基础价格计费","当前处于峰时段,按峰时价计费","当前为 DeepSeek 峰时高价时段,按峰时价计费","当前处于谷时段,按谷时价计费","周末时段——全谷价(周六及周日全天按谷时价计费)","周末时段——全谷价","周末全谷","法定假日——全天谷价","法定假日——全谷价","假日","法定假日(北京日期,逗号分隔)","自 2026-08-23 北京时间 00:00 起,周末和中国公众假期全天谷价;调休上班的周末仍按谷价。","峰时","平价","峰谷时段条样式","简洁(单行紧凑)","经典(分段与胶囊芯片)","峰/谷切换前弹窗提醒","提前提醒(分钟,1-30)","提醒类型","进入峰时","进入谷时","峰和谷","即将进入峰时","即将进入谷时","约 {time} 后计费档位切换为{phase}价,请注意本时段调用成本。","峰时","谷时","知道了","峰价提醒","谷价提醒","弹窗位置","右下角","屏幕中心","同步发送系统通知","开关后请在浏览器地址栏允许通知权限,才能在页面最小化/切走时收到提醒。","预览弹窗","预览 进入峰","预览 进入谷","(预览)","峰谷计价与提示","提示已隐藏:需启用峰谷计价并开启「峰时高价时段显著提示」。","常规","金额与币种","侧边栏显示","简化侧栏显示","精简卡片,保留金额、额度和悬停详情;高度最多占屏幕 38%,超出可滚动。关闭后恢复。","试试更轻巧的侧栏","简化显示可以为会话列表留出更多空间。要现在开启吗?之后可在「设置 → 费用 → 显示」中切换。","开启简化显示","保留当前显示","设置未能保存。可重试,或关闭提示后在设置中调整。","关闭提示","今日 / {period}预算","侧边栏进度条样式","标准","紧凑(两列)","恢复已移除的模型 ({count})","移除会清除手动映射并隐藏此行,可恢复;不会删除用量记录,后续按自动匹配规则计价。","右下角角标","图框详细信息","拓展价格表","按厂商和模型分类的参考价。挂载后可编辑并计费;DeepSeek 取消挂载后用默认价。","展开拓展价格表","收起拓展价格表","挂载","取消挂载","已挂载","未核价","DeepSeek 取消挂载后按默认价计费。","按模型统计(token 与费用)","侧栏模型花费","{n} 模型","其它","显示模型花费卡片","默认展开","记住展开状态","显示 Token","显示费用占比条","右下角显示 Top-1 模型","默认周期","收起摘要","卡片位置","模型行数(1–10)","刷新间隔(10–60 秒)","周期总额与模型数","Top-1 模型与金额","顶部","余额之后","底部","今日","近 90 天","费用排行","Token 消耗","缓存命中率","未上报?","长调用无缓存命中:代理可能移除缓存字段。金额按全未命中计,是上界;可直连核对。","性价比 · 每美元 token 数","输入","缓存","输出","该时段暂无用量数据。","综合单价 {price}/M","命中率=缓存读÷(缓存读+普通输入);「未上报?」表示缓存字段可能缺失,金额为上界。单价=费用÷token×1M;性价比=token÷费用。","未分模型(早期数据 · 按当时记录计费)","本会话 {amount}(API)· Plan 等值 {planAmount} · 命中 {hitRate} · 输入 {input} · 缓存 {cache} · 输出 {output}","费用 {amount}(+Plan)","Plan 订阅额度消耗(等值){amount}","Token Plan 用量统计(每 1% 与满窗估算)","尚无 Coding Plan 额度数据;请在「额度」页开启并刷新厂商。","窗口","已用 %","本周期实际(本地账本)","每 1% 额度 ≈","满窗 100% ≈","重置 {time}","采样差分","当前用量折算","样本不足","{method}(基准 {time})","读数精度受限","Plan 用量曲线(按采样区间聚合)","每日","每周","每月","采样不足:至少两次成功刷新,且额度百分比发生变化。","{date}:满窗估计 ≈ {full}(每 1% ≈ {per1})· 实际 {tokens} / {cost} · {intervals} 个采样区间","金额是目录价等值;订阅耗额度,预算只计 API。估算仅含 dsh 调用;服务端百分比含全账号。短时样本精度有限;5h 滚动,周/月按本地日历。","计费方式","Plan 订阅","自动","API 按量","在费用设置直接显示","仅控制是否在费用价格表直接显示;不影响挂载和计费。隐藏的已挂载模型仍可在拓展表编辑。","可逐模型切换显示位置。DeepSeek 默认直接显示,第三方默认在拓展表。","手动新增模型","未知模型名自动匹配","自动(去后缀 / 前缀 / 家族相似)","仅精确匹配","手动指定优先;自动匹配只接受同名及日期、版本、上下文后缀。未命中的 DeepSeek 用默认价,其他渠道不计价。","最近出现但未命中价格的模型","这些模型没有价格。可手动指定;「默认价」使用 DeepSeek 默认价。本地推理默认零费用。","DeepSeek 默认价","移除","本地模型(零消耗)","本月已命中价格的模型","这些模型自动匹配价格。可改选价格或零费用;token 仍统计。保存后移入手动指定区。","保持自动命中","暂无手动匹配覆盖。","已挂载(参与计费)","输入","缓存","输出","DeepSeek 价格表(已挂载)","Kimi / Moonshot","OpenRouter","SiliconFlow 硅基流动","CommandCode","SCNet 超算互联网 Token Plan","火山方舟 Volcano Ark Coding Plan","千问 Qwen Token Plan","小米 MiMo Token Plan","套餐积分","补偿积分","余额","额度来源","本地估算","官方 CLI","百炼 CLI","CLI 模式需在 DSH 主机安装 @qianwenai/qianwen-cli,并以同一系统账号运行 qianwen auth login。","百炼 CLI:在 DSH 主机安装 bailian-cli 并以同一系统账号运行 bl auth login --console。","月度 Credits 额度(个人版 Lite 5 万 / 标准版 50 万,以订阅页为准)","订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)","Credits 抵扣率覆盖(可选;每百万 token 抵扣的 Credits,留空用内置表)","模型名,如 qwen3.8-max-preview","费率","输入","缓存读","输出","待填齐三项正数后自动保存;全部清空恢复内置表。","添加","Credits 本地估算,以控制台为准。只计 qwen 及 qwen/qianwen-tokenplan 订阅渠道,含 llm- 前缀;不计按量 API。表外模型需设抵扣率。","本地估算月度 Credits 额度(基础 60,000 / 标准 240,000 / 高级 600,000)","订阅起始日(可选,格式 YYYY-MM-DD;留空按自然月)","优先用 24 小时内的控制台快照,否则按本地账本和官方 Credits 表估算。其他工具和表外模型不计入。","火山引擎 AccessKey ID","火山引擎 SecretAccessKey","火山方舟需 AK/SK、ArkReadOnlyAccess 和 BillingCenterReadOnlyAccess;可填凭据或导出 VOLC_ACCESSKEY/VOLC_SECRETKEY。只连接 open.volcengineapi.com。","AK...","SK...","{h}小时","{h}小时{m}分","{m}分钟","{time}后进入平价","{time}后进入高峰","峰时段(UTC):{windows};生效时间:{time}。{status}","未配置峰谷时段。{status}","未知","今日费用","本月费用","累计费用","自账本建立以来 · 调用 {calls} 次","外部用量","DSH + 外部合计","外部快照超过 24 小时未更新","近期每日记录","金额取最近快照,可能比官方账单晚几分钟。tokens 含输入、输出、缓存和推理;推理并入输出计费。以金额对账。","今日/本月按宿主时区 {host},浏览器为 {browser}。时区不同会影响日界和对账;可将 dsh 改为本地时区。","今日会话","点击日期行可展开当日会话明细","会话明细加载中…","该日无会话明细(早期数据或会话日志已清理)","会话明细加载失败","按会话统计(全部历史)","不按日期分组,全部历史会话;排序与条数可切换","暂无会话数据","会话排行加载中…","会话排行加载失败","显示条数","会话列表附显会话 ID","金额含 Plan 总额","开启后所有金额按含 Plan 订阅等值的总费用展示;关闭(默认)仅计真金白银 API 渠道","隐藏官方账户余额(开启后侧边栏与设置页不再显示官方余额)","隐藏今日消耗金额(开启后侧边栏/预算明细/概览卡片不再显示今日费用)","排序","费用 高→低","费用 低→高","时间 新→旧","时间 旧→新","实时顺序","历史记录","计费统计需要 DSH 0.2.0-rc.2 或更新版本的模块加载器。","Token 用量统计","累计 {tokens} tokens · 输入 {input} · 缓存 {cache} · 输出 {output} · {calls} 次调用","{date}:共 {tokens} tokens(输入 {input} · 缓存 {cache} · 输出 {output})· {calls} 次调用 · {cost}","暂无历史数据,开始对话后每日用量会汇总在这里","用量","Token 用量统计位置","费用设置","通用设置","独立分节(用量)","显示设置","概览","额度","用量","价格","显示","历史数据","会话费用显示位置","输入区下方","会话标题栏","关闭","输入框上方额度横条","启用额度横条(输入框上方一条横排显示)","横条含预算已用%","横条含 Go 额度","横条含 Coding Plan 额度","横条悬停可见各窗口重置时刻与更新时间;无可用额度数据时自动隐藏。","新增:输入框上方额度横条","在输入框上方显示预算及 OpenCode Go/Coding Plan 额度百分比。现在开启吗?可在「设置 → 显示设置」修改。","开启横条","暂不开启","点击立即刷新","新增:余额图框点击刷新","点击侧边栏余额或 Coding Plan 图框即可刷新;刷新时图框闪烁,失败时保留原值并在悬停提示中说明原因。","知道了","当日费用显示","侧边栏底部","货币单位","人民币 CNY","美元 USD","欧元 EUR","货币符号","汇率(1 美元 = ? 目标币种)","小数位数","余额显示位置","主页面侧边栏","设置页","两者都显示","余额刷新间隔(分钟)","启用 DeepSeek 峰谷时段价格","峰时高价时段显著提示(侧边栏预算框/今日费用;设置页峰谷面板内预览)","会话按调用时价格计费(含峰谷与历史档位)。输入、输出、缓存读写分开统计;独立缓存写入价与长上下文档位按配置生效。","价格表(美元 / 1M tokens)","官方价格币种","美元(英文官方页)","人民币(中文官方页)","决定同步价格所用的官方页语言。切换并同步后后台重算历史;日志不全的会话保留原价。完成后提示。","按调用时间计价:Flash 自 9 月 10 日北京 12:00 用新价,V4 Pro 自 9 月 14 日同刻用 Flash 价;此前用历史价。工作日 09–12、14–18 峰价翻倍;周末及中国公众假期全天谷价。缓存写入按命中价。","这里显示当前适用价格。手工编辑会取消此条后续预定调价,已发生的历史价格仍保留。","default(未匹配模型时回退)","新模型 ID(如 deepseek-v4-pro)","添加模型","数据与同步","保存中…","自动保存失败:{message}","已自动保存 {time}","配置修改后自动保存","确认用官方文档价格覆盖价格表?","应用","取消","从官方文档同步价格","官方同步只更新 DeepSeek 价格(含峰谷);z-ai/Kimi/Qwen/Volcano 等第三方价格随版本更新,也可在拓展价格表或模型名匹配中调整。","确认清除全部历史?","导入安装前历史","确认导入?将回放全部会话日志,只补账本缺失的日期与会话,不影响已有记录。","导入安装前历史失败:{message}","首次启动自动导入旧记录;拷入日志后可重跑。按当前价格回推;已删除日志无法回放,跨安装时刻的会话不计此前用量。","确认清除","清除全部历史","最近同步:{time}","从未(使用内置价格)",";来源:{source}","官方文档","内置默认","界面语言","跟随浏览器(自动)","简体中文","English","费用","{method} 调用失败","同步调用失败","余额刷新调用失败"]],["en",["Cost of this session (billed exactly at each call time)","Input {input} · Cache {cache} · Output {output}","Cache: read {read} · write {write} (writes billed at the hit price)","Cost {amount}","This session {amount} · Hit {hitRate} · Input {input} · Cache {cache} · Output {output}","Unlimited","CNY totals use USD prices × {rate}. To compare official CNY bills, select CNY, then sync prices; syncing also updates historical costs.","Balance query failed: {message}","Unknown error","Balance","Query failed","DeepSeek open-platform account balance","Cross-check official balance changes against the local ledger (warn when they diverge)","Total {amount}","Granted {granted} · Topped-up {toppedUp}","Updated {time}","Budget ({period})","Used {used} / {amount}","Today {amount} · {pct} of budget","This month {month} · All time {total}","Budget","Today's cost (billed exactly at official prices)","Today's token usage","tokens","Calls {calls} · Input {input} · Cache {cache} · Output {output}","This month {amount}","All time {amount}","Today","Sidebar today display","Cost","Token usage","Today","This month","All time","Custom range","No history yet. Once you start chatting, costs are aggregated here per day.","Date","Calls","In tok","Cache tok","Out tok","Cost","No sessions recorded today.","Session","Enable budget","Budget amount (in display currency)","Budget period","Start date","End date (empty = today)","Range: {range}","Enable a budget to see its limit, used amount and percentage in the display currency. Choose today, month, all time or a custom range.","{period} budget {amount} · Used {used} · {pct}%"," (over limit)"," (near limit)","Legacy","Default fallback","Remove","Base","Off-peak","Peak","Balance API key","This Open Platform key takes priority over model credentials. Account-login tokens cannot query balances.","Total {total} · Granted {granted} · Topped-up {toppedUp} · Updated {time}","Balance query failed: {message}","Balance not queried","Account balance","Refreshing…","Refresh balance","Custom provider balance","Add entry","Add Qianwen / Alibaba Cloud balance","Shows Alibaba Cloud China funds. RAM AccessKey needs bss:DescribeBillingAccount. The first two fields are required; Security Token is for STS. Secrets stay in the credential store.","Extract accepts paths, numbers and add/subtract/divide. Divide NewApi quota by 500000 for USD.","Chinese name","English name","Request URL","HTTP method","Headers (JSON)","Request body (JSON)","Blank sends no body; JSON text is saved and sent as entered. Content-Type defaults to application/json; headers can override it.","Extract rules (JSON)","Custom balance display","Refresh interval (minutes)","Source currency","Convert USD balance to display currency","Uses the display rate and precision. Keep the source currency; other currencies and credits stay unchanged.","Balance {amount}","Today {amount}","Spent {amount}","Balance progress bar (blue=balance, orange=today, gray=spent)","Progress bar direction",'Each group of bars can independently choose its fill direction: "Remaining" starts full and drains with usage; "Used" starts empty and fills up.',"Balance bars (official/custom)","Budget bar","Go quota bar","Plan / Codex quota bars","Remaining (full → empty)","Used (empty → full)","Budget cap (optional)","Leave empty to use API max_budget; if still missing, show full light-blue bar","Invalid JSON","{{VAR_NAME}} reads a credential or environment variable. <ROUTE>_API_KEY uses an uppercase Provider ID with underscores, such as openai→OPENAI_API_KEY. Names can share a key.","Allowed hosts (comma-separated)","When headers carry credentials only listed hosts are allowed; leave empty to allow with a warning. Protects keys when importing someone else's config.","Credential input","Store the key for each {{VAR}} placeholder above (write-only: stored in the DSH credential store, never echoed back):",'No {{VAR}} placeholders in the headers yet — add e.g. "Authorization": "Bearer {{MY_API_KEY}}" and a credential input will appear here.',"Enable","Remaining {remaining} · Spent {spend} / Budget {maxBudget} · Updated {time}","Remaining {amount}","Refresh custom balance","OpenCode Go subscription quota","Go","Rolling 5h","Weekly","Monthly","Resets: {time}","Reset time reached","{d}d {h}h left","{h}h {m}m left","{m}m left","{pct}% used","{pct}% remaining","{percent}%","Updated {time}","Go quota display position","Go quota refresh interval (minutes)","min","OpenCode Go API key (optional; empty = auto-detect)","Go quota primary window","Go box details","Configured (source: {source})","Not configured","Save","Clear","Saving…","The key is written to the DSH credential store only — it is never saved in the ledger and never echoed back.","These credentials remain in the local ledger. Export the matching environment variables and restart:","Budget box details","Refresh quota","Quota not queried","Anthropic (Claude Pro/Max)","Z.ai / Zhipu GLM Coding Plan","MiniMax Token Plan","MiniMax Plan","Quota origin (HTTPS)","Empty: official sites. Otherwise the Key is sent only to this origin. Use a trusted address without a path.","5h","7d","Open DeepSeek top-up page (platform.deepseek.com/usage)","ChatGPT (Codex) weekly quota","Show Codex quota (requires signed-in dsh-openai-codex)","Show Codex quota in sidebar (keep the conversation strip when hidden)","Include subagents in session cost","No quota data","Display position","“Main sidebar / Both” shows a quota card; the narrow rail shows percentages.","API key (optional; empty = auto-detect)","Refresh interval (minutes)","Refresh","Quota not queried","CLIProxyAPI gateway quotas","Add source","Source label","Base URL","Display","Allowed hosts","Management key (write-only)","Status","Unsupported providers","Unknown","No accounts","fetched {time}","Switch account (current: {account})","Gemini quota only","Refresh","Enable this item first","Enable and save a display position to refresh","Remove","Enabled items move to the top; click a name to expand its own settings. Up to 8 custom balances and 4 gateway sources.","Disabled. Enable it to query this vendor's coding plan quota on the refresh interval and show it here.","Enable OpenCode Go rolling 5h, weekly and monthly quotas in the sidebar, Settings and bottom-right corner. Missing subscriptions show a reason.","Bottom-right (dock) display","Show OpenCode Go quota / budget at the bottom-right","Rolling-5h quota","Weekly quota","Monthly quota","Budget used %","5h","Wk","Mo","Daily","Budget","Ledger read failed: {message}","Reading ledger…","Ledger unavailable","Sync failed: {message}","History cleared.","Clear failed: {message}","Peak/off-peak pricing is off; base prices are used","Not yet effective (effective at {time}); base prices are currently used","Peak hour now; peak prices apply","DeepSeek peak-hour pricing is active; current calls are billed at peak prices","Off-peak now; off-peak prices apply","Weekend — all off-peak (Sat & Sun billed at off-peak prices all day)","Weekend — all off-peak","Weekend","Chinese public holiday — off-peak all day","Public holiday — all off-peak","Holiday","Public holidays (Beijing dates, comma separated)","Since Aug 23, 2026 (Beijing time), weekends and Chinese public holidays are off-peak all day, including work-shift weekends.","Peak","Off-peak","Peak period strip style","Compact (one-line)","Classic (segments & chip)","Popup alert before peak/off-peak switch","Lead time (minutes, 1-30)","Alert type","Entering peak","Entering off-peak","Both","Entering peak hours soon","Entering off-peak hours soon","Billing switches to {phase} pricing in about {time}; mind your call costs in this window.","peak","off-peak","Got it","Peak alert","Off-peak alert","Popup position","Bottom-right","Screen center","Also send a system notification","When enabled, allow notification permission in the browser address bar so you get alerted even when the page is minimized or backgrounded.","Preview the popup","Preview entering peak","Preview entering off-peak"," (preview)","Peak/off-peak pricing & notice","Notice hidden: enable peak/off-peak pricing and the “prominent notice” toggle.","General","Money & currency","Sidebar display","Simplify the sidebar","Condense cards but keep amounts, quotas and hover details. Height is capped at 38% of the viewport with scrolling. Turn off to restore.","A lighter sidebar","Simple display leaves more room for conversations. Enable it now? You can change it in Settings → Cost → Display anytime.","Enable simple display","Keep current display","Settings could not be saved. Retry or dismiss this guide and change them later in Settings.","Dismiss guide","Today / {period} budget","Sidebar progress style","Standard","Compact (2 columns)","Restore removed models ({count})","Remove clears the override and hides the row until restored. Usage records are kept; automatic price matching applies.","Corner chips","Box details","Extended price catalog","Reference prices by vendor and model. Mount to edit and bill; unmounted DeepSeek uses its default price.","Expand extended price catalog","Collapse extended price catalog","Mount","Unmount","Mounted","Unpriced","Unmounted DeepSeek models use the default price.","Per-model statistics (tokens & cost)","Sidebar model costs","{n} models","Other","Show model cost card","Expand by default","Remember expansion","Show tokens","Show cost shares","Top model in corner dock","Default period","Collapsed summary","Card position","Model rows (1–10)","Refresh interval (10–60 seconds)","Period total and model count","Top model and cost","Top","After balances","Bottom","Today","Last 90 days","Cost ranking","Token usage","Cache hit rate","unreported?","Zero cache hits on long calls may mean a relay removed cache fields. All-miss cost is an upper bound; check with the direct API.","Value · tokens per USD","Input","Cache","Output","No usage data for this period.","blended {price}/M","Hit rate = cache reads ÷ (reads + uncached input). “Unreported?” means cache data may be missing, so cost is an upper bound. Unit price = cost ÷ tokens × 1M; value = tokens ÷ cost.","Unattributed (early data · billed as recorded)","This session {amount} (API) · Plan equiv. {planAmount} · Hit {hitRate} · Input {input} · Cache {cache} · Output {output}","Cost {amount} (+Plan)","Plan subscription quota usage (equiv.) {amount}","Token Plan usage stats (per-1% & full-window estimates)","No Coding Plan quota data yet. Enable and refresh a provider under Quotas.","Window","Used %","This period actual (local ledger)","Per 1% quota ≈","Full window (100%) ≈","resets {time}","sample delta","current usage ratio","not enough samples","{method} (as of {time})","low reading precision","Plan usage curves (aggregated from sample intervals)","Daily","Weekly","Monthly","Not enough samples: refresh successfully twice with a quota percentage change.","{date}: full-window est. ≈ {full} (per 1% ≈ {per1}) · actual {tokens} / {cost} · {intervals} sample interval(s)","Amounts are catalog-price equivalents. Plans use quota; budgets count API only. Estimates cover dsh calls, while server percentages cover the account. Short samples are less precise. 5h rolls; week/month use local dates.","Billing class","Plan subscription","Auto","API usage","Show directly in Cost settings","Controls direct display in Cost settings; mounting and billing stay unchanged. Hidden models remain editable in this catalog.","Choose where each model appears. DeepSeek shows directly; other vendors default to the catalog.","Custom models","Auto-match unknown model names","Auto (strip suffix / prefix / family similarity)","Exact match only","Manual overrides take priority. Auto-match accepts only the same name or date, version and context suffixes. Unknown DeepSeek models use the default price; other providers stay unpriced.","Recently seen models without a price hit","These models have no price. Assign one manually; “Default price” uses DeepSeek defaults. Local inference costs zero until assigned.","DeepSeek default price","Remove","Local model (zero cost)","Models matched this month","These models matched automatically. Choose another price or zero cost; tokens still count. Saved overrides move to the manual list.","Keep auto match","No manual match overrides.","Mounted (billed)","Input","Cached","Output","DeepSeek price table (mounted)","Kimi / Moonshot","OpenRouter","SiliconFlow","CommandCode","SCNet Token Plan","Volcano Ark Coding Plan","Qwen Token Plan (qianwenai.com)","Xiaomi MiMo Token Plan","Plan credits","Compensation","Balance","Quota source","Local estimate","Official CLI","Bailian CLI","Install @qianwenai/qianwen-cli on the DSH host and run qianwen auth login as the same OS user.","Bailian CLI: install bailian-cli on the DSH host and run bl auth login --console as the same OS user.","Monthly credits quota (personal Lite 50K / Standard 500K; see your plan page)","Plan start date (optional, YYYY-MM-DD; empty = calendar month)","Credits rate overrides (optional; credits deducted per 1M tokens; empty = built-in table)","Model name, e.g. qwen3.8-max-preview","rate","Input","Cached input","Output","Enter all three positive rates to save automatically; clear all to restore the built-in table.","Add","Local Credits estimate; console is authoritative. Counts qwen and qwen/qianwen-tokenplan subscription routes, including llm- prefix. Excludes pay-as-you-go API. Add rates for other models.","Monthly credits quota for local estimates (Basic 60,000 / Standard 240,000 / Pro 600,000)","Plan start date (optional, YYYY-MM-DD; empty = calendar month)","Uses console snapshots newer than 24h, then estimates from local records and official Credits rates. Other tools and unlisted models are excluded.","Volcengine AccessKey ID","Volcengine SecretAccessKey","Volcano Ark needs AK/SK, ArkReadOnlyAccess and BillingCenterReadOnlyAccess. Enter credentials or export VOLC_ACCESSKEY/VOLC_SECRETKEY. Only open.volcengineapi.com is contacted.","AK...","SK...","{h}h","{h}h {m}m","{m}m","Off-peak in {time}","Peak in {time}","Peak hours (UTC): {windows}; effective: {time}. {status}","No peak windows configured. {status}","unknown","Today","This month","All time","Since the ledger was created · Calls {calls}","External usage","DSH + external total","External snapshot has not been updated for 24 hours","Recent daily records","Amounts use the latest snapshot and may lag the official bill by minutes. Tokens include input, output, cache and reasoning; reasoning is billed with output. Reconcile by amount.","Today/month use host timezone {host}; this browser uses {browser}. Different day boundaries affect reconciliation. Set dsh to your local timezone to align.","Today's sessions","Click a date row to expand its session details","Loading session details…","No session details for this day (early data or session logs cleaned)","Failed to load session details","By session (all history)","All historical sessions, not grouped by date; sort and row count are switchable","No session data yet","Loading session ranking…","Failed to load session ranking","Rows","Show session IDs in session lists","Include plan totals","When on, every amount shows total equivalent cost including plan subscriptions; off (default) counts real-money API channels only","Hide official account balance (balance UI removed from sidebar and settings)","Hide today's cost (today's amount removed from sidebar, budget details and overview card)","Sort","Cost high→low","Cost low→high","Time new→old","Time old→new","Recent order","History","Cost statistics requires the module loader from DSH 0.2.0-rc.2 or newer.","Token usage stats","All-time {tokens} tokens · input {input} · cache {cache} · output {output} · {calls} calls","{date}: {tokens} tokens (input {input} · cache {cache} · output {output}) · {calls} calls · {cost}","No history yet — daily usage will accumulate here","Usage","Token usage stats position","Cost settings","General settings","Own section (Usage)","Display settings","Overview","Quotas","Usage","Pricing","Display","History data","Session cost display position","Below the composer","Session title bar","Off","Quota strip above the input","Enable the quota strip (one row above the input box)","Strip includes budget used %","Strip includes the Go quota","Strip includes coding plan quotas","Hover a chip for reset times and the last refresh; the strip hides itself when there is no quota data.","New: quota strip above the input","Show budget and OpenCode Go/coding-plan percentages above the input box. Enable now? Change it anytime in Settings → Display.","Enable the strip","Not now","Click to refresh now","New: click the balance box to refresh","Click a sidebar balance or plan box to refresh. It pulses while loading; on failure it keeps the old value and shows the reason on hover.","Got it","Today cost display","Sidebar footer","Currency","Chinese Yuan (CNY)","US Dollar (USD)","Euro (EUR)","Currency symbol","Exchange rate (1 USD = ? target currency)","Decimal places","Balance display position","Main sidebar","Settings page","Both","Balance refresh interval (minutes)","Use DeepSeek peak-hour prices","Prominent notice during peak hours (sidebar budget box, today's cost; previewed in the Settings peak panel)","Session cost uses call-time prices, including peak and historical rates. Input, output, cache reads and writes are separate; configured cache-write and long-context rates apply.","Price table (USD / 1M tokens)","Official price currency","USD (English official page)","CNY (Chinese official page)","Selects the official pricing-page language. Sync then recalculates history in the background; sessions without full logs keep their earlier basis.","Call-time prices: Flash changes Sep 10 04:00 UTC; V4 Pro uses Flash prices from Sep 14 04:00 UTC. Earlier calls retain history. Mon–Fri peaks 01–04 and 06–10 UTC cost 2×; weekends and Chinese public holidays are off-peak. Cache writes use hit rates.","Current rates are shown here. Editing cancels any future scheduled change for this entry; earlier historical rates are retained.","default (fallback for unmatched models)","New model ID (e.g. deepseek-v4-pro)","Add model","Data & sync","Saving…","Auto-save failed: {message}","Auto-saved {time}","Settings are auto-saved","Overwrite the price table with prices from the official docs?","Apply","Cancel","Sync prices from official docs","Official sync updates DeepSeek prices (including peak rates). Third-party prices (z-ai/Kimi/Qwen/Volcano) follow releases; edit in the extended catalog or model matching.","Clear all history?","Import pre-install history","Confirm import? Replays all session logs and only fills dates/sessions missing from the ledger; existing records are untouched.","Failed to import pre-install history: {message}","Pre-install history imports at first launch; rerun after copying old logs. Costs use current prices. Deleted logs cannot replay; sessions spanning installation exclude earlier usage.","Confirm clear","Clear all history","Last sync: {time}","Never (bundled prices)","; Source: {source}","Official docs","Bundled","Language","Follow browser (auto)","Simplified Chinese","English","Cost","{method} call failed","Sync call failed","Balance refresh call failed"]]].map(([t,s])=>[t,Object.fromEntries(["sessionCostTitle","sessionDetailTokens","sessionDetailCache","cost","sessionLine","quotaUnlimited","pricingCnyHint","balanceQueryFailed","unknownError","balance","queryFailed","balanceTitle","reconcileLabel","totalBalance","grantedToppedUp","updatedAt","budgetOf","usedOf","todayShare","monthTotal","budget","todayCostTitle","todayTokensTitle","tokensUnit","callsTokens","monthCost","totalCost","today","sidebarTodayMetric","sidebarTodayCost","sidebarTodayTokens","periodDay","periodMonth","periodAll","periodCustomRange","noHistory","colDate","colCalls","colInTok","colCacheTok","colOutTok","colCost","noSessionsToday","colSession","enableBudget","budgetAmountLabel","budgetPeriodLabel","startDate","endDate","rangeText","budgetDisabledNote","budgetStatus","overLimit","nearLimit","legacyModel","defaultFallback","remove","tierBase","tierOffPeak","tierPeak","balanceApiKey","balanceKeyHint","balanceLine","balanceQueryFailedHint","balanceNotQueried","accountBalance","refreshing","refreshBalance","customBalanceTitle","customBalanceAdd","aliyunBalanceAdd","aliyunBalanceNote","customBalanceConfigNote","customBalanceLabelZh","customBalanceLabelEn","customBalanceUrl","customBalanceMethod","customBalanceHeaders","customBalanceBody","customBalanceBodyNote","customBalanceExtract","customBalanceDisplayLabel","customBalanceRefreshInterval","customBalanceUnitLabel","customBalanceConvert","customBalanceConvertNote","balanceBarRemaining","balanceBarToday","balanceBarSpent","balanceShowProgressBar","barDirectionsTitle","barDirectionsHint","barDirection_balance","barDirection_budget","barDirection_go","barDirection_plan","barDirectionRemaining","barDirectionUsed","balanceBudgetCapLabel","balanceBudgetCapHint","customBalanceInvalidJson","customBalanceHeadersVarNote","customBalanceAllowedHosts","customBalanceAllowedHostsHint","customBalanceCredentialsTitle","customBalanceCredentialsHint","customBalanceNoPlaceholders","enable","customBalanceLine","customBalanceRemaining","refreshCustomBalance","goQuotaTitle","goQuotaRowLabel","goWindowRolling","goWindowWeekly","goWindowMonthly","goResetAt","resetReached","resetDays","resetHours","resetMinutes","quotaUsed","quotaRemaining","goQuotaPercent","goQuotaFetchedAt","goQuotaDisplayLabel","goQuotaRefreshIntervalLabel","goQuotaRefreshMinutesUnit","goQuotaKeyLabel","goMainLabel","goDetailLabel","credentialConfiguredOf","credentialNotConfigured","credentialSave","credentialClear","credentialSaving","credentialInputHint","secretMigrationPending","budgetDetailLabel","refreshGoQuota","goQuotaNotQueried","codingPlanAnthropic","codingPlanZai","codingPlanMinimax","codingPlanMinimaxTitle","minimaxOrigin","minimaxOriginNote","codingPlanRemain5h","codingPlanRemain7d","balanceRechargeLink","codexQuotaTitle","codexQuotaEnabled","codexQuotaSidebar","includeSubagentCost","gatewayQuotaEmpty","codingPlanDisplayLabel","codingPlanDisplayNote","codingPlanKeyLabel","codingPlanRefreshIntervalLabel","refreshCodingPlan","codingPlanNotQueried","gatewayQuotaTitle","gatewaySourceAdd","gatewaySourceLabel","gatewaySourceBaseURL","gatewaySourceDisplay","gatewaySourceAllowlist","gatewaySourceCredential","gatewaySourceStatus","gatewaySourceUnsupported","gatewaySourceUnknown","gatewaySourceNoAccounts","gatewaySourceFetchedAt","gatewaySwitchAccount","gatewayOnlyGemini","refresh","quotaEnableFirst","quotaRefreshReady","quotaRemove","quotaSectionNote","codingPlanDisabledNote","goQuotaDisabledNote","cornerLabel","cornerEnabledLabel","cornerGoRolling","cornerGoWeekly","cornerGoMonthly","cornerBudget","goShortRolling","goShortWeekly","goShortMonthly","goShortDaily","budgetShort","ledgerReadFailed","readingLedger","ledgerUnavailable","syncFailed","historyCleared","clearFailed","peakOff","peakNotEffective","peakActive","peakNotice","offPeakActive","weekendAllOffPeak","weekendChip","weekendShort","holidayAllOffPeak","holidayChip","holidayShort","peakHolidaysLabel","weekendRuleNote","peakShort","offPeakShort","peakStyleLabel","peakStyleCompact","peakStyleClassic","peakAlertLabel","peakAlertAheadLabel","peakAlertTargetLabel","peakAlertTargetPeak","peakAlertTargetOffPeak","peakAlertTargetBoth","peakAlertTitlePeak","peakAlertTitleOffPeak","peakAlertBody","peakAlertPhasePeak","peakAlertPhaseOffPeak","peakAlertBtn","peakAlertBadgePeak","peakAlertBadgeOffPeak","peakAlertPositionLabel","peakAlertPositionCorner","peakAlertPositionCenter","peakAlertWebNotifyLabel","peakAlertWebNotifyHint","peakAlertPreviewLabel","peakAlertPreviewPeak","peakAlertPreviewOffPeak","peakAlertPreviewTag","peakPanelTitle","peakNoticeHiddenHint","groupGeneral","groupMoney","groupSidebar","sidebarSimple","sidebarSimpleNote","sidebarSimpleTitle","sidebarSimpleBody","sidebarSimpleOn","sidebarSimpleOff","sidebarSimpleError","closeGuide","todayBudget","sidebarStyleLabel","sidebarStyleStandard","sidebarStyleCompact","restorePriceMatches","removePriceMatchHint","groupCorner","groupDetail","catalogTitle","catalogNote","catalogOpen","catalogCollapse","mountBtn","unmountBtn","mountedTag","catalogUnpriced","catalogDeepseekNote","modelStatsTitle","modelsTitle","modelsCount","modelsOther","models_enabled","models_defaultOpen","models_remember","models_tokens","models_shares","models_dock","models_period","models_summary","models_position","models_topN","models_refreshSeconds","modelsTotal","modelsTop","modelsFirst","modelsAfter","modelsLast","modelStatsToday","modelStatsHistory","modelStatsCostH","modelStatsTokensH","modelStatsHitH","modelStatsHitUnreported","modelStatsHitUnreportedTip","modelStatsValueH","modelStatsInput","modelStatsCache","modelStatsOutput","modelStatsEmpty","modelStatsBlended","modelStatsNote","modelStatsLegacy","sessionLineSplit","costChipPlan","sessionDetailPlan","planStatsTitle","planStatsEmpty","planStatsWindow","planStatsPercent","planStatsLocal","planStatsPer1","planStatsFull","planStatsResets","planStatsMethodSample","planStatsMethodLive","planStatsMethodNone","planStatsMethodSampleAt","planStatsConfidenceLow","planStatsCurveTitle","planStatsDaily","planStatsWeekly","planStatsMonthly","planStatsCurveEmpty","planStatsBarTip","planStatsNote","billingClassLabel","billingClassPlan","billingClassAuto","billingClassApi","catalogDisplayLabel","catalogDisplayHint","priceTableDisplayHint","catalogCustomModels","priceMatchLabel","priceMatchAuto","priceMatchExact","priceMatchNote","unmatchedTitle","unmatchedHint","overrideTargetDefault","overrideRemove","overrideTargetLocal","matchedTitle","matchedHint","matchedKeepAuto","overrideNone","mountedSuffix","flatInput","flatCached","flatOutput","deepseekMountedHeader","codingPlanKimi","codingPlanOpenrouter","codingPlanSiliconflow","codingPlanCommandcode","codingPlanScnet","codingPlanVolcengine","codingPlanQwen","codingPlanMimo","mimoWindowPlan","mimoWindowCompensation","codingPlanWindowBalance","qwenSource","qwenSourceLocal","qwenSourceCli","qwenSourceBailian","qwenCliNote","qwenBailianNote","qwenPlanCreditsLabel","qwenPlanStartLabel","qwenRatesLabel","qwenRatesModelPlaceholder","qwenRatePlaceholder","qwenRate_input","qwenRate_cachedInput","qwenRate_output","qwenRateDraftNote","qwenRatesAdd","qwenLocalNote","scnetPlanCreditsLabel","scnetPlanStartLabel","scnetLocalNote","volcengineAccessKeyIdLabel","volcengineSecretAccessKeyLabel","volcengineNote","volcengineAccessKeyPlaceholder","volcengineSecretPlaceholder","countdownHoursOnly","countdownHourMinute","countdownMinute","nextOffPeakIn","nextPeakIn","peakSummary","noPeakWindows","unknown","cardToday","cardMonth","cardTotal","cardTotalSub","externalUsage","combinedUsage","externalStale","externalHistory","cardsFootnote","timezoneHint","todaySessions","historyExpandHint","historySessionsLoading","historyNoSessions","historySessionsError","sessionRankTitle","sessionRankHint","sessionRankEmpty","sessionRankLoading","sessionRankError","sessionRankLimit","showSessionIdLabel","cardsTogglePlanTotal","cardsTogglePlanTotalHint","hideOfficialBalanceLabel","hideTodayCostLabel","sessionRankSort","sessionSortCostDesc","sessionSortCostAsc","sessionSortTimeDesc","sessionSortTimeAsc","sessionSortRecent","history","statisticsUpgrade","usageTitle","usageTotal","usageDay","usageEmpty","usageSectionLabel","usagePositionLabel","usagePositionCost","usagePositionGeneral","usagePositionSection","displaySettings","tabOverview","tabQuotas","tabUsage","tabPricing","tabDisplay","historyDataTitle","positionLabel","positionDock","positionHeader","off","quotaStripGroup","quotaStripEnable","quotaStripShowBudget","quotaStripShowGo","quotaStripShowPlans","quotaStripNote","quotaStripGuideTitle","quotaStripGuideBody","quotaStripGuideOn","quotaStripGuideOff","clickToRefresh","balanceClickGuideTitle","balanceClickGuideBody","balanceClickGuideOk","sidebarLabel","sidebarOn","currencyLabel","currencyCny","currencyUsd","currencyEur","symbolLabel","rateLabel","decimalsLabel","balanceDisplayLabel","balanceSidebar","balanceSettings","balanceBoth","refreshIntervalLabel","peakEnabledLabel","peakNoticeLabel","badgeNote","priceTableTitle","pricingCurrencyLabel","pricingCurrencyUsd","pricingCurrencyCny","pricingCurrencyNote","priceTableNote","datedPriceNote","defaultModelId","newModelPlaceholder","addModel","dataSync","saving","autoSaveFailed","autoSavedAt","autoSaveHint","confirmFetch","apply","cancel","syncFromDocs","syncScopeNote","confirmReset","importLegacy","confirmImportLegacy","legacyImportFailed","legacyImportNote","confirmClear","clearAllHistory","lastSync","neverSynced","source","sourceOfficial","sourceBundled","languageLabel","localeAuto","localeZh","localeEn","sectionLabel","rpcFailed","rpcSyncFailed","rpcBalanceFailed"].map((o,a)=>[o,s[a]]).filter(([,o])=>o!==null))]));function Ha(){return(typeof navigator<"u"&&typeof navigator.language=="string"?navigator.language:"").toLowerCase().startsWith("zh")?"zh":"en"}function F(t){return t==="zh"||t==="en"?t:Ha()}function K(t){const s=t==="zh"?Oe.zh:Oe.en;return(o,a)=>{let n=s[o]??Oe.en[o]??o;if(a)for(const l of Object.keys(a))n=n.split("{"+l+"}").join(String(a[l]));return n}}const je={day:"periodDay",month:"periodMonth",all:"periodAll",custom:"periodCustomRange"};function ie(t,s){throw new Error("dsh-cost-meter: 服务端数据非法 ("+t+": "+s+")")}function ge(t,s){return(t===null||typeof t!="object"||Array.isArray(t))&&ie(s,"object"),t}function te(t,s){return(typeof t!="number"||!Number.isFinite(t))&&ie(s,"number"),t}function le(t,s){return typeof t!="string"&&ie(s,"string"),t}const Je=(t,s,o)=>typeof t=="string"&&s.includes(t)?t:o;function _t(t,s=!1){return t===null||typeof t!="object"||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(([o,a])=>s?o.length>0&&["plan","api"].includes(a):["auto","plan","api"].includes(a)))}function Ae(t,s){return typeof t!="boolean"&&ie(s,"boolean"),t}const $e=(t,s,o)=>Object.fromEntries(s.map(a=>[a,o(t[a])]));function zt(t,s){const o={};if(t!==null&&typeof t=="object"&&!Array.isArray(t))for(const a of Object.keys(t)){const n=t[a];if(n===null||typeof n!="object"||Array.isArray(n))continue;const l=i=>typeof i=="number"&&Number.isFinite(i)&&i>=0?i:0;o[a]={...$e(n,["input","output","cacheRead","cacheWrite","reasoning","cost"],l),apiCost:n.apiCost===void 0?l(n.cost):l(n.apiCost)}}return o}function Gt(t,s){ge(t,s);const o={reasoning:t.reasoning===void 0?0:te(t.reasoning,s+".reasoning"),apiCost:t.apiCost===void 0?void 0:te(t.apiCost,s+".apiCost"),byModel:zt(t.byModel,s+".byModel"),byProviderModel:zt(t.byProviderModel,s+".byProviderModel")};for(const a of["input","output","cacheRead","cacheWrite","calls","cost"])o[a]=te(t[a],s+"."+a);return o}function Kt(t){return(Array.isArray(t)?t:ie("rows","array")).map(s=>({provider:le(s.provider,"provider"),model:le(s.model,"model"),bucket:le(s.bucket,"bucket"),tokens:te(s.tokens,"tokens"),rate:te(s.rate,"rate"),cost:te(s.cost,"cost"),priced:Ae(s.priced,"priced"),plan:Ae(s.plan,"plan")}))}function ut(t,s){return{...Gt(t,s),id:le(t.id,s+".id"),provider:typeof t.provider=="string"?t.provider:"",model:typeof t.model=="string"?t.model:""}}function he(t,s){const o={...Gt(t,s),date:le(t.date,s+".date"),sessions:[]};return t.sessions!==void 0&&(Array.isArray(t.sessions)||ie(s+".sessions","array"),o.sessions=t.sessions.map((a,n)=>ut(a,s+".sessions["+n+"]"))),o}function mt(t,s,o=["cacheWrite","reasoning"]){const a={};for(const n of["cacheHit","cacheMiss","output"])a[n]=te(t[n],s+"."+n);for(const n of o)t[n]!==void 0&&(a[n]=te(t[n],s+"."+n));return a}function pt(t,s){ge(t,s);const o=mt(t,s);for(const a of["offPeak","peak","legacyBase","longContext"])t[a]!==void 0&&(o[a]=mt(t[a],s+"."+a,["cacheWrite","reasoning","aboveInputTokens"]));t.cny!==void 0&&(o.cny=mt(t.cny,s+".cny")),t.legacy!==void 0&&(o.legacy=Ae(t.legacy,s+".legacy")),t.rateHistory!==void 0&&((!Array.isArray(t.rateHistory)||t.rateHistory.length>16)&&ie(s+".rateHistory","price history"),o.rateHistory=t.rateHistory.map((a,n)=>((!a||typeof a.before!="string"||!Number.isFinite(Date.parse(a.before)))&&ie(s+".rateHistory","dated price"),{...pt({...a,rateHistory:void 0},s+".rateHistory."+n),before:a.before})));for(const a of["billingMode","sourceUrl","checkedAt","notes"])typeof t[a]=="string"&&(o[a]=t[a]);return o}function Qa(t,s){const o=n=>n==null?void 0:{...n.adapter==="aliyun"?{adapter:"aliyun"}:{},enabled:n.enabled===!0,label:typeof n.label=="string"?n.label:"",labelEn:typeof n.labelEn=="string"?n.labelEn:"",display:Je(n.display,["sidebar","settings","off"],"both"),unit:["CNY","EUR","CREDITS"].includes(n.unit)?n.unit:"USD",convertToDisplayCurrency:n.convertToDisplayCurrency===!0,refreshMinutes:typeof n.refreshMinutes=="number"&&Number.isFinite(n.refreshMinutes)?n.refreshMinutes:15,request:n.request&&typeof n.request=="object"?n.request:{url:""},extract:n.extract&&typeof n.extract=="object"?n.extract:{},allowedHosts:Array.isArray(n?.allowedHosts)?n.allowedHosts.filter(l=>typeof l=="string"):[]};ge(t,s);const a={};if(t.prices!==null&&typeof t.prices=="object"&&t.prices.models!==null&&typeof t.prices.models=="object")for(const n of Object.keys(t.prices.models))a[n]=pt(t.prices.models[n],s+".prices.models."+n);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,sidebarTodayMetric:t.sidebarTodayMetric==="tokens"?"tokens":"cost",showTotalWithPlan:t.showTotalWithPlan===!0,sidebarSimple:t.sidebarSimple===!0,sidebarSimplePromptSeen:t.sidebarSimplePromptSeen===!0,sidebarModels:Object.fromEntries(Object.entries(Et).map(([n,l])=>[n,t.sidebarModels?.[n]??l])),codexQuotaEnabled:t.codexQuotaEnabled===!0,codexQuotaSidebar:t.codexQuotaSidebar!==!1,includeSubagentCost:t.includeSubagentCost===!0,sidebarStyle:t.sidebarStyle==="compact"?"compact":"standard",priceMatchDismissed:Array.isArray(t.priceMatchDismissed)?t.priceMatchDismissed.filter(n=>typeof n=="string"):[],pricingCurrency:t.pricingCurrency==="CNY"?"CNY":"USD",currency:typeof t.currency=="string"?t.currency:"CNY",symbol:typeof t.symbol=="string"?t.symbol:"¥",decimals:te(t.decimals,s+".decimals"),exchangeRate:te(t.exchangeRate,s+".exchangeRate"),peakEnabled:t.peakEnabled===!0,peakEffectiveAt:typeof t.peakEffectiveAt=="string"?t.peakEffectiveAt:"",peakWindows:Array.isArray(t.peakWindows)?t.peakWindows.map((n,l)=>({start:te(n.start,s+".peakWindows["+l+"].start"),end:te(n.end,s+".peakWindows["+l+"].end")})):[],peakHolidays:Array.isArray(t.peakHolidays)?t.peakHolidays.filter(n=>typeof n=="string"):[],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 n={};if(t.priceOverrides!==null&&typeof t.priceOverrides=="object"&&!Array.isArray(t.priceOverrides))for(const[l,i]of Object.entries(t.priceOverrides))typeof l=="string"&&typeof i=="string"&&(n[l]=i);return n})(),priceTableDisplay:(()=>{const n={};if(t.priceTableDisplay!==null&&typeof t.priceTableDisplay=="object"&&!Array.isArray(t.priceTableDisplay))for(const[l,i]of Object.entries(t.priceTableDisplay))typeof l=="string"&&(n[l]=i===!0);return n})(),codingPlans:(()=>{const n={};if(t.codingPlans!==null&&typeof t.codingPlans=="object"&&!Array.isArray(t.codingPlans))for(const l of Object.keys(t.codingPlans)){const i=t.codingPlans[l];i===null||typeof i!="object"||Array.isArray(i)||(n[l]={enabled:i.enabled===!0,display:i.display==="sidebar"||i.display==="both"||i.display==="off"?i.display:"settings",refreshMinutes:typeof i.refreshMinutes=="number"&&Number.isFinite(i.refreshMinutes)?i.refreshMinutes:15,apiKey:typeof i.apiKey=="string"?i.apiKey:"",...l==="minimax"?{baseUrl:typeof i.baseUrl=="string"?i.baseUrl:""}:{},...l==="qwen"?{quotaSource:["cli","bailian"].includes(i.quotaSource)?i.quotaSource:"local"}:{},...typeof i.planCredits=="number"&&Number.isFinite(i.planCredits)&&i.planCredits>0?{planCredits:i.planCredits}:{},...typeof i.planStart=="string"?{planStart:i.planStart}:{},...i.rates!==null&&typeof i.rates=="object"&&!Array.isArray(i.rates)?{rates:i.rates}:{},...typeof i.accessKeyId=="string"?{accessKeyId:i.accessKeyId}:{},...typeof i.secretAccessKey=="string"?{secretAccessKey:i.secretAccessKey}:{}})}return n})(),prices:{models:a,default:pt(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:te(t.historyDays,s+".historyDays"),fetchedAt:t.fetchedAt===null||t.fetchedAt===void 0?null:le(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:Je(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:Je(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 n=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:t.gatewayQuotas?.sources;return{sources:Array.isArray(n)?n.slice(0,4).filter(i=>i!==null&&typeof i=="object"&&!Array.isArray(i)).map(i=>({id:typeof i.id=="string"?i.id.slice(0,48):"",type:"cliproxyapi",label:typeof i.label=="string"?i.label.slice(0,80):"",baseURL:typeof i.baseURL=="string"?i.baseURL:"",enabled:i.enabled!==!1,display:Je(i.display,["sidebar","settings","off"],"both"),refreshMinutes:typeof i.refreshMinutes=="number"&&Number.isFinite(i.refreshMinutes)?Math.min(1440,Math.max(1,Math.floor(i.refreshMinutes))):15,includeProviders:Array.isArray(i.includeProviders)?[...new Set(i.includeProviders.filter(r=>typeof r=="string").map(r=>r.toLowerCase()).filter(r=>gt.includes(r)))]:gt,allowedHosts:Array.isArray(i.allowedHosts)?i.allowedHosts.filter(r=>typeof r=="string").slice(0,16):[],allowInsecureHttp:i.allowInsecureHttp===!0,antigravityOnlyGemini:i.antigravityOnlyGemini===!0,keyVar:typeof i.keyVar=="string"?i.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 n=o(t.customBalance);return n?[n]:[]})(),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 n=t.barDirections!==null&&typeof t.barDirections=="object"&&!Array.isArray(t.barDirections)?t.barDirections:{},l=(i,r)=>n[i]==="remaining"||n[i]==="used"?n[i]:r;return{balance:l("balance","remaining"),budget:l("budget","used"),go:l("go","used"),plan:l("plan","used")}})(),planBilling:{providers:_t(t.planBilling?.providers),models:_t(t.planBilling?.models,!0)}}}const Ie=t=>typeof t=="number"&&Number.isFinite(t)?t:null,Me=t=>Ie(t)??0,Fa={status:"off",message:"",fetchedAt:0,currency:"",totalBalance:0,grantedBalance:0,toppedUpBalance:0},Wa={status:"off",message:"",fetchedAt:0,rolling:null,weekly:null,monthly:null},Yt=(t=null)=>({status:"off",message:"",fetchedAt:0,label:"",unit:"USD",remaining:0,maxBudget:null,spend:null,index:t});function ft(t,s){return ge(t,s),{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}}function _a(t,s){return{...ft(t,s),keyConfigured:t.keyConfigured===!0,keySource:typeof t.keySource=="string"?t.keySource:"",currency:typeof t.currency=="string"?t.currency:"",totalBalance:Me(t.totalBalance),grantedBalance:Me(t.grantedBalance),toppedUpBalance:Me(t.toppedUpBalance)}}function bt(t,s){return t==null?null:((typeof t!="object"||Array.isArray(t))&&ie(s,"object"),{percent:Me(t.percent),resetsAt:typeof t.resetsAt=="string"?t.resetsAt:""})}function za(t,s){return{...ft(t,s),rolling:bt(t.rolling,s+".rolling"),weekly:bt(t.weekly,s+".weekly"),monthly:bt(t.monthly,s+".monthly")}}function Vt(t,s){return{...ft(t,s),label:typeof t.label=="string"?t.label:"",unit:typeof t.unit=="string"?t.unit:"USD",remaining:Me(t.remaining),maxBudget:Ie(t.maxBudget),spend:Ie(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"]),Ka=new Set(["off","loading","ok","partial","stale","error"]),gt=["antigravity","claude","codex","kimi","xai","workbuddy"],Jt={antigravity:"Antigravity",claude:"Claude",codex:"Codex",kimi:"Kimi",xai:"xAI",workbuddy:"WorkBuddy"};function Ya(t,s){ge(t,s);const o=(i,r="")=>typeof i=="string"?i:r,a=i=>Ie(i),n=i=>i!==null&&typeof i=="object"&&!Array.isArray(i)?{id:o(i.id),label:o(i.label),...a(i.percent)===null?{}:{percent:a(i.percent)},resetsAt:o(i.resetsAt),periodHours:a(i.periodHours),scope:o(i.scope)}:null,l=i=>i!==null&&typeof i=="object"&&!Array.isArray(i)?{unit:o(i.unit,"credits"),used:a(i.used),remaining:a(i.remaining),limit:a(i.limit),fetchedAt:o(i.fetchedAt),packages:Array.isArray(i.packages)?i.packages.filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)).map(r=>({id:o(r.id),label:o(r.label),used:a(r.used),remaining:a(r.remaining),limit:a(r.limit),startsAt:o(r.startsAt),resetsAt:o(r.resetsAt)})):[]}:void 0;return{id:o(t.id),type:"cliproxyapi",label:o(t.label),status:Ka.has(t.status)?t.status:"error",message:o(t.message),fetchedAt:a(t.fetchedAt)??0,attemptedAt:a(t.attemptedAt)??0,serverVersion:o(t.serverVersion),keyConfigured:t.keyConfigured===!0,keySource:o(t.keySource,"none"),accounts:Array.isArray(t.accounts)?t.accounts.filter(i=>i!==null&&typeof i=="object"&&!Array.isArray(i)).slice(0,16).map(i=>({id:o(i.id),provider:o(i.provider,"unknown"),label:o(i.label,"unknown"),status:Ga.has(i.status)?i.status:"unknown",message:o(i.message),plan:o(i.plan),windows:Array.isArray(i.windows)?i.windows.map(n).filter(Boolean):[],credits:l(i.credits)})):[],unsupportedProviders:Array.isArray(t.unsupportedProviders)?t.unsupportedProviders.filter(i=>typeof i=="string").slice(0,32):[]}}function Va(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,a]of Object.entries(t.providers)){if(a===null||typeof a!="object"||Array.isArray(a))continue;const n={},l={};if(a.windows!==null&&typeof a.windows=="object"&&!Array.isArray(a.windows))for(const[i,r]of Object.entries(a.windows))r===null||typeof r!="object"||Array.isArray(r)||(n[i]={...$e(r,["percent","localTokens","localCost","sampleCount"],Me),...$e(r,["sampleAt","per1Tokens","per1Cost","fullTokens","fullCost"],Ie),resetsAt:typeof r.resetsAt=="string"?r.resetsAt:"",method:r.method==="sample"||r.method==="live"?r.method:"none",confidence:r.confidence==="high"||r.confidence==="low"?r.confidence:null});if(a.intervals!==null&&typeof a.intervals=="object"&&!Array.isArray(a.intervals))for(const[i,r]of Object.entries(a.intervals))Array.isArray(r)&&(l[i]=r.filter(u=>u!==null&&typeof u=="object"&&!Array.isArray(u)).map(u=>$e(u,["t0","t1","tokens","cost","pct","per1Tokens","per1Cost"],Me)));s[o]={windows:n,intervals:l}}return{generatedAt:Me(t.generatedAt),providers:s}}function $t(t,s){return ge(t,s),{today:he(t.today,s+".today"),month:he(t.month,s+".month"),total:he(t.total,s+".total"),budgetUsed:typeof t.budgetUsed=="number"&&Number.isFinite(t.budgetUsed)?t.budgetUsed:void 0,balance:t.balance==null?Fa:_a(t.balance,s+".balance"),goQuota:t.goQuota==null?Wa:za(t.goQuota,s+".goQuota"),customBalance:t.customBalance==null?Yt():Vt(t.customBalance,s+".customBalance"),customBalances:Array.isArray(t.customBalances)?t.customBalances.filter(o=>o!==null&&typeof o=="object").map((o,a)=>Vt(o,s+".customBalances["+a+"]")):[],gatewayQuotas:Array.isArray(t.gatewayQuotas)?t.gatewayQuotas.filter(o=>o!==null&&typeof o=="object"&&!Array.isArray(o)).map((o,a)=>Ya(o,s+".gatewayQuotas["+a+"]")):[],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,a])=>[o,{configured:a.configured===!0,source:typeof a.source=="string"?a.source:""}])):{},codingPlans:t.codingPlans!==null&&typeof t.codingPlans=="object"&&!Array.isArray(t.codingPlans)?t.codingPlans:{},planStats:Va(t.planStats),history:Array.isArray(t.history)?t.history.map((o,a)=>he(o,s+".history["+a+"]")):[],externalUsage:t.externalUsage&&Array.isArray(t.externalUsage.sources)?{fetchedAt:Number(t.externalUsage.fetchedAt)||0,stale:t.externalUsage.stale===!0,sources:t.externalUsage.sources.map(o=>({source:String(o.source),today:he(o.today,s+".external.today"),month:he(o.month,s+".external.month"),total:he(o.total,s+".external.total"),history:(o.history??[]).map(a=>he(a,s+".external.history"))})),combined:Object.fromEntries(["today","month","total","history"].map(o=>[o,o==="history"?(t.externalUsage.combined.history??[]).map(a=>he(a,s+".external.history")):he(t.externalUsage.combined[o],s+".external."+o)]))}:null,config:Qa(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 Ja(t,s){ge(t,s);const o={ok:t.ok===!0,message:typeof t.message=="string"?t.message:""};return t.state!==void 0&&t.state!==null&&(o.state=$t(t.state,s+".state")),o}function ne(t){return{parse:t}}const ht=ne($t),$a=ne(t=>ge(t,"patch")),Za=ne(Ja),Zt=ne(t=>le(t,"provider")),Xa=ne(t=>{if(t!=null)return(typeof t!="number"||!Number.isInteger(t)||t<0||t>7)&&ie("index","0-7 integer"),t}),en=ne(t=>le(t,"date")),tn=ne(t=>ge(t,"day")),an=ne(t=>(Number.isFinite(Number(t))||ie("limit","number"),Number(t))),Xt=ne(t=>le(t,"sort")),nn=ne(t=>ge(t,"topSessions")),ea=ne(t=>le(t,"target")),sn=ne(t=>le(t,"value")),ve=(t,s)=>({mode:"strict",typeSymbol:"dsh-cost-meter#"+t,schema:s,create:()=>s}),re=(t,s,o,a=!1)=>({name:t,wire:t,source:"json",codec:ve(s,o),...a?{acceptsUndefined:!0}:{}}),on={package:"dsh-cost-meter",descriptors:[{method:"getState",result:ve("CostState",ht)},{method:"updateConfig",parameters:[re("patch","ConfigPatch",$a)],result:ve("CostState",ht)},{method:"fetchPrices"},{method:"refreshBalance"},{method:"refreshGoQuota"},{method:"refreshCustomBalance",parameters:[re("index","CustomBalanceIndex",Xa,!0)]},{method:"refreshCodingPlan",parameters:[re("provider","CodingPlanProvider",Zt)]},{method:"refreshGatewayQuota",parameters:[re("sourceId","GatewayQuotaSourceId",ne(t=>{if(t!=null)return(typeof t!="string"||t.length>48||!/^[a-z0-9][a-z0-9_-]*$/.test(t))&&ie("sourceId","gateway source id"),t}),!0)]},{method:"resetHistory",result:ve("CostState",ht)},{method:"importLegacyHistory"},{method:"getDaySessions",parameters:[re("date","DayKey",en)],result:ve("DayRecord",tn)},{method:"getSessionCost",parameters:[re("sessionId","SessionId",Zt)],result:ve("SessionCost",ne(t=>({own:ut(t.own,"own"),subagents:ut(t.subagents,"subagents"),found:Ae(t.found,"found"),subagentCount:te(t.subagentCount,"subagentCount")})))},{id:"dsh-cost-meter#costMeter/getTurnCost",service:"costMeter",namespace:"costMeter",method:"getTurnCost",invocation:{kind:"direct"},parameters:[re("sessionId","SessionId",ne(t=>le(t,"sessionId"))),...["startSeq","endSeq"].map(t=>re(t,"TurnSeq",ne(s=>((!Number.isSafeInteger(s)||s<0)&&ie(t,"nonnegative integer"),s))))],result:ve("TurnCost",ne(t=>({found:Ae(t.found,"found"),cost:te(t.cost,"cost"),apiCost:te(t.apiCost,"apiCost"),rows:Kt(t.rows),calls:(Array.isArray(t.calls)?t.calls:ie("calls","array")).map(s=>({kind:le(s.kind,"kind"),provider:le(s.provider,"provider"),model:le(s.model,"model"),atMs:te(s.atMs,"atMs"),cost:te(s.cost,"cost"),apiCost:te(s.apiCost,"apiCost"),plan:Ae(s.plan,"plan"),priced:Ae(s.priced,"priced"),longContext:Ae(s.longContext,"longContext"),rows:Kt(s.rows)}))})))},{method:"getTopSessions",parameters:[re("limit","SessionLimit",an),re("sort","SessionSort",Xt,!0),re("dir","SessionSortDir",Xt,!0)],result:ve("TopSessions",nn)},{method:"setCredential",parameters:[re("target","CredentialTarget",ea),re("value","CredentialValue",sn)]},{method:"clearCredential",parameters:[re("target","CredentialTarget",ea)]}].map(t=>({id:"dsh-cost-meter#costMeter/"+t.method,service:"costMeter",namespace:"costMeter",invocation:{kind:"direct"},parameters:[],result:ve("FetchPricesResult",Za),...t}))};function ln(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 Ue(t){if(t===null||typeof t!="object")return;const s=i=>{const r=t[i];return typeof r=="number"&&Number.isFinite(r)&&r>=0?r:void 0},o=s("cacheMiss")??s("input")??0,n={cacheHit:s("cacheHit")??s("cachedInput")??s("cacheRead")??o,cacheMiss:o,output:s("output")??0},l=s("reasoning");return l!==void 0&&(n.reasoning=l),s("cacheWrite")!==void 0&&(n.cacheWrite=s("cacheWrite")),n}function rn(t){const s=Ue(t);if(s===void 0)return null;for(const o of["offPeak","peak","legacyBase"]){const a=Ue(t[o]);a!==void 0&&(s[o]=a)}return Number.isFinite(t.longContext?.aboveInputTokens)&&t.longContext.aboveInputTokens>0&&(s.longContext={...Ue(t.longContext),aboveInputTokens:t.longContext.aboveInputTokens}),Array.isArray(t.rateHistory)&&(s.rateHistory=t.rateHistory.slice(0,16).map(o=>{const a={...Ue(o),before:o.before};for(const n of["offPeak","peak"]){const l=Ue(o[n]);l!==void 0&&(a[n]=l)}return a})),s}function Ze(t,s=Date.now()){if(!t||!Number.isFinite(s)||!Array.isArray(t.rateHistory))return t;let o=null,a=1/0;for(const i of t.rateHistory){const r=Date.parse(i.before);s<r&&r<a&&(o=i,a=r)}if(!o)return t;const{before:n,...l}=o;return{...t,...l}}const yt=Date.parse("2026-08-22T16:00:00Z");function ta(t){if(!Number.isFinite(t)||t<yt)return null;const s=Math.floor((t+8*36e5)/864e5),o=(s+4)%7;if(o!==6&&o!==0)return null;const a=o===6?s:s-1;return{start:Math.max(a*864e5-8*36e5,yt),end:(a+2)*864e5-8*36e5}}function aa(t,s){if(!Number.isFinite(t)||t<yt||!Array.isArray(s))return null;const o=Math.floor((t+8*36e5)/864e5);return s.includes(new Date(o*864e5).toISOString().slice(0,10))?{start:o*864e5-8*36e5,end:(o+1)*864e5-8*36e5}:null}const cn=(t,s)=>aa(t,s)??ta(t);function Xe(t,s,o,a){if(!Array.isArray(o)||o.length===0||cn(t,a)!==null||Number.isFinite(s)&&t<s)return!1;const n=new Date(t).getUTCHours();return o.some(l=>{const i=Number(l.start),r=Number(l.end);return!Number.isFinite(i)||!Number.isFinite(r)?!1:i<r?n>=i&&n<r:n>=i||n<r})}const dn=Date.parse("2026-08-16T16:00:00Z");function na(t,s,o){const a=Ze(t,s)??{cacheHit:0,cacheMiss:0,output:0},n=i=>({cacheHit:i.cacheHit,cacheMiss:i.cacheMiss,output:i.output,reasoning:i.reasoning??0,...i.cacheWrite===void 0?{}:{cacheWrite:i.cacheWrite},...i.longContext===void 0?{}:{longContext:i.longContext}});if(Number.isFinite(s)&&s<dn){const i=a.legacyBase;return n(i===void 0?a:i)}if(o?.enabled!==!0)return n(a);const l=typeof o.effectiveAtMs=="number"&&Number.isFinite(o.effectiveAtMs)?o.effectiveAtMs:void 0;if(Xe(s,l,o.windows,o.holidays)){const i=a.peak;return n(i===void 0?a:i)}if(l!==void 0&&s>=l){const i=a.offPeak;return n(i===void 0?a:i)}return n(a)}function sa(t,s){const o=Math.max(0,Number(t.input)||0),a=Math.max(0,Number(t.output)||0),n=Math.max(0,Number(t.cacheRead)||0),l=Math.max(0,Number(t.cacheWrite)||0),i=Math.max(0,Number(t.reasoning)||0);return s.longContext&&o+n+l>s.longContext.aboveInputTokens&&(s=s.longContext),(o*s.cacheMiss+a*s.output+n*s.cacheHit+l*(s.cacheWrite??s.cacheHit)+i*(s.reasoning??0))/1e6}function oa(t,s,o){const a=Number(t);if(!Number.isFinite(a)||a<0||a===0)return 0;if(s!=="CNY")return a;const n=Number(o);return!Number.isFinite(n)||n<=0?a:a/n}function se(t,s){const o=t?.barDirections,a=s==="balance"?"remaining":"used";if(o===null||typeof o!="object"||Array.isArray(o))return a;const n=o[s];return n==="remaining"||n==="used"?n:a}function pe(t,s){if(t==null||!Number.isFinite(Number(t)))return{width:0,label:null};const o=Math.max(0,Math.min(100,Number(t))),a=s==="remaining"?Math.round((100-o)*10)/10:Math.round(o*10)/10;return{width:a,label:a}}const la=(t,s)=>t.toFixed(s).replace(/(\.\d*?[1-9])0+$|\.0+$/,"$1");function ce(t,s){const o=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$",a=Number(s?.decimals),n=Math.max(0,Math.min(10,Number.isFinite(a)?Math.floor(a):2));let l=n;return t>0&&t<Math.pow(10,-n)&&(l=n+2),o+la(t,l)}function Y(t,s){const o=Number(s?.exchangeRate),a=t*(Number.isFinite(o)&&o>0?o:1);return ce(a,s)}function j(t){const s=Math.max(0,Number(t)||0),o=a=>a>=100?String(Math.round(a)):String(Math.round(a*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 fe(t){return String(t??"").toLowerCase().replace(/\([^)]*\)/g," ").replace(/([^)]*)/g," ").replace(/[^a-z0-9]+/g,"")}function Re(t,s){if(typeof t!="string"||t.length===0)return null;const o=Array.isArray(s)?s.filter(c=>typeof c=="string"&&c.length>0):[];if(o.length===0)return null;const a=c=>String(c).toLowerCase().replace(/[-@]\d{4}-?\d{2}-?\d{2}$/,"").replace(/[-@]v\d+(\.\d+)*$/,""),n=o.find(c=>c===t);if(n!==void 0)return n;const l=fe(t);if(l.length===0)return null;const i=o.find(c=>fe(c)===l);if(i!==void 0)return i;const r=a(t),u=o.find(c=>a(c)===r);if(u!==void 0)return u;const d=/^(?:[-_./:@](?:\d{4}-?\d{2}-?\d{2}|v\d+(?:\.\d+)*|\d+k|latest))+$/;return o.filter(c=>r.startsWith(a(c))&&d.test(r.slice(a(c).length))).sort((c,m)=>m.length-c.length)[0]??null}const un=new Set(["lmstudio","ollama","jan","gpt4all","koboldcpp","llamacpp","llama-cpp","localai","vllm","sglang","tabbyapi","lmdeploy","oobabooga","text-generation-webui","llama-server"]),mn=["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 pn(t,s){if(typeof t=="string"&&un.has(t))return!0;const o=typeof s=="string"?s.toLowerCase():"";return mn.some(a=>o.startsWith(a))}function fn(t,s,o){const a=o?.prices??{},n=o?.priceMatch==="exact"?"exact":"auto",l=o?.priceOverrides&&typeof o.priceOverrides=="object"?o.priceOverrides:{};let i=String(t??"").trim().toLowerCase();i.startsWith("llm-")&&(i=i.slice(4)),i===""&&(i="deepseek");let r=i,u=s;const d=l[i+":"+s];if(d==="__local__")return{entry:null,priced:!1,billingMode:"flat",matched:!0};if(typeof d=="string"&&d.length>0){const p=d.indexOf(":");if(p>0&&d.slice(p+1).length>0?(r=d.slice(0,p).trim().toLowerCase(),u=d.slice(p+1)):u=d,r==="deepseek"&&u==="__default__")return{entry:a.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}if(pn(r,u))return{entry:null,priced:!1,billingMode:"flat",matched:!1};if(r==="deepseek"||r.includes("deepseek")){const p=a.models??{},b=p[u]!==void 0?u:n==="auto"?Re(u,Object.keys(p)):null;if(b!==null)return{entry:p[b],priced:!0,billingMode:"deepseek-peak",matched:!0};if(n==="auto"){let g=null,h=-1,v="flat";for(const[N,C]of Object.entries(a.providers??{})){const x=C?.models??{},f=Re(u,Object.keys(x));if(f===null||x[f]?.unpriced===!0)continue;const y=(f===u||fe(f)===fe(u)?1e3:0)+fe(f).length;y>h&&(g=x[f],h=y,v=x[f]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(g!==null)return{entry:g,priced:!0,billingMode:v,matched:!0}}return{entry:a.default??{cacheHit:0,cacheMiss:0,output:0},priced:!0,billingMode:"deepseek-peak",matched:!1}}const c=a.providers?.[r]?.models??{},m=c[u]!==void 0?u:n==="auto"?Re(u,Object.keys(c)):null;if(m!==null)return{entry:c[m],priced:c[m]?.unpriced!==!0,billingMode:"flat",matched:!0};if(r==="opencode-go")return{entry:null,priced:!1,billingMode:"flat",matched:!1};if(n==="auto"){const p=a.models??{},b=Re(u,Object.keys(p));if(b!==null)return{entry:p[b],priced:!0,billingMode:"deepseek-peak",matched:!0};let g=null,h=-1,v="flat";for(const[N,C]of Object.entries(a.providers??{})){if(N===r)continue;const x=C?.models??{},f=Re(u,Object.keys(x));if(f===null||x[f]?.unpriced===!0)continue;const y=(f===u||fe(f)===fe(u)?1e3:0)+fe(f).length;y>h&&(g=x[f],h=y,v=x[f]?.billingMode==="deepseek-peak"?"deepseek-peak":"flat")}if(g!==null)return{entry:g,priced:!0,billingMode:v,matched:!0}}if(i!=="deepseek"&&!i.includes("deepseek")&&typeof d=="string"&&d.length>0&&!d.includes(":")){const p=a.models??{},b=p[d]!==void 0?d:n==="auto"?Re(d,Object.keys(p)):null;if(b!==null)return{entry:p[b],priced:!0,billingMode:"deepseek-peak",matched:!0}}return{entry:null,priced:!1,billingMode:"flat",matched:!1}}function kt(t,s,o){const a=fn(t,s,o);return a.priced&&o?.prices?.currency==="CNY"&&a.entry?.cny?{...a,entry:a.entry.cny,currency:"CNY"}:{...a,currency:a.billingMode==="deepseek-peak"&&o?.prices?.currency==="CNY"?"CNY":"USD"}}function bn(t){const s=Number(t?.calls)||0,o=Number(t?.input)||0,a=Number(t?.cacheRead)||0;return s>=3&&o>=1e5&&a===0}function et(t,s){return!t||!s?0:typeof t.cost=="number"&&Number.isFinite(t.cost)?t.cost:ra(t,s).total}function wt(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:wt(t)}const gn={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"],mimo:["mimo","xiaomimimo","mimo-token-plan","xiaomi-token-plan","xiaomi-token-plan-cn","xiaomi-token-plan-sgp","xiaomi-token-plan-ams"]},ia=["anthropic","zai","minimax","kimi","openrouter","siliconflow","commandcode","scnet","volcengine","qwen","mimo","go"];function hn(t){const s=String(t??"").trim().toLowerCase().replace(/^llm-/,"");if(s.length===0)return null;for(const[o,a]of Object.entries(gn))if(a.includes(s))return o;return ia.includes(s)?s:null}function yn(t){const s=new Set,o=t?.codingPlans;if(o!==null&&typeof o=="object")for(const a of ia)a!=="go"&&o[a]?.enabled===!0&&s.add(a);return t?.goQuota?.enabled===!0&&s.add("go"),s}function kn(t,s,o){const a=String(t??"").trim().toLowerCase();if(a.length>0&&a!=="deepseek"&&!a.includes("deepseek"))return!1;const n=fe(s);if(n.length===0)return!1;const l=o?.prices,i=l?.models??{};for(const r of Object.keys(i))if(fe(r)===n)return!1;for(const r of Object.values(l?.providers??{}))for(const u of Object.keys(r?.models??{}))if(fe(u)===n)return!0;return!1}function He(t,s,o){let a=hn(t);a===null&&kn(t,s,o)&&(a="go");const n=o?.planBilling?.models;if(n!==null&&typeof n=="object"){const i=n[t+":"+s];if(i==="plan"||i==="api")return i;if(a!==null){const r=n[a+":"+s];if(r==="plan"||r==="api")return r}}if(a===null)return"api";const l=o?.planBilling?.providers?.[a];return l==="plan"||l==="api"?l:yn(o).has(a)?"plan":"api"}function ra(t,s){if(!t||!s)return{total:0,api:0};const o={enabled:s.peakEnabled===!0,effectiveAtMs:Date.parse(s.peakEffectiveAt||""),windows:s.peakWindows,holidays:s.peakHolidays},a=Date.now(),n=t.byProviderModel??t.byModel??{};let l=0,i=0;for(const m of Object.keys(n)){const p=m.indexOf(":"),b=p>0?m.slice(0,p):"deepseek",g=p>0?m.slice(p+1):m,h=kt(b,g,s);if(h.priced){const v=sa(n[m],na(rn(h.entry),a,{...o,enabled:h.billingMode==="deepseek-peak"&&o.enabled})),N=oa(v,h.currency,s.exchangeRate);l+=N,He(b,g,s)==="api"&&(i+=N)}}const r={input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0};for(const m of Object.keys(n))r.input+=n[m].input??0,r.output+=n[m].output??0,r.cacheRead+=n[m].cacheRead??0,r.cacheWrite+=n[m].cacheWrite??0,r.reasoning+=n[m].reasoning??0;const u={input:Math.max(0,(t.input??0)-r.input),output:Math.max(0,(t.output??0)-r.output),cacheRead:Math.max(0,(t.cacheRead??0)-r.cacheRead),cacheWrite:Math.max(0,(t.cacheWrite??0)-r.cacheWrite),reasoning:Math.max(0,(t.reasoning??0)-r.reasoning)},d=sa(u,na(ln("default",s.prices),a,o)),c=oa(d,s.prices?.currency==="CNY"?"CNY":"USD",s.exchangeRate);return l+=c,i+=c,{total:l,api:i}}function ca(t,s){if(!t||!s)return!1;const o=t.byProviderModel??{};for(const a of Object.keys(o)){const n=a.indexOf(":"),l=n>0?a.slice(0,n):"deepseek",i=n>0?a.slice(n+1):a;if(He(l,i,s)==="plan")return!0}return!1}function xt(t){return(t?.input??0)+(t?.cacheRead??0)+(t?.cacheWrite??0)}function da(t,s){if(t?.apiCost!==void 0)return wt(t);if(!ca(t,s))return et(t,s);let o=0;for(const[a,n]of Object.entries(t.byProviderModel??{})){if(!Number.isFinite(n.cost))return ra(t,s).api;const l=a.indexOf(":");He(a.slice(0,l),a.slice(l+1),s)==="plan"&&(o+=n.cost)}return Math.max(0,et(t,s)-o)}function vt(t){const s=Math.abs(Math.round(Number(t)||0)),o=Math.floor(s/60),a=s%60;return"UTC"+(Number(t)<0?"-":"+")+o+(a>0?":"+String(a).padStart(2,"0"):"")}function wn(t){const s=t?.meta,o=Number(s?.timezoneOffsetMinutes);if(!Number.isFinite(o))return null;const a=-new Date().getTimezoneOffset();if(a===o)return null;const n=typeof s?.timezone=="string"&&s.timezone.length>0?s.timezone:"";return{hostLabel:n?n+" ("+vt(o)+")":vt(o),browserLabel:vt(a)}}function xn(t){let s=t;const o=new Set;return{getSnapshot:()=>s,subscribe:a=>(o.add(a),()=>{o.delete(a)}),set:a=>{if(a!==s){s=a;for(const n of[...o])n()}}}}const{createElement:e,Fragment:E,useState:R,useEffect:ee,useRef:Pe}=Be;function De({target:t,configured:s,source:o,t:a,api:n,placeholder:l,disabled:i}){const[r,u]=R(""),[d,c]=R(!1),[m,p]=R(null),b=i===!0||d,g=async()=>{const v=r.trim();if(!(v.length===0||b)){c(!0),p(null);try{const N=await n.setCredential(t,v);u(""),p({kind:"ok",text:N?.message??a("credentialSave")})}catch(N){p({kind:"err",text:String(N?.message??N)})}finally{c(!1)}}},h=async()=>{if(!b){c(!0),p(null);try{const v=await n.clearCredential(t);u(""),p({kind:"ok",text:v?.message??a("credentialClear")})}catch(v){p({kind:"err",text:String(v?.message??v)})}finally{c(!1)}}};return e("div",{className:"cm-field"},e("input",{className:"cm-input",type:"password",value:r,placeholder:typeof l=="string"?l:"",disabled:b,autoComplete:"off",onChange:v=>u(v.target.value)}),e("div",{className:"cm-buttons"},e("button",{className:"cm-btn small",onClick:g,disabled:b||r.trim().length===0},a(d?"credentialSaving":"credentialSave")),s===!0?e("button",{className:"cm-btn small",onClick:h,disabled:b},a("credentialClear")):null),e("span",{className:"cm-hint"},s===!0?a("credentialConfiguredOf",{source:typeof o=="string"&&o.length>0?o:"unknown"}):a("credentialNotConfigured")),e("span",{className:"cm-hint"},a("credentialInputHint")),Ut(m))}function vn({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 tt({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 ua(t,s){const o=Pe(!1),a=Pe(""),n=s!==null&&typeof s=="object"?[s.input,s.cacheRead,s.cacheWrite,s.output,s.reasoning,s.cost].map(l=>String(l??0)).join("|"):"";ee(()=>{if(!o.current){o.current=!0,a.current=n;return}if(n===""||n===a.current)return;a.current=n;const l=setTimeout(()=>{t.api?.reload?.()},800);return()=>clearTimeout(l)},[n])}function Nn(t,s,o,a){const n=u=>["input","output","cacheRead","cacheWrite"].reduce((d,c)=>d+(u?.[c]??0),0),l=s?.found&&n(s.own)>=n(t)?s.own:t;if(!o||!s?.subagentCount)return l;const i=s.subagents,r={...l};for(const u of["input","output","cacheRead","cacheWrite","reasoning","cost"])r[u]=(l?.[u]??0)+(i?.[u]??0);r.apiCost=da(l,a)+wt(i);for(const u of["byModel","byProviderModel"]){r[u]={...l?.[u]};for(const[d,c]of Object.entries(i?.[u]??{})){const m={...r[u][d]};for(const p of["input","output","cacheRead","cacheWrite","reasoning","cost"])m[p]=(m[p]??0)+(c[p]??0);delete m.apiCost,r[u][d]=m}}return r}function ma(t){const s=t.useProjection?t.useProjection("costUsage"):void 0,o=t.useCost?.(r=>r)?.state,a=o?.config,[n,l]=R(null);ua(t,s),ee(()=>{if(!t.sessionId||!t.api?.getSessionCost)return;let r=!0,u=!1;const d=async()=>{if(!u){u=!0;try{const m=await t.api.getSessionCost(t.sessionId);r&&l({id:t.sessionId,include:a?.includeSubagentCost===!0,value:m})}catch{}finally{u=!1}}};d();const c=a?.includeSubagentCost===!0?setInterval(d,1e4):null;return()=>{r=!1,c!==null&&clearInterval(c)}},[t.sessionId,o?.meta?.now,s,a?.includeSubagentCost]);const i=n&&n.id===t.sessionId&&n.include===(a?.includeSubagentCost===!0)?n.value:null;return{usage:Nn(s,i,a?.includeSubagentCost===!0,a),config:a}}function pa(t,s){let o=0,a=et(t,s);if(s.showTotalWithPlan!==!0&&(t.apiCost!==void 0||ca(t,s))){const n={total:et(t,s),api:da(t,s)};o=Math.max(0,n.total-n.api),o>0&&(a=n.api)}return{cost:a,planPart:o}}function fa(t,s){return Object.entries(t?.byProviderModel??{}).filter(([,o])=>o.input||o.output||o.cacheRead||o.cacheWrite||o.reasoning).map(([o,a])=>o+" "+Y(a.cost,s)).join("; ")}function Sn(t){const s=t.useCost?.(h=>h)?.state?.config,[o,a]=R(null),[n,l]=R(""),i=t.turn?.start?.seq,r=t.turn?.end?.seq,u=t.sessionId,d=JSON.stringify([s?.prices,s?.priceOverrides,s?.priceMatch,s?.planBilling,s?.codingPlans,s?.goQuota?.enabled,s?.peakEnabled,s?.peakEffectiveAt,s?.peakWindows,s?.peakHolidays,s?.exchangeRate]);if(ee(()=>{let h=!0;if(a(null),l(""),!(!u||i==null||r==null))return t.api.getTurnCost(u,i,r).then(v=>{h&&a(v)},v=>{h&&l(String(v.message??v))}),()=>{h=!1}},[u,i,r,d]),!s||i==null||r==null)return null;const c=F(s.locale)==="en",m=c?{input:"Input",output:"Output",cacheRead:"Cache read",cacheWrite:"Cache write",reasoning:"Reasoning"}:{input:"输入",output:"输出",cacheRead:"缓存读取",cacheWrite:"缓存写入",reasoning:"推理"},p=h=>Y(h,{...s,decimals:Math.max(8,s.decimals??2)}),b=c?{model:"Model call",compaction:"Context compaction",search:"Native search"}:{model:"模型调用",compaction:"上下文压缩",search:"原生搜索"},g=(h,v)=>e("div",{key:v,style:{marginBottom:4,overflowWrap:"anywhere"}},h.provider+":"+h.model+" · "+m[h.bucket]+(h.plan?" (Plan)":"")+": "+h.tokens.toLocaleString()+" × "+(h.priced?p(h.rate):"?")+" / 1,000,000 ≈ "+(h.priced?p(h.cost):"?"),h.priced?h.bucket==="reasoning"&&h.rate===0?c?" (no separate charge)":"(不单独收费)":"":c?" (price unavailable)":"(未配置价格)");return e("details",{className:"cm-note",style:{fontSize:12,marginTop:6}},e("summary",{style:{cursor:"pointer"}},c?"Turn cost":"本轮费用",o?.found?" ≈ "+p(s.showTotalWithPlan?o.cost:o.apiCost)+(o.rows.some(h=>!h.priced)?c?" + unpriced usage":" + 未定价用量":""):n?" ⚠":""),n?e("div",{role:"alert"},n):o?o.found?e(E,null,e("p",null,c?"Estimated from recorded usage and configured prices; rates per 1M tokens.":"按已记录用量和配置价格估算;单价单位为每百万 Token。"),e("p",null,"API ≈ "+p(o.apiCost)+" · Plan ≈ "+p(o.cost-o.apiCost)+(c?" (equivalent)":"(等值)")),o.rows.map(g),e("details",null,e("summary",{style:{cursor:"pointer"}},(c?"Individual calls":"逐次调用明细")+" ("+o.calls.length+")"),o.calls.map((h,v)=>e("details",{key:v,style:{margin:"6px 0"}},e("summary",{style:{cursor:"pointer",overflowWrap:"anywhere"}},"#"+(v+1)+" "+b[h.kind]+" · "+h.provider+":"+h.model+" · "+new Date(h.atMs).toLocaleTimeString()+" · "+(h.plan?"Plan ":"API ")+(h.priced?"≈ "+p(h.cost):c?"price unavailable":"未配置价格")+(h.longContext?c?" · long context":" · 长上下文价格":"")),h.rows.map(g))))):c?"Complete usage records unavailable":"没有完整用量记录":c?"Loading…":"加载中…")}function Cn(t){const{usage:s,config:o}=ma(t);if(!s||!o||xt(s)+(s?.output??0)===0)return null;const a=K(F(o.locale)),{cost:n,planPart:l}=pa(s,o),i=[a("sessionCostTitle"),a("sessionDetailTokens",{input:j(s?.input??0),cache:j((s?.cacheRead??0)+(s?.cacheWrite??0)),output:j(s?.output??0)}),a("sessionDetailCache",{read:j(s?.cacheRead??0),write:j(s?.cacheWrite??0)}),a("cost",{amount:Y(n,o)}),...l>0?[a("sessionDetailPlan",{amount:Y(l,o)})]:[],fa(s,o)].filter(Boolean).join("; ");return e(Z,{label:i,side:"top",delayMs:500},e("div",{className:"cm-chip"},l>0?a("costChipPlan",{amount:Y(n,o)}):a("cost",{amount:Y(n,o)})))}function An(t){const{usage:s,config:o}=ma(t);if(!s||!o)return null;const a=s.input??0,n=(s.cacheRead??0)+(s.cacheWrite??0),l=s.output??0;if(a+n+l===0)return null;const i=K(F(o.locale)),{cost:r,planPart:u}=pa(s,o),d=xt(s)>0?((s.cacheRead??0)/xt(s)*100).toFixed(1)+"%":"—";return e("div",{className:"cm-root",title:fa(s,o)},i(u>0?"sessionLineSplit":"sessionLine",{amount:Y(r,o),planAmount:Y(u,o),hitRate:d,input:j(a),cache:j(n),output:j(l)}))}const Mn={USD:"$",CNY:"¥",EUR:"€"};function Ne(t,s,o){const a=typeof o=="string"?o.toUpperCase():"",n=typeof s?.symbol=="string"&&s.symbol.length>0?s.symbol:"$";return ce(t,{symbol:Mn[a]??n,decimals:Math.max(2,Math.min(10,Math.floor(Number(s?.decimals)||2)))})}function ba(t,s){const o=Number(t?.balance?.budgetCap);if(Number.isFinite(o)&&o>0)return o;const a=Number(s?.maxBudget);return Number.isFinite(a)&&a>0?a:null}function Pn(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 a=0;for(const[n,l]of Object.entries(o)){const i=n.indexOf(":");let r=i>=0?n.slice(0,i):n;r.startsWith("llm-")&&(r=r.slice(4)),!(r!=="deepseek"&&r!=="deepseek-official")&&(a+=Number(l?.cost)||0)}return a}function ga(t,s,o,a,n=null){const l=o==="official"?Pn(t):Number(t.today?.cost)||0;if(o==="custom"){const r=Qe(s,a,n);if(r==="USD")return l;if(r==="CREDITS")return 0;const u=Number(s?.exchangeRate);return l*(Number.isFinite(u)&&u>0?u:1)}const i=Number(s?.exchangeRate);return l*(Number.isFinite(i)&&i>0?i:1)}function ha({remaining:t,spend:s,todayUsed:o,cap:a}){if(a===null||a<=0)return{remainingPct:100,todayPct:0,spentPct:0,hasCap:!1,pastSpend:0,today:0};const n=Math.max(0,Number(t)||0),l=Math.max(0,Number(s)||0),i=Math.max(0,Math.min(l,Number(o)||0)),r=Math.max(0,l-i),u=Math.max(0,Math.min(100,n/a*100)),d=Math.max(0,Math.min(100-u,i/a*100)),c=Math.max(0,Math.min(100-u-d,r/a*100));return{remainingPct:u,todayPct:d,spentPct:c,hasCap:!0,pastSpend:r,today:i}}function Nt(t,s,o=null,a=null){const n=o??t.customBalance,l=ba(Qe(s,n,a)==="CREDITS"?null:s,n),i=Number(n?.remaining)||0,r=Number(n?.spend)||0,u=ga(t,s,"custom",n,a);return{cap:l,...ha({remaining:i,spend:r,todayUsed:u,cap:l})}}function Tn(t,s){const o=t.balance,a=ba(s,null),n=Number(o?.totalBalance)||0,l=ga(t,s,"official",null),i=a!==null?Math.max(0,a-n):0;return{cap:a,...ha({remaining:n,spend:i,todayUsed:l,cap:a})}}function St(t){const{segments:s,direction:o="remaining"}=t,{remainingPct:a,todayPct:n,spentPct:l}=s,i=[];a>0&&i.push(e("div",{className:"cm-bbox-fill",style:{width:a+"%"}})),n>0&&i.push(e("div",{className:"cm-bbox-seg-today",style:{width:n+"%"}})),l>0&&i.push(e("div",{className:"cm-bbox-seg-spent",style:{width:l+"%"}})),i.length===0&&i.push(e("div",{className:"cm-bbox-fill",style:{width:"100%"}}));const r=o==="used"?[...i].reverse():i;return e("div",{className:"cm-bbox-bar segments"+(o==="used"?" rev":"")},...r)}function ya(t,s,o,a,n){const l=[t("balanceBarRemaining",{amount:a})];return o.today>0&&l.push(t("balanceBarToday",{amount:s(o.today)})),o.pastSpend>0&&l.push(t("balanceBarSpent",{amount:s(o.pastSpend)})),n!==null&&n>0&&l.push(t("balanceBudgetCapLabel")+": "+s(n)),l.join(" · ")}function Te(t){const[s,o]=R(!1),[a,n]=R(null);return{busy:s,err:a,run:()=>{s||typeof t!="function"||(o(!0),n(null),Promise.resolve().then(t).catch(i=>{n(i?.message??String(i))}).finally(()=>{o(!1)}))}}}const be=(t,s)=>({role:"button",tabIndex:0,"aria-busy":t?"true":"false",onClick:s,onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),s())}});function ye(t,s){const o=[t("clickToRefresh")];return s.busy&&o.push(t("refreshing")),s.err&&o.push("⚠ "+t("balanceRefreshFailed",{message:s.err})),o}const On="https://platform.deepseek.com/usage";function ka(t){return e("a",{className:"cm-bal-link",href:On,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 Dn(t){const{state:s,wide:o,api:a}=t,n=s.balance,l=K(F(s.config?.locale)),i=Te(a?()=>a.refreshBalance():null);if(!n||n.status==="off")return null;if(n.status==="error")return e(Z,{label:[l("balanceQueryFailed",{message:n.message||l("unknownError")}),...ye(l,i)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(i.busy?" busy":""),...be(i.busy,i.run)},o?e(E,null,l("balance")," ",e("span",{className:"cm-num"},l("queryFailed"))):"⚠"));const r=[l("balanceTitle"),l("totalBalance",{amount:Ne(n.totalBalance,s.config,n.currency)}),l("grantedToppedUp",{granted:Ne(n.grantedBalance,s.config,n.currency),toppedUp:Ne(n.toppedUpBalance,s.config,n.currency)}),l("updatedAt",{time:n.fetchedAt>0?new Date(n.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...ye(l,i)].join("; ");return e(Z,{label:r,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(i.busy?" busy":""),...be(i.busy,i.run)},o?e(E,null,e("span",{className:"cm-balance-name"},l("balance"),ka(l)),e("span",{className:"cm-num cm-bal-amt"},Ne(n.totalBalance,s.config,n.currency)),s.reconcile?.ok===!1?" ⚠":""):e(tt,{size:16})))}function Bn(t){const{state:s,wide:o,api:a}=t,n=s.config,l=s.balance,i=K(F(n?.locale)),r=Te(a?()=>a.refreshBalance():null);if(!l||l.status!=="ok")return null;const u=Tn(s,n),d=Ne(l.totalBalance,n,l.currency),c=b=>Ne(b,n,l.currency),m=[i("balanceTitle"),ya(i,c,u,d,u.cap),i("grantedToppedUp",{granted:Ne(l.grantedBalance,n,l.currency),toppedUp:Ne(l.toppedUpBalance,n,l.currency)}),i("updatedAt",{time:l.fetchedAt>0?new Date(l.fetchedAt).toLocaleTimeString():"—"}),...s.reconcile?.ok===!1?["⚠ "+s.reconcile.message]:[],...ye(i,r)].join("; "),p=e(E,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-balance-name"},e("span",{className:"cm-bbox-label"},i("balance")),ka(i)),e("span",{className:"cm-bbox-pct cm-num cm-bal-amt"},d)),e(St,{segments:u,direction:se(n,"balance")}));return e(Z,{label:m,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(o?"":" rail")+(r.busy?" busy":""),...be(r.busy,r.run)},o?p:e("div",{className:"cm-bbox-rail cm-num"},Math.round(u.remainingPct)+"%")))}function Ct(t,s){const o=typeof t?.label=="string"?t.label:"",a=typeof t?.labelEn=="string"?t.labelEn:"";return s==="en"?a||o||"Custom balance":o||a||"自定义余额"}function Qe(t,s,o){if((o??t?.customBalance)?.adapter==="aliyun"&&["CNY","USD","EUR"].includes(s?.unit))return s.unit;const a=o?.unit??t?.customBalance?.unit;return["CNY","EUR","USD","CREDITS"].includes(a)?a:["CNY","EUR","CREDITS"].includes(s?.unit)?s.unit:"USD"}function Fe(t,s,o,a){const n=Qe(s,o,a),l=Number(t);if(!Number.isFinite(l))return"—";const i=s?.currency==="USD"?1:Number(s?.exchangeRate);if((a??s?.customBalance)?.convertToDisplayCurrency===!0&&n==="USD"&&Number.isFinite(i)&&i>0){const c=l*i;return Number.isFinite(c)?ce(c,s):"—"}const r=n==="CREDITS",u=Math.max(2,Math.min(6,Math.floor(Number(s?.decimals)||4)));return(r?"":n==="CNY"?"¥":n==="EUR"?"€":"$")+la(l,u)+(r?" Credits":"")}function At(t,s,o,a,n=null){const l=Fe(t.remaining,s,t,n),i=p=>Fe(p,s,t,n);if(a&&s.balance?.showProgressBar===!0){const p=Nt(a,s,t,n);return[ya(o,i,p,l,p.cap),o("updatedAt",{time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"})].join(" · ")}const r=t.spend!==null?i(t.spend):"—",u=t.maxBudget!==null?i(t.maxBudget):"—",d=Qe(s,t,n)==="CREDITS"?NaN:Number(s?.balance?.budgetCap),c=Number.isFinite(d)&&d>0?o("balanceBudgetCapLabel")+": "+i(d):"",m=t.maxBudget!==null&&t.spend!==null?o("customBalanceLine",{remaining:l,spend:r,maxBudget:u,time:t.fetchedAt>0?new Date(t.fetchedAt).toLocaleTimeString():"—"}):o("customBalanceRemaining",{amount:l});return c?m+" · "+c:m}function Rn(t,s,o,a,n){const l=Ct(n??s.customBalance??{},F(s?.locale)),i=Fe(a.remaining,s,a,n),r=Nt(t,s,a,n);return{level:"ok",rail:Math.round(r.remainingPct)+"%",body:e(E,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"},i)),e(St,{segments:r,direction:se(s,"balance")}))}}function Mt(t,s){const o=s?.customBalances??[],a=Array.isArray(t?.customBalances)?t.customBalances:[],n=[];return o.forEach((l,i)=>{if(l?.enabled!==!0||l.display!=="sidebar"&&l.display!=="both")return;const r=a.find(u=>u.index===i)??(a.length===1&&o.length===1?a[0]:null);n.push({index:i,entry:l,snapshot:r})}),n.length===0&&a.length===0&&s?.customBalance?.enabled===!0&&(s.customBalance.display==="sidebar"||s.customBalance.display==="both")&&t?.customBalance?.status&&t.customBalance.status!=="off"&&n.push({index:null,entry:s.customBalance,snapshot:t.customBalance}),n}function Ln(t){const{state:s,wide:o,api:a}=t,n=s.config,l=K(F(n?.locale)),i=Mt(s,n);return i.length===0?null:e(E,null,i.map(({index:r,entry:u,snapshot:d})=>e(En,{key:"cb-"+r,state:s,wide:o,api:a,t:l,index:r,entry:u,snapshot:d})))}function En(t){const{state:s,wide:o,api:a,t:n,index:l,entry:i,snapshot:r}=t,u=s.config;if(r==null||r.status!=="ok")return null;const d=Te(a?()=>a.refreshCustomBalance(l):null),c=Rn(s,u,n,r,i),m=[At(r,u,n,s,i),...ye(n,d)].join(" · ");return e(Z,{label:m,side:"right",delayMs:300},e("div",{className:"cm-bbox clickable"+(c.level==="ok"?"":" "+c.level)+(o?"":" rail")+(d.busy?" busy":""),...be(d.busy,d.run)},o?c.body:e("div",{className:"cm-bbox-rail cm-num"},c.rail)))}function qn(t){const{state:s,wide:o,api:a}=t,n=s.config,l=K(F(n?.locale)),i=Mt(s,n);return i.length===0?null:e(E,null,i.map(({index:r,entry:u,snapshot:d})=>e(jn,{key:"cbr-"+r,state:s,wide:o,api:a,t:l,index:r,entry:u,snapshot:d})))}function jn(t){const{state:s,wide:o,api:a,t:n,index:l,entry:i,snapshot:r}=t,u=s.config,d=r??Yt(l);if(d.status==="off")return null;const c=Te(a?()=>a.refreshCustomBalance(l):null),m=Ct(i??u.customBalance??{},F(u?.locale));if(d.status==="error")return e(Z,{label:[d.message||n("unknownError"),...ye(n,c)].join("; "),side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+" cm-bal-err"+(c.busy?" busy":""),...be(c.busy,c.run)},o?e(E,null,e("span",{className:"cm-bal-label",title:m},m),e("span",{className:"cm-num cm-bal-amt"},n("queryFailed"))):"⚠"));const p=Fe(d.remaining,u,d,i),b=[At(d,u,n,s,i),...ye(n,c)].join(" · ");return e(Z,{label:b,side:"right",delayMs:300},e("div",{className:"cm-foot clickable"+(o?"":" cm-foot-rail")+(c.busy?" busy":""),...be(c.busy,c.run)},o?e(E,null,e("span",{className:"cm-bal-label",title:m},m),e("span",{className:"cm-num cm-bal-amt"},p)):e(tt,{size:16})))}function In(t){const o=(t.useCost?t.useCost(g=>g):void 0)?.state;if(!o)return null;const a=o.config,n=K(F(a?.locale)),l=a.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},i=o.goQuota,r=a?.goQuota?.enabled!==!1&&i?.status==="ok",u=g=>g!==null&&typeof g?.percent=="number"?Math.round(Math.max(0,Math.min(100,g.percent))):null,d=[];if(a.sidebarModels?.dock){const g=Ta(o,a.sidebarModels.period,n);g.length&&d.push({key:"model-top",text:e(E,null,e("span",{className:"cm-bal-label"},g[0].label),e("span",{className:"cm-bal-amt"},Y(g[0].cost,a))),tip:g[0].label+" "+Y(g[0].cost,a),level:"ok"})}const c=(g,h,v,N)=>{if(!l.enabled||!g||!r)return;const C=u(h);if(C===null)return;const x=typeof h.resetsAt=="string"&&h.resetsAt.length>0?n("goResetAt",{time:new Date(h.resetsAt).toLocaleString()}):"";d.push({key:v,text:n(v)+" "+C+"%",tip:n(N)+": "+C+"%"+(x?" · "+x:""),level:C>=100?"over":C>=80?"warn":"ok"})},m=a?.goQuota?.main==="weekly"||a?.goQuota?.main==="monthly"?a.goQuota.main:"rolling",p=[m,...["rolling","weekly","monthly"].filter(g=>g!==m)],b=g=>g==="rolling"?["goRolling",i?.rolling,"goShortRolling","cornerGoRolling"]:g==="weekly"?["goWeekly",i?.weekly,"goShortWeekly","cornerGoWeekly"]:["goMonthly",i?.monthly,"goShortMonthly","cornerGoMonthly"];for(const g of p){const[h,v,N,C]=b(g);c(l[h]===!0,v,N,C)}if(l.enabled&&l.budget===!0){const g=a.budget??{enabled:!1,amount:100,period:"month"};if(g.enabled===!0){const h=Number(a.exchangeRate),N=(o.budgetUsed??(g.period==="day"?z(o.today,a):g.period==="all"?z(o.total,a):z(o.month,a)))*(Number.isFinite(h)&&h>0?h:1),C=Math.max(0,Number(g.amount)||0),x=C>0?Math.min(999,N/C*100):null;if(x!==null){const f=x>=100?"over":x>=80?"warn":"ok";d.push({key:"budget",text:n("budgetShort")+" "+x.toFixed(1)+"%",tip:n("budgetOf",{period:n(je[g.period]??"periodMonth")})+" · "+n("usedOf",{used:ce(N,a),amount:ce(C,a)}),level:f})}}}return d.length===0?null:e("div",{className:"cm-corner"},d.map(g=>e(Z,{key:g.key,label:g.tip,side:"top",delayMs:500},e("span",{className:"cm-corner-chip"+(g.key==="model-top"?" cm-model-top":"")+(g.level==="ok"?"":" "+g.level)},g.text))))}function at(t,s,o){if(!Array.isArray(s)||s.length===0||!Number.isFinite(t))return null;const a=(p,b)=>{const g=new Date(t);return g.setUTCDate(g.getUTCDate()+p),g.setUTCHours(b,0,0,0),g.getTime()},n=new Set,l=Math.max(12,Math.min(380,(Array.isArray(o)?o.length:0)+7));for(let p=-l;p<=l;p+=1){n.add(a(p,16));for(const b of s){const g=Number(b?.start),h=Number(b?.end);!Number.isFinite(g)||!Number.isFinite(h)||(n.add(a(p,g)),n.add(a(h<=g?p+1:p,h)))}}const i=[...n].sort((p,b)=>p-b).flatMap(p=>{const b=Xe(p-1,void 0,s,o),g=Xe(p,void 0,s,o);return b===g?[]:[{at:p,intoPeak:g}]});let r=null,u=null;for(const p of i)p.at<=t&&(r===null||p.at>r.at)&&(r=p),p.at>t&&(u===null||p.at<u.at)&&(u=p);const d=aa(t,o),c=d??ta(t);return c!==null?u===null?null:{inPeak:!1,weekend:d===null,...d?{holiday:!0}:{},prevAtMs:c.start,nextAtMs:u.at,nextIntoPeak:u.intoPeak}:r===null||u===null?null:{inPeak:Xe(t,void 0,s,o),weekend:!1,prevAtMs:r.at,nextAtMs:u.at,nextIntoPeak:u.intoPeak}}function nt(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 a=Array.isArray(t.peakWindows)?t.peakWindows:[];return at(s,a,t.peakHolidays)}function st(t){return t.holiday===!0?{short:"holidayShort",chip:"holidayChip",notice:"holidayAllOffPeak"}:t.weekend===!0?{short:"weekendShort",chip:"weekendChip",notice:"weekendAllOffPeak"}:t.inPeak?{short:"peakShort",chip:"peakShort",notice:"peakNotice"}:{short:"offPeakShort",chip:"offPeakShort",notice:"offPeakActive"}}function ke(t,s,o){const a=Math.max(0,t.nextAtMs-s),n=Math.max(1,Math.ceil(a/6e4)),l=Math.floor(n/60),i=n%60;return l>0?i>0?o("countdownHourMinute",{h:l,m:i}):o("countdownHoursOnly",{h:l}):o("countdownMinute",{m:n})}const Pt="cm-peak-alert-preview";let wa=0;function Un(t){const s=t.useCost?t.useCost(h=>h):void 0,o=s?.state?.config,[a,n]=R(Date.now()),[l,i]=R(null),[r,u]=R(null);if(ee(()=>{const h=window.setInterval(()=>n(Date.now()),1e4);return()=>window.clearInterval(h)},[]),ee(()=>{const h=v=>{const N=v.detail?.kind==="offpeak"?"offpeak":"peak";u(N);const C=s?.state?.config;if(C?.peakAlertWebNotify===!0&&window.Notification&&Notification.permission==="granted"){const x=K(F(C.locale));try{new Notification(x(N==="peak"?"peakAlertTitlePeak":"peakAlertTitleOffPeak")+x("peakAlertPreviewTag"),{body:x("peakAlertBody",{time:x("countdownMinute",{m:2}),phase:x(N==="peak"?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}}};return window.addEventListener(Pt,h),window.__cmPeakAlertLive=!0,()=>{window.removeEventListener(Pt,h),window.__cmPeakAlertLive=!1}},[]),ee(()=>{if(!o||o.peakAlertEnabled!==!0||o.peakEnabled!==!0||o.peakAlertWebNotify!==!0||!window.Notification||Notification.permission!=="granted")return;const h=at(a,Array.isArray(o.peakWindows)?o.peakWindows:[],o.peakHolidays);if(h===null)return;const v=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",N=h.nextIntoPeak===!0;if(v!=="both"&&v!==(N?"peak":"offpeak"))return;const C=Number(o.peakAlertAhead),x=(Number.isFinite(C)&&C>=1?C:2)*6e4;if(a<h.nextAtMs-x||a>=h.nextAtMs||wa===h.nextAtMs)return;const f=K(F(o.locale));wa=h.nextAtMs;try{new Notification(f(N?"peakAlertTitlePeak":"peakAlertTitleOffPeak"),{body:f("peakAlertBody",{time:ke(h,a,f),phase:f(N?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})})}catch{}},[a]),!o||o.peakEnabled!==!0)return null;let d=null;if(o.peakAlertEnabled===!0){const h=Date.parse(o.peakEffectiveAt||"");if(!(Number.isFinite(h)&&a<h)){const v=at(a,Array.isArray(o.peakWindows)?o.peakWindows:[],o.peakHolidays);if(v!==null){const N=o.peakAlertTarget==="peak"||o.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",C=Number(o.peakAlertAhead),x=(Number.isFinite(C)&&C>=1?C:2)*6e4;(N==="both"||N===(v.nextIntoPeak?"peak":"offpeak"))&&a>=v.nextAtMs-x&&a<v.nextAtMs&&l!==v.nextAtMs&&(d=v)}}}let c=null,m=!1,p=null;if(d!==null)c=d,m=d.nextIntoPeak===!0,p=()=>i(d.nextAtMs);else if(r!==null)c={nextAtMs:a+2*6e4,nextIntoPeak:r==="peak"},m=r==="peak",p=()=>u(null);else return null;const b=K(F(o.locale)),g=o.peakAlertPosition==="center"?"cm-peak-alert-center":"cm-peak-alert-corner";return e("div",{className:"cm-peak-alert "+g+" "+(m?"cm-peak-alert-peak":"cm-peak-alert-offpeak"),role:"alert"},e("div",{className:"cm-peak-alert-badge"},b(m?"peakAlertBadgePeak":"peakAlertBadgeOffPeak")),e("div",{className:"cm-peak-alert-title"},b(m?"peakAlertTitlePeak":"peakAlertTitleOffPeak")),e("div",{className:"cm-peak-alert-body"},b("peakAlertBody",{time:ke(c,a,b),phase:b(m?"peakAlertPhasePeak":"peakAlertPhaseOffPeak")})),e("div",{className:"cm-peak-alert-actions"},e("button",{className:"cm-btn",onClick:p},b("peakAlertBtn"))))}function Hn(t){const{config:s,t:o}=t,[a,n]=R(Date.now());ee(()=>{const u=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(u)},[]);const l=nt(s,a);if(l===null)return null;const i=st(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ke(l,a,o)}):o("nextOffPeakIn",{time:ke(l,a,o)});return e(Z,{label:o(i.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-strip "+(l.weekend||l.holiday?"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||l.holiday?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-chip"},o(i.chip)+" · "+r)))}function Qn(t){const{config:s,t:o}=t,[a,n]=R(Date.now());ee(()=>{const u=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(u)},[]);const l=nt(s,a);if(l===null)return null;const i=st(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ke(l,a,o)}):o("nextOffPeakIn",{time:ke(l,a,o)});return e(Z,{label:o(i.notice),side:"right",delayMs:300},e("div",{className:"cm-peak-classic "+(l.weekend||l.holiday?"weekend":l.inPeak?"peak":"off")},e("div",{className:"cm-peak-classic-marker",style:{left:l.weekend||l.holiday?"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(i.chip)+" · "+r)))}function ot(t,s,o){return e(s?.peakStyle==="classic"?Qn:Hn,{config:s,t:o})}function Fn(t){const{config:s,t:o}=t,[a,n]=R(Date.now());ee(()=>{const d=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(d)},[]);const l=nt(s,a);if(l===null)return null;const i=st(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ke(l,a,o)}):o("nextOffPeakIn",{time:ke(l,a,o)}),u=[o(i.notice),r];return e(Z,{label:u,side:"right",delayMs:300},e("div",{className:"cm-peak-rail "+(l.weekend||l.holiday?"weekend":l.inPeak?"peak":"off"),"aria-label":u.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||l.holiday?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-label"},o(i.short))))}function Wn(t){const{config:s,t:o}=t,[a,n]=R(Date.now());ee(()=>{const d=window.setInterval(()=>n(Date.now()),3e4);return()=>window.clearInterval(d)},[]);const l=nt(s,a);if(l===null)return null;const i=st(l),r=l.nextIntoPeak?o("nextPeakIn",{time:ke(l,a,o)}):o("nextOffPeakIn",{time:ke(l,a,o)}),u=[o(i.notice),r];return e(Z,{label:u,side:"right",delayMs:300},e("div",{className:"cm-peak-rail-classic "+(l.weekend||l.holiday?"weekend":l.inPeak?"peak":"off"),"aria-label":u.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||l.holiday?"50%":l.inPeak?"25%":"75%"}})),e("span",{className:"cm-peak-rail-classic-label"},o(i.short))))}function _n(t,s,o){return e(s?.peakStyle==="classic"?Wn:Fn,{config:s,t:o})}function xa(t,s,o){const a=t.today,n=s.budget??{enabled:!1,amount:100,period:"month"},l=Number(s.exchangeRate),r=(t.budgetUsed??(n.period==="day"?z(t.today,s):n.period==="all"?z(t.total,s):z(t.month,s)))*(Number.isFinite(l)&&l>0?l:1),u=Math.max(0,Number(n.amount)||0),d=u>0?Math.min(999,r/u*100):null,c=pe(d===null?null:Math.min(100,d),se(s,"budget")),m=z(a,s)*(Number.isFinite(l)&&l>0?l:1),p=u>0?Math.min(999,m/u*100):null,b=n.detail!==!1;return{level:d===null?"ok":d>=100?"over":d>=80?"warn":"ok",rail:c.label===null?"—":Math.round(c.label)+"%",body:e(E,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("budget")),e("span",{className:"cm-bbox-pct cm-num"},c.label===null?"—":c.label.toFixed(1)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:c.width+"%"}})),b?e(E,null,s.hideTodayCost===!0?null:e("div",{className:"cm-bbox-line cm-num"},s.sidebarTodayMetric==="tokens"?o("today")+" "+Rt(a,s,o):o("todayShare",{amount:Y(z(a,s),s),pct:p===null?"—":p.toFixed(1)+"%"})),e("div",{className:"cm-bbox-line cm-num"},o("usedOf",{used:ce(r,s),amount:ce(u,s)}))):null,ot(t,s,o))}}function va(t,s,o){const a=t.goQuota,n=s?.goQuota?.main==="weekly"||s?.goQuota?.main==="monthly"?s.goQuota.main:"rolling",l=a[n],i=l!==null&&typeof l?.percent=="number"?Math.max(0,Math.min(100,Number(l.percent)||0)):0,r=b=>b!==null&&typeof b?.percent=="number"?Math.round(Math.max(0,Math.min(100,b.percent)))+"%":"—",u=b=>o(b==="rolling"?"goShortRolling":b==="weekly"?"goShortWeekly":"goShortMonthly"),d=["rolling","weekly","monthly"].filter(b=>b!==n),c=l!==null&&typeof l?.resetsAt=="string"&&l.resetsAt.length>0?o("goResetAt",{time:new Date(l.resetsAt).toLocaleString()}):"",m=s?.goQuota?.detail!==!1,p=pe(i,se(s,"go"));return{level:i>=100?"over":i>=80?"warn":"ok",rail:p.label===null?"—":Math.round(p.label)+"%",body:e(E,null,e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bbox-label"},o("goQuotaRowLabel")+" "+u(n)),e("span",{className:"cm-bbox-pct cm-num"},p.label===null?"—":Math.round(p.label)+"%")),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:p.width+"%"}})),m?e(E,null,e("div",{className:"cm-bbox-line cm-num"},d.map(b=>u(b)+" "+r(a[b])).join(" · ")),c?e("div",{className:"cm-bbox-line"},c):null):null)}}function zn(t){const{state:s,wide:o}=t,a=s.goQuota,n=K(F(s.config?.locale));if(!a||a.status!=="ok")return null;const l=s.config?.goQuota?.main==="weekly"||s.config?.goQuota?.main==="monthly"?s.config.goQuota.main:"rolling";if(a[l]===null||typeof a[l]?.percent!="number")return null;const i=va(s,s.config,n),r=[n("goQuotaTitle"),n("goWindowRolling")+": "+(a.rolling===null?"—":Math.round(a.rolling.percent)+"%"),n("goWindowWeekly")+": "+(a.weekly===null?"—":Math.round(a.weekly.percent)+"%"),n("goWindowMonthly")+": "+(a.monthly===null?"—":Math.round(a.monthly.percent)+"%"+(a.monthly!==null&&typeof a.monthly.resetsAt=="string"&&a.monthly.resetsAt.length>0?" · "+n("goResetAt",{time:new Date(a.monthly.resetsAt).toLocaleString()}):"")),n("goQuotaFetchedAt",{time:a.fetchedAt>0?new Date(a.fetchedAt).toLocaleTimeString():"—"})].join("; ");return e(Z,{label:r,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(i.level==="ok"?"":" "+i.level)+(o?"":" rail")},o?i.body:e("div",{className:"cm-bbox-rail cm-num"},i.rail)))}function Gn(t){return t===null||typeof t!="object"||t.unlimited||typeof t.percent!="number"?null:Math.max(0,Math.min(100,Math.round(Number(t.percent)||0)))}function We(t){const s=t!==null&&typeof t=="object"?t:{};return{five:s["5h"]??null,seven:s["7d"]??s.week??s.weekly??null}}function Na(t,s,o=Date.now()){if(typeof t!="string"||!t)return"";const a=Date.parse(t);if(!Number.isFinite(a))return"";const n=a-o;if(n<=0)return s("resetReached");const l=Math.ceil(n/6e4),i=Math.floor(l/1440),r=Math.floor(l%1440/60),u=l%60;return i>0?s("resetDays",{d:i,h:r}):r>0?s("resetHours",{h:r,m:u}):s("resetMinutes",{m:u})}function _e(t,s,o=Date.now()){const a=Na(t?.resetsAt,s,o);return a?s("goResetAt",{time:new Date(t.resetsAt).toLocaleString()})+" ("+a+")":""}function lt(t,s,o){return t===null?"—":o(s==="remaining"?"quotaRemaining":"quotaUsed",{pct:t})}function it(t){const[,s]=R(0),o=()=>s(Date.now());return ee(()=>{if(!t)return;const a=setInterval(o,6e4);return()=>clearInterval(a)},[t]),{onMouseEnter:o,onFocus:o}}function ze(t,s,o,a){const n=Gn(s),l=n===null?"ok":n>=100?"over":n>=80?"warn":"ok",i=pe(n,o),r=s?.unlimited?"∞":i.label===null?"—":i.label+"%";return{level:l,pct:n,text:r,label:i.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:i.width+"%"}})),e("span",{className:"cm-bbox-pct cm-num"},r))}}function Sa(t){const{five:s,seven:o,fetchedAt:a,t:n,wide:l,refresh:i,direction:r="used"}=t,u=it(s?.resetsAt),d=Na(s?.resetsAt,n),c=ze(n("codingPlanRemain5h"),s,r,n),m=ze(n("codingPlanRemain7d"),o,r,n),p=c.level==="over"||m.level==="over"?"over":c.level==="warn"||m.level==="warn"?"warn":"ok",b=(N,C,x)=>{const f=C?.unlimited?n("quotaUnlimited"):lt(x.label,r,n),S=_e(C,n);return N+" "+f+(S?" · "+S:"")},g=[n("codingPlanMinimaxTitle"),b(n("codingPlanRemain5h"),s,c),b(n("codingPlanRemain7d"),o,m),a>0?n("goQuotaFetchedAt",{time:new Date(a).toLocaleTimeString()}):null,...i?ye(n,i):[]].filter(Boolean).join(`
|
|
3
|
+
`),h=e(E,null,e("div",{className:"cm-mm-title"},n("codingPlanMinimaxTitle")),c.row,m.row,d?e("div",{className:"cm-mm-reset"},"5h · "+d):null),v=e(E,null,e("div",{className:"cm-bbox-rail cm-num"},c.text),e("div",{className:"cm-bbox-rail cm-num"},m.text));return e(Z,{label:e("span",{style:{whiteSpace:"pre-line"}},g),side:"right",delayMs:300},e("div",{...u,className:"cm-bbox cm-mm"+(p==="ok"?"":" "+p)+(l===!1?" rail":"")+(i?" clickable"+(i.busy?" busy":""):""),...i?be(i.busy,i.run):{}},l===!1?v:h))}function Kn(t){const{state:s,wide:o,api:a}=t,n=s.codingPlans?.minimax,l=K(F(s.config?.locale)),i=Te(a?()=>a.refreshCodingPlan("minimax"):null);if(!n||n.status!=="ok")return null;const{five:r,seven:u}=We(n.windows);return r==null&&u==null?null:e(Sa,{five:r,seven:u,fetchedAt:n.fetchedAt,t:l,wide:o,refresh:i,direction:se(s.config,"plan")})}const Yn="/plugins/dsh-openai-codex/auth/status",Vn=168*3600;function Jn(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(r=>r!==null&&typeof r=="object"&&r.id==="codex");if(!o||!Array.isArray(o.windows))return null;const a=o.windows.find(r=>r!==null&&typeof r=="object"&&Number(r.windowSeconds)===Vn);if(!a||typeof a.remainingPercent!="number"||!Number.isFinite(Number(a.remainingPercent)))return null;const n=Math.max(0,Math.min(100,Math.round((100-Number(a.remainingPercent))*10)/10)),l=Number(a.resetAt),i=Number.isFinite(l)&&l>0?new Date(l*1e3).toISOString():"";return{weekly:{percent:n,resetsAt:i}}}const $={status:"idle",windows:{},fetchedAt:0,inFlight:null,listeners:[]},$n=t=>($.listeners.push(t),()=>{$.listeners=$.listeners.filter(s=>s!==t)}),Zn=()=>{for(const t of $.listeners)try{t()}catch{}};async function Tt(t=!1,s=!1){if(!s)return;if($.inFlight!==null)return $.inFlight;if(!t&&$.fetchedAt>0&&Date.now()-$.fetchedAt<5*6e4)return;const o=(async()=>{try{const a=await fetch(Yn,{credentials:"same-origin",headers:{accept:"application/json"},signal:AbortSignal.timeout(8e3)});let n={};if(a.ok){const l=Jn(await a.json().catch(()=>null));l!==null&&(n=l)}$.status=Object.keys(n).length>0?"ok":"unavailable",$.windows=n}catch{$.status="unavailable"}finally{$.fetchedAt=Date.now(),$.inFlight=null,Zn()}})();return $.inFlight=o,o}function Ot(t){const[s,o]=R(()=>({status:$.status,windows:$.windows,fetchedAt:$.fetchedAt}));return ee(()=>{if(!t)return;let a=!0;const n=()=>{a&&o({status:$.status,windows:$.windows,fetchedAt:$.fetchedAt})},l=$n(n);return n(),Tt(!1,!0),()=>{a=!1,l()}},[t]),s}function Xn(t){const s=it(),{state:o,wide:a}=t,n=K(F(o.config?.locale)),l=o.config?.codexQuotaEnabled===!0&&o.config?.codexQuotaSidebar!==!1,i=Ot(l),r=Te(()=>Tt(!0,l));if(!l||i.status!=="ok")return null;const u=i.windows.weekly??null;if(u===null)return null;const d=se(o.config,"plan"),c=ze(n("goShortWeekly"),u,d,n),m=[n("codexQuotaTitle"),lt(c.label,d,n),_e(u,n),i.fetchedAt>0?n("goQuotaFetchedAt",{time:new Date(i.fetchedAt).toLocaleTimeString()}):null,...ye(n,r)].filter(Boolean).join(`
|
|
4
|
+
`),p=e(E,null,e("div",{className:"cm-mm-title"},n("codexQuotaTitle")),c.row),b=e("div",{className:"cm-bbox-rail cm-num"},c.label===null?"—":c.label+"%");return e(Z,{label:e("span",{style:{whiteSpace:"pre-line"}},m),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(c.level==="ok"?"":" "+c.level)+(a===!1?" rail":"")+(r.busy?" busy":""),...be(r.busy,r.run)},a===!1?b:p))}function Dt(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"):t==="plan"?s("mimoWindowPlan"):t==="compensation"?s("mimoWindowCompensation"):t==="balance"?s("codingPlanWindowBalance"):String(t).replace(/_/g," ")}function es(t){const s=it(),{id:o,state:a,wide:n,api:l}=t,i=a.codingPlans?.[o],r=K(F(a.config?.locale)),u=Te(l?()=>l.refreshCodingPlan(o):null),d=Ee.find(f=>f.id===o);if(!d||!i||i.status!=="ok")return null;const c=i.windows!==null&&typeof i.windows=="object"?i.windows:{},m=Object.entries(c);if(m.length===0)return null;const p=f=>f!==null&&typeof f=="object"&&typeof f.percent=="number"?Math.max(0,Math.min(100,Math.round(Number(f.percent)||0))):null,b=se(a.config,"plan"),g=m.map(([f,S])=>{const y=p(S);if(y===null)return e("div",{key:f,className:"cm-mm-row wide"},e("span",{className:"cm-mm-text"},typeof S?.text=="string"?S.text:"—"));const T=y>=100?"over":y>=80?"warn":"ok",A=pe(y,b);return e("div",{key:f,className:"cm-mm-row wide"+(T==="ok"?"":" "+T)},e("span",{className:"cm-bbox-label"},Dt(f,r)),e("div",{className:"cm-bbox-bar"},e("div",{className:"cm-bbox-fill",style:{width:A.width+"%"}})),e("span",{className:"cm-bbox-pct cm-num"},A.label===null?"—":A.label+"%"))}),h=m.map(([f,S])=>{const y=p(S),T=_e(S,r),A=y===null?typeof S?.text=="string"?S.text:"—":lt(pe(y,b).label,b,r);return Dt(f,r)+" "+A+(T?" · "+T:"")});i.fetchedAt>0&&h.push(r("goQuotaFetchedAt",{time:new Date(i.fetchedAt).toLocaleTimeString()})),h.push(...ye(r,u));const v=[r(d.labelKey),...h].join(`
|
|
5
|
+
`),N=m.map(([,f])=>p(f)).filter(f=>f!==null),C=N.some(f=>f>=100)?"over":N.some(f=>f>=80)?"warn":"ok",x=N.length>0?N.slice(0,2).map(f=>pe(f,b).label+"%").join(" "):typeof m[0][1]?.text=="string"?m[0][1].text:"—";return e(Z,{label:e("span",{style:{whiteSpace:"pre-line"}},v),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(C==="ok"?"":" "+C)+(n===!1?" rail":"")+(u.busy?" busy":""),...be(u.busy,u.run)},n===!1?e("div",{className:"cm-bbox-rail cm-num"},x):e(E,null,e("div",{className:"cm-mm-title"},r(d.labelKey)),...g)))}const Ca=t=>{try{return window.localStorage?.getItem?.("cm.gw."+t)??""}catch{return""}},ts=(t,s)=>{try{window.localStorage?.setItem?.("cm.gw."+t,s)}catch{}};function as(t){const s=it(),{source:o,snapshot:a,state:n,wide:l,api:i}=t,r=K(F(n.config?.locale)),[u,d]=R(()=>({source:o.id,id:Ca(o.id)})),c=Te(i?()=>i.refreshGatewayQuota(o.id):null),m=se(n.config,"plan"),p=a.accounts.length>1,b=u.source===o.id?u.id:Ca(o.id),g=a.accounts.findIndex(D=>D.id===b),h=g>=0?g:Math.max(0,a.accounts.findIndex(D=>D.windows.length>0||D.credits!=null)),v=a.accounts[h]??a.accounts[0],N=v?.label||v?.id||"",C=D=>p?(Jt[D.provider]??D.provider)+" · ":"",x=p&&v?[v]:a.accounts,f=[];for(const D of x){if(f.length>=4)break;for(const G of D.windows){if(f.length>=4)break;const B=C(D)+(G.label||G.id||r("gatewaySourceUnknown"));f.push({win:G,name:B,view:ze(B,G,m,r)})}D.windows.length===0&&D.credits!=null&&f.push({win:null,name:C(D)+(D.credits.unit||"credits"),text:(D.credits.used??"—")+" / "+(D.credits.limit??"—")})}f.length===0&&f.push({name:r("gatewayQuotaEmpty"),text:"—"});const S=f.some(D=>D.view?.level==="over")?"over":f.some(D=>D.view?.level==="warn")?"warn":"ok",y=f.map(D=>{if(D.text!=null)return D.name+" "+D.text;const G=_e(D.win,r);return D.name+" "+lt(D.view.label,m,r)+(G?" · "+G:"")});a.fetchedAt>0&&y.push(r("goQuotaFetchedAt",{time:new Date(a.fetchedAt).toLocaleTimeString()})),y.push(...ye(r,c));const A=[p&&N?`${o.label||o.id} (${h+1}/${a.accounts.length} · ${N})`:o.label||o.id,...y].join(`
|
|
6
|
+
`),L=f.map((D,G)=>D.text!=null?e("div",{key:G,className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},D.name),e("span",{className:"cm-mm-text cm-num"},D.text)):e(E,{key:G},D.view.row)),M=D=>{if(!D.key||D.key==="Enter"||D.key===" "){D.stopPropagation(),D.preventDefault?.();const G=a.accounts[(h+1)%a.accounts.length];ts(o.id,G.id),d({source:o.id,id:G.id})}},I=p?e("span",{className:"cm-gw-switcher","aria-label":r("gatewaySwitchAccount",{account:N||h+1}),onClick:M,onKeyDown:M,role:"button",tabIndex:0},`${h+1}/${a.accounts.length} ⇄`):null,k=p?e("div",{className:"cm-bbox-head"},e("div",{className:"cm-mm-title"},o.label||o.id),I):e("div",{className:"cm-mm-title"},o.label||o.id),H=p&&N?e("div",{className:"cm-gw-sub"},N):null,de=e(E,null,k,H,...L),we=f.filter(D=>D.view).map(D=>D.view.label).filter(D=>D!==null),Se=we.length>0?we.slice(0,2).map(D=>D+"%").join(" "):f[0].text??"—",O=e("div",{className:"cm-bbox-rail cm-num"},Se);return e(Z,{label:e("span",{style:{whiteSpace:"pre-line"}},A),side:"right",delayMs:300},e("div",{...s,className:"cm-bbox cm-mm clickable"+(S==="ok"?"":" "+S)+(l===!1?" rail":"")+(c.busy?" busy":""),...be(c.busy,c.run)},l===!1?e(E,null,O,I):de))}function ns(t,s,o,a){const n=Array.isArray(t.gatewayQuotas)?t.gatewayQuotas:[],l=[];for(const i of s.gatewayQuotas?.sources??[]){if(i.enabled===!1||i.display!=="sidebar"&&i.display!=="both")continue;const r=n.find(u=>u.id===i.id);!r||r.status!=="ok"&&r.status!=="partial"&&r.status!=="stale"||r.accounts.length===0||l.push(e(as,{source:i,snapshot:r,state:t,wide:o,api:a}))}return l}const ss={anthropic:"Claude",zai:"Z.ai",minimax:"MM",kimi:"Kimi",openrouter:"OR",siliconflow:"SF",commandcode:"CC",scnet:"SCNet",volcengine:"Ark",qwen:"Qwen",mimo:"MiMo"};function os(t){const s=t.useCost?t.useCost(g=>g):void 0;Ot(s?.state?.config?.codexQuotaEnabled===!0);const[o,a]=R(null),[n,l]=R({}),i=s?.state,r=t.api;if(!i)return null;const u=i.config,d=u.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};if(d.enabled!==!0)return null;const c=K(F(u?.locale)),m=[];if(d.budget!==!1){const g=u.budget??{enabled:!1,amount:100,period:"month"};if(g.enabled===!0){const h=Number(u.exchangeRate),N=(i.budgetUsed??(g.period==="day"?z(i.today,u):g.period==="all"?z(i.total,u):z(i.month,u)))*(Number.isFinite(h)&&h>0?h:1),C=Math.max(0,Number(g.amount)||0);if(C>0){const x=Math.min(999,N/C*100),f=x>=100?"over":x>=80?"warn":"ok";m.push({key:"budget",label:c("budgetShort"),level:f,tip:c("budgetOf",{period:c(je[g.period]??"periodMonth")})+" · "+c("usedOf",{used:ce(N,u),amount:ce(C,u)})+" · "+x.toFixed(1)+"%",segs:[{name:"main",pct:Math.round(pe(Math.min(100,x),se(u,"budget")).width)}]})}}}if(d.go!==!1){const g=i.goQuota;if(u?.goQuota?.enabled!==!1&&g?.status==="ok"){const h=u.goQuota.main==="weekly"||u.goQuota.main==="monthly"?u.goQuota.main:"rolling",v=h==="rolling"?g.rolling:h==="weekly"?g.weekly:g.monthly;if(v!==null&&typeof v=="object"&&typeof v.percent=="number"){const N=Math.max(0,Math.min(100,Math.round(Number(v.percent)||0))),C=N>=100?"over":N>=80?"warn":"ok",x=typeof v.resetsAt=="string"&&v.resetsAt.length>0?" · "+c("goResetAt",{time:new Date(v.resetsAt).toLocaleString()}):"";m.push({key:"go",label:"Go "+c(h==="rolling"?"goShortRolling":h==="weekly"?"goShortWeekly":"goShortMonthly"),level:C,tip:"Go: "+N+"%"+x,segs:[{name:"main",pct:Math.round(pe(N,se(u,"go")).width)}]})}}}if(d.plans!==!1)for(const g of Ee){const h=i.codingPlans?.[g.id];if(u.codingPlans?.[g.id]?.enabled!==!0||!h||h.status!=="ok")continue;const v=h.windows!==null&&typeof h.windows=="object"?h.windows:{},N=Object.entries(v);if(N.length===0)continue;const C=ss[g.id]??g.id,x=[],f=[];let S=0,y=0;for(const[T,A]of N){const L=Dt(T,c),M=typeof A?.resetsAt=="string"&&A.resetsAt.length>0?" · "+c("goResetAt",{time:new Date(A.resetsAt).toLocaleString()}):"",I=A!==null&&typeof A=="object"&&typeof A.percent=="number"?Math.max(0,Math.min(100,Math.round(Number(A.percent)||0))):null;if(f.push(L+" "+(I===null?typeof A?.text=="string"?A.text:"—":I+"%")+M),I===null){x.push({name:T,pct:null,text:typeof A?.text=="string"?A.text:"—"});continue}y>=2||(y+=1,x.push({name:T,pct:Math.round(pe(I,se(u,"plan")).width)}),S=Math.max(S,I>=100?2:I>=80?1:0))}h.fetchedAt>0&&f.push(c("goQuotaFetchedAt",{time:new Date(h.fetchedAt).toLocaleTimeString()})),x.length!==0&&m.push({key:g.id,label:C,level:["ok","warn","over"][S],tip:f.join("; "),segs:x})}const p=u.codexQuotaEnabled===!0&&$.status==="ok"?$.windows.weekly??null:null;if(p!==null&&typeof p.percent=="number"){const g=Math.max(0,Math.min(100,Math.round(Number(p.percent)||0))),h=typeof p.resetsAt=="string"&&p.resetsAt.length>0?" · "+c("goResetAt",{time:new Date(p.resetsAt).toLocaleString()}):"";m.push({key:"codex",label:"Codex",level:g>=100?"over":g>=80?"warn":"ok",tip:c("codexQuotaTitle")+": "+g+"%"+h,segs:[{name:"weekly",pct:Math.round(pe(g,se(u,"plan")).width)}]})}if(m.length===0)return null;const b=g=>{o!==null||!r||(a(g),l(h=>({...h,[g]:null})),Promise.resolve().then(()=>g==="budget"?r.reload():g==="go"?r.refreshGoQuota():g==="codex"?Tt(!0,u.codexQuotaEnabled===!0):r.refreshCodingPlan(g)).catch(h=>{l(v=>({...v,[g]:h?.message??String(h)}))}).finally(()=>a(null)))};return e("div",{className:"cm-qstrip"},m.map(g=>{const h=o===g.key,v=n[g.key],N=[e("span",{className:"cm-qlabel",key:"l"},g.label)];h?N.push(e("span",{className:"cm-qtext",key:"busy"},c("refreshing"))):g.segs.forEach((x,f)=>{f>0&&N.push(e("span",{className:"cm-qsep",key:"sep"+f,"aria-hidden":"true"})),x.pct===null?N.push(e("span",{className:"cm-qtext",key:x.name},x.text)):N.push(e("span",{className:"cm-qseg",key:x.name},e("span",{className:"cm-qbar"},e("span",{className:"cm-qfill",style:{width:x.pct+"%"}})),e("span",null,x.pct+"%")))});const C=[g.tip];return!h&&r&&C.push(c("clickToRefresh")),h&&C.push(c("refreshing")),v&&C.push("⚠ "+c("balanceRefreshFailed",{message:v})),e(Z,{key:g.key,label:C.join("; "),side:"bottom",delayMs:400},e("span",{className:"cm-qchip"+(r?" action":"")+(g.level==="ok"?"":" "+g.level),...r?be(h,()=>b(g.key)):{}},N))}))}const Aa="dsh-cost-meter:simple-guide-dismissed";function Bt(t){if(t?.sidebarSimplePromptSeen===!0)return!0;try{return window.localStorage.getItem(Aa)==="1"}catch{return!1}}function ls(t){const s=t.useCost?t.useCost(b=>b):void 0,o=Pe(!1),[a,n]=R(!1),[l,i]=R(!1),[r,u]=R(!1),d=s?.state?.config;if(!d||r||Bt(d))return null;const c=K(F(d.locale)),m=()=>{u(!0);try{window.localStorage.setItem(Aa,"1")}catch{}},p=async b=>{if(!o.current){o.current=!0,n(!0),i(!1);try{if((await t.api.updateConfig({sidebarSimple:b,sidebarSimplePromptSeen:!0}))?.config?.sidebarSimple!==b)throw new Error;m()}catch{i(!0)}finally{o.current=!1,n(!1)}}};return e("div",{className:"cm-qguide",role:"dialog","aria-label":c("sidebarSimpleTitle"),"aria-busy":a,onKeyDown:b=>{b.key==="Escape"&&(b.stopPropagation(),m())}},e("div",{className:"cm-bbox-head"},e("h4",null,c("sidebarSimpleTitle")),e("button",{type:"button",className:"cm-btn small","aria-label":c("closeGuide"),onClick:m},"×")),e("p",null,c("sidebarSimpleBody")),l?e("p",{role:"alert"},c("sidebarSimpleError")):null,e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small",disabled:a,onClick:()=>p(!1)},c("sidebarSimpleOff")),e("button",{type:"button",className:"cm-btn small primary",disabled:a,onClick:()=>p(!0)},c("sidebarSimpleOn"))))}function is(t){const s=t.useCost?t.useCost(r=>r):void 0,o=Pe(!1),a=s?.state;if(!a)return null;const n=a.config;if(!Bt(n)||n.quotaStrip?.promptSeen===!0)return null;const l=K(F(n?.locale)),i=r=>{if(o.current===!0)return;o.current=!0;const u=n.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0};t.api.updateConfig({quotaStrip:{...u,enabled:r,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:()=>i(!1)},l("quotaStripGuideOff")),e("button",{type:"button",className:"cm-btn small primary",onClick:()=>i(!0)},l("quotaStripGuideOn"))))}const Ma="dsh-cost-meter:balance-click-hint-seen",rs=()=>{try{return window.localStorage.getItem(Ma)==="1"}catch{return!1}},cs=()=>{try{window.localStorage.setItem(Ma,"1")}catch{}};function ds(t){const s=t.useCost?t.useCost(b=>b):void 0,o=Pe(!1),[a,n]=R(!1),[l]=R(rs),i=s?.state;if(!i)return null;const r=i.config,u=r.balance?.display==="sidebar"||r.balance?.display==="both",d=(r?.customBalances??[]).some(b=>b?.enabled===!0&&(b.display==="sidebar"||b.display==="both"))||r.customBalance?.enabled===!0&&(r.customBalance?.display==="sidebar"||r.customBalance?.display==="both"),c=Ee.some(b=>{const g=r.codingPlans?.[b.id];return g?.enabled===!0&&(g.display==="sidebar"||g.display==="both")});if(a||l||r.balance?.clickHintSeen===!0||!u&&!d&&!c||!Bt(r)||r.quotaStrip?.promptSeen!==!0)return null;const m=K(F(r?.locale)),p=()=>{o.current!==!0&&(n(!0),o.current=!0,cs(),t.api.updateConfig({balance:{...r.balance??{},clickHintSeen:!0}}).catch(()=>{o.current=!1,n(!1)}))};return e("div",{className:"cm-qguide",role:"dialog","aria-label":m("balanceClickGuideTitle")},e("h4",null,m("balanceClickGuideTitle")),e("p",null,m("balanceClickGuideBody")),e("div",{className:"cm-buttons"},e("button",{type:"button",className:"cm-btn small primary",onClick:p},m("balanceClickGuideOk"))))}function Rt(t,s,o){return s.sidebarTodayMetric==="tokens"?j(["input","output","cacheRead","cacheWrite","reasoning"].reduce((a,n)=>a+(Number(t?.[n])||0),0))+" "+o("tokensUnit"):Y(z(t,s),s)}function Lt(t){const{state:s,wide:o}=t,a=s.today,n=s.config,l=K(F(n?.locale)),i=Rt(a,n,l),r=n.budget??{enabled:!1,amount:100,period:"month"},u=Number(n.exchangeRate),c=(s.budgetUsed??(r.period==="day"?z(s.today,n):r.period==="all"?z(s.total,n):z(s.month,n)))*(Number.isFinite(u)&&u>0?u:1),m=Math.max(0,Number(r.amount)||0),p=m>0?Math.min(999,c/m*100):null,b=p===null?"ok":p>=100?"over":p>=80?"warn":"ok";if(r.enabled===!0){const v=z(a,n)*(Number.isFinite(u)&&u>0?u:1),N=m>0?Math.min(999,v/m*100):null,C=[l("budgetOf",{period:l(je[r.period]??"periodMonth")}),l("usedOf",{used:ce(c,n),amount:ce(m,n)})+" · "+(p===null?"—":p.toFixed(1)+"%"),...n.hideTodayCost===!0?[]:[n.sidebarTodayMetric==="tokens"?l("today")+" "+i:l("todayShare",{amount:i,pct:N===null?"—":N.toFixed(1)+"%"})],l("monthTotal",{month:Y(z(s.month,n),n),total:Y(z(s.total,n),n)})].join("; ");if(t.summary===!0)return e(Z,{label:C,side:"right",delayMs:300},e("div",{className:"cm-simple-summary"+(b==="ok"?"":" "+b),tabIndex:0},e("span",null,l("todayBudget",{period:l(je[r.period]??"periodMonth")})),e("span",{className:"cm-num"},i+" / "+ce(m,n))));const x=xa(s,n,l);return e(Z,{label:C,side:"right",delayMs:300},e("div",{className:"cm-bbox"+(b==="ok"?"":" "+b)+(o?"":" rail")},o?x.body:e("div",{className:"cm-bbox-rail cm-num"},x.rail)))}const g=[n.sidebarTodayMetric==="tokens"?l("todayTokensTitle"):l("todayCostTitle"),l("callsTokens",{calls:a.calls,input:j(a.input),cache:j(a.cacheRead+a.cacheWrite),output:j(a.output)}),l("monthCost",{amount:Y(z(s.month,n),n)}),l("totalCost",{amount:Y(z(s.total,n),n)})].join("; ");return e(Z,{label:g,side:"right",delayMs:300},e(E,null,e("div",{className:"cm-foot"+(o?"":" cm-foot-rail")},o?e(E,null,l("today")," ",e("span",{className:"cm-num"},i)):e(tt,{size:16})),o?ot(s,n,l):null))}function us(t){const s=t.useCost?t.useCost(M=>M):void 0;Ot(s?.state?.config?.codexQuotaEnabled===!0&&s?.state?.config?.codexQuotaSidebar!==!1);let o;if(t.useProjection)try{o=t.useProjection("costUsage")}catch{o=void 0}ua(t,o);const a=s?.state,n=!!t.wide;if(!a)return null;const l=a.config,i=K(F(l?.locale)),r=(l.balance?.display==="sidebar"||l.balance?.display==="both")&&l.hideOfficialBalance!==!0,d=Mt(a,l).length>0,c=r&&l.balance?.showProgressBar===!0&&a.balance?.status==="ok",m=d&&l.balance?.showProgressBar===!0,p=l.goQuota?.main==="weekly"||l.goQuota?.main==="monthly"?l.goQuota.main:"rolling",b=l.goQuota?.enabled!==!1&&(l.goQuota?.display==="sidebar"||l.goQuota?.display==="both")&&a.goQuota?.status==="ok"&&a.goQuota?.[p]!==null,g=Ee.map(M=>M.id).filter(M=>{const I=l.codingPlans?.[M];if(I?.enabled!==!0||I.display!=="sidebar"&&I.display!=="both")return!1;const k=a.codingPlans?.[M];if(k?.status!=="ok")return!1;const H=k.windows!==null&&typeof k.windows=="object"?k.windows:{};return Object.keys(H).length>0}),h=g.length>0,v=ns(a,l,n,t.api),N=l.codexQuotaEnabled===!0&&l.codexQuotaSidebar!==!1&&$.status==="ok"&&$.windows.weekly!==null,C=(l.budget??{}).enabled===!0,x=l.sidebar!==!1&&l.hideTodayCost!==!0,f=l.sidebarModels?.enabled===!0;if(!f&&!r&&!d&&!b&&!h&&!N&&!C&&!x&&v.length===0)return null;const S=l.sidebarSimple===!0,y=!S&&n&&l.sidebarStyle==="compact",T=S&&n&&x&&C,A=[];T?A.push(e(Lt,{state:a,wide:n,summary:!0})):S&&n&&x&&A.push(e("div",{className:"cm-simple-summary"},e("span",null,i("today")),e("span",{className:"cm-num"},Rt(a.today,l,i)))),c?A.push(e(Bn,{state:a,wide:n,api:t.api})):r&&A.push(e(Dn,{state:a,wide:n,api:t.api})),m?A.push(e(Ln,{state:a,wide:n,api:t.api})):d&&A.push(e(qn,{state:a,wide:n,api:t.api}));const L=A.length;if(h&&A.push(...g.map(M=>M==="minimax"?e(Kn,{state:a,wide:n,api:t.api}):e(es,{id:M,state:a,wide:n,api:t.api}))),A.push(...v),N&&A.push(e(Xn,{state:a,wide:n,api:t.api})),b&&C&&n&&!S){const M=va(a,l,i),I=xa(a,l,i),k=M.level==="over"||I.level==="over"?"over":M.level==="warn"||I.level==="warn"?"warn":"ok";A.push(e("div",{className:"cm-bbox cm-bbox-pair"+(k==="ok"?"":" "+k)},e("div",{className:"cm-bbox-section"+(M.level==="ok"?"":" "+M.level)},M.body),e("div",{className:"cm-bbox-divider"}),e("div",{className:"cm-bbox-section"+(I.level==="ok"?"":" "+I.level)},I.body)))}else b&&A.push(e(zn,{state:a,wide:n})),C&&!T&&A.push(e(Lt,{state:a,wide:n}));return!C&&x&&!(S&&n)&&A.push(e(Lt,{state:a,wide:n})),S&&n&&x&&A.push(ot(a,l,i)),n||A.push(_n(a,l,i)),f&&A.splice(l.sidebarModels.position==="first"?0:l.sidebarModels.position==="afterBalance"?L:A.length,0,e(ms,{key:"models",state:a,wide:n})),e("div",{...S?{tabIndex:0,role:"region","aria-label":i("sidebarSimple")}:{},className:"cm-footer-stack"+(n?"":" rail")+(y?" compact":"")+(S?" simple":"")},...A)}const Et={enabled:!1,period:"today",topN:5,summary:"total",position:"last",defaultOpen:!1,remember:!0,tokens:!1,shares:!0,refreshSeconds:60,dock:!1},Pa="dsh-cost-meter:models-open";function Ta(t,s,o){return Ra(t,t.config,o,s).map(a=>({...a,label:a.key==="deepseek:legacy"?a.label:It(a.key),cost:z(a,t.config)})).sort((a,n)=>n.cost-a.cost||n.tokens-a.tokens||a.key.localeCompare(n.key))}function ms({state:t,wide:s}){const o={...Et,...t.config.sidebarModels},a=K(F(t.config.locale)),n=()=>{try{const N=o.remember?window.localStorage.getItem(Pa):null;if(N!==null)return N==="1"}catch{}return o.defaultOpen},[l,i]=R(n),[r,u]=R(o.period);ee(()=>u(o.period),[o.period]),ee(()=>i(n()),[o.defaultOpen,o.remember]);const d=Ta(t,r,a),c=d.reduce((N,C)=>N+C.cost,0),m=N=>Y(N,t.config),p=a(r==="history"?"modelStatsHistory":"modelStatsToday")+" "+m(c)+" · "+a("modelsCount",{n:d.length}),b=o.summary==="top"&&d.length?d[0].label+" "+m(d[0].cost):p,g=o.summary==="top"&&d.length?e(E,null,e("span",{className:"cm-bal-label"},d[0].label),e("span",{className:"cm-bal-amt"},m(d[0].cost))):e("span",{className:"cm-bal-label"},b),h=()=>{i(!l);try{o.remember&&window.localStorage.setItem(Pa,l?"0":"1")}catch{}};if(!s||t.config.sidebarSimple)return e("div",{className:"cm-foot cm-num"+(s?"":" cm-foot-rail"),title:b+" · "+p},s?g:e(tt,{size:16}));const v=d.slice(0,o.topN);return d.length>o.topN&&v.push(d.slice(o.topN).reduce((N,C)=>{for(const x of["cost","input","output","cacheRead","cacheWrite"])N[x]+=C[x];return N},{key:"other",label:a("modelsOther"),cost:0,input:0,output:0,cacheRead:0,cacheWrite:0})),e("div",{className:"cm-bbox cm-model-costs"},e("button",{type:"button",className:"cm-collapse-h","aria-expanded":String(l),title:p,onClick:h},e("span",{className:"cm-caret"+(l?" open":"")}),g),l?e(E,null,e("div",{className:"cm-buttons"},["today","history"].map(N=>e("button",{key:N,type:"button",className:"cm-mstats-tab"+(r===N?" active":""),"aria-pressed":r===N,onClick:()=>u(N)},a(N==="today"?"modelStatsToday":"modelStatsHistory")))),v.length?v.map(N=>e("div",{key:N.key},e("div",{className:"cm-bbox-head"},e("span",{className:"cm-bal-label",title:N.label},N.label),e("span",{className:"cm-num cm-bal-amt"},m(N.cost))),o.shares?e("div",{className:"cm-bbox-bar",title:(c>0?N.cost/c*100:0).toFixed(1)+"%"},e("div",{className:"cm-bbox-fill",style:{width:(c>0?N.cost/c*100:0)+"%"}})):null,o.tokens?e("div",{className:"cm-mstats-note"},a("modelStatsInput")+" "+j(N.input)+" · "+a("modelStatsCache")+" "+j(N.cacheRead+N.cacheWrite)+" · "+a("modelStatsOutput")+" "+j(N.output)):null)):e("span",{className:"cm-note"},a("modelStatsEmpty"))):null)}function ps({draft:t,setDraft:s,t:o}){const a={...Et,...t?.sidebarModels},n=(i,r)=>{t&&s({...t,sidebarModels:{...a,[i]:r}})},l=(i,r)=>e("div",{className:"cm-field",key:i},e("label",null,o("models_"+i)),e("select",{className:"cm-input",value:a[i],onChange:u=>n(i,u.target.value)},r.map(([u,d])=>e("option",{key:u,value:u},o(d)))));return e("div",{className:"cm-grid"},e("div",{className:"cm-grid-group"},o("modelsTitle")),["enabled","defaultOpen","remember","tokens","shares","dock"].map(i=>e("label",{key:i,className:"cm-check"},e("input",{type:"checkbox",checked:a[i],onChange:r=>n(i,r.target.checked)}),o("models_"+i))),l("period",[["today","modelStatsToday"],["history","modelStatsHistory"]]),l("summary",[["total","modelsTotal"],["top","modelsTop"]]),l("position",[["first","modelsFirst"],["afterBalance","modelsAfter"],["last","modelsLast"]]),["topN","refreshSeconds"].map(i=>e("div",{key:i,className:"cm-field"},e("label",null,o("models_"+i)),ae({value:a[i]},r=>n(i,Math.max(i==="topN"?1:10,Math.min(i==="topN"?10:60,Math.floor(r))))))))}function rt(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))}function Oa(t){const[s,o]=R(null),[a,n]=R(""),[l,i]=R(0);return ee(()=>{let r=!0;return n(""),t.api.loadStatistics().then(u=>{r&&o(()=>u)},u=>{r&&n(String(u.message??u))}),()=>{r=!1}},[t.api,l]),s?e(s,{...t,formatMoneyUsd:Y,formatTokens:j}):e("p",{role:a?"alert":"status"},a||"…",a?e("button",{className:"cm-btn",onClick:()=>i(r=>r+1)},"↻"):null)}function fs(t){const s=t.useCost?.(i=>i)?.state,[o,a]=R(!1),n=Be.useRef(null);if(ee(()=>{o&&n.current?.showModal()},[o]),!s||!t.sessionId)return null;const l=F(s.config.locale)==="en"?"Cost details":"费用明细";return e(E,null,e("button",{type:"button",className:"cm-btn",onClick:()=>a(!0)},l),o?e("dialog",{ref:n,"aria-label":l,onCancel:()=>a(!1),style:{width:"min(1160px,94vw)",maxHeight:"90vh",padding:24,borderRadius:16,border:"1px solid var(--dsw-alias-border-l1)",color:"var(--dsw-alias-label-primary)",background:"var(--dsw-alias-bg-base,#fff)"}},e("button",{type:"button",className:"cm-btn",autoFocus:!0,"aria-label":F(s.config.locale)==="en"?"Close":"关闭",onClick:()=>a(!1),style:{float:"right"}},"×"),e(Oa,{state:s,api:t.api,sessionId:t.sessionId})):null)}function bs({state:t,t:s}){const o=t.externalUsage;if(!o)return null;const a=t.config,n=d=>Y(z(d,a),a),l=d=>s("callsTokens",{calls:d.calls,input:j(d.input),cache:j(d.cacheRead+d.cacheWrite),output:j(d.output)}),i=(d,c)=>({calls:d.calls+c.calls,input:d.input+c.input,output:d.output+c.output,cacheRead:d.cacheRead+c.cacheRead,cacheWrite:d.cacheWrite+c.cacheWrite,cost:z(d,a)+c.cost,apiCost:z(d,a)+c.cost}),r=(d,c)=>e("tr",{key:d},e("td",null,d),e("td",{className:"num"},String(c.calls)),e("td",{className:"num"},j(c.input)),e("td",{className:"num"},j(c.cacheRead+c.cacheWrite)),e("td",{className:"num"},j(c.output)),e("td",{className:"num"},n(c))),u=d=>e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,s("colDate")),...["colCalls","colInTok","colCacheTok","colOutTok","colCost"].map(c=>e("th",{className:"num"},s(c))))),e("tbody",null,d)));return e("section",{className:"cm-budget"},e("h3",{className:"cm-h"},s("externalUsage")),o.stale?e("p",{className:"cm-note"},s("externalStale")):null,e("div",{className:"cm-cards"},["today","month","total"].map((d,c)=>{const m=i(t[d],o.combined[d]);return e(rt,{key:d,title:s("combinedUsage")+" · "+s(["cardToday","cardMonth","cardTotal"][c]),value:n(m),sub:l(m)})})),...o.sources.map(d=>e("details",{key:d.source},e("summary",null,d.source+" · "+s("cardToday")+" "+n(d.today)+" · "+s("cardMonth")+" "+n(d.month)+" · "+l(d.today)),u(["today","month","total"].map((c,m)=>r(s(["cardToday","cardMonth","cardTotal"][m]),d[c]))),e("p",{className:"cm-note"},s("externalHistory")),u(d.history.map(c=>r(c.date,c))))))}const Le=(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 gs(t){const{state:s,api:o}=t,a=K(F(s.config?.locale)),[n,l]=R(!1);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Le(n,()=>l(!n),a("history"))),n?e("div",{className:"cm-collapse-body"},e(hs,{state:s,api:o})):null)}function hs(t){const{state:s,api:o}=t,a=K(F(s.config?.locale)),[n,l]=R(null),[i,r]=R({}),[u,d]=R(()=>new Set),c=s.history??[];if(c.length===0)return e("p",{className:"cm-empty"},a("noHistory"));const m=b=>{if(n===b){l(null);return}l(b),!(i[b]!==void 0||u.has(b))&&(d(g=>{const h=new Set(g);return h.add(b),h}),o.getDaySessions(b).then(g=>r(h=>({...h,[b]:Array.isArray(g?.sessions)?g.sessions:[]}))).catch(()=>r(g=>({...g,[b]:"error"}))).finally(()=>d(g=>{const h=new Set(g);return h.delete(b),h})))},p=b=>b.map(g=>e("tr",{key:g.id},qt(g,s.config?.showSessionId===!0,a),e("td",{className:"num"},String(g.calls)),e("td",{className:"num"},j(g.input)),e("td",{className:"num"},j(g.cacheRead+g.cacheWrite)),e("td",{className:"num"},j(g.output)),e("td",{className:"num"},Y(z(g,s.config),s.config))));return e("div",{className:"cm-scroll"},e("p",{className:"cm-hint",style:{padding:"6px 10px 0"}},a("historyExpandHint")),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("colDate")),e("th",{className:"num"},a("colCalls")),e("th",{className:"num"},a("colInTok")),e("th",{className:"num"},a("colCacheTok")),e("th",{className:"num"},a("colOutTok")),e("th",{className:"num"},a("colCost")))),e("tbody",null,c.flatMap(b=>{const g=e("tr",{key:b.date,className:"cm-row-click",onClick:()=>m(b.date)},e("td",null,(n===b.date?"▾ ":"▸ ")+b.date),e("td",{className:"num"},String(b.calls)),e("td",{className:"num"},j(b.input)),e("td",{className:"num"},j(b.cacheRead+b.cacheWrite)),e("td",{className:"num"},j(b.output)),e("td",{className:"num"},Y(z(b,s.config),s.config)));if(n!==b.date)return[g];const h=i[b.date],v=u.has(b.date)&&h===void 0?e("p",{className:"cm-empty"},a("historySessionsLoading")):h==="error"?e("p",{className:"cm-empty"},a("historySessionsError")):!Array.isArray(h)||h.length===0?e("p",{className:"cm-empty"},a("historyNoSessions")):e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("colSession")),e("th",{className:"num"},a("colCalls")),e("th",{className:"num"},a("colInTok")),e("th",{className:"num"},a("colCacheTok")),e("th",{className:"num"},a("colOutTok")),e("th",{className:"num"},a("colCost")))),e("tbody",null,p(h)));return[g,e("tr",{key:b.date+"-sessions"},e("td",{colSpan:6},v))]}))))}function ys(t){const{state:s,api:o}=t,a=K(F(s.config?.locale)),[n,l]=R(!1),[i,r]=R(100),[u,d]=R("cost-desc"),[c,m]=R(null),[p,b]=R(!1),[g,h]=R(!1),v=Be.useRef(0),N=(S,y)=>{const[T,A]=y==="recent"?["recent","desc"]:y.split("-"),L=++v.current;b(!0),h(!1),o.getTopSessions(S,T,A).then(M=>{L===v.current&&m(Array.isArray(M?.sessions)?M.sessions:[])}).catch(()=>{L===v.current&&h(!0)}).finally(()=>{L===v.current&&b(!1)})},C=()=>{l(S=>{const y=!S;return y&&c===null&&!p&&N(i,u),y})},x=S=>{r(S),(n||c!==null)&&N(S,u)},f=S=>{d(S),(n||c!==null)&&N(i,S)};return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Le(n,C,a("sessionRankTitle"))),n?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-hint"},a("sessionRankHint")),e("div",{style:{display:"flex",gap:"12px",flexWrap:"wrap",margin:"6px 0"}},e("div",{className:"cm-field"},e("label",null,a("sessionRankSort")),e("select",{className:"cm-input",value:u,onChange:S=>f(S.target.value)},e("option",{value:"cost-desc"},a("sessionSortCostDesc")),e("option",{value:"cost-asc"},a("sessionSortCostAsc")),e("option",{value:"time-desc"},a("sessionSortTimeDesc")),e("option",{value:"time-asc"},a("sessionSortTimeAsc")),e("option",{value:"recent"},a("sessionSortRecent")))),e("div",{className:"cm-field"},e("label",null,a("sessionRankLimit")),e("select",{className:"cm-input",value:String(i),onChange:S=>x(Number(S.target.value))},e("option",{value:"50"},"50"),e("option",{value:"100"},"100"),e("option",{value:"200"},"200")))),p?e("p",{className:"cm-empty"},a("sessionRankLoading")):g?e("p",{className:"cm-empty"},a("sessionRankError")):c===null||c.length===0?e("p",{className:"cm-empty"},a("sessionRankEmpty")):e("div",{className:"cm-scroll"},e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("colDate")),e("th",null,a("colSession")),e("th",{className:"num"},a("colCalls")),e("th",{className:"num"},a("colInTok")),e("th",{className:"num"},a("colCacheTok")),e("th",{className:"num"},a("colOutTok")),e("th",{className:"num"},a("colCost")))),e("tbody",null,c.map(S=>e("tr",{key:S.date+":"+S.id},e("td",null,S.date),qt(S,s.config?.showSessionId===!0,a),e("td",{className:"num"},String(S.calls)),e("td",{className:"num"},j(S.input)),e("td",{className:"num"},j((S.cacheRead??0)+(S.cacheWrite??0))),e("td",{className:"num"},j(S.output)),e("td",{className:"num"},Y(z(S,s.config),s.config)))))))):null)}function ks(t){const{state:s}=t,o=K(F(s.config?.locale)),a=s.today.sessions??[];if(a.length===0)return e("p",{className:"cm-empty"},o("noSessionsToday"));const n=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,a.map(l=>e("tr",{key:l.id},qt(l,n,o),e("td",{className:"num"},String(l.calls)),e("td",{className:"num"},j(l.input)),e("td",{className:"num"},j(l.cacheRead+l.cacheWrite)),e("td",{className:"num"},j(l.output)),e("td",{className:"num"},Y(z(l,s.config),s.config)))))))}function qt(t,s,o){const a=typeof t.title=="string"?t.title.trim():"",n=String(t.id).slice(0,14)+"…",l=a.length>0?a:n,i=a.length>0?a+" · "+t.id:t.id;return e("td",{title:i},e("div",{className:"cm-sess-title"+(a.length===0?" cm-sess-id":"")},l),s&&a.length>0?e("div",{className:"cm-sess-id"},n):null)}const ws={CNY:{symbol:"¥",decimals:4,exchangeRate:7.2},USD:{symbol:"$",decimals:6,exchangeRate:1},EUR:{symbol:"€",decimals:6,exchangeRate:.92}};function xs(t){const{state:s,draft:o,setDraft:a,t:n}=t,l=s.config,i=o?.budget??l.budget,r=Number(l.exchangeRate),d=(s.budgetUsed??(i.period==="day"?z(s.today,l):i.period==="all"?z(s.total,l):z(s.month,l)))*(Number.isFinite(r)&&r>0?r:1),c=Math.max(0,Number(i.amount)||0),m=i.enabled&&c>0?Math.min(999,d/c*100):null,p=m===null?"ok":m>=100?"over":m>=80?"warn":"ok",b=(v,N)=>{o!==null&&a({...o,budget:{...o.budget??l.budget,[v]:N}})},g=i.period==="custom"?i.customStart+" → "+(i.customEnd??n("periodDay")):null,h=i.enabled&&m!==null?n("budgetStatus",{period:n(je[i.period]??"periodMonth"),amount:ce(c,l),used:ce(d,l),pct:m.toFixed(1)})+(p==="over"?n("overLimit"):p==="warn"?n("nearLimit"):""):null;return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("budget")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:i.enabled===!0,onChange:v=>b("enabled",v.target.checked)}),e("span",null,n("enableBudget")))),i.enabled?e(E,null,e("div",{className:"cm-budget-bar"},e("div",{className:"cm-budget-fill "+(p==="ok"?"":p),style:{width:(m===null?0:Math.min(100,m))+"%"}})),e("div",{className:"cm-budget-line"+(p==="over"?" over":"")+" cm-num"},h),e("div",{className:"cm-budget-controls"},e("div",{className:"cm-field"},e("label",null,n("budgetAmountLabel")),ae({value:i.amount},v=>b("amount",v))),e("div",{className:"cm-field"},e("label",null,n("budgetPeriodLabel")),e("select",{className:"cm-input",value:i.period,onChange:v=>b("period",v.target.value)},e("option",{value:"day"},n("periodDay")),e("option",{value:"month"},n("periodMonth")),e("option",{value:"all"},n("periodAll")),e("option",{value:"custom"},n("periodCustomRange")))),i.period==="custom"?e(E,null,e("div",{className:"cm-field"},e("label",null,n("startDate")),e("input",{className:"cm-input",type:"date",value:i.customStart??"",onChange:v=>b("customStart",v.target.value===""?null:v.target.value)})),e("div",{className:"cm-field"},e("label",null,n("endDate")),e("input",{className:"cm-input",type:"date",value:i.customEnd??"",onChange:v=>b("customEnd",v.target.value===""?null:v.target.value)}))):null),g!==null?e("p",{className:"cm-hint"},n("rangeText",{range:g})):null):e("p",{className:"cm-note"},n("budgetDisabledNote")))}function vs(t){const{state:s,draft:o,setDraft:a,t:n}=t,l=s.config,i=(c,m)=>{o!==null&&a({...o,[c]:m})},r=o===null?l:{...l,...o},u=(()=>{if(r.peakEnabled!==!0)return n("peakOff");const c=Date.parse(r.peakEffectiveAt||""),m=Date.now();if(Number.isFinite(c)&&m<c)return n("peakNotEffective",{time:new Date(c).toLocaleString()});const p=r.peakWindows??[],b=at(m,p,r.peakHolidays);return b===null?n("offPeakActive"):b.holiday===!0?n("holidayAllOffPeak"):b.weekend===!0?n("weekendAllOffPeak"):b.inPeak?n("peakActive"):n("offPeakActive")})(),d=(r.peakWindows?.length??0)>0?n("peakSummary",{windows:r.peakWindows.map(c=>c.start+":00-"+c.end+":00").join(F(r.locale)==="zh"?"、":", "),time:r.peakEffectiveAt||n("unknown"),status:u}):n("noPeakWindows",{status:u});return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("peakPanelTitle")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakEnabled!==!1,onChange:c=>i("peakEnabled",c.target.checked)}),e("span",null,n("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:c=>i("peakNotice",c.target.checked)}),e("span",null,n("peakNoticeLabel")))),e("div",{className:"cm-field"},e("label",null,n("peakStyleLabel")),e("select",{className:"cm-input",value:o?.peakStyle==="classic"?"classic":"compact",onChange:c=>i("peakStyle",c.target.value)},e("option",{value:"compact"},n("peakStyleCompact")),e("option",{value:"classic"},n("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:c=>i("peakAlertEnabled",c.target.checked)}),e("span",null,n("peakAlertLabel")))),e("div",{className:"cm-field"},e("label",null,n("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:c=>{const m=Number(c.target.value);Number.isInteger(m)&&m>=1&&m<=30&&i("peakAlertAhead",m)}})),e("div",{className:"cm-field"},e("label",null,n("peakAlertTargetLabel")),e("select",{className:"cm-input",value:o?.peakAlertTarget==="peak"||o?.peakAlertTarget==="offpeak"?o.peakAlertTarget:"both",onChange:c=>i("peakAlertTarget",c.target.value)},e("option",{value:"both"},n("peakAlertTargetBoth")),e("option",{value:"peak"},n("peakAlertTargetPeak")),e("option",{value:"offpeak"},n("peakAlertTargetOffPeak"))))),e("div",{className:"cm-grid"},e("div",{className:"cm-field"},e("label",null,n("peakAlertPositionLabel")),e("select",{className:"cm-input",value:o?.peakAlertPosition==="center"?"center":"corner",onChange:c=>i("peakAlertPosition",c.target.value)},e("option",{value:"corner"},n("peakAlertPositionCorner")),e("option",{value:"center"},n("peakAlertPositionCenter")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:o?.peakAlertWebNotify===!0,onChange:c=>{i("peakAlertWebNotify",c.target.checked),c.target.checked&&window.Notification&&Notification.permission==="default"&&Promise.resolve(Notification.requestPermission()).catch(()=>{})}}),e("span",null,n("peakAlertWebNotifyLabel"))),e("p",{className:"cm-hint"},n("peakAlertWebNotifyHint")))),e("div",{className:"cm-field"},e("label",null,n("peakAlertPreviewLabel")),e("div",{className:"cm-row"},e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("peak")},n("peakAlertPreviewPeak")),e("button",{className:"cm-btn",onClick:()=>window.cmPeakAlertPreview?.("offpeak")},n("peakAlertPreviewOffPeak")))),e("div",{className:"cm-peak-preview"},o?.peakEnabled!==!1&&o?.peakNotice!==!1?ot(s,r,n):e("p",{className:"cm-hint"},n("peakNoticeHiddenHint"))),e("p",{className:"cm-hint"},d),e("div",{className:"cm-field"},e("label",null,n("peakHolidaysLabel")),e("input",{className:"cm-input",defaultValue:(r.peakHolidays??[]).join(", "),onBlur:c=>i("peakHolidays",c.target.value.split(/[,,\s]+/).filter(Boolean))})),e("p",{className:"cm-hint"},n("weekendRuleNote")))}function ae(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:a=>{const n=a.target.value;if(n===""){if(t.emptyMode==="clear"){s(null);return}if(t.emptyMode==="ignore")return;s(0);return}const l=Number(n);Number.isFinite(l)&&l>=0&&s(l)}})}function jt(t){const{modelId:s,entry:o,isDefault:a,draft:n,setDraft:l,t:i}=t,r=Ze(o),u=p=>{const b={...Ze(p)};if(Array.isArray(p.rateHistory)){const g=p.rateHistory.filter(h=>Date.parse(h.before)<=Date.now());g.length>0?b.rateHistory=g:delete b.rateHistory}return b},d=(p,b,g)=>{if(g===null){if(a){const T=u(n.prices.default??{cacheHit:0,cacheMiss:0,output:0}),A={...T[p]??{}};delete A[b];const L={...T};Object.keys(A).length>0?L[p]=A:delete L[p],l({...n,prices:{...n.prices,default:L}});return}const x={...n.prices.models},f=u(x[s]??{cacheHit:0,cacheMiss:0,output:0}),S={...f[p]??{}};delete S[b];const y={...f};Object.keys(S).length>0?y[p]=S:delete y[p],x[s]=y,l({...n,prices:{...n.prices,models:x}});return}const h=Math.max(0,g);if(a){let f={...u(n.prices.default??{cacheHit:0,cacheMiss:0,output:0})};if(p==="base")f[b]=h;else{const S={...f[p]??{},[b]:h};f={...f,[p]:S}}l({...n,prices:{...n.prices,default:f}});return}const v={...n.prices.models},N=u(v[s]??{cacheHit:0,cacheMiss:0,output:0});let C={...N};if(p==="base")C[b]=h;else{const x={...N[p]??{},[b]:h};C={...N,[p]:x}}v[s]=C,l({...n,prices:{...n.prices,models:v}})},c=()=>{const p={...n.prices.models};delete p[s],l({...n,prices:{...n.prices,models:p}})},m=(p,b)=>{const g=b==="base"?r:r[b]??null,h=b==="base"?"ignore":"clear";return e("div",{className:"cm-price-row",key:b},e("span",null,p),ae({value:g?.cacheHit??null,emptyMode:h},v=>d(b,"cacheHit",v)),ae({value:g?.cacheMiss??null,emptyMode:h},v=>d(b,"cacheMiss",v)),ae({value:g?.output??null,emptyMode:h},v=>d(b,"output",v)))};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},s),e(E,null,r?.legacy===!0?e("span",{className:"cm-price-legacy"},i("legacyModel")):null,a?e("span",{className:"cm-price-legacy"},i("defaultFallback")):null,a?null:e("button",{className:"cm-btn small danger",onClick:c},i("remove")))),e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,i("flatCached")),e("span",null,i("flatInput")),e("span",null,i("flatOutput"))),m(i("tierBase"),"base"),m(i("tierOffPeak"),"offPeak"),m(i("tierPeak"),"peak"),Array.isArray(o?.rateHistory)&&o.rateHistory.length>0?e("p",{className:"cm-note"},i("datedPriceNote")):null)}const Da={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 Ns(t,s,o="USD"){if(t=Ze(t),t===null||typeof t!="object")return"";if(t.unpriced===!0)return s("catalogUnpriced");o==="CNY"&&t.cny&&(t=t.cny);const a=l=>(o==="CNY"?"¥":"$")+String(l),n=t.peak!==null&&typeof t.peak=="object"?t.peak:null;return n!==null?a(t.cacheMiss)+"/"+a(n.cacheMiss)+" in · "+a(t.output)+"/"+a(n.output)+" out":a(t.cacheMiss??t.input??0)+" in · "+a(t.output??0)+" out"}function Ss(t){const{state:s,draft:o,setDraft:a,t:n}=t,[l,i]=R(!1),[r,u]=R({}),d=s.priceCatalog;if(d===null||typeof d!="object")return null;const c=o?.prices??s.config.prices,m=o?.priceTableDisplay??s.config.priceTableDisplay??{},p=(y,T)=>{const A=m[y+":"+T];return typeof A=="boolean"?A:y==="deepseek"},b=(y,T,A)=>{o!==null&&a({...o,priceTableDisplay:{...m,[y+":"+T]:A}})},g=(y,T)=>y==="deepseek"?c.models?.[T]!==void 0:c.providers?.[y]?.models?.[T]!==void 0,h=(y,T,A)=>{if(o===null)return;const L=JSON.parse(JSON.stringify(A));if(y==="deepseek"){a({...o,prices:{...o.prices,models:{...o.prices.models,[T]:L}}});return}const M={...o.prices.providers??{}},I=M[y]??{};M[y]={...I,models:{...I.models??{},[T]:L}},a({...o,prices:{...o.prices,providers:M}})},v=(y,T)=>{if(o===null)return;if(y==="deepseek"){const M={...o.prices.models};delete M[T],a({...o,prices:{...o.prices,models:M}});return}const A={...o.prices.providers??{}},L=A[y];if(L!==void 0&&L.models!==void 0){const M={...L.models};delete M[T],A[y]={...L,models:M},a({...o,prices:{...o.prices,providers:A}})}},N=Object.keys(d).sort((y,T)=>y==="deepseek"?-1:T==="deepseek"?1:y.localeCompare(T)),C=y=>Object.values(d[y]).reduce((T,A)=>T+Object.keys(A).length,0),x=new Set(Object.values(d.deepseek??{}).flatMap(y=>Object.keys(y))),f=Object.keys(c.models??{}).filter(y=>!x.has(y)).sort(),S=(y,T,A)=>{const L=g(y,T),M=p(y,T),I=L?e("label",{className:"cm-check cm-vendor-display",title:n("catalogDisplayHint")},e("input",{type:"checkbox",checked:M,onChange:k=>b(y,T,k.target.checked)}),e("span",null,n("catalogDisplayLabel"))):null;if(L&&!M&&o!==null){const k=y==="deepseek"?e(jt,{key:T,modelId:T,entry:c.models[T],isDefault:!1,draft:o,setDraft:a,t:n}):e(Ea,{key:T,provider:y,modelId:T,entry:c.providers?.[y]?.models?.[T],draft:o,setDraft:a,t:n});return e("div",{key:T,className:"cm-catalog-mounted"},I,k)}return e("div",{key:T,className:"cm-catalog-row"},e("span",{className:"cm-catalog-id"},T),e("span",{className:"cm-catalog-price"},Ns(A,n,y==="deepseek"||A?.cny?c.currency:"USD")),L?e("span",{className:"cm-catalog-tag"},n("mountedTag")):null,I,e("button",{className:"cm-btn small",disabled:!L&&A?.unpriced===!0,onClick:()=>L?v(y,T):h(y,T,A)},n(L?"unmountBtn":"mountBtn")))};return e("div",{className:"cm-budget",style:{marginTop:"8px"}},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},n("catalogTitle")),e("button",{className:"cm-toggle-btn",onClick:()=>i(y=>!y)},n(l?"catalogCollapse":"catalogOpen"))),l?e(E,null,e("p",{className:"cm-note"},n("catalogNote")),N.map(y=>{const T=r[y]===!0;return e("div",{key:y},e("div",{className:"cm-catalog-vendor cm-vendor-toggle",onClick:()=>u(A=>({...A,[y]:!T}))},e("span",null,(T?"▾ ":"▸ ")+(Da[y]??y)+" · "+C(y))),T?e(E,null,y==="deepseek"?e("p",{className:"cm-hint"},n("catalogDeepseekNote")):null,Object.keys(d[y]).sort().map(A=>e("div",{key:A},e("div",{className:"cm-catalog-family"},A),Object.keys(d[y][A]).sort().map(L=>S(y,L,d[y][A][L])))),y==="deepseek"&&f.length>0?e("div",null,e("div",{className:"cm-catalog-family"},n("catalogCustomModels")),f.map(A=>S("deepseek",A,null))):null):null)})):null)}const Ba=t=>t==="zen"?"go":t,It=t=>{const s=t.indexOf(":");return s<=0?t:Ba(t.slice(0,s).toLowerCase())+t.slice(s)};function Ra(t,s,o,a){const n=["input","output","cacheRead","cacheWrite","reasoning","cost","calls"],l=d=>Number.isFinite(Number(d))&&Number(d)>0?Number(d):0,i=(d,c,m)=>{if(!m||typeof m!="object")return;const p=d[c]??(d[c]=Object.fromEntries([...n,"apiCost"].map(g=>[g,0])));for(const g of n)p[g]+=l(m[g]);const b=c.indexOf(":");p.apiCost+=l(m.apiCost??(He(b>0?c.slice(0,b):"deepseek",b>0?c.slice(b+1):c,s)==="plan"?0:m.cost))},r=d=>{if(!d||typeof d!="object")return{};if(d.byProviderModel&&Object.keys(d.byProviderModel).length)return d.byProviderModel;if(d.byModel&&Object.keys(d.byModel).length)return Object.fromEntries(Object.entries(d.byModel).map(([m,p])=>[m.includes(":")?m:"deepseek:"+m,p]));const c={};for(const m of Array.isArray(d.sessions)?d.sessions:[])if(!(!m||typeof m!="object"))if(m.byProviderModel&&Object.keys(m.byProviderModel).length)for(const[p,b]of Object.entries(m.byProviderModel))i(c,p,b);else i(c,(m.provider||"deepseek")+":"+(m.model||"unknown"),m);return Object.keys(c).length?c:n.some(m=>l(d[m])>0)?{"deepseek:legacy":d}:{}};return(d=>{const c={},m=p=>{for(const[b,g]of Object.entries(p??{}))i(c,b,g)};if(d==="today")m(r(t.today));else{const p=Date.parse((t.meta?.dayKey||new Date().toISOString().slice(0,10))+"T00:00:00Z");for(const b of t.history??[]){const g=Date.parse(b.date+"T00:00:00Z");g<=p&&g>=p-76896e5&&m(r(b))}}return Object.entries(c).map(([p,b])=>{const g=p.indexOf(":"),h=(g>0?p.slice(0,g):"deepseek").toLowerCase(),v=g>0?p.slice(g+1):p,N=b.input+b.output+b.cacheRead+b.cacheWrite+b.reasoning,C=b.cacheRead+b.input;return{label:p==="deepseek:legacy"?o("modelStatsLegacy"):h==="deepseek"||h===""?v:Ba(h)+":"+v,key:p,...b,tokens:N,cls:He(h,v,s),hitRate:C>0?b.cacheRead/C:null,cacheUnreported:bn(b),blended:N>0&&b.cost>0?b.cost/N*1e6:null,perUsd:b.cost>0?N/b.cost:null}}).filter(p=>p.tokens>0||p.cost>0)})(a).sort((d,c)=>c.cost-d.cost||c.tokens-d.tokens)}function Cs(t){const{state:s,config:o,t:a,initialTab:n,draft:l,setDraft:i}=t,[r,u]=R(n==="history"?"history":"today"),[d,c]=R(!1),m=Ra(s,o,a,r),p=f=>(Math.max(0,Math.min(1,f))*100).toFixed(1)+"%",b=m.reduce((f,S)=>Math.max(f,S.cost),0),g=m.reduce((f,S)=>Math.max(f,S.tokens),0),h=m.reduce((f,S)=>Math.max(f,S.perUsd??0),0),v=(f,S)=>e("button",{className:"cm-mstats-tab"+(r===f?" active":""),onClick:()=>u(f)},S),N=f=>f.cls==="plan"?e("span",{className:"cm-plan-tag",title:a("billingClassLabel")},a("billingClassPlan")):null,C=f=>e("select",{className:"cm-input",title:a("billingClassLabel"),value:o.planBilling?.models?.[f.key]??"auto",disabled:l===null,onChange:S=>{const y={...l.planBilling?.models??{}};S.target.value==="auto"?delete y[f.key]:y[f.key]=S.target.value,i({...l,planBilling:{...l.planBilling,models:y}})}},e("option",{value:"auto"},a("billingClassAuto")),e("option",{value:"plan"},a("billingClassPlan")),e("option",{value:"api"},a("billingClassApi"))),x=(f,S,y,T,A)=>e("div",{className:"cm-mstats-row"},e("span",{className:"cm-mstats-name",title:f},f,A??null),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar "+y,style:{width:p(S)}})),e("span",{className:"cm-mstats-val"},T));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Le(d,()=>c(!d),a("modelStatsTitle"))),d?e("div",{className:"cm-collapse-body"},e("div",{className:"cm-mstats-tabs"},v("today",a("modelStatsToday")),v("history",a("modelStatsHistory"))),m.length===0?e("p",{className:"cm-note"},a("modelStatsEmpty")):e(E,null,e("div",{className:"cm-mstats-h"},a("modelStatsCostH")),m.map(f=>e(E,{key:"c:"+f.label},x(f.label,b>0?f.cost/b:0,"cost",Y(f.cost,o),e(E,null,N(f),C(f),f.cacheUnreported?e("span",{className:"cm-plan-tag",title:a("modelStatsHitUnreportedTip")},"⚠"):null)))),e("div",{className:"cm-mstats-h"},a("modelStatsTokensH")),e("div",{className:"cm-mstats-legend"},e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"var(--dsw-alias-state-business-primary)"}}),a("modelStatsInput")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#ff9800"}}),a("modelStatsCache")),e("span",null,e("span",{className:"cm-mstats-dot",style:{background:"#34a853"}}),a("modelStatsOutput"))),[...m].sort((f,S)=>S.tokens-f.tokens).map(f=>e("div",{className:"cm-mstats-row",key:"t:"+f.label},e("span",{className:"cm-mstats-name",title:f.label},f.label),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-seg in",style:{width:p(g>0?f.input/g:0)}}),e("div",{className:"cm-mstats-seg cache",style:{width:p(g>0?(f.cacheRead+f.cacheWrite)/g:0)}}),e("div",{className:"cm-mstats-seg out",style:{width:p(g>0?(f.output+f.reasoning)/g:0)}})),e("span",{className:"cm-mstats-val"},j(f.tokens)))),e("div",{className:"cm-mstats-h"},a("modelStatsHitH")),[...m].sort((f,S)=>(S.hitRate??-1)-(f.hitRate??-1)).map(f=>e(E,{key:"h:"+f.label},x(f.label,f.hitRate??0,"hit",f.cacheUnreported?a("modelStatsHitUnreported"):f.hitRate===null?"—":(f.hitRate*100).toFixed(1)+"%",f.cacheUnreported?e("span",{className:"cm-plan-tag",title:a("modelStatsHitUnreportedTip")},"⚠"):null))),e("div",{className:"cm-mstats-h"},a("modelStatsValueH")),[...m].sort((f,S)=>(S.perUsd??-1)-(f.perUsd??-1)).map(f=>e(E,{key:"v:"+f.label},x(f.label,h>0?(f.perUsd??0)/h:0,"value",f.perUsd===null?"—":j(f.perUsd)+" tok/$"+(f.blended!==null?" · "+a("modelStatsBlended",{price:"$"+f.blended.toFixed(2)}):"")))),e("p",{className:"cm-mstats-note"},a("modelStatsNote")))):null)}function As(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 Ms(t,s){if(t==="go")return"OpenCode Go";const o=Ee.find(a=>a.id===t);return o!==void 0?s(o.labelKey):t}const La=["fiveHour","weekly","monthly","daily"];function Ps(t,s){const o=new Map,a=n=>{const l=new Date(n),i=r=>String(r).padStart(2,"0");if(s==="monthly")return l.getFullYear()+"-"+i(l.getMonth()+1);if(s==="weekly"){const r=new Date(l.getFullYear(),l.getMonth(),l.getDate()-(l.getDay()+6)%7);return r.getFullYear()+"-"+i(r.getMonth()+1)+"-"+i(r.getDate())}return l.getFullYear()+"-"+i(l.getMonth()+1)+"-"+i(l.getDate())};for(const n of Object.values(t??{}))for(const l of n??[]){if(l===null||typeof l!="object"||!(l.tokens>0)&&!(l.cost>0))continue;const i=a(Number(l.t1)||Number(l.t0)),r=o.get(i)??{key:i,tokens:0,cost:0,pct:0,intervals:0};r.tokens+=Number(l.tokens)||0,r.cost+=Number(l.cost)||0,r.pct+=Number(l.pct)||0,r.intervals+=1,o.set(i,r)}return[...o.values()].map(n=>({...n,per1Tokens:n.pct>0?n.tokens/n.pct:null,fullTokens:n.pct>0?n.tokens/n.pct*100:null})).sort((n,l)=>n.key<l.key?-1:n.key>l.key?1:0)}function Ts(t){const{state:s,config:o,t:a}=t,[n,l]=R(!1),[i,r]=R("daily"),u=F(o?.locale),d=s?.planStats,c=d!=null&&typeof d.providers=="object"?d.providers:{},m=Object.keys(c).sort(),p=y=>Y(Number(y)||0,o??s?.config),b=y=>y.method==="none"||y.per1Tokens===null?"—":j(y.per1Tokens)+" tok · "+p(y.per1Cost),g=y=>y.method==="none"||y.fullTokens===null?"—":j(y.fullTokens)+" tok · "+p(y.fullCost),h=y=>y.method==="sample"?a("planStatsMethodSample"):y.method==="live"?a("planStatsMethodLive"):a("planStatsMethodNone"),v=y=>{let T=h(y);return y.method==="sample"&&Number(y.sampleAt)>0&&(T=a("planStatsMethodSampleAt",{method:T,time:new Date(Number(y.sampleAt)).toLocaleString(u==="en"?"en-US":"zh-CN")})),(y.method==="sample"||y.method==="live")&&y.confidence==="low"&&(T+=" · "+a("planStatsConfidenceLow")),T},N=([y,T,A])=>e("tr",{key:T+":"+y},e("td",null,As(y,u)),e("td",{className:"num"},Math.round(A.percent*10)/10+"%"),e("td",{className:"num"},j(A.localTokens)+" tok · "+p(A.localCost)),e("td",{className:"num"},b(A)),e("td",{className:"num"},g(A)),e("td",{className:"num cm-plan-reset"},A.resetsAt.length>0?a("planStatsResets",{time:new Date(A.resetsAt).toLocaleString(u==="en"?"en-US":"zh-CN")}):"—"),e("td",{className:"cm-plan-method"},v(A))),C=n?m.flatMap(y=>Object.entries(c[y]?.intervals??{})).map(([y,T])=>({winKey:y,list:T})):[],x=Ps(Object.fromEntries(C.map(y=>[y.winKey,y.list])),i),f=x.reduce((y,T)=>Math.max(y,T.fullTokens??0),0),S=(y,T)=>e("button",{key:y,className:"cm-mstats-tab"+(i===y?" active":""),onClick:()=>r(y)},T);return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},Le(n,()=>l(!n),a("planStatsTitle"))),n?e("div",{className:"cm-collapse-body"},m.length===0?e("p",{className:"cm-empty"},a("planStatsEmpty")):e(E,null,m.map(y=>{const T=c[y]?.windows??{},A=[...La.filter(L=>T[L]!==void 0).map(L=>[L,y,T[L]]),...Object.keys(T).filter(L=>!La.includes(L)).map(L=>[L,y,T[L]])];return e("div",{key:y,className:"cm-plan-provider"},e("div",{className:"cm-plan-provider-name"},Ms(y,a),e("span",{className:"cm-plan-updated"},(()=>{const L=Number(c[y]?.generatedAt)||Number(d?.generatedAt)||0;return L>0?new Date(L).toLocaleTimeString(u==="en"?"en-US":"zh-CN"):""})())),e("table",{className:"cm-table"},e("thead",null,e("tr",null,e("th",null,a("planStatsWindow")),e("th",{className:"num"},a("planStatsPercent")),e("th",null,a("planStatsLocal")),e("th",null,a("planStatsPer1")),e("th",null,a("planStatsFull")),e("th",null,""),e("th",null,""))),e("tbody",null,A.map(N))))}),e("div",{className:"cm-mstats-h",style:{marginTop:"10px"}},a("planStatsCurveTitle")),e("div",{className:"cm-mstats-tabs"},S("daily",a("planStatsDaily")),S("weekly",a("planStatsWeekly")),S("monthly",a("planStatsMonthly"))),x.length===0?e("p",{className:"cm-note"},a("planStatsCurveEmpty")):e(E,null,[...x].reverse().map(y=>e("div",{className:"cm-mstats-row",key:y.key},e("span",{className:"cm-mstats-name"},y.key),e("div",{className:"cm-mstats-barbg"},e("div",{className:"cm-mstats-bar value",style:{width:(f>0?(y.fullTokens??0)/f*100:0).toFixed(1)+"%"}})),e(Z,{label:a("planStatsBarTip",{date:y.key,full:y.fullTokens===null?"—":j(y.fullTokens),per1:y.per1Tokens===null?"—":j(y.per1Tokens),tokens:j(y.tokens),cost:p(y.cost),intervals:y.intervals}),side:"top",delayMs:200},e("span",{className:"cm-mstats-val"},y.fullTokens===null?"—":j(y.fullTokens)))))),e("p",{className:"cm-note"},a("planStatsNote")))):null)}function Ea(t){const{provider:s,modelId:o,entry:a,draft:n,setDraft:l,t:i}=t,r=m=>{const p={...n.prices.providers??{}},b=p[s]??{};p[s]={...b,models:m},l({...n,prices:{...n.prices,providers:p}})},u=(m,p)=>{if(n===null)return;const b={...(n.prices.providers??{})[s]?.models??{}};b[o]={...b[o]??{},[m]:Math.max(0,p)},r(b)},d=(m,p)=>{if(n===null)return;const b={...(n.prices.providers??{})[s]?.models??{}},g=b[o]??{};b[o]={...g,cny:{...g.cny,[m]:Math.max(0,p)}},r(b)},c=()=>{if(n===null)return;const m={...(n.prices.providers??{})[s]?.models??{}};delete m[o],r(m)};return e("div",{className:"cm-price-card"},e("div",{className:"cm-price-head"},e("span",{className:"cm-price-name"},o),e(E,null,a?.unpriced===!0?e("span",{className:"cm-price-legacy"},i("catalogUnpriced")):null,e("button",{className:"cm-btn small danger",onClick:c},i("unmountBtn")))),a?.unpriced===!0?null:e(E,null,e("div",{className:"cm-price-row"},e("span",null,""),e("span",null,i("flatInput")),e("span",null,i("flatCached")),e("span",null,i("flatOutput"))),e("div",{className:"cm-price-row"},e("span",null,"USD"),ae({value:a?.input??null,emptyMode:"ignore"},m=>u("input",m)),ae({value:a?.cachedInput??null,emptyMode:"ignore"},m=>u("cachedInput",m)),ae({value:a?.output??null,emptyMode:"ignore"},m=>u("output",m))),a?.cny?e("div",{className:"cm-price-row"},e("span",null,"CNY"),ae({value:a.cny.cacheMiss,emptyMode:"ignore"},m=>d("cacheMiss",m)),ae({value:a.cny.cacheHit,emptyMode:"ignore"},m=>d("cacheHit",m)),ae({value:a.cny.output,emptyMode:"ignore"},m=>d("output",m))):null))}const Ge=t=>[e("option",{key:"sidebar",value:"sidebar"},t("balanceSidebar")),e("option",{key:"settings",value:"settings"},t("balanceSettings")),e("option",{key:"both",value:"both"},t("balanceBoth")),e("option",{key:"off",value:"off"},t("off"))],Ut=t=>t!=null?e("div",{className:"cm-msg "+t.kind},t.text):null;function Os(t){const{state:s,api:o,t:a,draft:n,setDraft:l}=t,[i,r,u]=Ke(a,()=>o.refreshBalance()),d=s.balance,c=s.config,m=s.reconcile,p=(n?.balance??c.balance??{}).reconcile!==!1,b=v=>{n===null||typeof l!="function"||l({...n,balance:{...n.balance??c.balance??{},reconcile:v.target.checked}})},g=v=>Ne(v,c,d?.currency),h=d.status==="ok"?e("div",{className:"cm-bal-line"},e("span",null,a("balanceLine",{total:g(d.totalBalance),granted:g(d.grantedBalance),toppedUp:g(d.toppedUpBalance),time:d.fetchedAt>0?new Date(d.fetchedAt).toLocaleTimeString():"—"}))):d.status==="error"?e("div",{className:"cm-bal-line err"},a("balanceQueryFailedHint",{message:d.message||a("unknownError")})):e("div",{className:"cm-bal-line"},a("balanceNotQueried"));return e("div",{className:"cm-budget"},e("div",{className:"cm-budget-head"},e("h3",{className:"cm-h"},a("accountBalance")),e("button",{className:"cm-btn small",onClick:u,disabled:i},a(i?"refreshing":"refreshBalance"))),h,e("label",null,a("balanceApiKey")),e(De,{target:"balance",configured:d.keyConfigured,source:d.keySource,t:a,api:o,placeholder:"sk-…"}),e("p",{className:"cm-hint"},a("balanceKeyHint")),m!==void 0&&m.ok===!1?e("div",{className:"cm-bal-line warn"},"⚠ "+m.message):null,e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:p,onChange:b}),a("reconcileLabel")),Ut(r))}function ct(t){const{name:s,enabled:o,saved:a,busy:n,open:l,statusNode:i,configNode:r,errorMsg:u,onToggle:d,onRefresh:c,onRemove:m,onToggleOpen:p,t:b}=t,g=r!=null;return e("div",{className:"cm-budget cm-quota-card"},e("div",{className:"cm-budget-head"},e("label",{className:"cm-check"},e("input",{type:"checkbox","aria-label":b("enable")+": "+s,checked:o===!0,onChange:h=>d(h.target.checked)})),e("div",{className:"cm-quota-name"},g?Le(l===!0,p,s):e("h3",{className:"cm-h"},s)),m?e("button",{className:"cm-btn small",onClick:m},b("quotaRemove")):null,e("button",{className:"cm-btn small",onClick:c,disabled:n===!0||o!==!0||a?.enabled!==!0||a.display==="off",title:o!==!0?b("quotaEnableFirst"):a?.enabled!==!0||a.display==="off"?b("quotaRefreshReady"):b("refresh")},b(n===!0?"refreshing":"refresh"))),i,g&&l===!0?e("div",{className:"cm-collapse-body"},r):null,u!=null?e("div",{className:"cm-msg "+u.kind},u.text):null)}function Ke(t,s){const[o,a]=R(!1),[n,l]=R(null),i=Pe(!1);return[o,n,async()=>{if(!i.current){i.current=!0,a(!0),l(null);try{const u=await s();l({kind:u.ok?"ok":"err",text:u.message})}catch(u){l({kind:"err",text:t("syncFailed",{message:u?.message??String(u)})})}finally{i.current=!1,a(!1)}}}]}const Ds=t=>{const s=t.filter(a=>a.enabled===!0),o=t.filter(a=>a.enabled!==!0);return[...s,...o]},qa=(t,s,o,a,n,l=s)=>{if(typeof o?.percent!="number")return e("div",{key:l,className:"cm-go-row"+(n?" main":"")},e("span",{className:"cm-go-label"},s),e("span",{className:"cm-go-num"},typeof o?.text=="string"?o.text:"—"));const i=Math.max(0,Math.min(100,Number(o.percent)||0)),r=pe(i,a),u=typeof o.resetsAt=="string"&&o.resetsAt.length>0?t("goResetAt",{time:new Date(o.resetsAt).toLocaleString()}):"";return e("div",{key:l,className:"cm-go-row"+(n?" main":"")},e("span",{className:"cm-go-label"},s),e("div",{className:"cm-go-bar"},e("div",{className:"cm-go-fill",style:{width:r.width+"%"}})),e("span",{className:"cm-go-num"},r.label===null?"—":t("goQuotaPercent",{percent:String(Math.round(r.label))})),u?e("span",{className:"cm-go-reset"},u):null)};function Bs(t){const{state:s,api:o,t:a,entry:n,index:l,canRemove:i,onPatch:r,onRemove:u}=t,d=n.adapter==="aliyun",[c,m]=R(!1),p=()=>({headers:JSON.stringify(n.request?.headers??{},null,2),extract:JSON.stringify(n.extract??{},null,2),body:typeof n.request?.body=="string"?n.request.body:JSON.stringify(n.request?.body,null,2)??""}),[b,g]=R(p),[h,v]=R(()=>(n.allowedHosts??[]).join(", ")),[N,C]=R({}),x=Pe(!1),f=s.config,y=(Array.isArray(s.customBalances)?s.customBalances:[]).find(B=>B.index===l)??null,T=n.enabled===!0,A=()=>{m(B=>!B)};ee(()=>{c&&!x.current&&(g(p()),v((n.allowedHosts??[]).join(", ")),C({})),x.current=c},[c]);const L=(B,V)=>r({[B]:V}),M=(B,V)=>r({request:{...n.request??{},[B]:V}}),I=d?["ALIBABA_CLOUD_ACCESS_KEY_ID","ALIBABA_CLOUD_ACCESS_KEY_SECRET","ALIBABA_CLOUD_SECURITY_TOKEN"]:[...new Set(Object.values(n.request?.headers??{}).flatMap(B=>typeof B=="string"?[...B.matchAll(/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/g)].map(V=>V[1]):[]))],k=(B,V)=>{g(w=>({...w,[B]:V}));try{const w=B==="body",q=w&&!V.trim()?void 0:JSON.parse(V);if(!w&&(q===null||typeof q!="object"||Array.isArray(q)))throw new Error("invalid");if(B==="headers"&&Object.values(q).some(Q=>typeof Q!="string"))throw new Error("invalid");C(Q=>({...Q,[B]:""})),B==="extract"?L(B,q):M(B,w?q===void 0?void 0:V:q)}catch{C(w=>({...w,[B]:a("customBalanceInvalidJson")}))}},H=(B,V,w,q)=>!d&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a(V)),q&&e("span",{className:"cm-hint"},a(q)),e("textarea",{className:"cm-input",rows:w,value:b[B],onChange:Q=>k(B,Q.target.value)}),N[B]?e("span",{className:"cm-hint err"},N[B]):null),de=B=>{v(B);const V=B.split(/[\s,;]+/).map(w=>w.trim()).filter(w=>w.length>0);L("allowedHosts",V)},[we,Se,O]=Ke(a,()=>(f.customBalances??[])[l]?.enabled!==!0?Promise.resolve({ok:!1,message:a("quotaEnableFirst")}):o.refreshCustomBalance(l)),D=y!==null&&y.status==="ok"?e(E,null,f.balance?.showProgressBar===!0?e("div",{className:"cm-budget",style:{marginTop:"8px"}},e(St,{segments:Nt(s,f,y,n),direction:se(f,"balance")}),e("div",{className:"cm-bal-line"},At(y,f,a,s,n))):e("div",{className:"cm-bal-line"},a("customBalanceRemaining",{amount:Fe(y.remaining,f,y,n)}))):y!==null&&y.status==="error"?e("div",{className:"cm-bal-line err"},y.message||a("unknownError")):e("div",{className:"cm-bal-line"},y?.message||a("balanceNotQueried")),G=e(E,null,e("p",{className:"cm-note"},a(d?"aliyunBalanceNote":"customBalanceConfigNote")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n.convertToDisplayCurrency===!0,disabled:Qe(f,y,n)!=="USD",onChange:B=>L("convertToDisplayCurrency",B.target.checked)}),a("customBalanceConvert")),e("p",{className:"cm-note"},a("customBalanceConvertNote")),e("div",{className:"cm-grid"},[["label","customBalanceLabelZh"],["labelEn","customBalanceLabelEn"]].map(([B,V])=>e("div",{key:B,className:"cm-field"},e("label",null,a(V)),e("input",{className:"cm-input",value:n[B]??"",onChange:w=>L(B,w.target.value)}))),!d&&e("div",{className:"cm-field"},e("label",null,a("customBalanceUnitLabel")),e("select",{className:"cm-input",value:["CNY","EUR","CREDITS"].includes(n.unit)?n.unit:"USD",onChange:B=>L("unit",B.target.value)},e("option",{value:"USD"},"USD ($)"),e("option",{value:"CNY"},"CNY (¥)"),e("option",{value:"EUR"},"EUR (€)"),e("option",{value:"CREDITS"},"CREDITS"))),e("div",{className:"cm-field"},e("label",null,a("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:n.display??"both",onChange:B=>L("display",B.target.value)},...Ge(a))),e("div",{className:"cm-field"},e("label",null,a("customBalanceRefreshInterval")),ae({value:n.refreshMinutes??15},B=>L("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(B)))))),!d&&e("div",{className:"cm-field"},e("label",null,a("customBalanceMethod")),e("select",{className:"cm-input",value:n.request?.method??"GET",onChange:B=>M("method",B.target.value)},e("option",{value:"GET"},"GET"),e("option",{value:"POST"},"POST"))),!d&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a("customBalanceUrl")),e("input",{className:"cm-input",value:n.request?.url??"",placeholder:"https://example.com/key/info",onChange:B=>M("url",B.target.value)})),H("headers","customBalanceHeaders",5,"customBalanceHeadersVarNote"),!["GET","HEAD"].includes((n.request?.method??"GET").toUpperCase())&&H("body","customBalanceBody",5,"customBalanceBodyNote"),e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a("customBalanceCredentialsTitle")),I.length>0?e(E,null,!d&&e("span",{className:"cm-hint"},a("customBalanceCredentialsHint")),I.map(B=>e(De,{key:"cb-var-"+B,target:"customVar:"+B,configured:(s.customVarStatus?.[B]?.configured??!1)===!0,source:s.customVarStatus?.[B]?.source??"",t:a,api:o,placeholder:"{{"+B+"}}"}))):e("span",{className:"cm-hint"},a("customBalanceNoPlaceholders"))),!d&&e("div",{className:"cm-field",style:{gridColumn:"1 / -1"}},e("label",null,a("customBalanceAllowedHosts")),e("input",{className:"cm-input",value:h,placeholder:"api.example.com, relay.example.org",onChange:B=>de(B.target.value)}),e("span",{className:"cm-hint"},a("customBalanceAllowedHostsHint"))),H("extract","customBalanceExtract",8)));return e(ct,{name:`#${l+1} · `+(Ct(n,F(f?.locale))||a("customBalanceTitle")),enabled:T,saved:JSON.stringify(n)===JSON.stringify(f.customBalances?.[l])?f.customBalances[l]:null,busy:we,open:c,statusNode:D,configNode:G,errorMsg:Se,onToggle:B=>L("enabled",B),onRefresh:O,onRemove:i?u:null,onToggleOpen:A,t:a})}function ja({config:t,draft:s,setDraft:o,t:a,api:n}){const l=s?.goQuota??t.goQuota,i=(r,u)=>{s&&o({...s,goQuota:{...l,[r]:u}})};return e(E,null,[["display","goQuotaDisplayLabel"],["main","goMainLabel"]].map(([r,u])=>e("div",{key:r,className:"cm-field"},e("label",null,a(u)),e("select",{className:"cm-input",value:l[r],onChange:d=>i(r,d.target.value)},r==="display"?Ge(a):["rolling","weekly","monthly"].map((d,c)=>e("option",{key:d,value:d},a(["goWindowRolling","goWindowWeekly","goWindowMonthly"][c])))))),e("div",{className:"cm-field"},e("label",null,a("goQuotaRefreshIntervalLabel")),ae({value:l.refreshMinutes},r=>i("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(r)))))),e("label",null,a("goQuotaKeyLabel")),e(De,{target:"goQuota",configured:t.goQuota?.keyConfigured===!0,source:t.goQuota?.keySource,t:a,api:n,placeholder:"sk-…"}))}function Rs(t){const{state:s,api:o,t:a,draft:n,setDraft:l}=t,[i,r]=R(!1),u=s.goQuota,d=s.config,c=n?.goQuota?.enabled??d.goQuota?.enabled??!0,m=(f,S)=>{n!==null&&l({...n,goQuota:{...n.goQuota??d.goQuota,[f]:S}})},[p,b,g]=Ke(a,()=>o.refreshGoQuota()),h=d.goQuota?.main==="weekly"||d.goQuota?.main==="monthly"?d.goQuota.main:"rolling",v=[h,...["rolling","weekly","monthly"].filter(f=>f!==h)],N=f=>f==="rolling"?"goWindowRolling":f==="weekly"?"goWindowWeekly":"goWindowMonthly",C=f=>f==="rolling"?u.rolling:f==="weekly"?u.weekly:u.monthly,x=c===!1?e("p",{className:"cm-note"},a("goQuotaDisabledNote")):u.status==="ok"?e("div",{className:"cm-go-list"},v.map(f=>qa(a,a(N(f)),C(f),se(d,"go"),f===h)),e("div",{className:"cm-go-time"},a("goQuotaFetchedAt",{time:u.fetchedAt>0?new Date(u.fetchedAt).toLocaleTimeString():"—"}))):u.status==="error"?e("div",{className:"cm-bal-line err"},u.message||a("unknownError")):u.status==="off"&&u.message?e("p",{className:"cm-note"},u.message):e("div",{className:"cm-bal-line"},a("goQuotaNotQueried"));return e(ct,{name:a("goQuotaTitle"),enabled:c,saved:d.goQuota,busy:p,open:i,statusNode:x,errorMsg:b,configNode:e(ja,{config:d,draft:n,setDraft:l,t:a,api:o}),onToggleOpen:()=>r(f=>!f),onToggle:f=>m("enabled",f),onRefresh:g,t:a})}const Ls=(t,s)=>{if(typeof t?.keyVar=="string"&&t.keyVar.length>0)return t.keyVar;const a="CLIPROXYAPI_MANAGEMENT_KEY_"+(String(t?.id??"").toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"GATEWAY");return Object.keys(s??{}).find(n=>n===a||n.startsWith(a+"_"))??a};function Es(t){const{state:s,api:o,t:a,draft:n,setDraft:l,index:i}=t,r=s.config,d=(n??r).gatewayQuotas?.sources??[],c=d[i]??{},p=(Array.isArray(s.gatewayQuotas)?s.gatewayQuotas:[]).find(M=>M.id===c.id)??{id:c.id,status:"off",accounts:[],unsupportedProviders:[]},b=Ls(c,s.customVarStatus),[g,h]=R(!1),[v,N,C]=Ke(a,()=>o.refreshGatewayQuota(c.id)),x=M=>{n!==null&&l({...n,gatewayQuotas:{...n.gatewayQuotas??r.gatewayQuotas??{},sources:M}})},f=M=>x(d.map((I,k)=>k===i?{...I,...M}:I)),S=(M,I,k)=>e("div",{className:"cm-field"},e("label",null,M),e("input",{className:"cm-input",value:I??"",onChange:k})),y=(M,I)=>{const k=ze(M?.label||M?.id||a("gatewaySourceUnknown"),M,se(r,"plan"),a);return e(E,{key:M?.id||I},k.row,M?.resetsAt?e("div",{className:"cm-note"},_e(M,a)):null)},T=(M,I)=>e("div",{key:M.id||I,className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},M.label||"package"),e("span",{className:"cm-bbox-pct cm-num"},(M.used??"—")+" / "+(M.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(M.remaining??"—")+" remaining")),A=M=>M==null?null:e(E,null,e("div",{className:"cm-mm-row wide"},e("span",{className:"cm-bbox-label"},M.unit||"credits"),e("span",{className:"cm-bbox-pct cm-num"},(M.used??"—")+" / "+(M.limit??"—")),e("span",{className:"cm-bbox-pct cm-num"},(M.remaining??"—")+" remaining")),(M.packages??[]).map(T)),L=(M,I)=>e("div",{key:M.id||I,className:"cm-budget",style:{marginTop:"8px",padding:"10px 12px"}},e("div",{className:"cm-budget-head"},e("strong",null,(Jt[M.provider]??M.provider??a("gatewaySourceUnknown"))+" · "+(M.label||a("gatewaySourceUnknown"))),e("span",{className:"cm-hint"},M.status)),M.plan?e("div",{className:"cm-note"},M.plan):null,M.windows.length>0?e("div",{className:"cm-go-list"},M.windows.map(y)):null,A(M.credits),M.message?e("div",{className:"cm-note"},M.message):null);return e(ct,{name:c.label||c.id||a("gatewayQuotaTitle"),enabled:c.enabled===!0,saved:r.gatewayQuotas?.sources?.find(M=>M.id===c.id),busy:v,open:g,errorMsg:N,statusNode:e("div",{className:"cm-note"},a("gatewaySourceStatus")+": "+(p.status??a("gatewaySourceUnknown"))+(p.serverVersion?" · "+p.serverVersion:"")+(p.fetchedAt>0?" · "+a("gatewaySourceFetchedAt",{time:new Date(p.fetchedAt).toLocaleTimeString()}):"")+(p.message?" · "+p.message:"")),configNode:e(E,null,e("div",{className:"cm-grid"},S(a("gatewaySourceLabel"),c.label,M=>f({label:M.target.value})),S(a("gatewaySourceBaseURL"),c.baseURL,M=>f({baseURL:M.target.value})),e("div",{className:"cm-field"},e("label",null,a("gatewaySourceDisplay")),e("select",{className:"cm-input",value:c.display??"both",onChange:M=>f({display:M.target.value})},...Ge(a))),S(a("gatewaySourceAllowlist"),(c.allowedHosts??[]).join(", "),M=>f({allowedHosts:M.target.value.split(/[\s,;]+/).filter(Boolean)})),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:c.antigravityOnlyGemini===!0,onChange:M=>f({antigravityOnlyGemini:M.target.checked})}),e("span",null,a("gatewayOnlyGemini")))),b?e("div",{className:"cm-field"},e("label",null,a("gatewaySourceCredential")),e(De,{target:"customVar:"+b,configured:s.customVarStatus?.[b]?.configured===!0,source:s.customVarStatus?.[b]?.source??"",t:a,api:o,placeholder:b})):null,p.unsupportedProviders.length>0?e("div",{className:"cm-note"},a("gatewaySourceUnsupported")+": "+p.unsupportedProviders.join(", ")):null,p.accounts.length>0?p.accounts.map(L):e("div",{className:"cm-bal-line"},a("gatewaySourceNoAccounts"))),onToggle:M=>f({enabled:M}),onRefresh:C,onRemove:()=>x(d.filter((M,I)=>I!==i)),onToggleOpen:()=>h(M=>!M),t:a})}const Ee=[{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"},{id:"mimo",labelKey:"codingPlanMimo"}];function qs(t){const{state:s,api:o,t:a,draft:n,setDraft:l,planId:i,labelKey:r}=t,u=s.config,d=s.codingPlans??{},c=n?.codingPlans?.[i]??u.codingPlans?.[i]??{},m=d[i]??{status:"off",message:"",fetchedAt:0,windows:{}},p=c.enabled===!0,[b,g]=R(!1),[h,v,N]=Ke(a,()=>o.refreshCodingPlan(i)),C=(O,D)=>{if(n===null)return;const G=n.codingPlans??u.codingPlans??{};l({...n,codingPlans:{...G,[i]:{...G[i]??{},[O]:D}}})},[x,f]=R(""),[S,y]=R({}),T=O=>O?.rates!==null&&typeof O?.rates=="object"&&!Array.isArray(O.rates)?O.rates:{},A=["input","cachedInput","output"],L=O=>S[O]??T(c)[O]??{},M=O=>A.every(D=>Number.isFinite(Number(O[D]))&&Number(O[D])>0),I=(O,D,G)=>{if(n===null)return;const B={...L(O),[D]:String(G)};y(Q=>({...Q,[O]:B}));const V=A.every(Q=>String(B[Q]??"").trim()==="");if(!V&&!M(B))return;const w=n.codingPlans??u.codingPlans??{},q={...(w.qwen??{}).rates??{}};V?delete q[O]:q[O]=Object.fromEntries(A.map(Q=>[Q,Number(B[Q])])),l({...n,codingPlans:{...w,qwen:{...w.qwen??{},rates:q}}})},k=O=>{n!==null&&y(D=>({...D,[O]:D[O]??T(c)[O]??{}}))},H=O=>{if(n===null)return;y(B=>{const V={...B};return delete V[O],V});const D=n.codingPlans??u.codingPlans??{},G={...(D.qwen??{}).rates??{}};delete G[O],l({...n,codingPlans:{...D,qwen:{...D.qwen??{},rates:G}}})},de=m.windows!==null&&typeof m.windows=="object"?m.windows:{},we=p===!1?e("p",{className:"cm-note"},a("codingPlanDisabledNote")):m.status==="ok"?e("div",{className:"cm-go-list"},Object.keys(de).length>0?i==="minimax"&&(We(de).five!=null||We(de).seven!=null)?e(Sa,{five:We(de).five,seven:We(de).seven,fetchedAt:m.fetchedAt,t:a,wide:!0,direction:se(u,"plan")}):Object.entries(de).map(([O,D])=>qa(a,O.replace(/_/g," "),D,se(u,"plan"),!1,O)):e("div",{className:"cm-bal-line"},a("codingPlanNotQueried")),e("div",{className:"cm-go-time"},a("goQuotaFetchedAt",{time:m.fetchedAt>0?new Date(m.fetchedAt).toLocaleTimeString():"—"}))):m.status==="error"?e("div",{className:"cm-bal-line err"},m.message||a("unknownError")):m.status==="off"&&m.message?e("p",{className:"cm-note"},m.message):e("div",{className:"cm-bal-line"},a("codingPlanNotQueried")),Se=e(E,null,i==="minimax"?e("div",{className:"cm-field"},e("label",null,a("minimaxOrigin")),e("input",{className:"cm-input",type:"url",value:c.baseUrl??"",placeholder:"https://www.minimax.cn","aria-label":a("minimaxOrigin"),onChange:O=>C("baseUrl",O.target.value)}),e("p",{className:"cm-note"},a("minimaxOriginNote"))):null,i==="qwen"?e("div",{className:"cm-field"},e("label",null,a("qwenSource")),e("select",{className:"cm-input",value:c.quotaSource??"local",onChange:O=>C("quotaSource",O.target.value)},e("option",{value:"local"},a("qwenSourceLocal")),e("option",{value:"cli"},a("qwenSourceCli")),e("option",{value:"bailian"},a("qwenSourceBailian"))),e("p",{className:"cm-note"},a(c.quotaSource==="bailian"?"qwenBailianNote":"qwenCliNote"))):null,e("div",{className:"cm-field"},e("label",null,a("codingPlanDisplayLabel")),e("select",{className:"cm-input",value:typeof c.display=="string"?c.display:i==="minimax"?"both":"settings",onChange:O=>C("display",O.target.value)},e("option",{value:"sidebar"},a("balanceSidebar")),e("option",{value:"settings"},a("balanceSettings")),e("option",{value:"both"},a("balanceBoth")),e("option",{value:"off"},a("off"))),e("span",{className:"cm-hint"},a("codingPlanDisplayNote"))),i!=="scnet"&&(i!=="qwen"||(c.quotaSource??"local")!=="local")?e("div",{className:"cm-field"},e("label",null,a("codingPlanRefreshIntervalLabel")),ae({value:typeof c.refreshMinutes=="number"&&Number.isFinite(c.refreshMinutes)&&c.refreshMinutes>0?c.refreshMinutes:15},O=>{C("refreshMinutes",Math.min(1440,Math.max(1,Math.floor(O))))})):null,i==="scnet"||i==="qwen"&&(c.quotaSource??"local")==="local"?e(E,null,e("div",{className:"cm-field"},e("label",null,a(i==="qwen"?"qwenPlanCreditsLabel":"scnetPlanCreditsLabel")),e("input",{className:"cm-input",type:"number",min:"1",step:"1000",value:typeof c.planCredits=="number"&&Number.isFinite(c.planCredits)&&c.planCredits>0?c.planCredits:i==="qwen"?5e5:24e4,onChange:O=>{const D=Number(O.target.value);Number.isFinite(D)&&D>0&&C("planCredits",Math.floor(D))}})),e("div",{className:"cm-field"},e("label",null,a(i==="qwen"?"qwenPlanStartLabel":"scnetPlanStartLabel")),e("input",{className:"cm-input",type:"date",value:typeof c.planStart=="string"?c.planStart:"",onChange:O=>C("planStart",O.target.value)})),i==="qwen"?e(E,null,e("div",{className:"cm-field"},e("label",null,a("qwenRatesLabel"))),[...new Set([...Object.keys(T(c)),...Object.keys(S)])].sort().map(O=>e("div",{key:O,className:"cm-match-row"},e("span",{style:{minWidth:"120px"}},O),A.map(D=>e("input",{key:D,className:"cm-input narrow",type:"number",min:"0",step:"0.1",value:L(O)[D]??"",placeholder:a("qwenRate_"+D),"aria-label":O+" · "+a("qwenRate_"+D),onChange:G=>{const B=G.target.value;I(O,D,B)}})),e("button",{className:"cm-btn small",onClick:()=>H(O)},a("overrideRemove")),O in S&&!M(L(O))?e("span",{className:"cm-note"},a("qwenRateDraftNote")):null)),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:a("qwenRatesModelPlaceholder"),value:x,onChange:O=>f(O.target.value)}),e("button",{className:"cm-btn small",onClick:()=>{const O=x.trim();O.length!==0&&(k(O),f(""))},disabled:x.trim().length===0},a("qwenRatesAdd")))):null,e("p",{className:"cm-note"},a(i==="qwen"?"qwenLocalNote":"scnetLocalNote"))):i==="qwen"?null:i==="volcengine"?e(E,null,e("div",{className:"cm-field"},e("label",null,a("volcengineAccessKeyIdLabel"))),e(De,{target:"codingPlans.volcengine.ak",configured:m.keyConfigured===!0,source:m.keySource,t:a,api:o,placeholder:a("volcengineAccessKeyPlaceholder")}),e("div",{className:"cm-field"},e("label",null,a("volcengineSecretAccessKeyLabel"))),e(De,{target:"codingPlans.volcengine.sk",configured:m.keyConfigured===!0,source:m.keySource,t:a,api:o,placeholder:a("volcengineSecretPlaceholder")}),e("p",{className:"cm-note"},a("volcengineNote"))):e(E,null,e("div",{className:"cm-field"},e("label",null,i==="mimo"?"Cookie (platform.xiaomimimo.com)":a("codingPlanKeyLabel"))),e(De,{target:"codingPlans."+i,configured:m.keyConfigured===!0,source:m.keySource,t:a,api:o,placeholder:i==="mimo"?"api-platform_serviceToken=…; userId=…":"sk-…"})));return e(ct,{name:a(r),enabled:p,saved:u.codingPlans?.[i],busy:h,open:b,errorMsg:v,statusNode:we,configNode:Se,onToggle:O=>C("enabled",O),onRefresh:N,onToggleOpen:()=>g(O=>!O),t:a})}function js(t){const{state:s,api:o,t:a,draft:n,setDraft:l}=t,i=s.config,r=n??i,u=r.codingPlans??{},d=r.gatewayQuotas?.sources??[],c=n?.customBalances??i.customBalances??[],m=x=>{n!==null&&l({...n,customBalances:x,...x.length===0?{customBalance:{...i.customBalance??{},enabled:!1,request:{url:"",headers:{}}}}:{}})},p=Pe({next:0,keys:[]}).current;for(;p.keys.length<c.length;)p.keys.push(p.next++);p.keys.length=c.length;const b=x=>{p.keys.splice(x,1),m(c.filter((f,S)=>S!==x))},g=(x,f)=>m(c.map((S,y)=>y===x?{...S,...f}:S)),h=(x="custom")=>{c.length>=8||m([...c,{...x==="aliyun"?{adapter:x}:{},enabled:!1,label:x==="aliyun"?"千问 / 阿里云":"",labelEn:x==="aliyun"?"Qianwen / Alibaba Cloud":"",display:"both",unit:x==="aliyun"?"CNY":"USD",refreshMinutes:15,request:{url:x==="aliyun"?"https://business.aliyuncs.com/":"",method:x==="aliyun"?"POST":"GET",headers:{}},extract:{},allowedHosts:[]}])},v=()=>{d.length>=4||n===null||l({...n,gatewayQuotas:{...n.gatewayQuotas??i.gatewayQuotas??{},sources:[...d,{id:"gateway-"+Date.now().toString(36),type:"cliproxyapi",label:"CLIProxyAPI",baseURL:"http://127.0.0.1:8317",enabled:!1,display:"both",refreshMinutes:15,includeProviders:gt,allowedHosts:[],allowInsecureHttp:!1}]}})},N=[...d.map((x,f)=>({kind:"gateway",key:"gw-"+(x.id??f),index:f,enabled:x.enabled===!0})),{kind:"go",key:"go",enabled:r.goQuota?.enabled!==!1},...Ee.map(x=>({kind:"plan",key:"plan-"+x.id,planId:x.id,labelKey:x.labelKey,enabled:u[x.id]?.enabled===!0})),...c.map((x,f)=>({kind:"custom",key:"cb-"+p.keys[f],index:f,enabled:x.enabled===!0}))],C=x=>x.kind==="plan"?e(qs,{key:x.key,planId:x.planId,labelKey:x.labelKey,state:s,api:o,t:a,draft:n,setDraft:l}):x.kind==="go"?e(Rs,{key:x.key,state:s,api:o,t:a,draft:n,setDraft:l}):x.kind==="gateway"?e(Es,{key:x.key,index:x.index,state:s,api:o,t:a,draft:n,setDraft:l}):e(Bs,{key:x.key,state:s,api:o,t:a,entry:c[x.index],index:x.index,canRemove:!0,onPatch:f=>g(x.index,f),onRemove:()=>b(x.index)});return e("div",null,e("p",{className:"cm-note"},a("quotaSectionNote")),e("div",{className:"cm-quota-list"},Ds(N).map(C)),e("div",{className:"cm-buttons"},e("button",{className:"cm-btn small",onClick:v,disabled:d.length>=4},a("gatewaySourceAdd")),e("button",{className:"cm-btn small",onClick:()=>h(),disabled:c.length>=8},a("customBalanceAdd")),e("button",{className:"cm-btn small",onClick:()=>h("aliyun"),disabled:c.length>=8},a("aliyunBalanceAdd"))))}const Is=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Ia=t=>(t.input??0)+(t.output??0)+(t.cacheRead??0)+(t.cacheWrite??0);function Ht(t){const s=t.useCost?t.useCost(f=>f):void 0,o=t.state??s?.state;if(!o)return null;const a=o.config,n=F(a?.locale),l=t.t??K(n),i=Array.isArray(o.history)?o.history:[];if(i.length===0)return e("div",null,e("h3",{className:"cm-h"},l("usageTitle")),e("p",{className:"cm-empty"},l("usageEmpty")));const r=o.meta?.dayKey??"",u=new Map(i.map(f=>[f.date,f])),d=f=>{const S=y=>String(y).padStart(2,"0");return f.getFullYear()+"-"+S(f.getMonth()+1)+"-"+S(f.getDate())},c=new Date;c.setHours(0,0,0,0);const m=new Date(c);m.setDate(m.getDate()+(6-(c.getDay()+6)%7));const p=26,b=[],g=[];let h=-1;for(let f=p-1;f>=0;f-=1){for(let y=0;y<7;y+=1){const T=new Date(m);T.setDate(T.getDate()-(f*7+(6-y)));const A=u.get(d(T));b.push(A!==void 0?{day:A,tokens:Ia(A)}:{day:{date:d(T)},tokens:0})}const S=new Date(m);S.setDate(S.getDate()-(f*7+6)),g.push(S.getMonth()!==h?n==="en"?Is[S.getMonth()]:String(S.getMonth()+1)+"月":""),h=S.getMonth()}const v=Math.max(...b.map(f=>f.tokens),1),N=f=>{const S=f/v;return S<.25?1:S<.5?2:S<.75?3:4},C=f=>{const{day:S,tokens:y}=f,T="cm-ug-cell"+(y>0?" l"+N(y):"")+(S.date===r?" today":""),A=l("usageDay",{date:S.date,tokens:j(y),input:j(S.input??0),cache:j((S.cacheRead??0)+(S.cacheWrite??0)),output:j(S.output??0),calls:S.calls??0,cost:Y(z(S,a),a)});return e(Z,{key:S.date,label:A,side:"top",delayMs:200},e("div",{className:T}))},x=o.total;return e("div",{className:"cm-ug"},e("h3",{className:"cm-h"},l("usageTitle")),e("div",{className:"cm-ug-total"},l("usageTotal",{tokens:j(Ia(x)),input:j(x.input??0),cache:j((x.cacheRead??0)+(x.cacheWrite??0)),output:j(x.output??0),calls:x.calls??0})),e("div",{className:"cm-ug-grid",style:{gridTemplateColumns:"repeat("+p+",1fr)"}},b.map(C)),e("div",{className:"cm-ug-months",style:{gridTemplateColumns:"repeat("+p+",1fr)"}},g.map((f,S)=>e("span",{key:"m"+String(S),className:"cm-ug-monthc"},f))))}function Us(t){const s=t.useCost?t.useCost(w=>w):void 0,o=t.api,a=s?.state??null,[n,l]=R(null),[i,r]=R(null),[u,d]=R(!1),[c,m]=R(!1),[p,b]=R(!1),[g,h]=R(""),[v,N]=R(!1),[C,x]=R(!1),[f,S]=R("overview"),[y,T]=R({status:"idle",at:0,error:null}),A=Be.useRef(null),L=Be.useRef(null),M=Be.useRef(null);ee(()=>{if(a!==null){const w=JSON.stringify(a.config);l(q=>{const Q=q!==null&&JSON.stringify(q)!==A.current;return Q||(L.current=a.config,M.current=a.config),Q?q:JSON.parse(w)}),A.current=w}},[a]),ee(()=>{n!==null&&M.current===null&&L.current!==null&&(M.current=L.current)},[n]),ee(()=>{if(n===null||o===void 0)return;const w=JSON.stringify(n);if(w===A.current)return;T(Q=>Q.status==="saving"?Q:{...Q,status:"saving"});const q=setTimeout(()=>{const Q={},ue=M.current??L.current;if(ue!==null&&typeof ue=="object")for(const J of Object.keys(n))JSON.stringify(n[J])!==JSON.stringify(ue[J])&&(Q[J]=n[J]);if(Object.keys(Q).length===0){A.current=w,T({status:"saved",at:Date.now(),error:null});return}o.updateConfig(Q).then(()=>{A.current=w,ue!==null&&typeof ue=="object"&&(M.current={...ue,...Q}),T({status:"saved",at:Date.now(),error:null})},J=>{T({status:"error",at:0,error:J?.message??String(J)})})},600);return()=>{clearTimeout(q)}},[n,o]),ee(()=>{a!==null&&s?.status==="error"&&s.error&&r({kind:"err",text:k("ledgerReadFailed",{message:s.error})})},[s?.status,s?.error]);const I=F((n??a?.config)?.locale),k=K(I);if(s===void 0||a===null)return e("div",{className:"cm-section"},e("p",{className:"cm-empty"},s?.status==="loading"?k("readingLedger"):k("ledgerUnavailable")),s?.error&&e("p",{className:"cm-err",role:"alert"},k("ledgerReadFailed",{message:s.error})),e("button",{className:"cm-btn",disabled:s?.status==="loading"||!o?.reload,onClick:o?.reload},k("refresh")));const H=a.config,de=async()=>{if(!v){N(!0),r(null);try{const w=await o.fetchPrices();if(r({kind:w.ok?"ok":"err",text:w.message}),w.ok&&w.state&&typeof w.state.config=="object"){const q=JSON.stringify(w.state.config);l(JSON.parse(q)),A.current=q}}catch(w){r({kind:"err",text:k("syncFailed",{message:w?.message??String(w)})})}finally{N(!1),d(!1)}}},we=async()=>{if(!v){N(!0);try{await o.resetHistory(),r({kind:"ok",text:k("historyCleared")})}catch(w){r({kind:"err",text:k("clearFailed",{message:w?.message??String(w)})})}finally{N(!1),m(!1)}}},Se=async()=>{if(!v){N(!0),r(null);try{const w=await o.importLegacyHistory();r({kind:"ok",text:w.message})}catch(w){r({kind:"err",text:k("legacyImportFailed",{message:w?.message??String(w)})})}finally{N(!1),b(!1)}}},O=(w,q)=>{n!==null&&l({...n,[w]:q})},D=()=>{if(n===null)return;const w=g.trim().toLowerCase();if(w.length===0||!/^[a-z0-9_.-]+$/.test(w)||n?.prices.models[w]!==void 0)return;const q={...n.prices.models,[w]:{cacheHit:0,cacheMiss:0,output:0}};l({...n,prices:{...n.prices,models:q}}),h("")},G=n===null?[]:Object.keys(n.prices.models).filter(w=>{const Q=(n?.priceTableDisplay??H.priceTableDisplay??{})["deepseek:"+w];return typeof Q=="boolean"?Q:!0}).map(w=>e(jt,{key:w,modelId:w,entry:n.prices.models[w]??{cacheHit:0,cacheMiss:0,output:0},isDefault:!1,draft:n,setDraft:l,t:k})),B=[["overview",k("tabOverview")],["statistics",I==="en"?"Cost statistics":"计费统计"],["quotas",k("tabQuotas")],["usage",k("tabUsage")],["pricing",k("tabPricing")],["display",k("tabDisplay")]],V=y.status==="saving"?e("span",{className:"cm-hint"},k("saving")):y.status==="error"?e("span",{className:"cm-msg err"},k("autoSaveFailed",{message:y.error??""})):e("span",{className:"cm-hint"},y.status==="saved"?k("autoSavedAt",{time:new Date(y.at).toLocaleTimeString()}):k("autoSaveHint"));return e("div",{className:"cm-section"},e("div",{className:"cm-tabs-row"},e("div",{className:"cm-tabs",role:"tablist"},B.map(([w,q])=>e("button",{key:w,type:"button",role:"tab","aria-selected":String(f===w),className:"cm-tab"+(f===w?" active":""),onClick:()=>S(w)},q))),V),Ut(i),f==="statistics"?e(Oa,{state:a,api:o}):null,f==="overview"?e(E,{key:"overview"},e("div",{className:"cm-cards"},H.hideTodayCost===!0?null:e(rt,{title:k("cardToday"),value:Y(z(a.today,H),H),sub:k("callsTokens",{calls:a.today.calls,input:j(a.today.input),cache:j(a.today.cacheRead+a.today.cacheWrite),output:j(a.today.output)})}),e(rt,{title:k("cardMonth"),value:Y(z(a.month,H),H),sub:k("callsTokens",{calls:a.month.calls,input:j(a.month.input),cache:j(a.month.cacheRead+a.month.cacheWrite),output:j(a.month.output)})}),e(rt,{title:k("cardTotal"),value:Y(z(a.total,H),H),sub:k("cardTotalSub",{calls:a.total.calls})})),e(bs,{state:a,t:k}),e("p",{className:"cm-note",key:"cards-footnote"},k("cardsFootnote")),(()=>{const w=wn(a);return w!==null?e("p",{className:"cm-note",key:"tz-hint"},k("timezoneHint",{host:w.hostLabel,browser:w.browserLabel})):null})(),e("label",{className:"cm-cards-toggle",title:k("cardsTogglePlanTotalHint")},e("input",{type:"checkbox",checked:(n??H).showTotalWithPlan===!0,onChange:w=>{const q=n??H;q!=null&&l({...q,showTotalWithPlan:w.target.checked})}}),e("span",null,k("cardsTogglePlanTotal"))),e("div",null,e("h3",{className:"cm-h"},k("todaySessions")),e(ks,{state:a,t:k})),e(xs,{state:a,draft:n,setDraft:l,t:k}),(H.balance?.display==="settings"||H.balance?.display==="both")&&H.hideOfficialBalance!==!0?e(Os,{state:a,api:o,t:k,draft:n,setDraft:l}):null):null,f==="quotas"?e(js,{key:"quotas",state:a,api:o,t:k,draft:n,setDraft:l}):null,f==="usage"?e(E,{key:"usage"},!Ve||(H.usage?.position??"cost")==="cost"?e(Ht,{state:a,t:k,locale:I}):null,e(Cs,{state:a,config:n??H,t:k,draft:n,setDraft:l}),e(Ts,{state:a,config:n??H,t:k}),e(gs,{state:a,api:o}),e(ys,{state:a,api:o}),e("div",null,e("h3",{className:"cm-h"},k("historyDataTitle")),e("div",{className:"cm-buttons"},p?e(E,null,e("span",{className:"cm-hint"},k("confirmImportLegacy")),e("button",{className:"cm-btn",onClick:Se,disabled:v},k("apply")),e("button",{className:"cm-btn",onClick:()=>b(!1)},k("cancel"))):e("button",{className:"cm-btn",onClick:()=>b(!0),disabled:v},k("importLegacy")),c?e(E,null,e("span",{className:"cm-hint"},k("confirmReset")),e("button",{className:"cm-btn danger",onClick:we,disabled:v},k("confirmClear")),e("button",{className:"cm-btn",onClick:()=>m(!1)},k("cancel"))):e("button",{className:"cm-btn danger",onClick:()=>m(!0),disabled:v},k("clearAllHistory"))),e("p",{className:"cm-note"},k("legacyImportNote")))):null,f==="display"?e(E,{key:"display"},e(ps,{draft:n,setDraft:l,t:k}),a?.secretMigration?.pending?.length>0?e(vn,{pending:a.secretMigration.pending,t:k}):null,e("div",{className:"cm-toolbar"},e("div",{className:"cm-field"},e("label",null,k("languageLabel")),e("select",{className:"cm-input",value:n?.locale??"auto",onChange:w=>O("locale",w.target.value)},e("option",{value:"auto"},k("localeAuto")),e("option",{value:"zh"},k("localeZh")),e("option",{value:"en"},k("localeEn"))))),e("div",null,e("h3",{className:"cm-h"},k("displaySettings")),e("div",{className:"cm-grid"},e("div",{className:"cm-grid-group"},k("groupGeneral")),...["includeSubagentCost","codexQuotaEnabled","codexQuotaSidebar"].map(w=>e("label",{key:w,className:"cm-check"},e("input",{type:"checkbox",checked:n?.[w]===!0,onChange:q=>O(w,q.target.checked)}),e("span",null,k(w)))),Ve?e("div",{className:"cm-field"},e("label",null,k("usagePositionLabel")),e("select",{className:"cm-input",value:n?.usage?.position??"cost",onChange:w=>{n!==null&&l({...n,usage:{...n.usage??{position:"cost"},position:w.target.value}})}},e("option",{value:"cost"},k("usagePositionCost")),e("option",{value:"general"},k("usagePositionGeneral")),e("option",{value:"section"},k("usagePositionSection")))):null,e("div",{className:"cm-field"},e("label",null,k("positionLabel")),e("select",{className:"cm-input",value:n?.position??"dock",onChange:w=>O("position",w.target.value)},e("option",{value:"dock"},k("positionDock")),e("option",{value:"header"},k("positionHeader")),e("option",{value:"off"},k("off")))),e("div",{className:"cm-field"},e("label",null,k("sidebarLabel")),e("select",{className:"cm-input",value:n?.sidebar===!1?"off":"on",onChange:w=>O("sidebar",w.target.value==="on")},e("option",{value:"on"},k("sidebarOn")),e("option",{value:"off"},k("off")))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.showSessionId===!0,onChange:w=>O("showSessionId",w.target.checked)}),e("span",null,k("showSessionIdLabel"))),e("div",{className:"cm-grid-group"},k("groupMoney")),e("div",{className:"cm-field"},e("label",null,k("currencyLabel")),e("select",{className:"cm-input",value:n?.currency??"CNY",onChange:w=>{const q=ws[w.target.value];q!==void 0&&n!==null&&l({...n,currency:w.target.value,...q})}},e("option",{value:"CNY"},k("currencyCny")),e("option",{value:"USD"},k("currencyUsd")),e("option",{value:"EUR"},k("currencyEur")))),e("div",{className:"cm-field"},e("label",null,k("symbolLabel")),e("input",{className:"cm-input narrow",type:"text",value:n?.symbol??"",onChange:w=>O("symbol",w.target.value)})),e("div",{className:"cm-field"},e("label",null,k("rateLabel")),ae({value:n?.exchangeRate??1,emptyMode:"ignore"},w=>O("exchangeRate",w))),e("div",{className:"cm-field"},e("label",null,k("decimalsLabel")),ae({value:n?.decimals??2},w=>O("decimals",Math.min(10,Math.floor(w))))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.hideOfficialBalance===!0,onChange:w=>O("hideOfficialBalance",w.target.checked)}),e("span",null,k("hideOfficialBalanceLabel"))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.hideTodayCost===!0,onChange:w=>O("hideTodayCost",w.target.checked)}),e("span",null,k("hideTodayCostLabel"))),e("div",{className:"cm-grid-group"},k("groupSidebar")),e("div",{className:"cm-field"},e("label",null,k("sidebarTodayMetric")),e("select",{className:"cm-input",value:n?.sidebarTodayMetric??"cost",onChange:w=>O("sidebarTodayMetric",w.target.value)},e("option",{value:"cost"},k("sidebarTodayCost")),e("option",{value:"tokens"},k("sidebarTodayTokens")))),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.sidebarSimple===!0,onChange:w=>{n&&l({...n,sidebarSimple:w.target.checked,sidebarSimplePromptSeen:!0})}}),e("span",null,k("sidebarSimple"))),e("div",{className:"cm-field"},e("span",{className:"cm-hint"},k("sidebarSimpleNote"))),e("div",{className:"cm-field"},e("label",null,k("sidebarStyleLabel")),e("select",{className:"cm-input",value:n?.sidebarStyle??"standard",disabled:n?.sidebarSimple===!0,onChange:w=>O("sidebarStyle",w.target.value)},e("option",{value:"standard"},k("sidebarStyleStandard")),e("option",{value:"compact"},k("sidebarStyleCompact")))),e("div",{className:"cm-field"},e("label",null,k("balanceDisplayLabel")),e("select",{className:"cm-input",value:n?.balance?.display??"both",onChange:w=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5},display:w.target.value}})}},...Ge(k))),e("div",{className:"cm-field"},e("label",null,k("refreshIntervalLabel")),ae({value:n?.balance?.refreshMinutes??5},w=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(w)))}})})),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.balance?.showProgressBar===!0,onChange:w=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},showProgressBar:w.target.checked}})}}),e("span",null,k("balanceShowProgressBar")))),e("div",{className:"cm-field"},e("label",null,k("balanceBudgetCapLabel")),ae({value:n?.balance?.budgetCap??""},w=>{n!==null&&l({...n,balance:{...n.balance??{display:"both",refreshMinutes:5,showProgressBar:!1,budgetCap:null},budgetCap:w>0?w:null}})}),e("span",{className:"cm-hint"},k("balanceBudgetCapHint"))),e("div",{className:"cm-field"},e("label",null,k("barDirectionsTitle")),["balance","budget","go","plan"].map(w=>e("div",{className:"cm-dir-row",key:w},e("span",{className:"cm-dir-label"},k("barDirection_"+w)),e("select",{className:"cm-input",value:n?.barDirections?.[w]??(w==="balance"?"remaining":"used"),onChange:q=>{if(n===null)return;const Q={balance:"remaining",budget:"used",go:"used",plan:"used"};l({...n,barDirections:{...n.barDirections??Q,[w]:q.target.value}})}},e("option",{value:"remaining"},k("barDirectionRemaining")),e("option",{value:"used"},k("barDirectionUsed"))))),e("span",{className:"cm-hint"},k("barDirectionsHint"))),e("div",{className:"cm-field"},e("label",null,k("customBalanceDisplayLabel")),e("select",{className:"cm-input",value:n?.customBalance?.display??H.customBalance?.display??"both",onChange:w=>{n!==null&&l({...n,customBalance:{...n.customBalance??H.customBalance??{},display:w.target.value}})}},...Ge(k))),e("div",{className:"cm-field"},e("label",null,k("customBalanceRefreshInterval")),ae({value:n?.customBalance?.refreshMinutes??H.customBalance?.refreshMinutes??15},w=>{n!==null&&l({...n,customBalance:{...n.customBalance??H.customBalance??{},refreshMinutes:Math.min(1440,Math.max(1,Math.floor(w)))}})})),e(ja,{config:H,draft:n,setDraft:l,t:k,api:o}),e("div",{className:"cm-grid-group"},k("quotaStripGroup")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.quotaStrip?.enabled===!0,onChange:w=>{n!==null&&l({...n,quotaStrip:{...n.quotaStrip??{enabled:!1,budget:!0,go:!0,plans:!0},enabled:w.target.checked,promptSeen:!0}})}}),e("span",null,k("quotaStripEnable")))),n?.quotaStrip?.enabled===!0?[["budget","quotaStripShowBudget"],["go","quotaStripShowGo"],["plans","quotaStripShowPlans"]].map(([w,q])=>e("label",{key:w,className:"cm-check"},e("input",{type:"checkbox",checked:n.quotaStrip[w]!==!1,onChange:Q=>{n!==null&&l({...n,quotaStrip:{...n.quotaStrip,[w]:Q.target.checked}})}}),e("span",null,k(q)))):null,e("div",{className:"cm-field"},e("span",{className:"cm-hint"},k("quotaStripNote"))),e("div",{className:"cm-grid-group"},k("groupCorner")),e("div",{className:"cm-field"},e("label",null,k("cornerLabel")),e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.corner?.enabled===!0,onChange:w=>{n!==null&&l({...n,corner:{...n.corner??{enabled:!1,goRolling:!0,goWeekly:!0,goMonthly:!0,budget:!0},enabled:w.target.checked}})}}),e("span",null,k("cornerEnabledLabel"))),n?.corner?.enabled===!0?[["goRolling","cornerGoRolling"],["goWeekly","cornerGoWeekly"],["goMonthly","cornerGoMonthly"],["budget","cornerBudget"]].map(([w,q])=>e("label",{key:w,className:"cm-check"},e("input",{type:"checkbox",checked:n.corner[w]!==!1,onChange:Q=>{n!==null&&l({...n,corner:{...n.corner,[w]:Q.target.checked}})}}),e("span",null,k(q)))):null),e("div",{className:"cm-grid-group"},k("groupDetail")),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.goQuota?.detail!==!1,onChange:w=>{n!==null&&l({...n,goQuota:{...n.goQuota??{display:"both",refreshMinutes:15,apiKey:"",main:"rolling",detail:!0},detail:w.target.checked}})}}),e("span",null,k("goDetailLabel")))),e("div",{className:"cm-field"},e("label",{className:"cm-check"},e("input",{type:"checkbox",checked:n?.budget?.detail!==!1,onChange:w=>{n!==null&&l({...n,budget:{...n.budget??{enabled:!1,amount:100,period:"month",customStart:null,customEnd:null,detail:!0},detail:w.target.checked}})}}),e("span",null,k("budgetDetailLabel"))))),e("p",{className:"cm-note"},k("badgeNote")))):null,f==="pricing"?e(E,{key:"pricing"},e(vs,{state:a,draft:n,setDraft:l,t:k}),e("div",null,Le(C,()=>x(!C),k("priceTableTitle")),C?e("div",{className:"cm-collapse-body"},e("p",{className:"cm-note"},k("priceTableNote")),e("p",{className:"cm-hint"},k("priceTableDisplayHint")),e("div",{className:"cm-catalog-vendor"},k("deepseekMountedHeader")),G,e(jt,{key:"__default__",modelId:k("defaultModelId"),entry:n?.prices.default??{cacheHit:0,cacheMiss:0,output:0},isDefault:!0,draft:n,setDraft:l,t:k}),e("div",{className:"cm-buttons"},e("input",{className:"cm-input narrow",type:"text",placeholder:k("newModelPlaceholder"),value:g,onChange:w=>h(w.target.value)}),e("button",{className:"cm-btn small",onClick:D,disabled:g.trim().length===0},k("addModel"))),(()=>{const w=n?.priceTableDisplay??H.priceTableDisplay??{},q=n?.prices?.providers??{},Q=J=>Object.keys(q[J]?.models??{}).filter(P=>w[J+":"+P]===!0),ue=Object.keys(q).filter(J=>Q(J).length>0).sort((J,P)=>J.localeCompare(P));return ue.length===0?null:ue.map(J=>e("div",{key:J},e("div",{className:"cm-catalog-vendor"},(Da[J]??J)+" · "+k("mountedSuffix")),Q(J).sort().map(P=>e(Ea,{key:J+":"+P,provider:J,modelId:P,entry:q[J].models[P],draft:n,setDraft:l,t:k}))))})()):null),(()=>{const w=n?.priceOverrides??H.priceOverrides??{},q=n?.priceMatchDismissed??H.priceMatchDismissed??[],Q=n?.prices??H.prices,ue=a.today.byProviderModel??{},J={prices:Q,priceMatch:n?.priceMatch??H.priceMatch},P=Object.keys(ue).filter(U=>{if(q.includes(U)||w[U]!==void 0)return!1;const _=U.indexOf(":"),me=(_>0?U.slice(0,_):"deepseek").toLowerCase(),Qt=_>0?U.slice(_+1):U;return kt(me,Qt,J).matched!==!0}),W=[...new Set([...P,...Object.keys(w)])].filter(U=>!q.includes(U)),X=a.month?.byProviderModel??{},oe=Object.keys(X).filter(U=>{if(q.includes(U)||w[U]!==void 0)return!1;const _=U.indexOf(":"),me=(_>0?U.slice(0,_):"deepseek").toLowerCase(),Qt=_>0?U.slice(_+1):U;return kt(me,Qt,J).matched===!0}).sort(),qe=[{value:"__local__",label:k("overrideTargetLocal")},{value:"deepseek:__default__",label:k("overrideTargetDefault")},...Object.keys(Q.models??{}).map(U=>({value:"deepseek:"+U,label:"DeepSeek · "+U})),...Object.entries(Q.providers??{}).flatMap(([U,_])=>Object.keys(_?.models??{}).map(me=>({value:U+":"+me,label:U+" · "+me})))],Ce=(U,_)=>{if(n===null)return;const me={...n.priceOverrides??{}};_===""?delete me[U]:me[U]=_,l({...n,priceOverrides:me})},xe=U=>{if(n===null)return;const _={...n.priceOverrides??{}};delete _[U],l({...n,priceOverrides:_,priceMatchDismissed:[...new Set([...q,U])]})};return e("div",null,e("h3",{className:"cm-h"},k("priceMatchLabel")),e("div",{className:"cm-field"},e("select",{className:"cm-input",value:n?.priceMatch==="exact"?"exact":"auto",onChange:U=>O("priceMatch",U.target.value)},e("option",{value:"auto"},k("priceMatchAuto")),e("option",{value:"exact"},k("priceMatchExact")))),e("p",{className:"cm-note"},k("priceMatchNote")),W.length>0?e(E,null,e("h3",{className:"cm-h"},k("unmatchedTitle")),e("p",{className:"cm-hint"},k("unmatchedHint")),W.map(U=>e("div",{key:U,className:"cm-match-row"},e("span",null,It(U)),e("select",{className:"cm-input",value:w[U]??"",onChange:_=>Ce(U,_.target.value)},e("option",{value:""},"—"),qe.map(_=>e("option",{key:_.value,value:_.value},_.label))),e("button",{className:"cm-btn small",title:k("removePriceMatchHint"),onClick:()=>xe(U)},k("overrideRemove"))))):e("p",{className:"cm-hint"},k("overrideNone")),q.length>0?e("button",{className:"cm-btn small",onClick:()=>O("priceMatchDismissed",[])},k("restorePriceMatches",{count:q.length})):null,oe.length>0?e(E,null,e("h3",{className:"cm-h"},k("matchedTitle")),e("p",{className:"cm-hint"},k("matchedHint")),oe.map(U=>e("div",{key:U,className:"cm-match-row"},e("span",null,It(U)),e("select",{className:"cm-input",value:"",onChange:_=>{_.target.value!==""&&Ce(U,_.target.value)}},e("option",{value:""},k("matchedKeepAuto")),qe.map(_=>e("option",{key:_.value,value:_.value},_.label)))))):null)})(),e(Ss,{state:a,draft:n,setDraft:l,t:k}),e("div",null,e("h3",{className:"cm-h"},k("dataSync")),(n??H).currency==="CNY"&&(n??H).prices?.currency!=="CNY"?e("div",{className:"cm-note",role:"status"},k("pricingCnyHint",{rate:(n??H).exchangeRate}),(n??H).pricingCurrency!=="CNY"?e("button",{className:"cm-btn small",disabled:v,onClick:()=>O("pricingCurrency","CNY")},k("pricingCurrencyCny")):null):null,e("div",{className:"cm-field"},e("label",null,k("pricingCurrencyLabel")),e("select",{className:"cm-input",value:n?.pricingCurrency==="CNY"?"CNY":"USD",onChange:w=>O("pricingCurrency",w.target.value)},e("option",{value:"USD"},k("pricingCurrencyUsd")),e("option",{value:"CNY"},k("pricingCurrencyCny"))),e("p",{className:"cm-note"},k("pricingCurrencyNote"))),e("div",{className:"cm-buttons"},u?e(E,null,e("span",{className:"cm-hint"},k("confirmFetch")),e("button",{className:"cm-btn",onClick:de,disabled:v},k("apply")),e("button",{className:"cm-btn",onClick:()=>d(!1)},k("cancel"))):e("button",{className:"cm-btn",onClick:()=>d(!0),disabled:v},k("syncFromDocs"))),e("p",{className:"cm-note"},k("lastSync",{time:H.fetchedAt!==null?new Date(H.fetchedAt).toLocaleString():k("neverSynced")})+k("source",{source:H.priceSource==="official"?k("sourceOfficial"):k("sourceBundled")})),e("p",{className:"cm-note"},k("syncScopeNote")))):null)}const Hs=["remote"];async function Qs(t){const s=t.remote;if(s===void 0||typeof s.$mount!="function")return;const o=await s.$mount(on);t.effect(()=>()=>{o()},"cost-meter: remote contribution");const a=t.get("remote.costMeter");if(a===void 0)return;const n=xn({status:"loading",error:null,state:null}),l=()=>K(F(n.getSnapshot().state?.config?.locale)),i=async(P,W)=>{const X=await a[P](...W??[]);if(X===null||typeof X!="object"||X.ok!==!0)throw new Error(X?.error?.message??l()("rpcFailed",{method:P}));return X.value};let r=Date.now(),u=!1,d=!0,c=1;const m=async()=>{if(!d||u)return;u=!0,r=Date.now();const P=n.getSnapshot();P.state===null&&n.set({...P,status:"loading"});try{const W=await i("getState");if(!d)return;c=1,n.set({status:"ready",error:null,state:W})}catch(W){if(!d)return;P.state===null&&(r=Date.now()),c=Math.min(c*2,60),n.set({status:"error",error:W?.message??String(W),state:P.state})}finally{u=!1}};t.effect(()=>t.on("connection/reset",()=>{m()}),"cost-meter: reconnect reload");const p=setInterval(()=>{const P=n.getSnapshot().state,W=P?.config.sidebarModels,X=P?W?.enabled||W?.dock?W.refreshSeconds:60:c;!document.hidden&&Date.now()-r>=(X||60)*1e3&&m()},1e3);t.effect(()=>()=>{d=!1,clearInterval(p)},"cost-meter: poll timer");const b=()=>{document.visibilityState==="visible"&&m()};document.addEventListener("visibilitychange",b),t.effect(()=>()=>{document.removeEventListener("visibilitychange",b)},"cost-meter: visibility reload");const g=async(P,W="rpcSyncFailed",X=!1)=>{const oe=await P;if(oe===null||typeof oe!="object"||oe.ok!==!0)throw new Error(oe?.error?.message??(X?oe?.value?.message:void 0)??l()(W));return oe.value.state!==void 0&&n.set({status:"ready",error:null,state:oe.value.state}),oe.value};let h=null;const v={loadStatistics:()=>(h||(h=(typeof Ye.async=="function"?Ye.async("./client.statistics.js").then(P=>P.mount(t)):Promise.reject(new Error(l()("statisticsUpgrade")))).catch(P=>{throw h=null,P})),h),reload:m,updateConfig:async P=>{const W=await i("updateConfig",[P]);return n.set({status:"ready",error:null,state:W}),W},fetchPrices:async()=>g(a.fetchPrices()),resetHistory:async()=>{const P=await i("resetHistory");return n.set({status:"ready",error:null,state:P}),P},importLegacyHistory:async()=>{const P=await a.importLegacyHistory();if(P===null||typeof P!="object"||P.ok!==!0)throw new Error(P?.error?.message??P?.value?.message??l()("legacyImportFailed",{message:"RPC failed"}));return P.value.state!==void 0&&n.set({status:"ready",error:null,state:P.value.state}),P.value},getDaySessions:async P=>i("getDaySessions",[P]),getSessionCost:async P=>i("getSessionCost",[P]),getTurnCost:async(P,W,X)=>i("getTurnCost",[P,W,X]),getTopSessions:async(P,W,X)=>i("getTopSessions",[P,W,X]),refreshBalance:async()=>g(a.refreshBalance(),"rpcBalanceFailed"),refreshGoQuota:async()=>g(a.refreshGoQuota()),refreshGatewayQuota:async(P=null)=>g(P==null?a.refreshGatewayQuota():a.refreshGatewayQuota(P)),refreshCustomBalance:async(P=null)=>g(P==null?a.refreshCustomBalance():a.refreshCustomBalance(P)),refreshCodingPlan:async P=>g(a.refreshCodingPlan(P)),setCredential:async(P,W)=>g(a.setCredential(P,W),"rpcSyncFailed",!0),clearCredential:async P=>g(a.clearCredential(P),"rpcSyncFailed",!0)};m();const N=t.get("slots");if(N===void 0)return;const C=()=>({hooks:{cost:n},api:v});N.inject("conversation.session.header.actions",()=>N.register({name:"conversation.session.header.actions",id:"cost-meter-statistics",order:15,inject:C},fs)),N.inject("conversation.chat.turnTail",()=>N.register({name:"conversation.chat.turnTail",id:"cost-meter-turn",order:10,inject:C},Sn));const x=()=>({gen:0,dispose:null}),f=(P,W,X,oe,qe=!0)=>{P.dispose!==null&&(P.dispose(),P.dispose=null),P.gen+=1;const Ce=P.gen;qe&&N.inject(W,()=>{if(P.gen!==Ce)return;const xe=typeof X=="function"?X():N.register(X,oe);if(P.gen!==Ce){xe();return}return P.dispose=xe,()=>{P.dispose===xe&&(P.dispose=null),xe()}})},S=x(),y=P=>{const W=P==="header"?"conversation.session.header.actions":"conversation.composer.dock";f(S,W,P==="header"?{name:W,id:"cost-meter",order:-5,inject:C}:{name:W,id:"cost-meter",order:5,inject:C},P==="header"?Cn:An,P!=="off")},T=x(),A=P=>{f(T,"sidebar.footer.action",{name:"sidebar.footer.action",id:"cost-meter",order:0,inject:C},us,P)},L=x(),M=P=>{f(L,"conversation.composer.dock",{name:"conversation.composer.dock",id:"cost-meter-corner",order:9,inject:C},In,P)};N.inject("conversation.input.dock",()=>N.register({name:"conversation.input.dock",id:"cost-meter-qstrip",order:5,inject:C},os)),N.inject("sidebar.footer.action",()=>N.register({name:"sidebar.footer.action",id:"cost-meter-simple-guide",order:1,inject:C},ls)),N.inject("sidebar.footer.action",()=>N.register({name:"sidebar.footer.action",id:"cost-meter-qstrip-guide",order:1,inject:C},is)),N.inject("sidebar.footer.action",()=>N.register({name:"sidebar.footer.action",id:"cost-meter-balance-click-guide",order:2,inject:C},ds));const I=x(),k=P=>{f(I,"sidebar.footer.action",()=>N.register({name:"sidebar.footer.action",id:"cost-meter-peak-alert",order:0,inject:C},Un),null,P)};window.cmPeakAlertPreview=P=>{if(window.__cmPeakAlertLive!==!0){console.warn("[dsh-cost-meter] 弹窗组件未挂载:需启用峰谷计价并重启 dsh web 后再预览。");return}window.dispatchEvent(new CustomEvent(Pt,{detail:{kind:P==="offpeak"?"offpeak":"peak"}}))};const H=x(),de=P=>{f(H,"settings.section",{name:"settings.section",id:"cost-meter",order:30,label:P==="en"?Oe.en.sectionLabel:Oe.zh.sectionLabel,inject:C},Us,!0)},we=x(),Se=P=>{f(we,"settings.general.item",{name:"settings.general.item",id:"cost-meter-usage",order:30,inject:C},Ht,P)},O=x(),D=(P,W)=>{f(O,"settings.section",{name:"settings.section",id:"cost-meter-usage",order:31,label:W==="en"?Oe.en.usageSectionLabel:Oe.zh.usageSectionLabel,inject:C},Ht,P)};let G=null,B=null,V=null,w=null,q=null,Q=null;const ue=()=>{const P=n.getSnapshot().state,W=P?.config?.position??"dock",X=P?.config?.sidebar!==!1&&P?.config?.hideTodayCost!==!0,oe=P?.config?.balance?.display??"both",qe=(oe==="sidebar"||oe==="both")&&P?.config?.hideOfficialBalance!==!0,Ce=X||qe||P?.config?.codexQuotaEnabled===!0||P?.config?.sidebarModels?.enabled===!0,xe=P?.config?.corner?.enabled===!0||P?.config?.sidebarModels?.dock===!0,U=F(P?.config?.locale),_=P?.config?.usage?.position??"cost";W!==G&&(y(W),G=W),Ce!==B&&(A(Ce),B=Ce),xe!==V&&(M(xe),V=xe);const me=P?.config?.peakEnabled===!0;me!==Q&&(k(me),Q=me),U!==w&&(de(U),w=U),_!==q?(Ve&&(Se(_==="general"),D(_==="section",U)),q=_):Ve&&_==="section"&&U!==w&&D(!0,U)};ue();const J=n.subscribe(ue);return()=>{J()}}return dt.apply=Qs,dt.inject=Hs,Ft.exports}});
|