1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-ui-cXGMPlE0.js","assets/vendor-vue-CNokyTVe.js"])))=>i.map(i=>d[i]); 2import{k as ae,g as Lt,h as da,ab as ca,a9 as ma,a as Vt,ac as Be,z as ga,a0 as pa,ad as va,_ as Ut}from"./index-DP2Z749b.js";import{d as we,a4 as ya,r as o,c as I,w as de,o as Ft,a as et,z as v,A as Ee,B as s,D as T,R as ke,G as u,u as g,W as Xe,F as W,L as ce,k as h,E as _a,C as m,K as Ne,H as qe,J as xe,U as fa,q as he,S as Ze,X as ba}from"./vendor-vue-CNokyTVe.js";import{F as ha}from"./vendor-misc-CSmvsGIg.js";import{g as ka}from"./usePersistedPageSize-x0WpaIWh.js";import{r as Ue,_ as xa,a as wa,b as Ca,c as $a}from"./GroupDistributionChart.vue_vue_type_script_setup_true_lang-DyNMbchF.js";import{_ as Sa}from"./AppLayout.vue_vue_type_script_setup_true_lang-DA3QqGQe.js";import{P as At}from"./Pagination-BppI-mJq.js";import{S as te}from"./Select-S_YpYAoi.js";import{D as Ta,_ as Da}from"./TokenUsageTrend.vue_vue_type_script_setup_true_lang-DRHRjCob.js";import{C as Ua}from"./errorBadges-dEAkHb3m.js";import{u as Re}from"./vendor-i18n-CJe1LeE7.js";import{L as Ea}from"./LoadingSpinner-BeG-_bjC.js";import{_ as Et}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CmtphKkd.js";import{_ as qa}from"./UserBalanceHistoryModal.vue_vue_type_script_setup_true_lang-DM_RirjU.js";import{_ as Ra,a as La}from"./OpsErrorLogTable.vue_vue_type_script_setup_true_lang-BA2gNOf5.js";import{a as Va}from"./ModelDistributionChart.vue_vue_type_script_setup_true_lang-45lrfypx.js";import{_ as Fa}from"./EndpointDistributionChart.vue_vue_type_script_setup_true_lang-DvaayMYD.js";import"./DataTable-CSNQ-xLu.js";import"./EmptyState.vue_vue_type_script_setup_true_lang-qrSDwWZV.js";import"./vendor-chart-CN2sanci.js";import"./AppHeader.vue_vue_type_style_index_0_scoped_e9be4349_lang-xG_yv2rf.js";import"./useClipboard-CR8lmECi.js";import"./LocaleSwitcher-pcuQ_98X.js";/* empty css */const Aa={class:"flex flex-wrap items-end justify-between gap-4"},Ma={class:"flex flex-1 flex-wrap items-end gap-4"},Pa={class:"input-label"},za=["placeholder"],Ia={key:1,class:"absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border bg-white shadow-lg dark:bg-dark-800"},Oa=["onClick"],Ba={key:0,class:"ml-1 text-xs text-gray-400"},Na={class:"ml-2 text-xs text-gray-400"},Ka={class:"input-label"},ja=["placeholder"],Ha={key:1,class:"absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border bg-white shadow-lg dark:bg-dark-800"},Ga=["onClick"],Ja={class:"truncate"},Ya={class:"ml-2 text-xs text-gray-400"},Qa={class:"w-full sm:w-auto sm:min-w-[220px]"},Wa={class:"input-label"},Xa={class:"input-label"},Za=["placeholder"],es={key:1,class:"absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border bg-white shadow-lg dark:bg-dark-800"},ts=["onClick"],as={class:"truncate"},ss={class:"ml-2 text-xs text-gray-400"},ls={key:0,class:"w-full sm:w-auto sm:min-w-[180px]"},os={class:"input-label"},ns={key:1,class:"w-full sm:w-auto sm:min-w-[200px]"},rs={class:"input-label"},us={key:2,class:"w-full sm:w-auto sm:min-w-[200px]"},is={class:"input-label"},ds={key:3,class:"w-full sm:w-auto sm:min-w-[180px]"},cs={class:"input-label"},ms={key:4,class:"w-full sm:w-auto sm:min-w-[180px]"},gs={class:"input-label"}
2,ps={key:5,class:"w-full sm:w-auto sm:min-w-[180px]"},vs={class:"input-label"},ys={class:"w-full sm:w-auto sm:min-w-[200px]"},_s={class:"input-label"},fs={key:0,class:"flex w-full flex-wrap items-center justify-end gap-3 sm:w-auto"},bs=["disabled"],Mt=we({__name:"UsageFilters",props:{modelValue:{},exporting:{type:Boolean},startDate:{},endDate:{},showActions:{type:Boolean,default:!0},modelOptions:{},mode:{default:"usage"},flat:{type:Boolean,default:!1}},emits:["update:modelValue","change","refresh","reset","export","cleanup"],setup(k,{expose:Q,emit:a}){const E=k,y=a,{t:d}=Re(),r=ya(E,"modelValue"),U=o(null),F=o(null),O=o(null),q=o(""),D=o([]),L=o(!1);let B=null,P=0;const R=o(""),f=o([]),A=o(!1);let _=null;const $=o(""),j=o([]),X=o(!1);let oe=null;const Z=I(()=>[{value:null,label:d("admin.usage.allModels")},...(E.modelOptions??[]).map(t=>({value:t,label:t}))]),se=o([{value:null,label:d("admin.usage.allGroups")}]),me=o([{value:null,label:d("admin.usage.allTypes")},{value:"ws_v2",label:d("usage.ws")},{value:"stream",label:d("usage.stream")},{value:"sync",label:d("usage.sync")},{value:"cyber",label:d("usage.cyber")}]),ge=o([{value:null,label:d("admin.usage.allBillingTypes")},{value:0,label:d("admin.usage.billingTypeBalance")},{value:1,label:d("admin.usage.billingTypeSubscription")}]),N=I(()=>[{value:null,label:d("admin.usage.allTypes")},{value:"upstream",label:d("admin.ops.errorLog.typeUpstream")},{value:"account_auth",label:d("admin.ops.errorLog.typeAccountAuth")},{value:"request",label:d("admin.ops.errorLog.typeRequest")},{value:"auth",label:d("admin.ops.errorLog.typeAuth")},{value:"routing",label:d("admin.ops.errorLog.typeRouting")},{value:"internal",label:d("admin.ops.errorLog.typeInternal")}]),H=["auth","rate_limit","quota","invalid_request","service_unavailable","upstream","internal","cyber"],pe=I(()=>[{value:null,label:d("usage.errors.allCategories")},...H.map(t=>({value:t,label:d("usage.errors.categories."+t)}))]),K=I(()=>[{value:null,label:d("usage.errors.allStatuses")},...Ua.map(t=>({value:t,label:String(t)}))]),ne=o([{value:null,label:d("admin.usage.allBillingModes")},{value:"token",label:d("admin.usage.billingModeToken")},{value:"per_request",label:d("admin.usage.billingModePerRequest")},{value:"image",label:d("admin.usage.billingModeImage")},{value:"video",label:d("admin.usage.billingModeVideo")}]),C=()=>y("change"),J=()=>{B&&(clearTimeout(B),B=null),P+=1},ve=()=>{J();const t=q.value.trim();if(!t){D.value=[];return}const i=P;B=setTimeout(async()=>{B=null;try{const p=await ae.usage.searchUsers(t);i===P&&(D.value=p.sort((ee,Te)=>Number(ee.deleted)-Number(Te.deleted)))}catch{i===P&&(D.value=[])}},300)},re=()=>{_&&clearTimeout(_),_=setTimeout(async()=>{try{f.value=await ae.usage.searchApiKeys(r.value.user_id,R.value||"")}catch{f.value=[]}},300)},ue=async t=>{J(),q.value=t.email,L.value=!1,r.value.user_id=t.id,c();try{f.value=await ae.usage.searchApiKeys(t.id,"")}catch{f.value=[]}C()},Ce=()=>{J(),q.value="",D.value=[],L.value=!1,r.value.user_id=void 0,c(),C()},ye=t=>{R.value=t.name||String(t.id),A.value=!1,r.value.api_key_id=t.id,C()},c=()=>{R.value="",f.value=[],A.value=!1,r.value.api_key_id=void 0},x=()=>{c(),C()},S=()=>{oe&&clearTimeout(oe),oe=setTimeout(async()=>{if(!$.value){j.value=[];return}try{const t=await ae.accounts.list(1,20,{search:$.value});j.value=t.items.map(i=>({id:i.id,name:i.name}))}catch{j.value=[]}},300)},$e=t=>{$.value=t.name,X.value=!1,r.value.account_id=t.id,C()},Se=()=>{$.value="",j.value=[],X.value=!1,r.value.account_id=void 0,C()},Le=()=>{A.value=!0,f.value.length===0&&re()},V=t=>{var Ve,Fe,De;const i=t.target;if(!i)return;const p=((Ve=U.value)==null?void 0:Ve.contains(i))??!1,ee=((Fe=F.value)==null?void 0:Fe.contains(i))??!1,Te=((De=O.value)==null?void 0:De.contains(i))??!1;p||(L.value=!1),ee||(A.value=!1),Te||(X.value=!1)};return de(()=>E.startDate,t=>{r.value.start_date=t},{immediate:!0}),de(()=>E.endDate,t=>{r.value.end_date=t},{immediate:!0}),de(()=>r.value.user_id,t=>{t||(J(),q.value="",D.value=[])}),de(()=>r.value.api_key_id,t=>{t||(R.value="",f.value=[])}),de(()=>r.value.account_id,t=>{t||($.value="",j.value=[])}),Ft(async()=>{document.addEventListener("click",V);try{const t=await ae.groups.list(1,1e3);se.value.push(...t.items.map(i=>({value:i.id,label:i.name})))}catch{}}),et(()=>{J(),document.removeEventListener("click",V)}),Q({setUserKeyword:t=>{J(),q.value=t,D.value=[],L.value=!1}}),(t,i)=>(m(),v("div",{class:Ee(k.flat?"p-4 sm:p-6":"card p-6")},[s("div",Aa,[s("div",Ma,[s("div",{ref_key:"userSearchRef",ref:U,class:"usage-filter-dropdown relative w-full sm:w-auto
2sm:min-w-[240px]"},[s("label",Pa,u(g(d)("admin.usage.userFilter")),1),ke(s("input",{"onUpdate:modelValue":i[0]||(i[0]=p=>q.value=p),type:"text",class:"input pr-8",placeholder:g(d)("admin.usage.searchUserPlaceholder"),onInput:ve,onFocus:i[1]||(i[1]=p=>L.value=!0)},null,40,za),[[Xe,q.value]]),r.value.user_id?(m(),v("button",{key:0,type:"button",onClick:Ce,class:"absolute right-2 top-9 text-gray-400","aria-label":"Clear user filter"}," â ")):T("",!0),L.value&&(D.value.length>0||q.value)?(m(),v("div",Ia,[(m(!0),v(W,null,ce(D.value,p=>(m(),v("button",{key:p.id,type:"button",onClick:ee=>ue(p),class:"w-full px-4 py-2 text-left hover:bg-gray-100 dark:hover:bg-dark-700"},[s("span",null,[Ne(u(p.email),1),p.deleted?(m(),v("span",Ba,"ï¼"+u(g(d)("admin.usage.userDeletedBadge"))+"ï¼",1)):T("",!0)]),s("span",Na,"#"+u(p.id),1)],8,Oa))),128))])):T("",!0)],512),s("div",{ref_key:"apiKeySearchRef",ref:F,class:"usage-filter-dropdown relative w-full sm:w-auto sm:min-w-[240px]"},[s("label",Ka,u(g(d)("usage.apiKeyFilter")),1),ke(s("input",{"onUpdate:modelValue":i[2]||(i[2]=p=>R.value=p),type:"text",class:"input pr-8",placeholder:g(d)("admin.usage.searchApiKeyPlaceholder"),onInput:re,onFocus:Le},null,40,ja),[[Xe,R.value]]),r.value.api_key_id?(m(),v("button",{key:0,type:"button",onClick:x,class:"absolute right-2 top-9 text-gray-400","aria-label":"Clear API key filter"}," â ")):T("",!0),A.value&&f.value.length>0?(m(),v("div",Ha,[(m(!0),v(W,null,ce(f.value,p=>(m(),v("button",{key:p.id,type:"button",onClick:ee=>ye(p),class:"w-full px-4 py-2 text-left hover:bg-gray-100 dark:hover:bg-dark-700"},[s("span",Ja,u(p.name||`#${p.id}`),1),s("span",Ya,"#"+u(p.id),1)],8,Ga))),128))])):T("",!0)],512),s("div",Qa,[s("label",Wa,u(g(d)("usage.model")),1),h(te,{modelValue:r.value.model,"onUpdate:modelValue":i[3]||(i[3]=p=>r.value.model=p),options:Z.value,searchable:"",onChange:C},null,8,["modelValue","options"])]),s("div",{ref_key:"accountSearchRef",ref:O,class:"usage-filter-dropdown relative w-full sm:w-auto sm:min-w-[220px]"},[s("label",Xa,u(g(d)("admin.usage.account")),1),ke(s("input",{"onUpdate:modelValue":i[4]||(i[4]=p=>$.value=p),type:"text",class:"input pr-8",placeholder:g(d)("admin.usage.searchAccountPlaceholder"),onInput:S,onFocus:i[5]||(i[5]=p=>X.value=!0)},null,40,Za),[[Xe,$.value]]),r.value.account_id?(m(),v("button",{key:0,type:"button",onClick:Se,class:"absolute right-2 top-9 text-gray-400","aria-label":"Clear account filter"}," â ")):T("",!0),X.value&&(j.value.length>0||$.value)?(m(),v("div",es,[(m(!0),v(W,null,ce(j.value,p=>(m(),v("button",{key:p.id,type:"button",onClick:ee=>$e(p),class:"w-full px-4 py-2 text-left hover:bg-gray-100 dark:hover:bg-dark-700"},[s("span",as,u(p.name),1),s("span",ss,"#"+u(p.id),1)],8,ts))),128))])):T("",!0)],512),k.mode!=="errors"?(m(),v("div",ls,[s("label",os,u(g(d)("usage.type")),1),h(te,{modelValue:r.value.request_type,"onUpdate:modelValue":i[6]||(i[6]=p=>r.value.request_type=p),options:me.value,onChange:C},null,8,["modelValue","options"])])):T("",!0),k.mode!=="errors"?(m(),v("div",ns,[s("label",rs,u(g(d)("admin.usage.billingType")),1),h(te,{modelValue:r.value.billing_type,"onUpdate:modelValue":i[7]||(i[7]=p=>r.value.billing_type=p),options:ge.value,onChange:C},null,8,["modelValue","options"])])):T("",!0),k.mode==="usage"?(m(),v("div",us,[s("label",is,u(g(d)("admin.usage.billingMode")),1),h(te,{modelValue:r.value.billing_mode,"onUpdate:modelValue":i[8]||(i[8]=p=>r.value.billing_mode=p),options:ne.value,onChange:C},null,8,["modelValue","options"])])):T("",!0),k.mode==="errors"?(m(),v("div",ds,[s("label",cs,u(g(d)("admin.ops.errorLog.type")),1),h(te,{modelValue:r.value.error_phase,"onUpdate:modelValue":i[9]||(i[9]=p=>r.value.error_phase=p),options:N.value,onChange:C},null,8,["modelValue","options"])])):T("",!0),k.mode==="errors"?(m(),v("div",ms,[s("label",gs,u(g(d)("usage.errors.category")),1),h(te,{modelValue:r.value.error_category,"onUpdate:modelValue":i[10]||(i[10]=p=>r.value.error_category=p),options:pe.value,onChange:C},null,8,["modelValue","options"])])):T("",!0),k.mode==="errors"?(m(),v("div",ps,[s("label",vs,u(g(d)("admin.ops.errorLog.status")),1),h(te,{modelValue:r.value.status_code,"onUpdate:modelValue":i[11]||(i[11]=p=>r.value.status_code=p),options:K.value,onChange:C},null,8,["modelValue","options"])])):T("",!0),s("div",ys,[s("label",_s,u(g(d)("admin.usage.group")),1),h(te,{modelValue:r.value.group_id,"onUpdate:modelValue":i[12]||(i[12]=p=>r.value.group_id=p),options:se.value,searchable:"",onChange:C},null,8,["modelValue","options"])])]),k.showActions?(m(),v("div",fs,[s("button",{type:"button",onClick:i[13]||(i[13]=p=>t.$emit("refresh")),class:"btn btn-secondary"},u(g(d)("common.refresh")),1),s("button",{type:"button",onClick:i[14]||(i[14]=p=>t.$emit("reset")),class:"btn btn-secondary"},u(g(d)("common.reset")),1),_a(t.$slots,"after-reset"),k.mode==="usage"?(m(),v(W,{key:0},[s("button",{type:"button",onClick:i[15]||(i[15]=p=>t.$emit("cleanup")),class:"btn btn-danger"}
2,u(g(d)("admin.usage.cleanup.button")),1),s("button",{type:"button",onClick:i[16]||(i[16]=p=>t.$emit("export")),disabled:k.exporting,class:"btn btn-primary"},u(g(d)("usage.exportExcel")),9,bs)],64)):T("",!0)])):T("",!0)])],2))}}),hs={class:"space-y-4"},ks={class:"text-sm text-gray-600 dark:text-gray-400"},xs={class:"flex items-center justify-between text-sm text-gray-700 dark:text-gray-300"},ws={class:"font-medium text-gray-900 dark:text-white"},Cs={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-dark-700"},$s=["aria-valuenow","aria-label"],Ss={key:0,class:"text-xs text-gray-500 dark:text-gray-400","aria-live":"polite","aria-atomic":"true"},Ts=we({__name:"ExportProgressDialog",props:{show:{type:Boolean},progress:{},current:{},total:{},estimatedTime:{}},emits:["cancel"],setup(k,{emit:Q}){const a=k,E=Q,{t:y}=Re(),d=I(()=>{const U=Number.isFinite(a.progress)?a.progress:0;return Math.min(100,Math.max(0,Math.round(U)))}),r=()=>{E("cancel")};return(U,F)=>(m(),qe(Lt,{show:k.show,title:g(y)("usage.exporting"),width:"narrow",onClose:r},{footer:xe(()=>[s("button",{onClick:r,type:"button",class:"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:border-dark-600 dark:bg-dark-700 dark:text-gray-200 dark:hover:bg-dark-600 dark:focus:ring-offset-dark-800"},u(g(y)("usage.cancelExport")),1)]),default:xe(()=>[s("div",hs,[s("div",ks,u(g(y)("usage.exportingProgress")),1),s("div",xs,[s("span",null,u(g(y)("usage.exportedCount",{current:k.current,total:k.total})),1),s("span",ws,u(d.value)+"%",1)]),s("div",Cs,[s("div",{role:"progressbar","aria-valuenow":d.value,"aria-valuemin":"0","aria-valuemax":"100","aria-label":`${g(y)("usage.exportingProgress")}: ${d.value}%`,class:"h-2 rounded-full bg-primary-600 transition-all",style:fa({width:`${d.value}%`})},null,12,$s)]),k.estimatedTime?(m(),v("div",Ss,u(g(y)("usage.estimatedTime",{time:k.estimatedTime})),1)):T("",!0)])]),_:1},8,["show","title"]))}}),Ds=we({__name:"UsageExportProgress",props:{show:{type:Boolean},progress:{},current:{},total:{},estimatedTime:{}},emits:["cancel"],setup(k){return(Q,a)=>(m(),qe(Ts,{show:k.show,progress:k.progress,current:k.current,total:k.total,"estimated-time":k.estimatedTime,onCancel:a[0]||(a[0]=E=>Q.$emit("cancel"))},null,8,["show","progress","current","total","estimated-time"]))}}),Us={class:"flex flex-wrap items-center justify-between gap-3 border-b border-gray-100 px-4 py-3 dark:border-dark-700/50 sm:px-6"},Es={class:"text-xs text-gray-400 dark:text-gray-500"},qs={class:"flex items-center gap-3"},Rs={key:0,class:"text-xs text-gray-400 dark:text-gray-500"},Ls={class:"w-28"},Vs={class:"overflow-x-auto"},Fs={class:"w-full min-w-max divide-y divide-gray-200 dark:divide-dark-700"},As={class:"bg-gray-50 dark:bg-dark-800"},Ms={class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-dark-400"},Ps=["onClick"],zs={key:0,"aria-hidden":"true"},Is={class:"divide-y divide-gray-200 bg-white dark:divide-dark-700 dark:bg-dark-900"},Os={key:0},Bs=["colspan"],Ns={key:1},Ks=["colspan"],js=["title","onClick"],Hs={class:"px-4 py-3 sm:px-6"},Gs={key:1,class:"inline-block w-6 text-center text-sm tabular-nums text-gray-400"},Js=["title"],Ys={class:"ml-1 font-normal text-gray-400 dark:text-gray-500"},Qs={class:"whitespace-nowrap px-4 py-3 text-right text-sm tabular-nums text-gray-500 dark:text-gray-400"},Ws={class:"whitespace-nowrap px-4 py-3 text-right text-sm tabular-nums text-gray-500 dark:text-gray-400"},Xs={class:"whitespace-nowrap px-4 py-3 text-right text-sm tabular-nums text-gray-500 dark:text-gray-400"},Zs={class:"whitespace-nowrap px-4 py-3 text-right text-sm tabular-nums text-gray-500 dark:text-gray-400"},el={class:"whitespace-nowrap px-4 py-3 text-right text-sm font-medium tabular-nums text-gray-900 dark:text-gray-100"},tl={class:"whitespace-nowrap px-4 py-3 text-right text-sm font-medium tabular-nums text-green-600 dark:text-green-400"},al=we({__name:"UserTokenRanking",props:{startDate:{},endDate:{},filters:{},model:{}},emits:["select-user"],setup(k,{expose:Q}){const a=k,{t:E}=Re(),y=[{key:"requests",label:"admin.usage.tokenRanking.columns.requests"},{key:"input_tokens",label:"admin.usage.tokenRanking.columns.inputTokens"},{key:"output_tokens",label:"admin.usage.tokenRanking.columns.outputTokens"},{key:"cache_tokens",label:"admin.usage.tokenRanking.columns.cacheTokens"},{key:"total_tokens",label:"admin.usage.tokenRanking.columns.totalTokens"},{key:"actual_cost",label:"admin.usage.tokenRanking.columns.cost"}],d=[{value:20,label:"Top 20"},{value:50,label:"Top 50"},{value:100,label:"Top 100"},{value:200,label:"Top 200"}],r=["bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-400","bg-gray-200 text-gray-600 dark:bg-gray-500/20 dark:text-gray-300","bg-orange-100 text-orange-700 dark:bg-orange-500/20 dark:text-orange-400"],U=o([]),F=o(!1),O=o("total_tokens"),q=o(50);let D=0;const L=f=>ca(f),B=f=>ma(f,4),P=f=>{O.value!==f&&(O.value=f,R())},R=async()=>{const f=++D;F.value=!0;try{const A={...a.filters,start_date:a.startDate,end_date:a.endDate,sort_by:O.value,limit:q.value};a.model&&(A.model=a.model);const _=await da(A);if(f!==D)return;U.value=_.users||[]}catch{if(f!==D)return;U.value=[]}finally{f===D&&(F.value=!1)}};return de(()=>[a.startDate,a.endDate,a.model,JSON.stringify(a.filters)],()=>R(),{immediate:!0}),Q({reload:R}),(f,A)=>(m(),v("div",null,[s("div",Us,[s("p",Es,u(g(E)("admin.usage.tokenRanking.subtitle")),1),s("div",qs,[!F.value&&U.value.length>0?(m(),v("span",Rs,u(g(E)("admin.usage.tokenRanking.userCount",{count:U.value.length})),1)):T("",!0),s("div",Ls,[h(te,{modelValue:q.value,"onUpdate:modelValue":A[0]||(A[0]=_=>q.value=_),options:d,onChange:R},null,8,["modelValue"])])])]),s("div",Vs,[s("table",Fs,[s("thead",As,[s("tr",null,[A[1]||(A[1]=s("th",{class:"w-16 px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-dark-400 sm:px-6"},"#",-1)),s("th",Ms,u(g(E)("admin.usage.tokenRanking.columns.user")),1),(m(),v(W,null,ce(y,_=>s("th",{key:_.key,class:Ee(["cursor-pointer select-none whitespace-nowrap px-4 py-3 text-right text-xs font-medium uppercase tracking-wider transition-colors hover:bg-gray-100 dark:hover:bg-dark-700",O.value===_.key?"text-primary-600 dark:text-primary-400":"text-gray-500 dark:text-dark-400"]),onClick:$=>P(_.key)},[Ne(u(g(E)(_.label))+" ",1),O.value===_.key?(m(),v("span",zs,"â")):T("",!0)],10,Ps)),64))])]),s("tbody",Is,[F.value?(m(),v("tr",Os,[s("td",{colspan:y.length+2,class:"py-12 text-center"},[h(Ea)],8,Bs)])):U.value.length===0?(m(),v("tr",Ns,[s("td",{colspan:y.length+2,class:"py-12 text-center text-sm text-gray-400"},u(g(E)("admin.dashboard.noDataAvailable")),9,Ks)])):(m(!0),v(W,{key:2},ce(U.value,(_,$)=>(m(),v("tr",{key:_.user_id,class:"cursor-pointer transition-colors hover:bg-gray-50 dark:hover:bg-dark-700/40",title:g(E)("admin.usage.tokenRanking.rowHint"),onClick:j=>f.$emit("select-user",_.user_id,_.email)},[s("td",Hs,[$<3?(m(),v("span",{key:0,class:Ee(["inline-flex h-6 w-6 items-center justify-center rounded-full text-xs font-semibold",r[$]])},u($+1),3)):(m(),v("span",Gs,u($+1),1))]),s("td",{class:"max-w-[260px] truncate px-4 py-3 text-sm font-medium text-gray-700 dark:text-gray-200",title:_.email},[Ne(u(_.email||`User #${_.user_id}`)+" ",1),s("span",Ys,"#"+u(_.user_id),1)],8,Js),s("td",Qs,u(_.requests.toLocaleStr
2ing()),1),s("td",Ws,u(L(_.input_tokens)),1),s("td",Xs,u(L(_.output_tokens)),1),s("td",Zs,u(L(_.cache_tokens)),1),s("td",el,u(L(_.total_tokens)),1),s("td",tl,"$"+u(B(_.actual_cost)),1)],8,js))),128))])])])]))}}),sl={class:"space-y-4"},ll={class:"rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200"},ol={class:"rounded-xl border border-gray-200 p-4 dark:border-dark-700"},nl={class:"flex items-center justify-between"},rl={class:"text-sm font-semibold text-gray-700 dark:text-gray-200"},ul={class:"mt-3 space-y-2"},il={key:0,class:"text-sm text-gray-500 dark:text-gray-400"},dl={key:1,class:"text-sm text-gray-500 dark:text-gray-400"},cl={key:2,class:"space-y-2"},ml={class:"flex flex-wrap items-center justify-between gap-2"},gl={class:"flex items-center gap-2"},pl={class:"text-xs text-gray-400"},vl=["onClick"],yl={class:"text-xs text-gray-400"},_l={class:"flex flex-wrap items-center gap-4 text-xs text-gray-500 dark:text-gray-400"},fl={key:0,class:"text-xs text-rose-500"},bl={class:"flex justify-end gap-3"},hl=["disabled"],kl=we({__name:"UsageCleanupDialog",props:{show:{type:Boolean},filters:{},startDate:{},endDate:{}},emits:["close"],setup(k,{emit:Q}){const a=k,E=Q,{t:y}=Re(),d=Vt(),r=o({}),U=o(""),F=o(""),O=o([]),q=o(!1),D=o(1),L=o(5),B=o(0),P=o(!1),R=o(!1),f=
2o(!1),A=o(!1),_=o(null);let $=null;const j=()=>{},X=()=>{r.value={...a.filters},U.value=a.startDate,F.value=a.endDate,r.value.start_date=U.value,r.value.end_date=F.value,D.value=1,B.value=0},oe=()=>{Z(),$=window.setInterval(()=>{K()},1e4)},Z=()=>{$!==null&&(window.clearInterval($),$=null)},se=()=>{Z(),R.value=!1,f.value=!1,A.value=!1,_.value=null,P.value=!1,E("close")},me=c=>({pending:y("admin.usage.cleanup.status.pending"),running:y("admin.usage.cleanup.status.running"),succeeded:y("admin.usage.cleanup.status.succeeded"),failed:y("admin.usage.cleanup.status.failed"),canceled:y("admin.usage.cleanup.status.canceled")})[c]||c,ge=c=>({pending:"bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-200",running:"bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-200",succeeded:"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200",failed:"bg-rose-100 text-rose-700 dark:bg-rose-500/20 dark:text-rose-200",canceled:"bg-gray-200 text-gray-600 dark:bg-dark-600 dark:text-gray-300"})[c]||"bg-gray-100 text-gray-600",N=c=>{if(!c)return"--";const x=new Date(c);return Number.isNaN(x.getTime())?c:x.toLocaleString()},H=c=>{const x=N(c.filters.start_time),S=N(c.filters.end_time);return`${x} ~ ${S}`},pe=()=>{try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return"UTC"}},K=async()=>{if(a.show){q.value=!0;try{const c=await Be.listCleanupTasks({page:D.value,page_size:L.value});O.value=c.items||[],B.value=c.total||0,c.page&&(D.value=c.page),c.page_size&&(L.value=c.page_size)}catch(c){console.error("Failed to load cleanup tasks:",c),d.showError(y("admin.usage.cleanup.loadFailed"))}finally{q.value=!1}}},ne=c=>{D.value=c,K()},C=c=>{!Number.isFinite(c)||c<=0||(L.value=c,D.value=1,K())},J=()=>{R.value=!0},ve=c=>c.status==="pending"||c.status==="running",re=c=>{_.value=c,f.value=!0},ue=()=>{if(!U.value||!F.value)return d.showError(y("admin.usage.cleanup.missingRange")),null;const c={start_date:U.value,end_date:F.value,timezone:pe()};if(r.value.user_id&&r.value.user_id>0&&(c.user_id=r.value.user_id),r.value.api_key_id&&r.value.api_key_id>0&&(c.api_key_id=r.value.api_key_id),r.value.account_id&&r.value.account_id>0&&(c.account_id=r.value.account_id),r.value.group_id&&r.value.group_id>0&&(c.group_id=r.value.group_id),r.value.model&&(c.model=r.value.model),r.value.request_type){c.request_type=r.value.request_type;const x=Ue(r.value.request_type);x!=null&&(c.stream=x)}else r.value.stream!==null&&r.value.stream!==void 0&&(c.stream=r.value.stream);return r.value.billing_type!==null&&r.value.billing_type!==void 0&&(c.billing_type=r.value.billing_type),c},Ce=async()=>{const c=ue();if(!c){R.value=!1;return}P.value=!0,R.value=!1;try{await Be.createCleanupTask(c),d.showSuccess(y("admin.usage.cleanup.submitSuccess")),K()}catch(x){console.error("Failed to create cleanup task:",x),d.showError(y("admin.usage.cleanup.submitFailed"))}finally{P.value=!1}},ye=async()=>{const c=_.value;if(!c){f.value=!1;return}A.value=!0,f.value=!1;try{await Be.cancelCleanupTask(c.id),d.showSuccess(y("admin.usage.cleanup.cancelSuccess")),K()}catch(x){console.error("Failed to cancel cleanup task:",x),d.showError(y("admin.usage.cleanup.cancelFailed"))}finally{A.value=!1,_.value=null}};return de(()=>a.show,c=>{c?(X(),K(),oe()):Z()}),et(()=>{Z()}),(c,x)=>(m(),v(W,null,[h(Lt,{show:k.show,title:g(y)("admin.usage.cleanup.title"),width:"wide",onClose:se},{footer:xe(()=>[s("div",bl,[s("button",{type:"button",class:"btn btn-secondary",onClick:se},u(g(y)("common.cancel")),1),s("button",{type:"button",class:"btn btn-danger",disabled:P.value,onClick:J},u(P.value?g(y)("admin.usage.cleanup.submitting"):g(y)("admin.usage.cleanup.submit")),9,hl)])]),default:xe(()=>[s("div",sl,[h(Mt,{modelValue:r.value,"onUpdate:modelValue":x[0]||(x[0]=S=>r.value=S),startDate:U.value,"onUpdate:startDate":x[1]||(x[1]=S=>U.value=S),endDate:F.value,"onUpdate:endDate":x[2]||(x[2]=S=>F.value=S),exporting:!1,"show-actions":!1,onChange:j},null,8,["modelValue","startDate","endDate"]),s("div",ll,u(g(y)("admin.usage.cleanup.warning")),1),s("div",ol,[s("div",nl,[s("h4",rl,u(g(y)("admin.usage.cleanup.recentTasks")),1),s("button",{type:"button",class:"btn btn-ghost btn-sm",onClick:K},u(g(y)("common.refresh")),1)]),s("div",ul,[q.value?(m(),v("div",il,u(g
2(y)("admin.usage.cleanup.loadingTasks")),1)):O.value.length===0?(m(),v("div",dl,u(g(y)("admin.usage.cleanup.noTasks")),1)):(m(),v("div",cl,[(m(!0),v(W,null,ce(O.value,S=>(m(),v("div",{key:S.id,class:"flex flex-col gap-2 rounded-lg border border-gray-100 px-3 py-2 text-sm text-gray-600 dark:border-dark-700 dark:text-gray-300"},[s("div",ml,[s("div",gl,[s("span",{class:Ee([ge(S.status),"rounded-full px-2 py-0.5 text-xs font-semibold"])},u(me(S.status)),3),s("span",pl,"#"+u(S.id),1),ve(S)?(m(),v("button",{key:0,type:"button",class:"btn btn-ghost btn-xs text-rose-600 hover:text-rose-700 dark:text-rose-300",onClick:$e=>re(S)},u(g(y)("admin.usage.cleanup.cancel")),9,vl)):T("",!0)]),s("div",yl,u(N(S.created_at)),1)]),s("div",_l,[s("span",null,u(g(y)("admin.usage.cleanup.range"))+": "+u(H(S)),1),s("span",null,u(g(y)("admin.usage.cleanup.deletedRows"))+": "+u(S.deleted_rows.toLocaleString()),1)]),S.error_message?(m(),v("div",fl,u(S.error_message),1)):T("",!0)]))),128))]))]),B.value>L.value?(m(),qe(At,{key:0,class:"mt-4",total:B.value,page:D.value,"page-size":L.value,"page-size-options":[5],"show-page-size-selector":!1,"show-jump":!0,"onUpdate:page":ne,"onUpdate:pageSize":C},null,8,["total","page","page-size"])):T("",!0)])])]),_:1},8,["show","title"]),h(Et,{show:R.value,title:g(y)("admin.usage.cleanup.confirmTitle"),message:g(y)("admin.usage.cleanup.confirmMessage"),"confirm-text":g(y)("admin.usage.cleanup.confirmSubmit"),danger:"",onConfirm:Ce,onCancel:x[3]||(x[3]=S=>R.value=!1)},null,8,["show","title","message","confirm-text"]),h(Et,{show:f.value,title:g(y)("admin.usage.cleanup.cancelConfirmTitle"),message:g(y)("admin.usage.cleanup.cancelConfirmMessage"),"confirm-text":g(y)("admin.usage.cleanup.cancelConfirm"),danger:"",onConfirm:ye,onCancel:x[4]||(x[4]=S=>f.value=!1)},null,8,["show","title","message","confirm-text"])],64))}}),xl={class:"space-y-6"},wl={class:"space-y-4"},Cl={class:"card p-4"},$l={class:"flex flex-wrap items-center gap-4"},Sl={class:"flex items-center gap-2"},Tl={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Dl={class:"ml-auto flex items-center gap-2"},Ul={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},El={class:"w-28"},ql={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Rl={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Ll={class:"card"},Vl={class:"flex flex-wrap items-center border-b border-gray-200 px-2 dark:border-dark-700 sm:px-4"},Fl=["onClick"],Al=["title"],Ml={class:"hidden md:inline"},Pl={key:0,class:"absolute right-0 top-full z-50 mt-1 max-h-80 w-48 overflow-y-auto rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-dark-600 dark:bg-dark-800"},zl=["onClick"],Il={class:"overflow-hidden rounded-b-2xl"},Ol={class:"overflow-hidden rounded-b-2xl"},Bl={key:0,class:"overflow-hidden rounded-b-2xl"},qt="usage-hidden-columns",Rt="usage-error-hidden-columns",po=we({__name:"UsageView",setup(k,{expose:Q}){const{t:a}=Re(),E=Vt(),y=ba(),d=o(null),r=o([]),U=o(!1),F=o(!1),O=o([]),q=o([]),D=o([]),L=o([]),B=o([]),P=o(!1),R=o(!1),f=
2o("hour"),A=o("tokens"),_=o("requested"),$=he({requested:!1,upstream:!1,mapping:!1}),j=o("tokens"),X=o("tokens"),oe=o("inbound"),Z=o([]),se=o([]),me=o([]),ge=o(!1);let N=null,H=null,pe=0,K=0,ne=0;const C=he({show:!1,progress:0,current:0,total:0,estimatedTime:""}),J=o(!1),ve=o(!1),re=o(null),ue=I(()=>{const e={};return t.value.user_id&&(e.user_id=t.value.user_id),t.value.api_key_id&&(e.api_key_id=t.value.api_key_id),t.value.account_id&&(e.account_id=t.value.account_id),t.value.group_id&&(e.group_id=t.value.group_id),t.value.request_type!=null&&(e.request_type=t.value.request_type),t.value.billing_type!=null&&(e.billing_type=t.value.billing_type),e}),Ce=I(()=>Array.from(new Set(q.value.map(e=>e.model).filter(Boolean))).sort()),ye=async e=>{try{const l=await ae.users.getById(e,!0);re.value=l,ve.value=!0}catch{E.showError(a("admin.usage.failedToLoadUser"))}},c=(e,l)=>{var n,w;t.value={...t.value,user_id:e},(w=(n=dt.value)==null?void 0:n.setUserKeyword)==null||w.call(n,l||""),G.value="usage",Pe()},x=I(()=>[{value:"day",label:a("admin.dashboard.day")},{value:"hour",label:a("admin.dashboard.hour")}]),S=e=>{const l=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),w=String(e.getDate()).padStart(2,"0");return`${l}-${n}-${w}`},$e=()=>{const e=new Date,l=new Date(e.getTime()-24*60*60*1e3);return{start:S(l),end:S(e)}},Se=(e,l)=>{const n=new Date(`${e}T00:00:00`).getTime(),w=new Date(`${l}T00:00:00`).getTime();return Math.ceil((w-n)/(1e3*60*60*24))<=1?"hour":"day"},Le=$e(),V=o(Le.start),M=o(Le.end),t=o({user_id:void 0,model:void 0,group_id:void 0,request_type:void 0,billing_type:null,start_date:V.value,end_date:M.value}),i=he({page:1,page_size:ka(),total:0}),p=he({sort_by:"created_at",sort_order:"desc"}),ee=e=>Array.isArray(e)?e.find(l=>typeof l=="string"&&l.length>0):typeof e=="string"&&e.length>0?e:void 0,Te=e=>{const l=ee(e);if(!l)return;const n=Number(l);return Number.isFinite(n)?n:void 0},Ve=()=>{const e=ee(y.query.start_date),l=ee(y.query.end_date),n=Te(y.query.user_id);e&&(V.value=e),l&&(M.value=l),t.value={...t.value,user_id:n,start_date:V.value,end_date:M.value},f.value=Se(V.value,M.value)},Fe=e=>{V.value=e.startDate,M.value=e.endDate,t.value={...t.value,start_date:e.startDate,end_date:e.endDate},f.value=Se(e.startDate,e.endDate),Pe()},De=(e,l,n)=>{const w=t.value.request_type,z=w?Ue(w):t.value.stream;return{page:e,page_size:l,exact_total:n,...t.value,stream:z===null?void 0:z,sort_by:p.sort_by,sort_order:p.sort_order}},_e=async()=>{N==null||N.abort();const e=new AbortController;N=e,U.value=!0;try{const l=await ae.usage.list(De(i.page,i.page_size,!1),{signal:e.signal});e.signal.aborted||(r.value=l.items,i.total=l.total)}catch(l){(l==null?void 0:l.name)!=="AbortError"&&console.error("Failed to load usage logs:",l)}finally{N===e&&(U.value=!1)}},Ke=async(e=!1)=>{const l=++K;ge.value=!0;try{const n=t.value.request_type,w=n?Ue(n):t.value.stream,z=await ae.usage.getStats({...t.value,stream:w===null?void 0:w,...e?{nocache:1}:{}});if(l!==K)return;d.value=z,Z.value=z.endpoints||[],se.value=z.upstream_endpoints||[],me.value=z.endpoint_paths||[]}catch(n){if(l!==K)return;console.error("Failed to load usage stats:",n),Z.value=[],se.value=[],me.value=[]}finally{l===K&&(ge.value=!1)}},tt=()=>{$.requested=!1,$.upstream=!1,$.mapping=!1},Ae=async(e,l=!1)=>{if(!l&&$[e])return;const n=++ne;R.value=!0;try{const w=t.value.request_type,z=w?Ue(w):t.value.stream,Qe={start_date:t.value.start_date||V.value,end_date:t.value.end_date||M.value,user_id:t.value.user_id,model:t.value.model,api_key_id:t.value.a
2pi_key_id,account_id:t.value.account_id,group_id:t.value.group_id,request_type:w,stream:z===null?void 0:z,billing_type:t.value.billing_type},Oe=await ae.dashboard.getModelStats({...Qe,model_source:e});if(n!==ne)return;const Y=Oe.models||[];e==="requested"?q.value=Y:e==="upstream"?D.value=Y:L.value=Y,$[e]=!0}catch(w){if(n!==ne)return;console.error("Failed to load model stats:",w),e==="requested"?q.value=[]:e==="upstream"?D.value=[]:L.value=[],$[e]=!1}finally{n===ne&&(R.value=!1)}},Me=async()=>{const e=++pe;P.value=!0;try{const l=t.value.request_type,n=l?Ue(l):t.value.stream,w=await ae.dashboard.getSnapshotV2({start_date:t.value.start_date||V.value,end_date:t.value.end_date||M.value,granularity:f.value,user_id:t.value.user_id,model:t.value.model,api_key_id:t.value.api_key_id,account_id:t.value.account_id,group_id:t.value.group_id,request_type:l,stream:n===null?void 0:n,billing_type:t.value.billing_type,include_stats:!1,include_trend:!0,include_model_stats:!1,include_group_stats:!0,include_users_trend:!1});if(e!==pe)return;O.value=w.trend||[],B.value=w.groups||[]}catch(l){console.error("Failed to load chart data:",l)}finally{e===pe&&(P.value=!1)}},Pe=()=>{i.page=1,tt(),_e(),Ke(),Ae(_.value,!0),Me(),fe.value=1,G.value==="errors"?be():ze.value=[]},at=()=>{var e;tt(),_e(),Ke(!0),Ae(_.value,!0),Me(),G.value==="errors"&&be(),je.value&&((e=ct.value)==null||e.reload())},Pt=()=>{const e=$e();V.value=e.start,M.value=e.end,t.value={start_date:V.value,end_date:M.value,request_type:void 0,billing_type:null,billing_mode:void 0},f.value=Se(V.value,M.value),Pe()},zt=e=>{i.page=e,_e()},It=e=>{i.page_size=e,i.page=1,_e()},Ot=(e,l)=>{p.sort_by=e,p.sort_order=l,i.page=1,_e()},st=()=>{E.showError(a("usage.ipGeo.batchFailed"))},Bt=()=>H==null?void 0:H.abort(),Nt=()=>{J.value=!0},Kt=e=>{const l=$a(e);return a(l==="cyber"?"usage.cyber":l==="ws_v2"?"usage.ws":l==="stream"?"usage.stream":l==="sync"?"usage.sync":"usage.unknown")},jt=async()=>{if(F.value)return;F.value=!0,C.show=!0;const e=new AbortController;H=e;try{let l=1,n=i.total,w=0;const z=await ga(()=>import("./vendor-ui-cXGMPlE0.js").then(Y=>Y.x),__vite__mapDeps([0,1])),Qe=[a("usage.time"),a("admin.usage.user"),a("usage.apiKeyFilter"),a("admin.usage.account"),a("usage.model"),a("usage.upstreamModel"),a("usage.reasoningEffort"),a("admin.usage.group"),a("usage.inboundEndpoint"),a("usage.upstreamEndpoint"),a("usage.type"),a("admin.usage.inputTokens"),a("admin.usage.outputTokens"),a("admin.usage.cacheReadTokens"),a("admin.usage.cacheCreationTokens"),a("admin.usage.inputCost"),a("admin.usage.outputCost"),a("admin.usage.cacheReadCost"),a("admin.usage.cacheCreationCost"),a("usage.rate"),a("usage.accountMultiplier"),a("usage.original"),a("usage.userBilled"),a("usage.accountBilled"),a("usage.firstToken"),a("usage.duration"),a("admin.usage.requestId"),a("usage.userAgent"),a("admin.usage.ipAddress")],Oe=z.utils.aoa_to_sheet([Qe]);for(;;){const Y=await Be.list(De(l,100,!0),{signal:e.signal});if(e.signal.aborted)break;l===1&&(n=Y.total,C.total=n);const We=(Y.items||[]).map(b=>{var ft,bt,ht,kt,xt,wt,Ct,$t,St,Tt,Dt;return[b.created_at,((ft=b.user)==null?void 0:ft.email)||"",((bt=b.api_key)==null?void 0:bt.name)||"",((ht=b.account)==null?void 0:ht.name)||"",b.model,b.upstream_model||"",pa(b.reasoning_effort),((kt=b.group)==null?void 0:kt.name)||"",b.inbound_endpoint||"",b.upstream_endpoint||"",Kt(b),b.input_tokens,b.output_tokens,b.cache_read_tokens,b.cache_creation_tokens,((xt=b.input_cost)==null?void 0:xt.toFixed(6))||"0.000000",((wt=b.output_cost)==null?void 0:wt.toFixed(6))||"0.000000",((Ct=b.cache_read_cost)==null?void 0:Ct.toFixed(6))||"0.000000",(($t=b.cache_creation_cost)==null?void 0:$t.toFixed(6))||"0.000000",((St=b.rate_multiplier)==null?void 0:St.toPrecision(4))||"1.00",(b.account_rate_multiplier??1).toPrecision(4),((Tt=b.total_cost)==null?void 0:Tt.toFixed(6))||"0.000000",((Dt=b.actual_cost)==null?void 0:Dt.toFixed(6))||"0.000000",((b.account_stats_cost??b.total_cost)*(b.account_rate_multiplier??1)).toFixed(6),b.first_token_ms??"",b.duration_ms,b.request_id||"",b.user_agent||"",b.ip_address||""]});if(We.length&&z.utils.sheet_add_aoa(Oe,We,{origin:-1}),w+=We.length,C.current=w,C.progress=n>0?Math.min(100,Math.round(w/n*100)):0,w>=n||Y.items.length<100)break;l++}if(!e.signal.aborted){const Y=z.utils.book_new();z.utils.book_append_sheet(Y,Oe,"Usage"),ha.saveAs(new Blob([z.write(Y,{bookType:"xlsx",type:"array"})],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),`usage_${t.value.start_date}_to_${t.value.end_date}.xlsx`),E.showSuccess(a("usage.exportSuccess"))}}catch(l){console.error("Failed to export:",l),E.showError("Export Failed")}finally{H===e&&(H=null,F.value=!1,C.show=!1)}},lt=["user","created_at"],ot=["reasoning_effort","user_agent"],nt=I(()=>[{key:"user",label:a("admin.usage.user"),sortable:!1},{key:"api_key",label:a("usage.apiKeyFilter"),sortable:!1},{key:"account",label:a("admin.usage.account"),sortable:!1},{key:"model",label:a("usage.model"),sortable:!0},{key:"reasoning_effort",label:a("usage.reasoningEffort"),sortable:!1},{key:"endpoint",label:a("usage.endpoint"),sortable:!1},{key:"group",label:a("admin.usage.group"),sortable:!1},{key:"stream",label:a("usage.type"),sortable:!1},{key:"billing_mode",label:a("admin.usage.billingMode"),sortable:!1},{key:"tokens",label:a("usage.tokens"),sortable:!1},{key:"cost",label:a("usage.cost"),sortable:!1},{key:"latency",label:a("usage.latency"),sortable:!1},{key:"created_at",label:a("usage.time"),sortable:!0},{key:"user_agent",label:a("usage.userAgent"),sortable:!1},{key:"ip_address",label:a("admin.usage.ipAddress"),sortable:!1}]),le=he(new Set),Ht=I(()=>nt.value.filter(e=>
2!lt.includes(e.key))),Gt=I(()=>nt.value.filter(e=>lt.includes(e.key)||!le.has(e.key))),Jt=e=>!le.has(e),Yt=e=>{le.has(e)?le.delete(e):le.add(e);try{localStorage.setItem(qt,JSON.stringify([...le]))}catch(l){console.error("Failed to save columns:",l)}},rt=["user","status","created_at","actions"],ut=["user_agent"],it=I(()=>[{key:"user",label:a("admin.ops.errorLog.user")},{key:"api_key",label:a("admin.ops.errorLog.apiKey")},{key:"account",label:a("admin.ops.errorLog.account")},{key:"platform",label:a("admin.ops.errorLog.platform")},{key:"model",label:a("admin.ops.errorLog.model")},{key:"endpoint",label:a("admin.ops.errorLog.endpoint")},{key:"group",label:a("admin.ops.errorLog.group")},{key:"type",label:a("admin.ops.errorLog.type")},{key:"category",label:a("usage.errors.category")},{key:"status",label:a("admin.ops.errorLog.status")},{key:"message",label:a("admin.ops.errorLog.message")},{key:"created_at",label:a("admin.ops.errorLog.time")},{key:"user_agent",label:a("usage.userAgent")},{key:"client_ip",label:a("admin.ops.errorLog.ip")},{key:"actions",label:a("admin.ops.errorLog.action")}]),ie=he(new Set),Qt=I(()=>it.value.filter(e=>!rt.includes(e.key))),Wt=I(()=>it.value.filter(e=>rt.includes(e.key)||!ie.has(e.key)).map(e=>e.key)),Xt=e=>{ie.has(e)?ie.delete(e):ie.add(e);try{localStorage.setItem(Rt,JSON.stringify([...ie]))}catch(l){console.error("Failed to save error columns:",l)}},Zt=()=>{try{const e=localStorage.getItem(Rt);(e?JSON.parse(e):ut).forEach(n=>ie.add(n))}catch{ut.forEach(e=>ie.add(e))}},ea=I(()=>G.value==="errors"?Qt.value:Ht.value),ta=e=>G.value==="errors"?!ie.has(e):Jt(e),aa=e=>G.value==="errors"?Xt(e):Yt(e),sa=()=>{try{const e=localStorage.getItem(qt);e?JSON.parse(e).forEach(l=>{le.add(l)}):ot.forEach(l=>{le.add(l)})}catch{ot.forEach(e=>{le.add(e)})}},G=o("usage"),la=I(()=>[{key:"usage",label:a("usage.tabs.usage"),icon:"document"},{key:"errors",label:a("usage.tabs.errors"),icon:"exclamationTriangle"},{key:"ranking",label:a("usage.tabs.ranking"),icon:"chart"}]),dt=o(null),je=o(!1),ct=o(null),oa=e=>{G.value=e,e==="errors"&&ze.value.length===0&&be(),e==="ranking"&&(je.value=!0)},ze=o([]),He=o(!1),fe=o(1),Ge=o(20),mt=o(0),gt=o("created_at"),pt=o("desc"),Je=o(!1),vt=o(null),yt=(e,l=!1)=>e?new Date(e+(l?"T23:59:59.999":"T00:00:00")).toISOString():void 0,be=async()=>{He.value=!0;try{const e=await va({page:fe.value,page_size:Ge.value,view:"all",start_time:yt(t.value.start_date),end_time:yt(t.value.end_date,!0),user_id:t.value.user_id??void 0,api_key_id:t.value.a
2pi_key_id??void 0,account_id:t.value.account_id??void 0,group_id:t.value.group_id??void 0,model:t.value.model||void 0,phase:t.value.error_phase||void 0,category:t.value.error_category||void 0,status_codes:t.value.status_code!=null?String(t.value.status_code):void 0,sort_by:gt.value,sort_order:pt.value});ze.value=e.items,mt.value=e.total}catch(e){console.error("Failed to load admin errors:",e),E.showError(a("usage.errors.failedToLoad"))}finally{He.value=!1}},na=(e,l)=>{gt.value=e,pt.value=l,fe.value=1,be()},ra=e=>{fe.value=e,be()},ua=e=>{Ge.value=e,fe.value=1,be()},ia=e=>{vt.value=e,Je.value=!0},Ie=o(!1),Ye=o(null),_t=e=>{Ye.value&&!Ye.value.contains(e.target)&&(Ie.value=!1)};return Ft(()=>{Ve(),_e(),Ke(),Ae(_.value,!0),window.setTimeout(()=>{Me()},120),sa(),Zt(),document.addEventListener("click",_t)}),et(()=>{N==null||N.abort(),H==null||H.abort(),document.removeEventListener("click",_t)}),de(_,e=>{Ae(e)}),Q({requestedModelStats:q,refreshData:at}),(e,l)=>(m(),v(W,null,[h(Sa,null,{default:xe(()=>[s("div",xl,[h(xa,{stats:d.value},null,8,["stats"]),s("div",wl,[s("div",Cl,[s("div",$l,[s("div",Sl,[s("span",Tl,u(g(a)("admin.dashboard.timeRange"))+":",1),h(Ta,{"start-date":V.value,"onUpdate:startDate":l[0]||(l[0]=n=>V.value=n),"end-date":M.value,"onUpdate:endDate":l[1]||(l[1]=n=>M.value=n),onChange:Fe}
2,null,8,["start-date","end-date"])]),s("div",Dl,[s("span",Ul,u(g(a)("admin.dashboard.granularity"))+":",1),s("div",El,[h(te,{modelValue:f.value,"onUpdate:modelValue":l[2]||(l[2]=n=>f.value=n),options:x.value,onChange:Me},null,8,["modelValue","options"])])])])]),s("div",ql,[h(Va,{source:_.value,"onUpdate:source":l[3]||(l[3]=n=>_.value=n),metric:A.value,"onUpdate:metric":l[4]||(l[4]=n=>A.value=n),"model-stats":q.value,"upstream-model-stats":D.value,"mapping-model-stats":L.value,loading:R.value,"show-source-toggle":!0,"show-metric-toggle":!0,"start-date":V.value,"end-date":M.value,filters:ue.value},null,8,["source","metric","model-stats","upstream-model-stats","mapping-model-stats","loading","start-date","end-date","filters"]),h(wa,{metric:j.value,"onUpdate:metric":l[5]||(l[5]=n=>j.value=n),"group-stats":B.value,loading:P.value,"show-metric-toggle":!0,"start-date":V.value,"end-date":M.value,filters:ue.value},null,8,["metric","group-stats","loading","start-date","end-date","filters"])]),s("div",Rl,[h(Fa,{source:oe.value,"onUpdate:source":l[6]||(l[6]=n=>oe.value=n),metric:X.value,"onUpdate:metric":l[7]||(l[7]=n=>X.value=n),"endpoint-stats":Z.value,"upstream-endpoint-stats":se.value,"endpoint-path-stats":me.value,loading:ge.value,"show-source-toggle":!0,"show-metric-toggle":!0,title:g(a)("usage.endpointDistribution"),"start-date":V.value,"end-date":M.value,filters:ue.value},null,8,["source","metric","endpoint-stats","upstream-endpoint-stats","endpoint-path-stats","loading","title","start-date","end-date","filters"]),h(Da,{"trend-data":O.value,loading:P.value},null,8,["trend-data","loading"])])]),s("div",Ll,[s("div",Vl,[(m(!0),v(W,null,ce(la.value,n=>(m(),v("button",{key:n.key,type:"button","data-testid":"usage-detail-tab",class:Ee(["-mb-px inline-flex items-center gap-1.5 border-b-2 px-3 py-3 text-sm font-medium transition-colors sm:px-4",G.value===n.key?"border-primary-500 text-primary-600 dark:text-primary-400":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:border-dark-500 dark:hover:text-gray-200"]),onClick:w=>oa(n.key)},[h(Ut,{name:n.icon,size:"sm"},null,8,["name"]),Ne(" "+u(n.label),1)],10,Fl))),128))]),h(Mt,{modelValue:t.value,"onUpdate:modelValue":l[9]||(l[9]=n=>t.value=n),ref_key:"usageFiltersRef",ref:dt,flat:"",mode:G.value,class:"border-b border-gray-100 dark:border-dark-700/50","start-date":V.value,"end-date":M.value,exporting:F.value,"model-options":Ce.value,onChange:Pe,onRefresh:at,onReset:Pt,onCleanup:Nt,onExport:jt},{"after-reset":xe(()=>[G.value!=="ranking"?(m(),v("div",{key:0,class:"relative",ref_key:"columnDropdownRef",ref:Ye},[s("button",{onClick:l[8]||(l[8]=n=>Ie.value=!Ie.value),class:"btn btn-secondary px-2 md:px-3",title:g(a)("admin.users.columnSettings")},[l[13]||(l[13]=s("svg",{class:"h-4 w-4 md:mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","stroke-width":"1.5"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9 4.5v15m6-15v15m-10.875 0h15.75c.621 0 1.125-.504 1.125-1.125V5.625c0-.621-.504-1.125-1.125-1.125H4.125C3.504 4.5 3 5.004 3 5.625v12.75c0 .621.504 1.125 1.125 1.125z"})],-1)),s("span",Ml,u(g(a)("admin.users.columnSettings")),1)],8,Al),Ie.value?(m(),v("div",Pl,[(m(!0),v(W,null,ce(ea.value,n=>(m(),v("button",{key:n.key,onClick:w=>aa(n.key),class:"flex w-full items-center justify-between px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-dark-700"},[s("span",null,u(n.label),1),ta(n.key)?(m(),qe(Ut,{key:0,name:"check",size:"sm",class:"text-primary-500","stroke-width":2})):T("",!0)],8,zl))),128))])):T("",!0)],512)):T("",!0)]),_:1},8,["modelValue","mode","start-date","end-date","exporting","model-options"]),ke(s("div",Il,[h(Ca,{flat:"",data:r.value,loading:U.value,columns:Gt.value,"server-side-sort":!0,"default-sort-key":"created_at","default-sort-order":"desc",onSort:Ot,onUserClick:ye,onIpGeoBatchFailed:st},null,8,["data","loading","columns"]),i.total>0?(m(),qe(At,{key:0,page:i.page,total:i.total,"page-size":i.page_size,"onUpdate:page":zt,"onUpdate:pageSize":It},null,8,["page","total","page-size"])):T("",!0)],512),[[Ze,G.value==="usage"]]),ke(s("div",Ol,[h(Ra,{flat:"",rows:ze.value,total:mt.value,loading:He.value,page:fe.value,"page-size":Ge.value,"visible-column-keys":Wt.value,"user-clickable":"",onUserClick:ye,onOpenErrorDetail:ia,onSort:na,"onUpdate:page":ra,"onUpdate:pageSize":ua,onIpGeoBatchFailed:st},null,8,["rows","total","loading","page","page-size","visible-column-keys"])],512),[[Ze,G.value==="errors"]]),je.value?ke((m(),v("div",Bl,[h(al,{ref_key:"rankingRef",ref:ct,"start-
2date":V.value,"end-date":M.value,filters:ue.value,model:t.value.model,onSelectUser:c},null,8,["start-date","end-date","filters","model"])],512)),[[Ze,G.value==="ranking"]]):T("",!0)]),h(La,{show:Je.value,"onUpdate:show":l[10]||(l[10]=n=>Je.value=n),"error-id":vt.value,"error-type":"request"},null,8,["show","error-id"])])]),_:1}),h(Ds,{show:C.show,progress:C.progress,current:C.current,total:C.total,"estimated-time":C.estimatedTime,onCancel:Bt},null,8,["show","progress","current","total","estimated-time"]),h(kl,{show:J.value,filters:t.value,"start-date":V.value,"end-date":M.value,onClose:l[11]||(l[11]=n=>J.value=!1)},null,8,["show","filters","start-date","end-date"]),h(qa,{show:ve.value,user:re.value,"hide-actions":!0,onClose:l[12]||(l[12]=n=>{ve.value=!1,re.value=null})},null,8,["show","user"])],64))}});export{po as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.