Files
darroyo ddc73957cb
CI / test (push) Failing after 12m38s
Fix: move keys and model-load routes under /api/v1/admin prefix
Routes now consistently under admin session auth:
- /api/v1/admin/keys (GET, POST, DELETE)
- /api/v1/admin/models/:name/load (POST)

Rebuilt frontend assets.
2026-07-31 17:17:23 -04:00

12 lines
5.5 KiB
JavaScript

import{d as A,q as C,c as e,a as t,t as d,F as h,b as _,e as m,n as L,g as b,i as M,r as u,s as v,o as a}from"./index-DGy3EgY7.js";import{c as y}from"./createLucideIcon-C8BmASko.js";import{C as N}from"./cpu-D29LpvoC.js";import{K as S}from"./key-BRxFGImj.js";/**
* @license lucide-vue-next v0.460.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const j=y("ActivityIcon",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/**
* @license lucide-vue-next v0.460.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const D=y("ClockIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]),F={key:0,class:"text-text-muted"},I={key:1,class:"p-4 bg-error/10 border border-error/20 rounded-lg text-error"},q={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8"},R={class:"card"},B={class:"flex items-center gap-4"},K={class:"w-12 h-12 bg-primary/10 rounded-xl flex items-center justify-center"},T={class:"text-2xl font-bold"},V={class:"card"},z={class:"flex items-center gap-4"},P={class:"w-12 h-12 bg-success/10 rounded-xl flex items-center justify-center"},$={class:"text-2xl font-bold"},E={class:"card"},H={class:"flex items-center gap-4"},Y={class:"w-12 h-12 bg-warning/10 rounded-xl flex items-center justify-center"},G={class:"text-2xl font-bold"},J={class:"card"},O={class:"flex items-center gap-4"},Q={class:"w-12 h-12 bg-info/10 rounded-xl flex items-center justify-center"},U={class:"text-2xl font-bold"},W={class:"card mb-8"},X={class:"flex items-center justify-between mb-4"},Z={key:0,class:"mb-4"},tt={class:"text-lg font-mono"},st={key:1,class:"p-3 bg-error/10 border border-error/20 rounded-lg text-error text-sm"},et={class:"card"},at={class:"table"},ot={class:"font-mono"},lt={class:"font-mono text-text-muted"},dt={key:0,class:"badge badge-info"},nt={key:1,class:"badge"},rt={key:0,class:"badge badge-success"},it={key:1,class:"badge"},ct=["onClick"],ut={key:1,class:"badge badge-success"},_t={key:0},bt=A({__name:"Dashboard",setup(mt){const r=u({total_requests:0,total_tokens:0,avg_latency_ms:0,active_keys:0,total_models:0}),l=u({status:"stopped",current_model:null,loaded_at:null,last_error:null}),x=u([]),g=u(!0),i=u("");async function f(){var c,s,o;g.value=!0,i.value="";try{const[n,p,w]=await Promise.all([v.get("/api/v1/admin/dashboard"),v.get("/api/v1/admin/models"),v.get("/api/v1/admin/status")]);r.value=n.data.stats,x.value=p.data.data,l.value=w.data}catch(n){i.value=((o=(s=(c=n.response)==null?void 0:c.data)==null?void 0:s.error)==null?void 0:o.message)||"Failed to load dashboard"}finally{g.value=!1}}async function k(c){var s,o,n;try{await v.post(`/api/v1/admin/models/${c}/load`),await f()}catch(p){i.value=((n=(o=(s=p.response)==null?void 0:s.data)==null?void 0:o.error)==null?void 0:n.message)||"Failed to load model"}}return C(f),(c,s)=>(a(),e("div",null,[s[9]||(s[9]=t("h1",{class:"text-2xl font-bold mb-6"},"Dashboard",-1)),g.value?(a(),e("div",F,"Loading...")):i.value?(a(),e("div",I,d(i.value),1)):(a(),e(h,{key:2},[t("div",q,[t("div",R,[t("div",B,[t("div",K,[_(m(j),{class:"w-6 h-6 text-primary"})]),t("div",null,[s[0]||(s[0]=t("p",{class:"text-text-muted text-sm"},"Total Requests",-1)),t("p",T,d(r.value.total_requests.toLocaleString()),1)])])]),t("div",V,[t("div",z,[t("div",P,[_(m(N),{class:"w-6 h-6 text-success"})]),t("div",null,[s[1]||(s[1]=t("p",{class:"text-text-muted text-sm"},"Total Tokens",-1)),t("p",$,d(r.value.total_tokens.toLocaleString()),1)])])]),t("div",E,[t("div",H,[t("div",Y,[_(m(D),{class:"w-6 h-6 text-warning"})]),t("div",null,[s[2]||(s[2]=t("p",{class:"text-text-muted text-sm"},"Avg Latency",-1)),t("p",G,d(r.value.avg_latency_ms.toFixed(0))+"ms",1)])])]),t("div",J,[t("div",O,[t("div",Q,[_(m(S),{class:"w-6 h-6 text-info"})]),t("div",null,[s[3]||(s[3]=t("p",{class:"text-text-muted text-sm"},"Active Keys",-1)),t("p",U,d(r.value.active_keys),1)])])])]),t("div",W,[t("div",X,[s[4]||(s[4]=t("h2",{class:"text-lg font-semibold"},"Model Status",-1)),t("span",{class:L(["badge",{"badge-success":l.value.status==="ready","badge-warning":l.value.status==="loading"||l.value.status==="swapping","badge-error":l.value.status==="failed"}])},d(l.value.status),3)]),l.value.current_model?(a(),e("div",Z,[s[5]||(s[5]=t("p",{class:"text-text-muted text-sm"},"Current Model",-1)),t("p",tt,d(l.value.current_model),1)])):b("",!0),l.value.last_error?(a(),e("div",st,d(l.value.last_error),1)):b("",!0)]),t("div",et,[s[8]||(s[8]=t("h2",{class:"text-lg font-semibold mb-4"},"Models",-1)),t("table",at,[s[7]||(s[7]=t("thead",null,[t("tr",null,[t("th",null,"Name"),t("th",null,"Alias"),t("th",null,"Default"),t("th",null,"Status"),t("th",null,"Actions")])],-1)),t("tbody",null,[(a(!0),e(h,null,M(x.value,o=>(a(),e("tr",{key:o.id},[t("td",ot,d(o.name),1),t("td",lt,d(o.alias),1),t("td",null,[o.is_default?(a(),e("span",dt,"Yes")):(a(),e("span",nt,"No"))]),t("td",null,[o.is_active?(a(),e("span",rt,"Active")):(a(),e("span",it,"Inactive"))]),t("td",null,[o.is_active?(a(),e("span",ut,"Loaded")):(a(),e("button",{key:0,onClick:n=>k(o.name),class:"btn btn-primary btn-sm"}," Load ",8,ct))])]))),128)),x.value.length===0?(a(),e("tr",_t,[...s[6]||(s[6]=[t("td",{colspan:"5",class:"text-center text-text-muted py-8"}," No models configured. Add models via the API. ",-1)])])):b("",!0)])])])],64))]))}});export{bt as default};