openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
96 lines • 9.38 kB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Do as t,Oo as n,k as r,m as i}from"./control-ui-core-Rwzhj6nO.js";import{K as a,X as o,q as s}from"./lit-runtime-CV_MH99K.js";import{Yt as c,en as l}from"./control-ui-core-vvcQQV2m.js";function u(e){return e?.refreshing===!0}var d,f,p;function m(){return(m=e((()=>{d=5e3,f=3,p=class{constructor(e){this.options=e,this.timer=null,this.retryInFlight=null,this.pendingIncomplete=!1,this.attempts=0,this.cycle=0,this.exhaustionReported=!1}get exhausted(){return this.exhaustionReported}observe(e,t){return this.useConnection(t),e?this.retryInFlight===null?this.timer===null?this.armRetry():`retrying`:(this.pendingIncomplete=!0,`retrying`):(this.resetCycle(),`complete`)}armRetry(){if(this.attempts>=(this.options.limit??f))return this.reportExhaustion(),`exhausted`;this.attempts+=1,this.pendingIncomplete=!1;let e=this.cycle;return this.timer=window.setTimeout(()=>{this.timer=null;let t;try{t=this.options.retry()}catch{return}if(!t)return;let n=Promise.resolve(t).then(()=>void 0,()=>void 0);this.retryInFlight=n,n.finally(()=>{this.cycle===e&&this.retryInFlight===n&&(this.retryInFlight=null,this.pendingIncomplete&&(this.pendingIncomplete=!1,this.armRetry()))})},this.options.retryMs??d),`retrying`}startCycle(){this.resetCycle()}useConnection(e){e!==this.connection&&(this.connection=e,this.startCycle())}dispose(){this.resetCycle()}resetCycle(){this.cycle+=1,this.attempts=0,this.pendingIncomplete=!1,this.retryInFlight=null,this.exhaustionReported=!1,this.clear()}reportExhaustion(){this.exhaustionReported||(this.exhaustionReported=!0,this.options.onExhausted?.())}clear(){this.timer!==null&&(window.clearTimeout(this.timer),this.timer=null)}}})))()}function h(e){if(e.reason===`manual`)return`fetch`;if(!e.visible)return`defer`;if(e.interrupted)return`fetch`;let t=e.ttlMs??g;return e.lastLoadedAtMs!==null&&e.nowMs-e.lastLoadedAtMs<t?`skip`:`fetch`}var g,_;function v(){return(v=e((()=>{m(),g=3e5,_=class{constructor(e){this.options=e,this.lastLoadedAtMs=null,this.pendingAutomaticRefresh=!1,this.reloadPending=!1,this.incompleteUsageRetry=new p({retry:()=>this.requestAndWait(`poll`),onExhausted:()=>this.options.onIncompleteUsageExhausted?.()})}get incompleteUsageExhausted(){return this.incompleteUsageRetry.exhausted}setLastLoadedAtMs(e,t){return this.applyLoadState(e,t?.incomplete===!0,t?.connection)}markProviderUsage(e,t,n){let r=e?.ok===!1||e?.ok===!0&&u(e.value);return this.applyLoadState(t,r,n)}resetPayload(){this.applyLoadState(null,!1),this.reloadPending=!1}dispose(){this.incompleteUsageRetry.dispose()}applyLoadState(e,t,n){let r=this.incompleteUsageRetry.observe(t,n);return this.lastLoadedAtMs=r===`complete`?e:null,r}interrupt(){this.reloadPending||=this.options.isLoading()}markLoadDeferred(){this.reloadPending=!0}beginLoad(){this.reloadPending=!1}async reloadAndWait(){this.pendingAutomaticRefresh=!1,await this.options.reload()}request(e){this.requestAndWait(e)}async requestAndWait(e){if(this.options.isLoading()&&e!==`manual`){this.pendingAutomaticRefresh=!0;return}this.pendingAutomaticRefresh=!1,h({reason:e,visible:document.visibilityState===`visible`&&document.hasFocus(),interrupted:this.reloadPending,nowMs:Date.now(),lastLoadedAtMs:this.lastLoadedAtMs})===`fetch`&&(e!==`poll`&&this.incompleteUsageRetry.startCycle(),await this.reloadAndWait())}flushPending(){this.pendingAutomaticRefresh&&(this.pendingAutomaticRefresh=!1,this.request(`focus`))}}})))()}function y(e,t){let n=t.trim().toUpperCase();return[`USD`,`EUR`,`GBP`,`CNY`,`JPY`].includes(n)?new Intl.NumberFormat(void 0,{style:`currency`,currency:n,maximumFractionDigits:n===`JPY`?0:2}).format(e):`${new Intl.NumberFormat(void 0,{maximumFractionDigits:2}).format(e)} ${t}`}function b(e){return!e||!Number.isFinite(e)?null:new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}).format(new Date(e))}function x(e){return(e.billing??[]).map(e=>{let t=e.label??(e.type===`balance`?l(`usage.providerUsage.balance`):e.type===`spend`?l(`usage.providerUsage.spend`):l(`usage.providerUsage.budget`)),n=e.type===`budget`?`${y(e.used,e.unit)} / ${y(e.limit,e.unit)}`:y(e.amount,e.unit);return o`
<div class="provider-usage-billing-row">
<span>${t}</span>
<strong>${n}</strong>
</div>
`})}function S(e,t){let n=e.costHistory;if(!n)return 0;let r=new Date,i=Date.UTC(r.getUTCFullYear(),r.getUTCMonth(),r.getUTCDate()),a=i-(Math.max(1,t)-1)*864e5;return n.daily.reduce((e,t)=>{let n=Date.parse(`${t.date}T00:00:00Z`);return Number.isFinite(n)&&n>=a&&n<=i?e+t.amount:e},0)}function C(e){let t=e.costHistory;if(!t||t.daily.length===0)return s;let n=Math.max(...t.daily.map(e=>e.amount),0),r=t.daily.reduce((e,t)=>({requests:e.requests+(t.requests??0),input:e.input+t.inputTokens,cache:e.cache+t.cacheReadTokens+t.cacheWriteTokens,output:e.output+t.outputTokens}),{requests:0,input:0,cache:0,output:0}),a=i(r.input),c=i(r.cache),u=i(r.output),d=[[l(`usage.providerUsage.today`),S(e,1)],[l(`usage.providerUsage.last7Days`),S(e,7)],[l(`usage.providerUsage.lastDays`,{count:String(t.periodDays)}),t.daily.reduce((e,t)=>e+t.amount,0)]];return o`
<div class="provider-cost-history">
<div class="provider-cost-windows">
${d.map(([e,n])=>o`
<div class="provider-cost-window">
<span>${e}</span>
<strong>${y(n,t.unit)}</strong>
</div>
`)}
</div>
<div class="provider-cost-chart" aria-label=${l(`usage.providerUsage.dailyCost`)}>
${t.daily.map(e=>{let r=e.amount>0&&n>0?Math.max(3,e.amount/n*100):0;return o`<span
style=${`height: ${r}%`}
title=${`${e.date}: ${y(e.amount,t.unit)}`}
aria-label=${`${e.date}: ${y(e.amount,t.unit)}`}
></span>`})}
</div>
<div class="provider-cost-tokens">
${r.requests>0?o`<span
>${l(`usage.providerUsage.requests`,{count:new Intl.NumberFormat().format(r.requests)})}</span
>`:s}
<span>${l(`usage.providerUsage.inputTokens`,{count:a})}</span>
<span>${l(`usage.providerUsage.cacheTokens`,{count:c})}</span>
<span>${l(`usage.providerUsage.outputTokens`,{count:u})}</span>
</div>
${t.models.length>0||t.categories.length>0?o`
<div class="provider-cost-breakdowns">
${t.models.length>0?o`
<div class="provider-cost-breakdown">
<span class="provider-cost-breakdown__title"
>${l(`usage.providerUsage.topModels`)}</span
>
${t.models.slice(0,3).map(e=>o`
<div>
<span>${e.name}</span
><strong>${i(e.totalTokens)}</strong>
</div>
`)}
</div>
`:s}
${t.categories.length>0?o`
<div class="provider-cost-breakdown">
<span class="provider-cost-breakdown__title"
>${l(`usage.providerUsage.costCategories`)}</span
>
${t.categories.slice(0,3).map(e=>o`
<div>
<span>${e.name}</span>
<strong
>${y(e.amount,t.unit)}</strong
>
</div>
`)}
</div>
`:s}
</div>
`:s}
</div>
`}function w(e){return e.error?o`<div class="provider-usage-error">${t(e.error)}</div>`:o`
${e.windows.length>0?o`
<div class="provider-usage-windows">
${e.windows.map(e=>{let t=Math.max(0,Math.min(100,e.usedPercent)),n=Math.max(0,100-t),r=b(e.resetAt);return o`
<div class="provider-usage-window">
<div class="provider-usage-window__meta">
<span>${e.label}</span>
<strong
>${l(`usage.providerUsage.remaining`,{percent:n.toFixed(0)})}</strong
>
</div>
<div
class="provider-usage-progress"
role="progressbar"
aria-label=${e.label}
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow=${t.toFixed(0)}
>
<span style=${`width: ${t}%`}></span>
</div>
${r?o`<div class="provider-usage-reset">
${l(`usage.providerUsage.resets`,{date:r})}
</div>`:s}
</div>
`})}
</div>
`:s}
${e.billing&&e.billing.length>0?o`<div class="provider-usage-billing">${x(e)}</div>`:s}
${C(e)}
${e.summary?o`<div class="provider-usage-summary">${e.summary}</div>`:s}
`}function T(){return(T=e((()=>{a(),c(),n(),r()})))()}function E(){return(E=e((()=>{})))()}export{v as a,_ as i,T as n,m as o,w as r,u as s,E as t};
//# sourceMappingURL=usage-BoX28Uwf.js.map