1import{d as xt,r as i,c as w,o as ht,D as ot,K as pt,B as t,z as f,E as M,k as l,G as s,u as r,Z as vt,F as kt,C as m}from"./vendor-vue-Dzwqm9Y9.js";import{a as ft,_ as u,j as B}from"./index-Dg7iAOYr.js";import{_ as yt}from"./AppLayout.vue_vue_type_script_setup_true_lang-CDGJUeC2.js";import{L as rt}from"./LoadingSpinner-CObn9Zi-.js";import{D as bt,_ as wt}from"./TokenUsageTrend.vue_vue_type_script_setup_true_lang-BCE9MD51.js";import{S as Dt}from"./Select-D8cj2YCx.js";import{a as St}from"./ModelDistributionChart.vue_vue_type_script_setup_true_lang-CvZaR2yo.js";import{u as Ct}from"./AppHeader.vue_vue_type_style_index_0_scoped_25b0c839_lang-B0lsvCqV.js";import{C as $t,b as Tt,L as Lt,P as zt,c as Rt,p as qt,a as Ft,i as Pt,d as Ut}from"./vendor-chart-BNlN3Otn.js";import{u as Vt}from"./vendor-i18n-BuoWFzps.js";import"./vendor-misc-B-nM3tYW.js";import"./useClipboard-DI2IZ1WO.js";import"./LocaleSwitcher-BZZz6YQD.js";/* empty css */const Et={class:"space-y-6"},Nt={key:0,class:"flex items-center justify-center py-12"},At={class:"grid grid-cols-2 gap-4 lg:grid-cols-4"},Mt={class:"card p-4"},Bt={class:"flex items-center gap-3"},It={class:"rounded-lg bg-blue-100 p-2 dark:bg-blue-900/30"},jt={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},Kt={class:"text-xl font-bold text-gray-900 dark:text-white"},Gt={class:"text-xs text-green-600 dark:text-green-400"},Ot={class:"card p-4"},Ht={class:"flex items-center gap-3"},Yt={class:"rounded-lg bg-purple-100 p-2 dark:bg-purple-900/30"},Zt={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},Jt={class:"text-xl font-bold text-gray-900 dark:text-white"},Qt={class:"text-xs"},Wt={class:"text-green-600 dark:text-green-400"},Xt={key:0,class:"ml-1 text-red-500"},te={class:"card p-4"},ee={class:"flex items-center gap-3"},ae={class:"rounded-lg bg-green-100 p-2 dark:bg-green-900/30"},se={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},oe={class:"text-xl font-bold text-gray-900 dark:text-white"},re={class:"text-xs text-gray-500 dark:text-gray-400"},ne={class:"card p-4"},de={class:"flex items-center gap-3"},le={class:"rounded-lg bg-emerald-100 p-2 dark:bg-emerald-900/30"},ie={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},ce={class:"text-xl font-bold text-emerald-600 dark:text-emerald-400"},ue={class:"text-xs text-gray-500 dark:text-gray-400"},ge={class:"grid grid-cols-2 gap-4 lg:grid-cols-4"},me={class:"card p-4"},_e={class:"flex items-center gap-3"},xe={class:"rounded-lg bg-amber-100 p-2 dark:bg-amber-900/30"},he={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},pe={class:"text-xl font-bold text-gray-900 dark:text-white"},ve={class:"text-xs"},ke=["title"],fe=["title"],ye=["title"],be={class:"card p-4"},we={class:"flex items-center gap-3"},De={class:"rounded-lg bg-indigo-100 p-2 dark:bg-indigo-900/30"},Se={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},Ce={class:"text-xl font-bold text-gray-900 dark:text-white"},$e={class:"text-xs"},Te=["title"],Le=["title"],ze=["title"],Re={class:"card p-4"},qe={class:"flex items-center gap-3"},Fe={class:"rounded-lg bg-violet-100 p-2 dark:bg-violet-900/30"},Pe={class:"flex-1"},Ue={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},Ve={class:"flex items-baseline gap-2"},Ee={class:"text-xl font-bold text-gray-900 dark:text-white"},Ne={class:"flex items-baseline gap-2"},Ae={class:"text-sm font-semibold text-violet-600 dark:text-violet-400"},Me={class:"card p-4"},Be={class:"flex items-center gap-3"},Ie={class:"rounded-lg bg-rose-100 p-2 dark:bg-rose-900/30"},je={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},Ke={class:"text-xl font-bold text-gray-900 dark:text-white"},Ge={class:"text-xs text-gray-500 dark:text-gray-400"},Oe={class:"card p-4"},He={class:"mb-3 flex items-center justify-between"},Ye={class:"text-sm font-semibold text-gray-900 dark:text-white"},Ze={class:"grid grid-cols-1 gap-3 md:grid-cols-2"},Je={class:"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-sky-100 text-sky-600 dark:bg-sky-900/30 dark:text-sky-400"},Qe={class:"min-w-0 flex-1"},We={class:"block text-sm font-medium text-gray-900 dark:text-white"},Xe={class:"block text-xs text-gray-500 dark:text-gray-400"},ta={class:"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-emerald-100 text-emerald-600 dark:bg-emerald-900/30 dark:text-emerald-400"},ea={class:"min-w-0 flex-1"},aa={class:"block text-sm font-medium text-gray-900 dark:text-white"},sa={class:"block text-xs text-gray-500 dark:text-gray-400"},oa={class:"space-y-6"},ra={class:"card p-4"},na={class:"flex flex-wrap items-center gap-4"},da={class:"flex items-center gap-2"},la={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},ia=["disabled"],ca={class:"ml-auto flex items-center gap-2"},ua={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},ga={class:"w-28"},ma={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},_a={class:"card p-4"},xa={class:"mb-4 text-sm font-semibold text-gray-900 dark:text-white"},ha={class:"h-64"},pa={key:0,class:"flex h-full items-center justify-center"},va={key:2,class:"flex h-full items-center justify-center text-sm text-gray-500 dark:text-gray-400"},ka=12,Ua=xt({__name:"DashboardView",setup(fa){const{t:o}=Vt();$t.register(Tt,Lt,zt,Rt,qt,Ft,Pt);const nt=ft(),R=vt(),{canUseBatchImage:dt,refreshBatchImageAccess:lt}=Ct(),n=i(null),q=i(!1),y=i(!1),F=i(!1),P=i(!1),U=i(!1),I=i([]),j=i([]),D=i([]),V=i([]),E=i(0),N=i(0),A=i(0);let S=0,C=0,$=0;const K=a=>`${a.getFullYear()}
1-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`,it=()=>{const a=new Date,e=new Date(a.getTime()-24*60*60*1e3);return{start:K(e),end:K(a)}},p=i("hour"),G=it(),_=i(G.start),x=i(G.end),ct=w(()=>[{value:"day",label:o("admin.dashboard.day")},{value:"hour",label:o("admin.dashboard.hour")}]),O=w(()=>document.documentElement.classList.contains("dark")),b=w(()=>({text:O.value?"#e5e7eb":"#374151",grid:O.value?"#374151":"#e5e7eb"})),ut=w(()=>({responsive:!0,maintainAspectRatio:!1,interaction:{intersect:!1,mode:"index"},plugins:{legend:{position:"top",labels:{color:b.value.text,usePointStyle:!0,pointStyle:"circle",padding:15,font:{size:11}}},tooltip:{itemSort:(a,e)=>{var h,L;const d=typeof(a==null?void 0:a.raw)=="number"?a.raw:Number(((h=a==null?void 0:a.parsed)==null?void 0:h.y)??0);return(typeof(e==null?void 0:e.raw)=="number"?e.raw:Number(((L=e==null?void 0:e.parsed)==null?void 0:L.y)??0))-d},callbacks:{label:a=>`${a.dataset.label}: ${v(a.raw)}`}}},scales:{x:{grid:{color:b.value.grid},ticks:{color:b.value.text,font:{size:10}}},y:{grid:{color:b.value.grid},ticks:{color:b.value.text,font:{size:10},callback:a=>v(Number(a))}}}})),H=w(()=>{var et;if(!((et=D.value)!=null&&et.length))return null;const a=c=>{var at,st;const g=(at=c.username)==null?void 0:at.trim();if(g)return g;const z=(st=c.email)==null?void 0:st.trim();return z||o("admin.redeem.userPrefix",{id:c.user_id})},e=new Map,d=new Set;D.value.forEach(c=>{d.add(c.date);const g=c.user_id;e.has(g)||e.set(g,{name:a(c),data:new Map}),e.get(g).data.set(c.date,c.tokens)});const T=Array.from(d).sort(),h=["#3b82f6","#10b981","#f59e0b","#ef4444","#8b5cf6","#ec4899","#14b8a6","#f97316","#6366f1","#84cc16","#06b6d4","#a855f7"],L=Array.from(e.values()).map((c,g)=>({label:c.name,data:T.map(z=>c.data.get(z)||0),borderColor:h[g%h.length],backgroundColor:`${h[g%h.length]}20`,fill:!1,tension:.3}));return{labels:T,datasets:L}}),v=a=>a==null?"0":a>=1e9?`${(a/1e9).toFixed(2)}B`:a>=1e6?`${(a/1e6).toFixed(2)}M`:a>=1e3?`${(a/1e3).toFixed(2)}K`:a.toLocaleString(),Y=a=>{const e=Number(a);return Number.isFinite(e)?e:0},Z=a=>Y(a).toLocaleString(),k=a=>{const e=Y(a);return e>=1e3?(e/1e3).toFixed(2)+"K":e>=1?e.toFixed(2):e>=.01?e.toFixed(3):e.toFixed(4)},gt=a=>a>=1e3?`${(a/1e3).toFixed(2)}s`:`${Math.round(a)}ms`,mt=a=>{R.push({path:"/admin/usage",query:{user_id:String(a.user_id),start_date:_.value,end_date:x.value}})},_t=a=>{const e=new Date(a.startDate),d=new Date(a.endDate);Math.ceil((d.getTime()-e.getTime())/(1e3*60*60*24))<=1?p.value="hour":p.value="day",tt()},J=async a=>{const e=++S;a&&!n.value&&(q.value=!0),y.value=!0;try{const d=await B.dashboard.getSnapshotV2({start_date:_.value,end_date:x.value,granularity:p.value,include_stats:a,include_trend:!0,include_model_stats:!0,include_group_stats:!1,include_users_trend:!1});if(e!==S)return;a&&d.stats&&(n.value=d.stats),I.value=d.trend||[],j.value=d.models||[]}catch(d){if(e!==S)return;nt.showError(o("admin.dashboard.failedToLoad")),console.error("Error loading dashboard snapshot:",d)}finally{e===S&&(q.value=!1,y.value=!1)}},Q=async()=>{const a=++C;F.value=!0;try{const e=await B.dashboard.getUserUsageTrend({start_date:_.value,end_date:x.value,granularity:p.value,limit:12});if(a!==C)return;D.value=e.trend||[]}catch(e){if(a!==C)return;console.error("Error loading users trend:",e),D.value=[]}finally{a===C&&(F.value=!1)}},W=async()=>{const a=++$;P.value=!0,U.value=!1;try{const e=await B.dashboard.getUserSpendingRanking({start_date:_.value,end_date:x.value,limit:ka});if(a!==$)return;V.value=e.ranking||[],E.value=e.total_actual_cost||0,N.value=e.total_requests||0,A.value=e.total_tokens||0}catch(e){if(a!==$)return;console.error("Error loading user spending ranking:",e),V.value=[],E.value=0,N.value=0,A.value=0,U.value=!0}finally{a===$&&(P.value=!1)}},X=async()=>{await Promise.all([J(!0),Q(),W()])},tt=async()=>{await Promise.all([J(!1),Q(),W()])};return ht(()=>{lt(),X()}),(a,e)=>(m(),ot(yt,null,{default:pt(()=>[t("div",Et,[q.value?(m(),f("div",Nt,[l(rt)])):n.value?(m(),f(kt,{key:1},[t("div",At,[t("div",Mt,[t("div",Bt,[t("div",It,[l(u,{name:"key",size:"md",class:"text-blue-600 dar
1k:text-blue-400","stroke-width":2})]),t("div",null,[t("p",jt,s(r(o)("admin.dashboard.apiKeys")),1),t("p",Kt,s(n.value.total_api_keys),1),t("p",Gt,s(n.value.active_api_keys)+" "+s(r(o)("common.active")),1)])])]),t("div",Ot,[t("div",Ht,[t("div",Yt,[l(u,{name:"server",size:"md",class:"text-purple-600 dark:text-purple-400","stroke-width":2})]),t("div",null,[t("p",Zt,s(r(o)("admin.dashboard.accounts")),1),t("p",Jt,s(n.value.total_accounts),1),t("p",Qt,[t("span",Wt,s(n.value.normal_accounts)+" "+s(r(o)("common.active")),1),n.value.error_accounts>0?(m(),f("span",Xt,s(n.value.error_accounts)+" "+s(r(o)("common.error")),1)):M("",!0)])])])]),t("div",te,[t("div",ee,[t("div",ae,[l(u,{name:"chart",size:"md",class:"text-green-600 dark:text-green-400","stroke-width":2})]),t("div",null,[t("p",se,s(r(o)("admin.dashboard.todayRequests")),1),t("p",oe,s(n.value.today_requests),1),t("p",re,s(r(o)("common.total"))+": "+s(Z(n.value.total_requests)),1)])])]),t("div",ne,[t("div",de,[t("div",le,[l(u,{name:"userPlus",size:"md",class:"text-emerald-600 dark:text-emerald-400","stroke-width":2})]),t("div",null,[t("p",ie,s(r(o)("admin.dashboard.users")),1),t("p",ce," +"+s(n.value.today_new_users),1),t("p",ue,s(r(o)("common.total"))+": "+s(Z(n.value.total_users)),1)])])])]),t("div",ge,[t("div",me,[t("div",_e,[t("div",xe,[l(u,{name:"cube",size:"md",class:"text-amber-600 dark:text-amber-400","stroke-width":2})]),t("div",null,[t("p",he,s(r(o)("admin.dashboard.todayTokens")),1),t("p",pe,s(v(n.value.today_tokens)),1),t("p",ve,[t("span",{class:"text-green-600 dark:text-green-400",title:r(o)("admin.dashboard.actual")},"$"+s(k(n.value.today_actual_cost)),9,ke),e[5]||(e[5]=t("span",{class:"text-gray-400 dark:text-gray-500"}," / ",-1)),t("span",{class:"text-orange-500 dark:text-orange-400",title:r(o)("admin.dashboard.accountCost")},"$"+s(k(n.value.today_account_cost)),9,fe),e[6]||(e[6]=t("span",{class:"text-gray-400 dark:text-gray-500"}," / ",-1)),t("span",{class:"text-gray-400 dark:text-gray-500",title:r(o)("admin.dashboard.standard")},"$"+s(k(n.value.today_cost)),9,ye)])])])]),t("div",be,[t("div",we,[t("div",De,[l(u,{name:"database",size:"md",class:"text-indigo-600 dark:text-indigo-400","stroke-width":2})]),t("div",null,[t("p",Se,s(r(o)("admin.dashboard.totalTokens")),1),t("p",Ce,s(v(n.value.total_tokens)),1),t("p",$e,[t("span",{class:"text-green-600 dark:text-green-400",title:r(o)("admin.dashboard.actual")},"$"+s(k(n.value.total_actual_cost)),9,Te),e[7]||(e[7]=t("span",{class:"text-gray-400 dark:text-gray-500"}," / ",-1)),t("span",{class:"text-orange-500 dark:text-orange-400",title:r(o)("admin.dashboard.accountCost")},"$"+s(k(n.value.total_account_cost)),9,Le),e[8]||(e[8]=t("span",{class:"text-gray-400 dark:text-gray-500"}," / ",-1)),t("span",{class:"text-gray-400 dark:text-gray-500",title:r(o)("admin.dashboard.standard")},"$"+s(k(n.value.total_cost)),9,ze)])])])]),t("div",Re,[t("div",qe,[t("div",Fe,[l(u,{name:"bolt",size:"md",class:"text-violet-600 dark:text-violet-400","stroke-width":2})]),t("div",Pe,[t("p",Ue,s(r(o)("admin.dashboard.performance")),1),t("div",Ve,[t("p",Ee,s(v(n.value.rpm)),1),e[9]||(e[9]=t("span",{class:"text-xs text-gray-500 dark:text-gray-400"},"RPM",-1))]),t("div",Ne,[t("p",Ae,s(v(n.value.tpm)),1),e[10]||(e[10]=t("span",{class:"text-xs text-gray-500 dark:text-gray-400"},"TPM",-1))])])])]),t("div",Me,[t("div",Be,[t("div",Ie,[l(u,{name:"clock",size:"md",class:"text-rose-600 dar
1k:text-rose-400","stroke-width":2})]),t("div",null,[t("p",je,s(r(o)("admin.dashboard.avgResponse")),1),t("p",Ke,s(gt(n.value.average_duration_ms)),1),t("p",Ge,s(n.value.active_users)+" "+s(r(o)("admin.dashboard.activeUsers")),1)])])])]),t("div",Oe,[t("div",He,[t("h2",Ye,s(r(o)("admin.dashboard.quickActions")),1)]),t("div",Ze,[r(dt)?(m(),f("button",{key:0,type:"button",class:"group flex items-center gap-3 rounded-lg bg-gray-50 p-3 text-left transition-colors hover:bg-sky-50 dark:bg-dark-800/50 dark:hover:bg-sky-900/20",onClick:e[0]||(e[0]=d=>r(R).push("/batch-image"))},[t("span",Je,[l(u,{name:"sparkles",size:"md","stroke-width":2})]),t("span",Qe,[t("span",We,s(r(o)("admin.dashboard.batchImage")),1),t("span",Xe,s(r(o)("admin.dashboard.batchImageDesc")),1)]),l(u,{name:"chevronRight",size:"sm",class:"text-gray-400 group-hover:text-sky-500"})])):M("",!0),t("button",{type:"button",class:"group flex items-center gap-3 rounded-lg bg-gray-50 p-3 text-left transition-colors hover:bg-emerald-50 dark:bg-dark-800/50 dark:hover:bg-emerald-900/20",onClick:e[1]||(e[1]=d=>r(R).push("/admin/groups"))},[t("span",ta,[l(u,{name:"grid",size:"md","stroke-width":2})]),t("span",ea,[t("span",aa,s(r(o)("admin.dashboard.groupPricing")),1),t("span",sa,s(r(o)("admin.dashboard.groupPricingDesc")),1)]),l(u,{name:"chevronRight",size:"sm",class:"text-gray-400 group-hover:text-emerald-500"})])])]),t("div",oa,[t("div",ra,[t("div",na,[t("div",da,[t("span",la,s(r(o)("admin.dashboard.timeRange"))+":",1),l(bt,{"start-date":_.value,"onUpdate:startDate":e[2]||(e[2]=d=>_.value=d),"end-date":x.value,"onUpdate:endDate":e[3]||(e[3]=d=>x.value=d),onChange:_t}
1,null,8,["start-date","end-date"])]),t("button",{onClick:X,disabled:y.value,class:"btn btn-secondary"},s(r(o)("common.refresh")),9,ia),t("div",ca,[t("span",ua,s(r(o)("admin.dashboard.granularity"))+":",1),t("div",ga,[l(Dt,{modelValue:p.value,"onUpdate:modelValue":e[4]||(e[4]=d=>p.value=d),options:ct.value,onChange:tt},null,8,["modelValue","options"])])])])]),t("div",ma,[l(St,{"model-stats":j.value,"enable-ranking-view":!0,"ranking-items":V.value,"ranking-total-actual-cost":E.value,"ranking-total-requests":N.value,"ranking-total-tokens":A.value,loading:y.value,"ranking-loading":P.value,"ranking-error":U.value,"start-date":_.value,"end-date":x.value,onRankingClick:mt},null,8,["model-stats","ranking-items","ranking-total-actual-cost","ranking-total-requests","ranking-total-tokens","loading","ranking-loading","ranking-error","start-date","end-date"]),l(wt,{"trend-data":I.value,loading:y.value},null,8,["trend-data","loading"])]),t("div",_a,[t("h3",xa,s(r(o)("admin.dashboard.recentUsage"))+" (Top 12) ",1),t("div",ha,[F.value?(m(),f("div",pa,[l(rt,{size:"md"})])):H.value?(m(),ot(r(Ut),{key:1,data:H.value,options:ut.value},null,8,["data","options"])):(m(),f("div",va,s(r(o)("admin.dashboard.noDataAvailable")),1))])])])],64)):M("",!0)])]),_:1}))}});export{Ua 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.