Spaces:
Sleeping
Sleeping
Delete static/assets
Browse files- static/assets/Accounts-m5Nl8NCa.js +0 -1
- static/assets/AppShell-CwjhmzKi.js +0 -1
- static/assets/Checkbox.vue_vue_type_script_setup_true_lang-CuT0jx5F.js +0 -1
- static/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-DNFguumV.js +0 -1
- static/assets/Dashboard-CJ3Hpnpg.js +0 -1
- static/assets/Docs-eQ0J31EN.js +0 -101
- static/assets/HelpTip.vue_vue_type_script_setup_true_lang-CkjCxRxq.js +0 -1
- static/assets/Login-Bx-F0sKQ.js +0 -1
- static/assets/Logs-CMG8wRs8.js +0 -2
- static/assets/Monitor-CHl7ZWIN.js +0 -1
- static/assets/PublicLogs-C5ozupJ2.js +0 -1
- static/assets/PublicUptime-DGTiftNg.js +0 -1
- static/assets/SelectMenu.vue_vue_type_script_setup_true_lang-NT93P4h_.js +0 -1
- static/assets/Settings-Br2oo35p.js +0 -1
- static/assets/index-BlnVds-t.css +0 -1
- static/assets/index-koyNnZzO.js +0 -0
- static/assets/settings-BSPhJbTu.js +0 -1
- static/assets/useConfirmDialog-egiUdQHS.js +0 -1
- static/assets/useUptimeStatus-nIwESkAy.js +0 -1
static/assets/Accounts-m5Nl8NCa.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{g as z,D as $e,h as c,d as Ae,E as Se,i as R,o as De,c as d,a as t,y as D,z as ue,w as V,p as $,b as h,B as Ee,t as a,n as m,u as v,F as q,r as ce,f as xe,T as pe,m as g,e as r}from"./index-koyNnZzO.js";import{_ as Ue}from"./SelectMenu.vue_vue_type_script_setup_true_lang-NT93P4h_.js";import{_ as F}from"./Checkbox.vue_vue_type_script_setup_true_lang-CuT0jx5F.js";import{_ as ze}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-DNFguumV.js";import{u as je}from"./useConfirmDialog-egiUdQHS.js";import{_ as Be}from"./HelpTip.vue_vue_type_script_setup_true_lang-CkjCxRxq.js";const y={list:()=>z.get("/admin/accounts"),getConfig:()=>z.get("/admin/accounts-config"),updateConfig:f=>z.put("/admin/accounts-config",f),delete:f=>z.delete(`/admin/accounts/${f}`),disable:f=>z.put(`/admin/accounts/${f}/disable`),enable:f=>z.put(`/admin/accounts/${f}/enable`)},Me=$e("accounts",()=>{const f=c([]),x=c(!1);async function b(){x.value=!0;try{const l=await y.list();f.value=Array.isArray(l)?l:l.accounts||[]}finally{x.value=!1}}async function j(l){await y.delete(l),await b()}async function p(l){await y.disable(l),await b()}async function B(l){await y.enable(l),await b()}async function E(l){await Promise.all(l.map(_=>y.enable(_))),await b()}async function u(l){await Promise.all(l.map(_=>y.disable(_))),await b()}async function A(l){await Promise.all(l.map(_=>y.delete(_))),await b()}async function M(l){await y.updateConfig(l),await b()}return{accounts:f,isLoading:x,loadAccounts:b,deleteAccount:j,disableAccount:p,enableAccount:B,bulkEnable:E,bulkDisable:u,bulkDelete:A,updateConfig:M}}),Ne={class:"space-y-8"},Te={class:"rounded-3xl border border-border bg-card p-6"},Oe={class:"flex flex-wrap items-center justify-between gap-4"},Je={class:"grid w-full grid-cols-2 gap-3 sm:flex sm:w-auto sm:items-center"},Le={class:"flex w-full flex-wrap items-center gap-3 text-xs text-muted-foreground sm:w-auto sm:flex-nowrap"},Fe={key:0},Ie={class:"ml-auto flex items-center gap-2 sm:ml-0"},Pe={class:"mt-4 flex flex-wrap items-center gap-3"},He=["disabled"],Qe=["disabled"],Re=["disabled"],qe=["disabled"],Ge={key:0,class:"mt-6 grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-3"},Ke=["onClick"],We={class:"flex items-start justify-between gap-3"},Xe={class:"mt-1 font-mono text-xs text-foreground"},Ye={class:"flex items-center gap-2"},Ze={class:"mt-4 grid grid-cols-2 gap-3 text-xs text-muted-foreground"},et={key:0,class:"mt-1 text-[11px]"},tt={key:0},ot={key:1},st={class:"mt-1 text-sm font-semibold text-foreground"},rt={class:"mt-1 text-sm font-semibold text-foreground"},lt={class:"mt-4 flex flex-wrap items-center gap-2"},nt=["onClick"],dt=["onClick"],at=["onClick"],it=["onClick"],ut={key:0,class:"rounded-2xl border border-border bg-background p-4 text-center text-xs text-muted-foreground"},ct={key:1,class:"relative mt-6 overflow-x-auto overflow-y-visible"},xt={class:"min-w-full text-left text-sm"},pt={class:"text-xs uppercase tracking-[0.2em] text-muted-foreground"},ft={class:"py-3 pr-4"},mt={class:"py-3 pr-6"},bt={class:"inline-flex items-center gap-2"},vt={class:"text-sm text-foreground"},gt={key:0},yt=["onClick"],_t={class:"py-4 pr-6 font-mono text-xs text-foreground"},wt={class:"py-4 pr-6"},ht={class:"py-4 pr-6"},kt={key:0,class:"block text-[11px] text-muted-foreground"},Ct={class:"py-4 pr-6 text-xs"},Vt={class:"py-4 pr-6 text-xs text-muted-foreground"},$t={class:"py-4 pr-6 text-xs text-muted-foreground"},At={class:"py-4 text-right"},St={class:"flex flex-wrap justify-end gap-2"},Dt=["onClick"],Et=["onClick"],Ut=["onClick"],zt=["onClick"],jt={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},Bt={class:"w-full max-w-lg rounded-3xl border border-border bg-card p-6 shadow-xl"},Mt={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},Nt={class:"mt-4 space-y-3 text-sm"},Tt={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},Ot={class:"w-full max-w-3xl rounded-3xl border border-border bg-card p-6 shadow-xl"},Jt={class:"flex items-center justify-between"},Lt={class:"flex items-center gap-2"},Ft={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},It={class:"mt-4"},Pt=["readonly"],Ht={class:"mt-6 flex items-center justify-end gap-2"},Qt=["disabled"],Yt=Ae({__name:"Accounts",setup(f){const x=Me(),{accounts:b,isLoading:j}=Se(x),p=je(),B=c(""),E=c("all"),u=c(new Set),A=c("table"),M=c(!1),l=c(""),_=c(!1),w=c(""),U=c(""),k=c(!1),N=c([]),i=c({id:"",secure_c_ses:"",csesidx:"",config_id:"",host_c_oses:"",expires_at:""}),J=c(null),G=c([]),fe=[{label:"全部状态",value:"all"},{label:"正常",value:"正常"},{label:"即将过期",value:"即将过期"},{label:"已过期",value:"已过期"},{label:"手动禁用",value:"手动禁用"},{label:"错误禁用",value:"错误禁用"},{label:"429限流",value:"429限流"}],C=R(()=>{const o=B.value.trim().toLowerCase();return b.value.filter(e=>{const s=!o||e.id.toLowerCase().includes(o),n=E.value==="all"||O(e)===E.value;return s&&n})}),T=R(()=>u.value.size),I=R(()=>C.value.length>0&&C.value.every(o=>u.value.has(o.id))),K=async()=>{await x.loadAccounts(),u.value=new Set};De(async()=>{await K()});const O=o=>o.cooldown_reason?.includes("429")&&o.cooldown_seconds>0?"429限流":o.cooldown_reason==="错误禁用"?"错误禁用":o.disabled?"手动禁用":o.status==="已过期"?"已过期":o.status==="即将过期"?"即将过期":"正常",W=o=>{const e=O(o);return e==="429限流"||e==="即将过期"?"bg-amber-200 text-amber-900":e==="错误禁用"||e==="已过期"?"bg-destructive/10 text-destructive":e==="手动禁用"?"bg-muted text-muted-foreground":"bg-emerald-500 text-white"},X=o=>o.cooldown_reason?.includes("429")&&o.cooldown_seconds>0?!0:o.disabled||o.cooldown_reason==="错误禁用",Y=o=>o==="已过期"?"过期":o==="未设置"?"未设置":o,Z=o=>o.status==="已过期"?"text-rose-600":o.status==="即将过期"?"text-amber-700":o.status==="未设置"?"text-muted-foreground":"text-emerald-600",ee=o=>o<60?`${o} 秒`:o<3600?`${Math.ceil(o/60)} 分钟`:`${(o/3600).toFixed(1)} 小时`,P=o=>o.cooldown_seconds>0?"text-amber-700":o.cooldown_reason==="错误禁用"?"text-rose-600":"text-muted-foreground",te=o=>{const e=O(o);return e==="手动禁用"||e==="已过期"?"bg-muted/70":""},L=o=>{const e=new Set(u.value);e.has(o)?e.delete(o):e.add(o),u.value=e},oe=()=>{if(I.value){u.value=new Set;return}u.value=new Set(C.value.map(o=>o.id))},me=(o,e)=>o.id||`account_${e+1}`,be=async()=>(await y.getConfig()).accounts.map((e,s)=>({...e,id:me(e,s)})),ve=(o,e)=>{let s=-1;for(let S=0;S<o.length;S+=1)if(o[S].id===e){s=S;break}if(s===-1)return l.value="未找到对应账号配置。",!1;const n=o[s];return i.value={id:n.id,secure_c_ses:n.secure_c_ses,csesidx:n.csesidx,config_id:n.config_id,host_c_oses:n.host_c_oses,expires_at:n.expires_at},G.value=o,J.value=s,M.value=!0,!0},se=async o=>{l.value="";try{const e=await be();ve(e,o)}catch(e){l.value=e.message||"加载账号配置失败"}},ge=async()=>{w.value="";try{const o=await y.getConfig();N.value=Array.isArray(o.accounts)?o.accounts:[],U.value=JSON.stringify(le(N.value),null,2),k.value=!0,_.value=!0}catch(o){w.value=o.message||"加载账号配置失败"}},H=()=>{_.value=!1,w.value="",k.value=!1},re=()=>{const o=JSON.parse(U.value);if(!Array.isArray(o))throw new Error("配置格式必须是数组。");return o},ye=o=>typeof o!="string"||!o?o:o.length<=6?`${o.slice(0,2)}****`:`${o.slice(0,3)}****`,le=o=>{const e=new Set(["secure_c_ses","csesidx","config_id","host_c_oses"]);return o.map(s=>{const n={...s};return e.forEach(S=>{const ie=n[S];ie&&(n[S]=ye(ie))}),n})},_e=()=>{if(w.value="",!k.value){try{N.value=re()}catch(o){w.value=o.message||"JSON 格式错误";return}U.value=JSON.stringify(le(N.value),null,2),k.value=!0;return}U.value=JSON.stringify(N.value,null,2),k.value=!1},we=async()=>{w.value="";try{const o=re();await x.updateConfig(o),H()}catch(o){w.value=o.message||"保存失败"}},Q=()=>{M.value=!1,l.value=""},he=async()=>{if(J.value===null)return;const o=[...G.value];o[J.value]={...o[J.value],id:i.value.id,secure_c_ses:i.value.secure_c_ses,csesidx:i.value.csesidx,config_id:i.value.config_id,host_c_oses:i.value.host_c_oses||void 0,expires_at:i.value.expires_at||void 0};try{await x.updateConfig(o),Q()}catch(e){l.value=e.message||"保存失败"}},ke=async()=>{await x.bulkEnable(Array.from(u.value)),u.value=new Set},Ce=async()=>{await p.ask({title:"批量禁用",message:"确定要批量禁用选中的账号吗?"})&&(await x.bulkDisable(Array.from(u.value)),u.value=new Set)},Ve=async()=>{await p.ask({title:"批量删除",message:"确定要批量删除选中的账号吗?",confirmText:"删除"})&&(await x.bulkDelete(Array.from(u.value)),u.value=new Set)},ne=async o=>{await x.enableAccount(o)},de=async o=>{await p.ask({title:"禁用账号",message:"确定要禁用该账号吗?"})&&await x.disableAccount(o)},ae=async o=>{await p.ask({title:"删除账号",message:"确定要删除该账号吗?",confirmText:"删除"})&&await x.deleteAccount(o)};return(o,e)=>(r(),d(q,null,[t("div",Ne,[t("section",Te,[t("div",Oe,[t("div",Je,[V(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>B.value=s),type:"text",placeholder:"搜索账号 ID",class:"w-full rounded-full border border-input bg-background px-4 py-2 text-sm sm:w-48"},null,512),[[$,B.value]]),D(Ue,{modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=s=>E.value=s),options:fe},null,8,["modelValue"])]),t("div",Le,[D(F,{modelValue:I.value,"onUpdate:modelValue":oe},{default:Ee(()=>[...e[16]||(e[16]=[xe(" 全选 ",-1)])]),_:1},8,["modelValue"]),t("span",null,"共 "+a(C.value.length)+" 个账号",1),T.value?(r(),d("span",Fe,"已选 "+a(T.value)+" 个",1)):h("",!0),t("div",Ie,[t("button",{type:"button",class:m(["inline-flex h-8 w-8 items-center justify-center rounded-full border border-border text-muted-foreground transition-colors hover:border-primary hover:text-primary",A.value==="table"?"bg-accent text-accent-foreground":""]),onClick:e[2]||(e[2]=s=>A.value="table"),"aria-label":"列表视图"},[...e[17]||(e[17]=[t("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[t("path",{d:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"})],-1)])],2),t("button",{type:"button",class:m(["inline-flex h-8 w-8 items-center justify-center rounded-full border border-border text-muted-foreground transition-colors hover:border-primary hover:text-primary",A.value==="card"?"bg-accent text-accent-foreground":""]),onClick:e[3]||(e[3]=s=>A.value="card"),"aria-label":"卡片视图"},[...e[18]||(e[18]=[t("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[t("path",{d:"M4 6h7v6H4V6zm9 0h7v6h-7V6zM4 14h7v4H4v-4zm9 0h7v4h-7v-4z"})],-1)])],2)])])]),t("div",Pe,[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:ge}," 账户配置 "),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:v(j),onClick:K}," 刷新列表 ",8,He),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:!T.value,onClick:ke}," 批量启用 ",8,Qe),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:!T.value,onClick:Ce}," 批量禁用 ",8,Re),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-destructive transition-colors hover:border-destructive hover:text-destructive",disabled:!T.value,onClick:Ve}," 批量删除 ",8,qe)]),A.value==="card"?(r(),d("div",Ge,[(r(!0),d(q,null,ce(C.value,s=>(r(),d("div",{key:s.id,class:m(["rounded-2xl border border-border bg-card p-4",te(s)]),onClick:n=>L(s.id)},[t("div",We,[t("div",null,[e[19]||(e[19]=t("p",{class:"text-xs text-muted-foreground"},"账号 ID",-1)),t("p",Xe,a(s.id),1)]),t("div",Ye,[D(F,{modelValue:u.value.has(s.id),"onUpdate:modelValue":n=>L(s.id),onClick:e[4]||(e[4]=g(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue"]),t("span",{class:m(["inline-flex items-center rounded-full border border-border px-3 py-1 text-xs",W(s)])},a(O(s)),3)])]),t("div",Ze,[t("div",null,[e[20]||(e[20]=t("p",null,"剩余时间",-1)),t("p",{class:m(["mt-1 text-sm font-semibold",Z(s)])},a(Y(s.remaining_display)),3),s.expires_at?(r(),d("p",et,a(s.expires_at),1)):h("",!0)]),t("div",null,[e[21]||(e[21]=t("p",null,"冷却",-1)),t("p",{class:m(["mt-1",P(s)])},[s.cooldown_seconds>0?(r(),d("span",tt,a(ee(s.cooldown_seconds))+" · "+a(s.cooldown_reason),1)):(r(),d("span",ot,a(s.cooldown_reason||"无冷却"),1))],2)]),t("div",null,[e[22]||(e[22]=t("p",null,"失败数",-1)),t("p",st,a(s.error_count),1)]),t("div",null,[e[23]||(e[23]=t("p",null,"会话数",-1)),t("p",rt,a(s.conversation_count),1)])]),t("div",lt,[t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>se(s.id),["stop"])}," 编辑 ",8,nt),X(s)?(r(),d("button",{key:0,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:[e[5]||(e[5]=g(()=>{},["stop"])),n=>ne(s.id)]}," 启用 ",8,dt)):(r(),d("button",{key:1,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:[e[6]||(e[6]=g(()=>{},["stop"])),n=>de(s.id)]}," 禁用 ",8,at)),t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-destructive transition-colors hover:border-destructive hover:text-destructive",onClick:[e[7]||(e[7]=g(()=>{},["stop"])),n=>ae(s.id)]}," 删除 ",8,it)])],10,Ke))),128)),!C.value.length&&!v(j)?(r(),d("div",ut," 暂无账号数据,请检查后台配置。 ")):h("",!0)])):(r(),d("div",ct,[t("table",xt,[t("thead",pt,[t("tr",null,[t("th",ft,[D(F,{modelValue:I.value,"onUpdate:modelValue":oe},null,8,["modelValue"])]),e[25]||(e[25]=t("th",{class:"py-3 pr-6"},"账号 ID",-1)),e[26]||(e[26]=t("th",{class:"py-3 pr-6"},"状态",-1)),t("th",mt,[t("span",bt,[e[24]||(e[24]=xe(" 剩余/过期 ",-1)),D(Be,{text:"过期时间为 12 小时,账户过期以北京时间为准。"})])]),e[27]||(e[27]=t("th",{class:"py-3 pr-6"},"冷却",-1)),e[28]||(e[28]=t("th",{class:"py-3 pr-6"},"失败数",-1)),e[29]||(e[29]=t("th",{class:"py-3 pr-6"},"会话数",-1)),e[30]||(e[30]=t("th",{class:"py-3 text-right"},"操作",-1))])]),t("tbody",vt,[!C.value.length&&!v(j)?(r(),d("tr",gt,[...e[31]||(e[31]=[t("td",{colspan:"8",class:"py-8 text-center text-muted-foreground"}," 暂无账号数据,请检查后台配置。 ",-1)])])):h("",!0),(r(!0),d(q,null,ce(C.value,s=>(r(),d("tr",{key:s.id,class:m(["border-t border-border",te(s)]),onClick:n=>L(s.id)},[t("td",{class:"py-4 pr-4",onClick:e[8]||(e[8]=g(()=>{},["stop"]))},[D(F,{modelValue:u.value.has(s.id),"onUpdate:modelValue":n=>L(s.id)},null,8,["modelValue","onUpdate:modelValue"])]),t("td",_t,a(s.id),1),t("td",wt,[t("span",{class:m(["inline-flex items-center rounded-full border border-border px-3 py-1 text-xs",W(s)])},a(O(s)),3)]),t("td",ht,[t("div",{class:m(["text-sm font-semibold",Z(s)])},a(Y(s.remaining_display)),3),s.expires_at?(r(),d("span",kt,a(s.expires_at),1)):h("",!0)]),t("td",Ct,[s.cooldown_seconds>0?(r(),d("span",{key:0,class:m(P(s))},a(ee(s.cooldown_seconds))+" · "+a(s.cooldown_reason),3)):(r(),d("span",{key:1,class:m(P(s))},a(s.cooldown_reason||"无冷却"),3))]),t("td",Vt,a(s.error_count),1),t("td",$t,a(s.conversation_count),1),t("td",At,[t("div",St,[t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>se(s.id),["stop"])}," 编辑 ",8,Dt),X(s)?(r(),d("button",{key:0,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>ne(s.id),["stop"])}," 启用 ",8,Et)):(r(),d("button",{key:1,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>de(s.id),["stop"])}," 禁用 ",8,Ut)),t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-destructive transition-colors hover:border-destructive hover:text-destructive",onClick:g(n=>ae(s.id),["stop"])}," 删除 ",8,zt)])])],10,yt))),128))])])]))])]),D(ze,{open:v(p).open.value,title:v(p).title.value,message:v(p).message.value,"confirm-text":v(p).confirmText.value,"cancel-text":v(p).cancelText.value,onConfirm:v(p).confirm,onCancel:v(p).cancel},null,8,["open","title","message","confirm-text","cancel-text","onConfirm","onCancel"]),(r(),ue(pe,{to:"body"},[M.value?(r(),d("div",jt,[t("div",Bt,[t("div",{class:"flex items-center justify-between"},[e[32]||(e[32]=t("p",{class:"text-sm font-medium text-foreground"},"编辑账号",-1)),t("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:Q}," 关闭 ")]),l.value?(r(),d("div",Mt,a(l.value),1)):h("",!0),t("div",Nt,[e[33]||(e[33]=t("label",{class:"block text-xs text-muted-foreground"},"账号 ID",-1)),V(t("input",{"onUpdate:modelValue":e[9]||(e[9]=s=>i.value.id=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",disabled:""},null,512),[[$,i.value.id]]),e[34]||(e[34]=t("label",{class:"block text-xs text-muted-foreground"},"secure_c_ses",-1)),V(t("textarea",{"onUpdate:modelValue":e[10]||(e[10]=s=>i.value.secure_c_ses=s),class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",rows:"3"},null,512),[[$,i.value.secure_c_ses]]),e[35]||(e[35]=t("label",{class:"block text-xs text-muted-foreground"},"csesidx",-1)),V(t("input",{"onUpdate:modelValue":e[11]||(e[11]=s=>i.value.csesidx=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.csesidx]]),e[36]||(e[36]=t("label",{class:"block text-xs text-muted-foreground"},"config_id",-1)),V(t("input",{"onUpdate:modelValue":e[12]||(e[12]=s=>i.value.config_id=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.config_id]]),e[37]||(e[37]=t("label",{class:"block text-xs text-muted-foreground"},"host_c_oses",-1)),V(t("input",{"onUpdate:modelValue":e[13]||(e[13]=s=>i.value.host_c_oses=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.host_c_oses]]),e[38]||(e[38]=t("label",{class:"block text-xs text-muted-foreground"},"expires_at",-1)),V(t("input",{"onUpdate:modelValue":e[14]||(e[14]=s=>i.value.expires_at=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"2025-12-23 10:59:21"},null,512),[[$,i.value.expires_at]])]),t("div",{class:"mt-6 flex items-center justify-end gap-2"},[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:Q}," 取消 "),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:he}," 保存 ")])])])):h("",!0)])),(r(),ue(pe,{to:"body"},[_.value?(r(),d("div",Tt,[t("div",Ot,[t("div",Jt,[e[39]||(e[39]=t("p",{class:"text-sm font-medium text-foreground"},"账户配置(JSON)",-1)),t("div",Lt,[t("button",{class:"rounded-full bg-foreground px-3 py-1 text-xs text-background transition-opacity hover:opacity-90",onClick:_e},a(k.value?"显示原文":"脱敏显示"),1),t("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:H}," 关闭 ")])]),w.value?(r(),d("div",Ft,a(w.value),1)):h("",!0),t("div",It,[V(t("textarea",{"onUpdate:modelValue":e[15]||(e[15]=s=>U.value=s),class:"h-96 w-full rounded-2xl border border-input bg-background px-4 py-3 font-mono text-xs text-foreground",spellcheck:"false",readonly:k.value},null,8,Pt),[[$,U.value]])]),t("div",Ht,[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:H}," 取消 "),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:we,disabled:k.value}," 保存 ",8,Qt)])])])):h("",!0)]))],64))}});export{Yt as default};
|
|
|
|
|
|
static/assets/AppShell-CwjhmzKi.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as F,l as U,h as y,i as f,s as Z,x as S,c as l,a as e,y as m,z as G,b as d,n as u,F as V,r as $,A as K,t as p,B as w,u as a,R as k,C as O,T as q,q as E,f as A,e as s}from"./index-koyNnZzO.js";import{u as J}from"./settings-BSPhJbTu.js";import{_ as Q}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-DNFguumV.js";import{u as W}from"./useConfirmDialog-egiUdQHS.js";const X={class:"min-h-screen"},Y={class:"flex min-h-screen flex-col lg:flex-row"},ee={key:0,class:"text-base font-semibold text-foreground"},te={key:0,class:"px-3 pb-2 text-xs uppercase tracking-[0.28em] text-muted-foreground"},re={class:"space-y-1"},oe={"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-5 w-5",fill:"currentColor"},se=["d"],ne={key:0,class:"flex-1 min-w-0 truncate"},le={key:1,class:"ml-auto text-xs opacity-0 transition-opacity group-hover:opacity-100"},ae={class:"mt-auto border-t border-border px-6 py-3 lg:py-4"},ie={key:0,class:"rounded-2xl bg-secondary/60 p-3"},de=["title"],ue={class:"min-w-0 flex-1 overflow-hidden lg:ml-0"},pe={class:"min-w-0 flex flex-col gap-4 border-b border-border bg-card/70 px-6 py-5 backdrop-blur lg:flex-row lg:items-center lg:justify-between lg:px-10"},ce={class:"flex items-center gap-3"},xe={class:"text-xl font-semibold text-foreground lg:text-2xl"},fe={class:"flex flex-wrap items-center gap-3"},me={class:"h-full overflow-y-auto overflow-x-hidden bg-card/70 px-4 pb-10 pt-6 backdrop-blur lg:px-10 lg:pt-10"},be={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},ge={class:"w-full max-w-lg rounded-3xl border border-border bg-card p-6 shadow-xl"},ve={class:"flex items-center justify-between"},he={class:"mt-4 space-y-3 text-sm"},ye={class:"mt-1 flex items-start gap-2"},we={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},ke={class:"mt-1 flex items-start gap-2"},_e={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},ze={class:"mt-1 flex items-start gap-2"},Ce={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},He={class:"mt-1 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-muted-foreground"},Me={class:"flex flex-wrap gap-2 text-foreground"},Se={class:"mt-1 flex items-start gap-2"},Ve={class:"min-w-0 flex-1 rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},$e={class:"mt-6 flex items-center justify-end"},Ie=F({__name:"AppShell",setup(Ae){const L=E(),b=Z(),j=U(),c=J(),x=y(!1),o=y(!1),i=W(),g=y(!1),_=[{path:"/",label:"概览",icon:"M4 4h7v7H4V4zm9 0h7v4h-7V4zm0 6h7v10h-7V10zM4 13h7v7H4v-7z"},{path:"/accounts",label:"账号管理",icon:"M12 12a3.5 3.5 0 1 0-3.5-3.5A3.5 3.5 0 0 0 12 12zm0 2c-4.1 0-7.5 2.2-7.5 5v1h15v-1c0-2.8-3.4-5-7.5-5z"},{path:"/settings",label:"系统设置",icon:"M4 6h10v2H4V6zm12 0h4v2h-4V6zM4 11h6v2H4v-2zm8 0h8v2h-8v-2zM4 16h10v2H4v-2zm12 0h4v2h-4v-2z"},{path:"/monitor",label:"监控状态",icon:"M3 12h4l2-4 4 8 3-6h5v2h-4l-4 8-4-8-2 4H3v-2z"},{path:"/logs",label:"运行日志",icon:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h10v2H4v-2z"},{path:"/docs",label:"文档中心",icon:"M6 3h9l4 4v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zm8 1.5V8h3.5L14 4.5zM8 11h8v2H8v-2zm0 4h8v2H8v-2z"}],B=f(()=>_.find(t=>t.path===b.path)?.label||"概览"),D=n=>{const r=`transition-colors ${o.value?"px-2 justify-center gap-0":"px-3 gap-3"}`;return b.path===n?`${r} bg-primary text-primary-foreground`:`${r} text-muted-foreground hover:bg-accent hover:text-accent-foreground`},I=n=>b.path===n?"bg-primary-foreground/15 text-primary-foreground border-primary-foreground/40":"bg-secondary text-muted-foreground group-hover:text-accent-foreground",v=f(()=>(c.settings?.basic?.base_url||""||window.location.origin).replace(/\/$/,"")),z=f(()=>`${v.value}/v1`),C=f(()=>`${v.value}/v1/chat/completions`),H=f(()=>c.settings?.basic?.api_key||"未设置"),T=["gemini-auto","gemini-2.5-flash","gemini-2.5-pro","gemini-3-flash-preview","gemini-3-pro-preview"];S(()=>b.path,()=>{x.value=!1});const M=localStorage.getItem("sidebar-collapsed");M&&(o.value=M==="true"),S(o,n=>{localStorage.setItem("sidebar-collapsed",n?"true":"false")});async function N(){await i.ask({title:"退出登录",message:"确定退出管理控制台吗?"})&&(await j.logout(),L.push({name:"login"}))}function P(){window.location.reload()}async function R(){g.value=!0,!c.settings&&!c.isLoading&&await c.loadSettings()}async function h(n){if(n)try{await navigator.clipboard.writeText(n)}catch(t){console.error("Copy failed",t)}}return(n,t)=>(s(),l("div",X,[e("div",Y,[x.value?(s(),l("div",{key:0,class:"fixed inset-0 z-30 bg-black/20 backdrop-blur-sm lg:hidden",onClick:t[0]||(t[0]=r=>x.value=!1)})):d("",!0),e("aside",{class:u(["fixed inset-y-0 left-0 z-40 w-72 -translate-x-full bg-card/90 backdrop-blur border-r border-border transition-[width,transform] duration-200 ease-out will-change-[width,transform] transform-gpu flex flex-col lg:static lg:translate-x-0 lg:bg-card/80 lg:border-b-0 lg:border-r lg:sticky lg:top-0 lg:h-screen",[{"translate-x-0":x.value,"w-20 lg:w-20":o.value}]])},[e("div",{class:u(["flex h-16 items-center justify-between px-6 pt-4 lg:h-20 lg:pt-5",o.value?"justify-center px-0":""])},[e("div",{class:u(["flex items-center gap-2",o.value?"gap-0 justify-center w-full":""])},[t[9]||(t[9]=e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"text-foreground transition-colors hover:text-primary","aria-label":"GitHub"},[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-6 w-6",fill:"currentColor"},[e("path",{d:"M12 2C6.477 2 2 6.477 2 12c0 4.419 2.865 8.166 6.839 9.489.5.09.682-.217.682-.483 0-.237-.009-.868-.014-1.703-2.782.604-3.369-1.341-3.369-1.341-.454-1.154-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.004.071 1.532 1.031 1.532 1.031.892 1.529 2.341 1.087 2.91.832.091-.647.349-1.087.636-1.337-2.22-.253-4.555-1.11-4.555-4.944 0-1.092.39-1.987 1.029-2.687-.103-.253-.446-1.272.098-2.65 0 0 .84-.269 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.295 2.748-1.026 2.748-1.026.546 1.378.202 2.397.1 2.65.64.7 1.028 1.595 1.028 2.687 0 3.842-2.338 4.687-4.566 4.936.359.309.678.919.678 1.852 0 1.337-.012 2.418-.012 2.747 0 .268.18.577.688.479A10.002 10.002 0 0 0 22 12c0-5.523-4.477-10-10-10z"})])],-1)),o.value?d("",!0):(s(),l("span",ee,"Gemini Business2API"))],2)],2),e("nav",{class:u(["pb-4 pt-4 lg:pt-6 flex-1 overflow-y-auto",o.value?"px-2":"px-3"])},[o.value?d("",!0):(s(),l("p",te," 导航 ")),e("div",re,[(s(),l(V,null,$(_,r=>m(a(k),{key:r.path,to:r.path,class:u(["group flex items-center rounded-2xl py-2 text-sm font-medium transition-colors overflow-hidden",D(r.path)]),title:o.value?r.label:void 0},{default:w(()=>[e("span",{class:u(["inline-flex h-9 w-9 items-center justify-center rounded-2xl border border-border",I(r.path)])},[(s(),l("svg",oe,[e("path",{d:r.icon},null,8,se)]))],2),o.value?d("",!0):(s(),l("span",ne,p(r.label),1)),o.value?d("",!0):(s(),l("span",le," 进入 "))]),_:2},1032,["to","class","title"])),64))])],2),e("div",ae,[o.value?d("",!0):(s(),l("div",ie,[...t[10]||(t[10]=[e("p",{class:"text-xs tracking-[0.12em] text-muted-foreground"},[e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 transition-colors hover:text-foreground"}," gemini-business2api "),e("span",null," · 声明")],-1),e("p",{class:"mt-2 text-xs text-muted-foreground"}," 本项目仅限学习与研究用途,禁止用于商业用途。请保留本声明、原作者信息与开源来源。 ",-1)])])),e("div",{class:u(["mt-4 flex items-center gap-3",o.value?"justify-center":""])},[o.value?d("",!0):(s(),l("button",{key:0,onClick:N,class:"flex-1 rounded-2xl border border-border bg-background px-4 py-3 text-sm font-medium text-muted-foreground transition-colors hover:border-destructive/40 hover:text-destructive"}," 退出登录 ")),e("button",{class:"h-10 w-10 shrink-0 items-center justify-center rounded-2xl border border-border text-muted-foreground transition-all hover:border-primary hover:text-primary flex",onClick:t[1]||(t[1]=r=>o.value=!o.value),title:o.value?"展开侧边栏":"收起侧边栏"},[...t[11]||(t[11]=[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4 shrink-0",fill:"currentColor"},[e("path",{d:"M6 4h2v16H6V4zm4 4h8v2h-8V8zm0 6h8v2h-8v-2z"})],-1)])],8,de)],2)])],2),e("main",ue,[e("header",pe,[e("div",ce,[e("button",{class:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-border text-foreground transition-colors hover:border-primary hover:text-primary lg:hidden",onClick:t[2]||(t[2]=r=>x.value=!0),"aria-label":"打开导航"},[...t[12]||(t[12]=[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-5 w-5",fill:"currentColor"},[e("path",{d:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"})],-1)])]),t[13]||(t[13]=K('<svg aria-hidden="true" viewBox="0 0 130 150" class="logo-mark h-9 w-9 shrink-0 text-foreground"><defs><filter id="head-shadow" x="-50%" y="-50%" width="200%" height="200%"><feDropShadow dx="0" dy="10" stdDeviation="12" flood-color="rgba(0, 188, 212, 0.2)"></feDropShadow></filter></defs><g class="logo-cat-wrapper" transform="translate(0, 12)"><g transform="translate(16, 20) rotate(-10, 9, 12)"><path d="M14 0 L18 24 L0 24 Z" fill="#2c3e50"></path></g><g transform="translate(96, 20) rotate(10, 9, 12)"><path d="M4 0 L18 24 L0 24 Z" fill="#2c3e50"></path></g><g filter="url(#head-shadow)"><path d="M 32 40 L 98 40 A 12 12 0 0 1 110 52 L 110 90 A 30 30 0 0 1 80 120 L 50 120 A 30 30 0 0 1 20 90 L 20 52 A 12 12 0 0 1 32 40 Z" fill="rgba(255, 255, 255, 0.9)" stroke="#2c3e50" stroke-width="3"></path></g><rect class="logo-eye" x="35" y="68" width="14" height="4" rx="1"></rect><rect class="logo-eye" x="81" y="68" width="14" height="4" rx="1"></rect></g></svg>',1)),e("h2",xe,p(B.value),1)]),e("div",fe,[e("button",{onClick:P,class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",title:"刷新"}," 刷新 "),e("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:R}," 接口信息 "),m(a(k),{to:"/public/uptime",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"},{default:w(()=>[...t[14]||(t[14]=[A(" 状态监控 ",-1)])]),_:1}),m(a(k),{to:"/public/logs",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"},{default:w(()=>[...t[15]||(t[15]=[A(" 公开日志 ",-1)])]),_:1})])]),e("div",me,[m(a(O))])])]),m(Q,{open:a(i).open.value,title:a(i).title.value,message:a(i).message.value,"confirm-text":a(i).confirmText.value,"cancel-text":a(i).cancelText.value,onConfirm:a(i).confirm,onCancel:a(i).cancel},null,8,["open","title","message","confirm-text","cancel-text","onConfirm","onCancel"]),(s(),G(q,{to:"body"},[g.value?(s(),l("div",be,[e("div",ge,[e("div",ve,[t[16]||(t[16]=e("p",{class:"text-sm font-medium text-foreground"},"API 接口",-1)),e("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:t[3]||(t[3]=r=>g.value=!1)}," 关闭 ")]),t[22]||(t[22]=e("p",{class:"mt-2 text-xs text-muted-foreground"},"根据客户端选择对应接口",-1)),e("div",he,[e("div",null,[t[17]||(t[17]=e("p",{class:"text-xs text-muted-foreground"},"基础端点",-1)),e("div",ye,[e("p",we,p(v.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[4]||(t[4]=r=>h(v.value))}," 复制 ")])]),e("div",null,[t[18]||(t[18]=e("p",{class:"text-xs text-muted-foreground"},"SDK 接口",-1)),e("div",ke,[e("p",_e,p(z.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[5]||(t[5]=r=>h(z.value))}," 复制 ")])]),e("div",null,[t[19]||(t[19]=e("p",{class:"text-xs text-muted-foreground"},"完整接口",-1)),e("div",ze,[e("p",Ce,p(C.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[6]||(t[6]=r=>h(C.value))}," 复制 ")])]),e("div",null,[t[20]||(t[20]=e("p",{class:"text-xs text-muted-foreground"},"支持模型",-1)),e("div",He,[e("div",Me,[(s(),l(V,null,$(T,r=>e("span",{key:r,class:"rounded-full border border-border px-2 py-0.5 text-[11px]"},p(r),1)),64))])])]),e("div",null,[t[21]||(t[21]=e("p",{class:"text-xs text-muted-foreground"},"API 密钥",-1)),e("div",Se,[e("p",Ve,p(H.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[7]||(t[7]=r=>h(H.value))}," 复制 ")])])]),e("div",$e,[e("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:t[8]||(t[8]=r=>g.value=!1)}," 知道了 ")])])])):d("",!0)]))]))}});export{Ie as default};
|
|
|
|
|
|
static/assets/Checkbox.vue_vue_type_script_setup_true_lang-CuT0jx5F.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as c,c as r,a as o,b as i,G as u,e as a}from"./index-koyNnZzO.js";const p={class:"inline-flex items-center gap-2"},m=["checked","disabled"],b={key:0,class:"text-xs text-muted-foreground"},f=c({__name:"Checkbox",props:{modelValue:{type:Boolean},disabled:{type:Boolean}},emits:["update:modelValue"],setup(s,{emit:d}){const n=d,l=e=>{const t=e.target;n("update:modelValue",t.checked)};return(e,t)=>(a(),r("label",p,[o("input",{type:"checkbox",class:"sr-only peer",checked:s.modelValue,disabled:s.disabled,onChange:l},null,40,m),t[0]||(t[0]=o("span",{class:"flex h-4 w-4 items-center justify-center rounded border border-border bg-background text-transparent transition-colors peer-checked:border-foreground peer-checked:bg-foreground peer-checked:text-white peer-disabled:opacity-50","aria-hidden":"true"},[o("svg",{viewBox:"0 0 20 20",class:"h-3.5 w-3.5",fill:"currentColor"},[o("path",{d:"M7.6 13.2 4.4 10l1.2-1.2 2 2 6-6 1.2 1.2-7.2 7.2z"})])],-1)),e.$slots.default?(a(),r("span",b,[u(e.$slots,"default")])):i("",!0)]))}});export{f as _};
|
|
|
|
|
|
static/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-DNFguumV.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as a,z as d,c as l,b as m,m as c,a as t,t as r,T as f,e as i}from"./index-koyNnZzO.js";const u={class:"w-full max-w-sm rounded-3xl border border-border bg-card p-6 shadow-2xl"},x={class:"text-sm font-semibold text-foreground"},p={class:"mt-2 text-sm text-muted-foreground"},b={class:"mt-6 flex items-center justify-end gap-2"},y=a({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},message:{},confirmText:{},cancelText:{}},emits:["confirm","cancel"],setup(o){return(n,e)=>(i(),d(f,{to:"body"},[o.open?(i(),l("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/30 px-4",onClick:e[2]||(e[2]=c(s=>n.$emit("cancel"),["self"]))},[t("div",u,[t("p",x,r(o.title),1),t("p",p,r(o.message),1),t("div",b,[t("button",{type:"button",class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-foreground hover:text-foreground",onClick:e[0]||(e[0]=s=>n.$emit("cancel"))},r(o.cancelText),1),t("button",{type:"button",class:"rounded-full bg-primary px-4 py-2 text-sm text-primary-foreground transition-opacity hover:opacity-90",onClick:e[1]||(e[1]=s=>n.$emit("confirm"))},r(o.confirmText),1)])])])):m("",!0)]))}});export{y as _};
|
|
|
|
|
|
static/assets/Dashboard-CJ3Hpnpg.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{g as A,d as N,h as n,i as B,o as F,j,c as u,a,F as z,r as L,t as c,f as D,z as O,b as E,k as V,n as G,e as i}from"./index-koyNnZzO.js";import{_ as U}from"./HelpTip.vue_vue_type_script_setup_true_lang-CkjCxRxq.js";const $={overview(){return A.get("/admin/stats")}},H={class:"space-y-8"},I={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4"},J={class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},K={class:"mt-4 text-3xl font-semibold text-foreground"},P={class:"mt-2 text-xs text-muted-foreground"},Q={class:"dashboard-split flex w-full flex-col gap-6"},W={class:"dashboard-main w-full min-w-0 rounded-3xl border border-border bg-card p-6 overflow-hidden"},X={class:"mt-6 border-t border-border pt-6"},Y={class:"dashboard-side w-full min-w-0 rounded-3xl border border-border bg-card p-6"},Z={class:"mt-6 space-y-4"},ee={class:"flex items-center justify-between text-sm"},te={class:"flex items-center gap-2 text-muted-foreground"},ae={class:"font-medium text-foreground"},le={class:"h-2 w-full rounded-full bg-secondary"},ne=N({__name:"Dashboard",setup(oe){const r=n([{label:"账号总数",value:"0",caption:"账号池中已加载的总数量。"},{label:"活跃账号",value:"0",caption:"未过期、未禁用、未限流且可用。"},{label:"失败账号",value:"0",caption:"自动禁用或已过期,需要处理。"},{label:"限流账号",value:"0",caption:"触发 429 限流,冷却中。"}]),f=n([]),h=n([]),b=n([]),x=n({}),m=n(null),p=n(null);let o=null,s=null;const k=B(()=>{const e=Math.max(Number(r.value[0].value),1),t=Number(r.value[1].value),l=Number(r.value[2].value),d=Number(r.value[3].value),v=Math.max(e-t-l-d,0);return[{label:"活跃",value:t,percent:Math.round(t/e*100),barClass:"bg-emerald-500"},{label:"失败",value:l,percent:Math.round(l/e*100),barClass:"bg-destructive"},{label:"限流",value:d,percent:Math.round(d/e*100),barClass:"bg-amber-300"},{label:"空闲",tooltip:"未限流、未失败、未激活使用中的账号(主要是手动禁用)。",value:v,percent:Math.round(v/e*100),barClass:"bg-slate-300"}]});F(async()=>{await R(),M(),q(),window.addEventListener("resize",_)}),j(()=>{window.removeEventListener("resize",_),o&&(o.dispose(),o=null),s&&(s.dispose(),s=null)});function M(){const e=window.echarts;!e||!m.value||(o=e.init(m.value),g(),w())}function q(){const e=window.echarts;!e||!p.value||(s=e.init(p.value),y(),S())}function g(){o&&(o.setOption({tooltip:{trigger:"axis"},legend:{data:["总请求","失败/限流"],right:0,top:0,textStyle:{color:"#6b6b6b",fontSize:11}},grid:{left:24,right:16,top:44,bottom:24,containLabel:!0},xAxis:{type:"category",data:b.value,boundaryGap:!1,axisLine:{lineStyle:{color:"#d4d4d4"}},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10},splitLine:{lineStyle:{color:"#e5e5e5"}}},series:[{name:"总请求",type:"line",data:f.value,smooth:!0,showSymbol:!1,lineStyle:{width:3},itemStyle:{color:"#0ea5e9"}},{name:"失败/限流",type:"line",data:h.value,smooth:!0,showSymbol:!1,lineStyle:{width:2},itemStyle:{color:"#f59e0b"}}]}),w())}function y(){if(!s)return;const e=Object.entries(x.value).map(([t,l])=>({name:t,type:"line",stack:"models",data:l,smooth:!0,showSymbol:!1,areaStyle:{opacity:.2},lineStyle:{width:1.5},itemStyle:{color:T(t)}}));s.setOption({tooltip:{trigger:"axis"},legend:{data:e.map(t=>t.name),right:0,top:0,textStyle:{color:"#6b6b6b",fontSize:11}},grid:{left:24,right:16,top:44,bottom:24,containLabel:!0},xAxis:{type:"category",data:b.value,boundaryGap:!1,axisLine:{lineStyle:{color:"#d4d4d4"}},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10},splitLine:{lineStyle:{color:"#e5e5e5"}}},series:e}),S()}function _(){o&&o.resize(),s&&s.resize()}async function R(){try{const e=await $.overview();r.value[0].value=(e.total_accounts??0).toString(),r.value[1].value=(e.active_accounts??0).toString(),r.value[2].value=(e.failed_accounts??0).toString(),r.value[3].value=(e.rate_limited_accounts??0).toString();const t=e.trend||{labels:[],total_requests:[],failed_requests:[],rate_limited_requests:[]};b.value=t.labels||[],f.value=t.total_requests||[];const l=t.failed_requests||[],d=t.rate_limited_requests||[];h.value=f.value.map((v,C)=>(l[C]||0)+(d[C]||0)),x.value=t.model_requests||{},g(),y()}catch(e){console.error("Failed to load overview:",e)}}function w(){o&&requestAnimationFrame(()=>{o?.resize()})}function S(){s&&requestAnimationFrame(()=>{s?.resize()})}function T(e){return{"gemini-3-pro-preview":"#2563eb","gemini-2.5-pro":"#10b981","gemini-2.5-flash":"#f97316","gemini-3-flash-preview":"#8b5cf6","gemini-auto":"#64748b"}[e]||"#94a3b8"}return(e,t)=>(i(),u("div",H,[a("section",I,[(i(!0),u(z,null,L(r.value,l=>(i(),u("div",{key:l.label,class:"rounded-3xl border border-border bg-card p-6"},[a("p",J,c(l.label),1),a("p",K,c(l.value),1),a("p",P,c(l.caption),1)]))),128))]),a("section",Q,[a("div",W,[t[1]||(t[1]=a("div",{class:"flex items-center justify-between"},[a("p",{class:"text-sm font-medium text-foreground"},"调用趋势(近12小时)")],-1)),a("div",{ref_key:"trendChartRef",ref:m,class:"mt-6 h-56 w-full max-w-full lg:h-64"},null,512),a("div",X,[t[0]||(t[0]=a("p",{class:"text-sm font-medium text-foreground"},"模型调用分布(近12小时)",-1)),a("div",{ref_key:"modelChartRef",ref:p,class:"mt-4 h-56 w-full max-w-full lg:h-64"},null,512)])]),a("div",Y,[t[2]||(t[2]=a("p",{class:"text-sm font-medium text-foreground"},"账号健康",-1)),a("div",Z,[(i(!0),u(z,null,L(k.value,l=>(i(),u("div",{key:l.label,class:"space-y-2"},[a("div",ee,[a("span",te,[D(c(l.label)+" ",1),l.tooltip?(i(),O(U,{key:0,text:l.tooltip},null,8,["text"])):E("",!0)]),a("span",ae,c(l.value),1)]),a("div",le,[a("div",{class:G(["h-2 rounded-full",l.barClass]),style:V({width:l.percent+"%"})},null,6)])]))),128))]),t[3]||(t[3]=a("div",{class:"mt-6 rounded-2xl border border-border bg-secondary/50 p-4 text-xs text-muted-foreground"}," 建议及时处理失败或过期账号,避免影响轮询效率。 ",-1))])])]))}});export{ne as default};
|
|
|
|
|
|
static/assets/Docs-eQ0J31EN.js
DELETED
|
@@ -1,101 +0,0 @@
|
|
| 1 |
-
import{c as r,A as s,e as n}from"./index-koyNnZzO.js";const a=(o,t)=>{const u=o.__vccOpts||o;for(const[e,q]of t)u[e]=q;return u},p={},l={class:"space-y-6"};function c(o,t){return n(),r("div",l,[...t[0]||(t[0]=[s(`<section class="rounded-3xl border border-border bg-card p-6"><div class="flex flex-wrap items-center justify-between gap-3"><div><p class="text-base font-semibold text-foreground">文档中心</p><p class="mt-1 text-xs text-muted-foreground"> 常用格式说明与示例,复制即可使用 </p></div></div><div class="mt-6 space-y-6 text-sm text-foreground"><div class="space-y-2"><p class="text-sm font-semibold">账户配置格式</p><p class="mt-1 text-xs text-muted-foreground"> accounts.json 或环境变量 ACCOUNTS_CONFIG 使用的 JSON 数组 </p><pre class="mt-3 overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">[
|
| 2 |
-
{
|
| 3 |
-
"id": "account_1",
|
| 4 |
-
"secure_c_ses": "CSE.Ad...",
|
| 5 |
-
"csesidx": "498...",
|
| 6 |
-
"config_id": "0cd...",
|
| 7 |
-
"host_c_oses": "",
|
| 8 |
-
"expires_at": "2026-12-31 23:59:59"
|
| 9 |
-
}
|
| 10 |
-
]</pre><p class="mt-2 text-xs text-muted-foreground"> 必填:secure_c_ses / csesidx / config_id。id、host_c_oses、expires_at 可选。 </p></div><div class="space-y-2"><p class="text-sm font-semibold">API 对话 curl 格式</p><p class="mt-1 text-xs text-muted-foreground"> 标准的 OpenAI 兼容格式,支持流式和非流式输出。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 11 |
-
-H "Content-Type: application/json" \\
|
| 12 |
-
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 13 |
-
-d '{
|
| 14 |
-
"model": "gemini-2.5-flash",
|
| 15 |
-
"stream": false,
|
| 16 |
-
"temperature": 0.7,
|
| 17 |
-
"top_p": 1,
|
| 18 |
-
"messages": [
|
| 19 |
-
{ "role": "system", "content": "你是一个简洁的助手" },
|
| 20 |
-
{ "role": "user", "content": "你好,介绍一下这个项目" }
|
| 21 |
-
]
|
| 22 |
-
}'</pre></div><p class="mt-2 text-xs text-muted-foreground"> 如果未设置 API Key,可省略 Authorization。 </p></div><div class="space-y-2"><p class="text-sm font-semibold">文生图格式(Base64 / URL 输出)</p><p class="mt-1 text-xs text-muted-foreground"> 使用支持文生图的模型,直接给文本提示即可;输出格式由系统设置决定(base64 或 url)。 </p><pre class="mt-3 overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 23 |
-
-H "Content-Type: application/json" \\
|
| 24 |
-
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 25 |
-
-d '{
|
| 26 |
-
"model": "gemini-3-pro-preview",
|
| 27 |
-
"stream": true,
|
| 28 |
-
"temperature": 0.7,
|
| 29 |
-
"top_p": 1,
|
| 30 |
-
"messages": [
|
| 31 |
-
{ "role": "user", "content": "生成一只戴着头盔的猫,赛博风格" }
|
| 32 |
-
]
|
| 33 |
-
}'</pre></div><div class="space-y-2"><p class="text-sm font-semibold">图生图格式(Base64 / URL 输入)</p><p class="mt-1 text-xs text-muted-foreground"> content 使用多模态数组,image_url 可填 URL 或 data:base64。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 34 |
-
-H "Content-Type: application/json" \\
|
| 35 |
-
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 36 |
-
-d '{
|
| 37 |
-
"model": "gemini-3-flash-preview",
|
| 38 |
-
"stream": false,
|
| 39 |
-
"temperature": 0.7,
|
| 40 |
-
"top_p": 1,
|
| 41 |
-
"messages": [
|
| 42 |
-
{
|
| 43 |
-
"role": "user",
|
| 44 |
-
"content": [
|
| 45 |
-
{ "type": "text", "text": "把图片改成插画风格" },
|
| 46 |
-
{ "type": "image_url", "image_url": { "url": "https://example.com/cat.png" } }
|
| 47 |
-
]
|
| 48 |
-
}
|
| 49 |
-
]
|
| 50 |
-
}'</pre><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 51 |
-
-H "Content-Type: application/json" \\
|
| 52 |
-
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 53 |
-
-d '{
|
| 54 |
-
"model": "gemini-3-flash-preview",
|
| 55 |
-
"stream": false,
|
| 56 |
-
"temperature": 0.7,
|
| 57 |
-
"top_p": 1,
|
| 58 |
-
"messages": [
|
| 59 |
-
{
|
| 60 |
-
"role": "user",
|
| 61 |
-
"content": [
|
| 62 |
-
{ "type": "text", "text": "增强画面细节" },
|
| 63 |
-
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,AAA..." } }
|
| 64 |
-
]
|
| 65 |
-
}
|
| 66 |
-
]
|
| 67 |
-
}'</pre></div></div><div class="space-y-2"><p class="text-sm font-semibold">读文件格式(URL / Base64)</p><p class="mt-1 text-xs text-muted-foreground"> 适用于 PDF/图片/文本等可读文件,Word/PPT 等可能不支持会被提示转换。大部分文件都可能支持,建议自行测试。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 68 |
-
-H "Content-Type: application/json" \\
|
| 69 |
-
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 70 |
-
-d '{
|
| 71 |
-
"model": "gemini-2.5-pro",
|
| 72 |
-
"stream": false,
|
| 73 |
-
"temperature": 0.7,
|
| 74 |
-
"top_p": 1,
|
| 75 |
-
"messages": [
|
| 76 |
-
{
|
| 77 |
-
"role": "user",
|
| 78 |
-
"content": [
|
| 79 |
-
{ "type": "text", "text": "读取并总结这个文件" },
|
| 80 |
-
{ "type": "image_url", "image_url": { "url": "https://example.com/doc.pdf" } }
|
| 81 |
-
]
|
| 82 |
-
}
|
| 83 |
-
]
|
| 84 |
-
}'</pre><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 85 |
-
-H "Content-Type: application/json" \\
|
| 86 |
-
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 87 |
-
-d '{
|
| 88 |
-
"model": "gemini-2.5-pro",
|
| 89 |
-
"stream": false,
|
| 90 |
-
"temperature": 0.7,
|
| 91 |
-
"top_p": 1,
|
| 92 |
-
"messages": [
|
| 93 |
-
{
|
| 94 |
-
"role": "user",
|
| 95 |
-
"content": [
|
| 96 |
-
{ "type": "text", "text": "读取并摘要" },
|
| 97 |
-
{ "type": "image_url", "image_url": { "url": "data:application/pdf;base64,AAA..." } }
|
| 98 |
-
]
|
| 99 |
-
}
|
| 100 |
-
]
|
| 101 |
-
}'</pre></div></div></div></section>`,1)])])}const i=a(p,[["render",c]]);export{i as default};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static/assets/HelpTip.vue_vue_type_script_setup_true_lang-CkjCxRxq.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d,h as n,c as i,F as g,a as r,z as x,G as m,T as b,b as v,k as y,f as k,t as T,H as _,e as a,B as h}from"./index-koyNnZzO.js";const B=d({__name:"Tooltip",props:{text:{},offset:{}},setup(o){const u=o,e=n(null),l=n(!1),p=n({}),f=()=>{l.value=!0,_(()=>{if(!e.value)return;const t=e.value.getBoundingClientRect(),s=u.offset??8;p.value={left:`${t.left+t.width/2}px`,top:`${t.top-s}px`}})},c=()=>{l.value=!1};return(t,s)=>(a(),i(g,null,[r("span",{ref_key:"triggerRef",ref:e,class:"inline-flex",onMouseenter:f,onMouseleave:c,onFocusin:f,onFocusout:c},[m(t.$slots,"default")],544),(a(),x(b,{to:"body"},[l.value?(a(),i("div",{key:0,class:"fixed z-[9999] -translate-x-1/2 -translate-y-full rounded-md bg-foreground px-2 py-1 text-[10px] text-background shadow-lg",style:y(p.value)},[k(T(o.text)+" ",1),s[0]||(s[0]=r("span",{class:"absolute left-1/2 top-full h-0 w-0 -translate-x-1/2 border-x-4 border-t-4 border-x-transparent border-t-foreground"},null,-1))],4)):v("",!0)]))],64))}}),C=d({__name:"HelpTip",props:{text:{}},setup(o){return(u,e)=>(a(),x(B,{text:o.text},{default:h(()=>[...e[0]||(e[0]=[r("span",{class:"help-dot"},"?",-1)])]),_:1},8,["text"]))}});export{C as _};
|
|
|
|
|
|
static/assets/Login-Bx-F0sKQ.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as f,l as x,h as a,c as i,a as e,m as b,b as v,w as g,p as h,t as l,f as y,q as w,e as d}from"./index-koyNnZzO.js";const _={class:"min-h-screen px-4"},k={class:"flex min-h-screen items-center justify-center"},B={class:"w-full max-w-md rounded-[2.5rem] border border-border bg-card p-10 shadow-2xl shadow-black/10"},A={class:"space-y-2"},C=["disabled"],M={key:0,class:"rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},S=["disabled"],G=f({__name:"Login",setup(V){const u=w(),c=x(),t=a(""),o=a(""),r=a(!1);async function m(){if(t.value){o.value="",r.value=!0;try{await c.login(t.value),u.push({name:"dashboard"})}catch(n){o.value=n.message||"登录失败,请检查密钥。"}finally{r.value=!1}}}return(n,s)=>(d(),i("div",_,[e("div",k,[e("div",B,[s[2]||(s[2]=e("div",{class:"text-center"},[e("h1",{class:"text-3xl font-semibold text-foreground"},"Gemini Business 2API"),e("p",{class:"mt-2 text-sm text-muted-foreground"},"管理员登录")],-1)),e("form",{onSubmit:b(m,["prevent"]),class:"mt-8 space-y-6"},[e("div",A,[s[1]||(s[1]=e("label",{for:"password",class:"block text-sm font-medium text-foreground"}," 管理员密钥 ",-1)),g(e("input",{id:"password","onUpdate:modelValue":s[0]||(s[0]=p=>t.value=p),type:"password",required:"",class:"w-full rounded-2xl border border-input bg-background px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-all",placeholder:"请输入管理员密钥",disabled:r.value},null,8,C),[[h,t.value]])]),o.value?(d(),i("div",M,l(o.value),1)):v("",!0),e("button",{type:"submit",disabled:r.value||!t.value,class:"w-full rounded-2xl bg-primary py-3 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50"},l(r.value?"登录中...":"登录"),9,S)],32),s[3]||(s[3]=e("div",{class:"mt-8 flex items-center justify-center gap-4 text-xs text-muted-foreground"},[e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-2 transition-colors hover:text-foreground"},[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[e("path",{d:"M12 2C6.477 2 2 6.477 2 12c0 4.419 2.865 8.166 6.839 9.489.5.09.682-.217.682-.483 0-.237-.009-.868-.014-1.703-2.782.604-3.369-1.341-3.369-1.341-.454-1.154-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.004.071 1.532 1.031 1.532 1.031.892 1.529 2.341 1.087 2.91.832.091-.647.349-1.087.636-1.337-2.22-.253-4.555-1.11-4.555-4.944 0-1.092.39-1.987 1.029-2.687-.103-.253-.446-1.272.098-2.65 0 0 .84-.269 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.295 2.748-1.026 2.748-1.026.546 1.378.202 2.397.1 2.65.64.7 1.028 1.595 1.028 2.687 0 3.842-2.338 4.687-4.566 4.936.359.309.678.919.678 1.852 0 1.337-.012 2.418-.012 2.747 0 .268.18.577.688.479A10.002 10.002 0 0 0 22 12c0-5.523-4.477-10-10-10z"})]),y(" GitHub ")]),e("span",null,"Powered by Gemini Business API")],-1))])])]))}});export{G as default};
|
|
|
|
|
|
static/assets/Logs-CMG8wRs8.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
| 1 |
-
import{g as B,d as de,h as m,I as ce,i as M,o as ie,j as ue,c as n,a as s,y as W,b as y,t as r,n as h,w as U,p as z,F as w,r as k,k as O,v as me,e as a}from"./index-koyNnZzO.js";import{_ as xe}from"./SelectMenu.vue_vue_type_script_setup_true_lang-NT93P4h_.js";import{_ as pe}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-DNFguumV.js";const F={list:G=>B.get("/admin/log",{params:G}),clear:()=>B.delete("/admin/log?confirm=yes")},ve={class:"rounded-3xl border border-border bg-card p-6"},fe={class:"flex flex-wrap items-center justify-between gap-3"},be={class:"text-xs text-muted-foreground"},ge={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-3 xl:grid-cols-6"},ye={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},he={class:"mt-1 text-lg font-semibold text-foreground"},_e={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},we={class:"mt-1 text-lg font-semibold text-foreground"},Ce={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Re={class:"mt-1 text-lg font-semibold text-foreground"},Ie={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},ke={class:"mt-1 text-lg font-semibold text-foreground"},Oe={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Ne={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Le={class:"mt-1 text-lg font-semibold text-foreground"},Se={class:"mt-4 flex flex-wrap items-center gap-2 sm:flex-nowrap"},$e={class:"w-44 shrink-0"},Ae={key:1,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},Te={class:"whitespace-pre-wrap font-mono leading-relaxed"},Ee={key:0,class:"text-xs text-muted-foreground"},Me={class:"flex flex-wrap items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 text-xs"},Ue={class:"flex flex-wrap items-center gap-2"},Fe={class:"text-muted-foreground"},Ge={class:"w-full text-foreground md:w-auto md:flex-1"},Ve=["onClick"],De={class:"text-muted-foreground"},He={key:1,class:"text-muted-foreground"},je={class:"text-muted-foreground"},qe={class:"space-y-2 px-4 py-3"},Be={class:"flex flex-wrap items-center gap-2"},We={class:"text-muted-foreground"},ze={class:"w-full text-foreground md:w-auto md:flex-1"},Ze=de({__name:"Logs",setup(G){const A=m([]),p=m(null),N=m(""),v=m(""),C=m("success"),L=m(!1),R=m(!0),I=m({}),f=m(!1),b=m(null),g=m(null);let _;const i=ce({level:"",search:"",limit:1500}),J=[{label:"全部",value:""},{label:"INFO",value:"INFO"},{label:"WARNING",value:"WARNING"},{label:"ERROR",value:"ERROR"}],Y={SYSTEM:"#9e9e9e",CONFIG:"#607d8b",LOG:"#9e9e9e",AUTH:"#4caf50",SESSION:"#00bcd4",FILE:"#ff9800",CHAT:"#2196f3",API:"#8bc34a",CACHE:"#9c27b0",ACCOUNT:"#f44336",MULTI:"#673ab7"},P={account_1:"#9c27b0",account_2:"#e91e63",account_3:"#00bcd4",account_4:"#4caf50",account_5:"#ff9800"},Z=M(()=>C.value==="error"?"text-destructive":"text-muted-foreground"),V=e=>Y[e]||"#757575",T=e=>P[e]||"#757575",D=e=>{const t="rounded px-2 py-0.5 text-[10px] font-semibold";return e==="INFO"?`${t} bg-blue-100 text-blue-700`:e==="WARNING"?`${t} bg-amber-100 text-amber-700`:e==="ERROR"||e==="CRITICAL"?`${t} bg-rose-100 text-rose-700`:`${t} bg-violet-100 text-violet-700`},K=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";return e==="success"?`${t} bg-emerald-100 text-emerald-700`:e==="error"?`${t} bg-rose-100 text-rose-700`:e==="timeout"?`${t} bg-amber-100 text-amber-700`:`${t} bg-amber-100 text-amber-700`},Q=e=>e==="success"?"成功":e==="error"?"失败":e==="timeout"?"超时":"进行中",x=e=>{let t=e;const o=[];let l="";const d=/^\[([A-Za-z0-9_]+)\]/;for(;;){const c=t.match(d);if(!c)break;const u=c[1];if(t=t.slice(c[0].length).trim(),!u.startsWith("req_")){if(u.startsWith("account_")){l=u;continue}o.push(u)}}return{tags:o,accountId:l,text:t}},X=e=>{if(/^\d{4}-\d{2}-\d{2}T/.test(e))return new Date(e);if(/^\d{4}-\d{2}-\d{2}/.test(e))return new Date(e.replace(" ","T"));if(/^\d{2}:\d{2}:\d{2}$/.test(e)){const t=new Date,[o,l,d]=e.split(":").map(Number),c=new Date(t);return c.setHours(o,l,d,0),c}return null},ee=e=>{const t=e[e.length-1],o=t.message;if(o.includes("响应完成")||o.includes("非流式响应完成"))return"success";if(t.level==="ERROR"||o.includes("失败"))return"error";const l=X(t.time);return l&&(Date.now()-l.getTime())/1e3/60>5?"timeout":"in_progress"},S=M(()=>{const e=new Map,t=[],o=[];A.value.forEach(d=>{const c=d.message.match(/\[req_([a-z0-9]+)\]/i);if(c){const u=c[1];e.has(u)||(e.set(u,[]),t.push(u)),e.get(u)?.push(d)}else o.push(d)});const l=t.map(d=>{const c=e.get(d)||[],u=c[0],j=u?.message.match(/\[(account_[^\]]+)\]/i),q=u?.message.match(/收到请求: ([^ |]+)/)||u?.message.match(/Received request: ([^ |]+)/);return{id:d,logs:c,status:ee(c),accountId:j?j[1]:"",model:q?q[1]:""}});return{ungrouped:o,groups:l}}),te=M(()=>A.value.map(e=>`${e.time} | ${e.level} | ${e.message}`).join(`
|
| 2 |
-
`)),E=e=>I.value[e]===!0,se=e=>{I.value[e]=!E(e),localStorage.setItem("log-fold-state",JSON.stringify(I.value))},oe=()=>{(!i.limit||Number.isNaN(i.limit))&&(i.limit=1500),i.limit=Math.min(Math.max(i.limit,10),3e3)},$=async()=>{N.value="",v.value="",oe();try{const e=await F.list({limit:i.limit,level:i.level||void 0,search:i.search||void 0});A.value=e.logs,p.value=e.stats,requestAnimationFrame(()=>{f.value&&b.value&&(b.value.scrollTop=b.value.scrollHeight),!f.value&&g.value&&(g.value.scrollTop=g.value.scrollHeight)})}catch(e){N.value=e.message||"日志加载失败"}},re=async()=>{v.value="",C.value="success";try{const e=await F.list({limit:3e3,level:i.level||void 0,search:i.search||void 0}),t=new Blob([JSON.stringify({exported_at:new Date().toISOString(),logs:e.logs},null,2)],{type:"application/json"}),o=URL.createObjectURL(t),l=document.createElement("a");l.href=o,l.download=`logs_${new Date().toISOString().slice(0,19).replace(/:/g,"-")}.json`,l.click(),URL.revokeObjectURL(o),v.value="导出成功"}catch(e){C.value="error",v.value=e.message||"导出失败"}},le=async()=>{L.value=!1;try{await F.clear(),C.value="success",v.value="已清空日志",await $()}catch(e){C.value="error",v.value=e.message||"清空失败"}},H=()=>{_&&(window.clearInterval(_),_=void 0),R.value&&(_=window.setInterval($,3e3))},ne=()=>{R.value=!R.value,H()},ae=()=>{f.value=!f.value,requestAnimationFrame(()=>{f.value&&b.value&&(b.value.scrollTop=b.value.scrollHeight),!f.value&&g.value&&(g.value.scrollTop=g.value.scrollHeight)})};return ie(()=>{const e=localStorage.getItem("log-fold-state");if(e)try{I.value=JSON.parse(e)}catch{I.value={}}$(),H()}),ue(()=>{_&&window.clearInterval(_)}),(e,t)=>(a(),n(w,null,[s("div",ve,[s("div",fe,[t[5]||(t[5]=s("p",{class:"text-base font-semibold text-foreground"},"管理日志",-1)),s("div",be," 自动刷新:"+r(R.value?"开启":"关闭"),1)]),s("div",ge,[s("div",ye,[t[6]||(t[6]=s("div",{class:"text-[11px] text-muted-foreground"},"总数",-1)),s("div",he,r(p.value?.memory.total??0),1)]),s("div",_e,[t[7]||(t[7]=s("div",{class:"text-[11px] text-muted-foreground"},"对话",-1)),s("div",we,r(p.value?.chat_count??0),1)]),s("div",Ce,[t[8]||(t[8]=s("div",{class:"text-[11px] text-muted-foreground"},"INFO",-1)),s("div",Re,r(p.value?.memory.by_level.INFO??0),1)]),s("div",Ie,[t[9]||(t[9]=s("div",{class:"text-[11px] text-muted-foreground"},"WARNING",-1)),s("div",ke,r(p.value?.memory.by_level.WARNING??0),1)]),s("div",Oe,[t[10]||(t[10]=s("div",{class:"text-[11px] text-muted-foreground"},"ERROR",-1)),s("div",{class:h(["mt-1 text-lg font-semibold",p.value?.memory.by_level.ERROR?"text-rose-600":"text-foreground"])},r(p.value?.memory.by_level.ERROR??0),3)]),s("div",Ne,[t[11]||(t[11]=s("div",{class:"text-[11px] text-muted-foreground"},"缓存上限",-1)),s("div",Le,r(p.value?.memory.capacity??0),1)])]),s("div",Se,[s("div",$e,[W(xe,{modelValue:i.level,"onUpdate:modelValue":t[0]||(t[0]=o=>i.level=o),options:J},null,8,["modelValue"])]),U(s("input",{"onUpdate:modelValue":t[1]||(t[1]=o=>i.search=o),type:"text",placeholder:"搜索...",class:"min-w-[200px] flex-1 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-foreground sm:min-w-0"},null,512),[[z,i.search,void 0,{trim:!0}]]),U(s("input",{"onUpdate:modelValue":t[2]||(t[2]=o=>i.limit=o),type:"number",min:"10",max:"3000",step:"100",class:"w-24 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-foreground"},null,512),[[z,i.limit,void 0,{number:!0}]]),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:$}," 查询 "),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:re}," 导出 "),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:ae},r(f.value?"结构化视图":"原始视图"),1),s("button",{class:h(["rounded-full px-4 py-2 text-xs font-medium transition-colors",R.value?"bg-primary text-primary-foreground":"border border-border text-muted-foreground hover:text-foreground"]),onClick:ne}," 自动刷新 ",2),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-destructive transition-colors hover:border-destructive/60",onClick:t[3]||(t[3]=o=>L.value=!0)}," 清空 ")]),v.value?(a(),n("div",{key:0,class:h(["mt-3 text-xs",Z.value])},r(v.value),3)):y("",!0),N.value?(a(),n("div",Ae,r(N.value),1)):y("",!0),f.value?(a(),n("div",{key:2,ref_key:"rawLogContainer",ref:b,class:"scrollbar-slim mt-4 max-h-[60vh] overflow-y-auto rounded-2xl border border-border bg-black px-4 py-3 text-xs text-green-200"},[s("pre",Te,r(te.value),1)],512)):(a(),n("div",{key:3,ref_key:"structuredLogContainer",ref:g,class:"scrollbar-slim mt-4 max-h-[60vh] space-y-3 overflow-y-auto rounded-2xl border border-border bg-card px-4 py-3"},[S.value.ungrouped.length===0&&S.value.groups.length===0?(a(),n("div",Ee," 暂无日志 ")):y("",!0),(a(!0),n(w,null,k(S.value.ungrouped,(o,l)=>(a(),n("div",{key:`u-${l}`},[s("div",Me,[s("div",Ue,[s("span",Fe,r(o.time),1),s("span",{class:h(D(o.level))},r(o.level),3),(a(!0),n(w,null,k(x(o.message).tags,d=>(a(),n("span",{key:d,class:"rounded px-2 py-0.5 text-[10px] font-semibold text-white",style:O({backgroundColor:V(d)})},r(d),5))),128)),x(o.message).accountId?(a(),n("span",{key:0,class:"text-[11px] font-semibold",style:O({color:T(x(o.message).accountId)})},r(x(o.message).accountId),5)):y("",!0)]),s("div",Ge,r(x(o.message).text),1)])]))),128)),(a(!0),n(w,null,k(S.value.groups,o=>(a(),n("div",{key:o.id,class:"rounded-2xl border border-border bg-card"},[s("button",{type:"button",class:"flex w-full flex-wrap items-center gap-2 rounded-2xl bg-secondary/40 px-4 py-3 text-left text-xs transition hover:bg-secondary/60",onClick:l=>se(o.id)},[s("span",{class:h(K(o.status))},r(Q(o.status)),3),s("span",De,"req_"+r(o.id),1),o.accountId?(a(),n("span",{key:0,class:"text-xs font-semibold",style:O({color:T(o.accountId)})},r(o.accountId),5)):y("",!0),o.model?(a(),n("span",He,r(o.model),1)):y("",!0),s("span",je,r(o.logs.length)+" 条日志",1),s("span",{class:h(["ml-auto text-muted-foreground transition-transform",{"rotate-90":!E(o.id)}])}," ▸ ",2)],8,Ve),U(s("div",qe,[(a(!0),n(w,null,k(o.logs,(l,d)=>(a(),n("div",{key:`${o.id}-${d}`,class:"flex flex-wrap items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 text-xs"},[s("div",Be,[s("span",We,r(l.time),1),s("span",{class:h(D(l.level))},r(l.level),3),(a(!0),n(w,null,k(x(l.message).tags,c=>(a(),n("span",{key:c,class:"rounded px-2 py-0.5 text-[10px] font-semibold text-white",style:O({backgroundColor:V(c)})},r(c),5))),128)),x(l.message).accountId?(a(),n("span",{key:0,class:"text-[11px] font-semibold",style:O({color:T(x(l.message).accountId)})},r(x(l.message).accountId),5)):y("",!0)]),s("div",ze,r(x(l.message).text),1)]))),128))],512),[[me,!E(o.id)]])]))),128))],512))]),W(pe,{open:L.value,title:"确认操作",message:"确定要清空所有运行日志吗?","confirm-text":"确认","cancel-text":"取消",onConfirm:le,onCancel:t[4]||(t[4]=o=>L.value=!1)},null,8,["open"])],64))}});export{Ze as default};
|
|
|
|
|
|
|
|
|
static/assets/Monitor-CHl7ZWIN.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{u as g}from"./useUptimeStatus-nIwESkAy.js";import{d as v,o as y,c as r,a as t,b as u,t as o,u as n,F as _,r as c,n as m,f as l,e as a}from"./index-koyNnZzO.js";const h={class:"space-y-6"},k={class:"rounded-3xl border border-border bg-card p-6"},C={class:"flex flex-wrap items-center justify-between gap-3"},N={class:"mt-1 text-xs text-muted-foreground"},B={key:0,class:"mt-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},M={class:"mt-6 grid gap-8 md:grid-cols-2"},S={class:"monitor-card__header"},V={class:"monitor-card__name"},w={class:"monitor-card__stats"},F={class:"monitor-card__value"},L={class:"monitor-card__value"},$={class:"monitor-card__value"},j={class:"monitor-card__beats"},z={key:0,class:"monitor-beat__tooltip"},U=v({__name:"Monitor",setup(A){const{services:p,updatedAt:b,errorMessage:i,refreshStatus:f}=g();return y(()=>{f()}),(D,s)=>(a(),r("div",h,[t("section",k,[t("div",C,[t("div",null,[s[0]||(s[0]=t("p",{class:"text-base font-semibold text-foreground"},"服务状态",-1)),t("p",N," 最近更新:"+o(n(b)||"未获取"),1)]),s[1]||(s[1]=t("div",{class:"flex items-center gap-2"},[t("a",{href:"/#/public/uptime",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"}," 打开监控页 ")],-1))]),n(i)?(a(),r("div",B,o(n(i)),1)):u("",!0),t("div",M,[(a(!0),r(_,null,c(n(p),e=>(a(),r("div",{key:e.key,class:"monitor-card"},[t("div",S,[t("span",V,o(e.name),1),t("span",{class:m(["monitor-card__badge",e.statusClass])},o(e.statusLabel),3)]),t("div",w,[t("span",null,[s[2]||(s[2]=l("可用率 ",-1)),t("span",F,o(e.uptime)+"%",1)]),t("span",null,[s[3]||(s[3]=l("请求 ",-1)),t("span",L,o(e.total),1)]),t("span",null,[s[4]||(s[4]=l("成功 ",-1)),t("span",$,o(e.success),1)])]),t("div",j,[(a(!0),r(_,null,c(e.beats,(d,x)=>(a(),r("div",{key:`${e.key}-${x}`,class:m(["monitor-beat",d.className])},[d.tooltip?(a(),r("span",z,o(d.tooltip),1)):u("",!0)],2))),128))])]))),128))])])]))}});export{U as default};
|
|
|
|
|
|
static/assets/PublicLogs-C5ozupJ2.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{g as h,d as J,h as c,i,o as M,j as O,c as o,a as s,b as q,f as B,t as n,F as g,r as y,k as H,w as K,n as _,v as Q,e as l}from"./index-koyNnZzO.js";const W={list:w=>h.get("/public/log",{params:w})},X={overview(){return h.get("/public/stats")}},Y={overview(){return h.get("/public/display")}},Z={class:"min-h-screen overflow-x-hidden bg-card/70 text-foreground backdrop-blur"},ee={class:"mx-auto w-full max-w-6xl min-w-0 px-4 py-8"},te={class:"rounded-3xl border border-border bg-card p-6"},se={class:"flex flex-wrap items-start justify-between gap-4"},re={class:"flex items-center gap-3"},oe=["src"],le={class:"mt-4 flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-border bg-secondary/40 px-4 py-3"},ae=["href"],ne={key:1,class:"text-xs text-muted-foreground"},ue={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},ie={class:"text-[11px] text-muted-foreground"},ce={key:0,class:"mt-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},de={key:1,class:"mt-4 rounded-2xl border border-border bg-secondary/30 px-4 py-6 text-center text-sm text-muted-foreground"},pe={key:2,class:"mt-4 max-h-[60vh] space-y-3 overflow-y-auto pr-1 scrollbar-slim"},be=["onClick"],me={class:"text-muted-foreground"},xe={class:"text-muted-foreground"},fe={class:"space-y-2 px-4 py-3"},ve={class:"text-muted-foreground"},ge={class:"flex-1 text-foreground"},N=1e3,_e=J({__name:"PublicLogs",setup(w){const u=c([]),b=c(null),m=c(null),d=c(""),$=c("--:--"),p=c({});let x;const D=i(()=>m.value?.logo_url?.trim()||"/logo.svg"),k=i(()=>m.value?.chat_url?.trim()||""),j=i(()=>u.value.length),f=i(()=>u.value.filter(e=>e.status==="success").length),C=i(()=>u.value.filter(e=>e.status==="error").length),A=i(()=>{let e=0,t=0;return u.value.forEach(r=>{r.status==="success"&&r.events.forEach(a=>{if(a.type!=="complete")return;const L=a.content.match(/([0-9]+(?:\.[0-9]+)?)\s*s/);L&&(e+=Number(L[1]),t+=1)})}),t===0?"-":`${(e/t).toFixed(1)}s`}),F=i(()=>{const e=f.value+C.value;return e===0?"-":`${(f.value/e*100).toFixed(1)}%`}),I=i(()=>[{label:"总访客",value:b.value?.total_visitors??0},{label:"每分钟请求",value:b.value?.requests_per_minute??0,color:b.value?.load_color},{label:"平均响应",value:A.value},{label:"成功率",value:F.value,color:"#10b981"},{label:"对话次数",value:j.value},{label:"成功",value:f.value,color:"#10b981"},{label:"失败",value:C.value,color:"#ef4444"},{label:"更新时间",value:$.value,color:"#6b7280"}]),R=e=>e==="success"?"成功":e==="error"?"失败":e==="timeout"?"超时":"进行中",U=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";return e==="success"?`${t} bg-emerald-100 text-emerald-700`:e==="error"?`${t} bg-rose-100 text-rose-700`:e==="timeout"?`${t} bg-amber-100 text-amber-700`:`${t} bg-amber-100 text-amber-700`},z=e=>e.type==="start"?"开始对话":e.type==="select"?"选择":e.type==="retry"?"重试":e.type==="switch"?"切换":e.type==="complete"?e.status==="success"?"完成":e.status==="error"?"失败":e.status==="timeout"?"超时":"完成":"事件",E=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";if(e.type==="start")return`${t} bg-blue-100 text-blue-700`;if(e.type==="select")return`${t} bg-violet-100 text-violet-700`;if(e.type==="retry")return`${t} bg-amber-100 text-amber-700`;if(e.type==="switch")return`${t} bg-cyan-100 text-cyan-700`;if(e.type==="complete"){if(e.status==="success")return`${t} bg-emerald-100 text-emerald-700`;if(e.status==="error")return`${t} bg-rose-100 text-rose-700`;if(e.status==="timeout")return`${t} bg-amber-100 text-amber-700`}return`${t} bg-slate-100 text-slate-600`},P=()=>{try{const e=localStorage.getItem("public-log-fold-state");e&&(p.value=JSON.parse(e))}catch{p.value={}}},T=()=>{localStorage.setItem("public-log-fold-state",JSON.stringify(p.value))},v=e=>p.value[e]===!0,V=e=>{p.value[e]=!v(e),T()},S=async()=>{d.value="";try{const[e,t]=await Promise.all([W.list({limit:N}),X.overview()]);u.value=e.logs,b.value=t,$.value=new Date().toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch(e){d.value=e.message||"日志加载失败"}},G=async()=>{try{m.value=await Y.overview()}catch{m.value=null}};return M(()=>{P(),G(),S(),x=window.setInterval(S,3e3)}),O(()=>{x&&window.clearInterval(x)}),(e,t)=>(l(),o("div",Z,[s("div",ee,[s("section",te,[s("div",se,[s("div",re,[s("img",{src:D.value,alt:"Gemini Business2API",class:"h-8 w-8 object-contain"},null,8,oe),t[0]||(t[0]=s("div",null,[s("p",{class:"text-base font-semibold text-foreground"},"公开日志")],-1))]),t[1]||(t[1]=s("div",{class:"flex items-center gap-2 text-xs text-muted-foreground"},[s("span",null,"自动刷新:3s")],-1))]),s("div",le,[s("div",{class:"text-xs text-muted-foreground"},[t[2]||(t[2]=B(" 展示最近 ",-1)),s("span",{class:"font-semibold text-foreground"},n(N)),t[3]||(t[3]=B(" 条会话日志 ",-1))]),k.value?(l(),o("a",{key:0,href:k.value,target:"_blank",class:"text-xs font-medium text-emerald-600 transition hover:text-emerald-500"}," 开始对话 ",8,ae)):(l(),o("span",ne,"开始对话"))]),s("div",ue,[(l(!0),o(g,null,y(I.value,r=>(l(),o("div",{key:r.label,class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},[s("div",ie,n(r.label),1),s("div",{class:"mt-1 text-lg font-semibold",style:H({color:r.color||void 0})},n(r.value),5)]))),128))]),d.value?(l(),o("div",ce,n(d.value),1)):q("",!0),u.value.length===0&&!d.value?(l(),o("div",de," 暂无日志 ")):u.value.length>0?(l(),o("div",pe,[(l(!0),o(g,null,y(u.value,r=>(l(),o("div",{key:r.request_id,class:"rounded-2xl border border-border bg-card"},[s("button",{type:"button",class:"flex w-full flex-wrap items-center gap-2 rounded-2xl bg-secondary/40 px-4 py-3 text-left text-xs transition hover:bg-secondary/60",onClick:a=>V(r.request_id)},[s("span",{class:_(U(r.status))},n(R(r.status)),3),s("span",me,"req_"+n(r.request_id),1),s("span",xe,n(r.events.length)+" 条事件",1),s("span",{class:_(["ml-auto text-muted-foreground transition-transform",{"rotate-90":!v(r.request_id)}])}," ▸ ",2)],8,be),K(s("div",fe,[(l(!0),o(g,null,y(r.events,a=>(l(),o("div",{key:`${r.request_id}-${a.time}-${a.type}`,class:"flex flex-wrap items-center gap-3 rounded-xl border border-border bg-card px-3 py-2 text-xs"},[s("div",ve,n(a.time),1),s("span",{class:_(E(a))},n(z(a)),3),s("div",ge,n(a.content),1)]))),128))],512),[[Q,!v(r.request_id)]])]))),128))])):q("",!0)])])]))}});export{_e as default};
|
|
|
|
|
|
static/assets/PublicUptime-DGTiftNg.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{u as g}from"./useUptimeStatus-nIwESkAy.js";import{d as h,o as v,c as o,a as t,b as i,t as r,u as n,F as _,r as m,e as a,n as p,f as u}from"./index-koyNnZzO.js";const y={class:"min-h-screen overflow-x-hidden bg-card/70 text-foreground backdrop-blur"},k={class:"mx-auto flex min-h-screen w-full max-w-5xl min-w-0 items-center justify-center px-4 py-8"},w={class:"w-full rounded-3xl border border-border bg-card p-6"},B={class:"mb-6 flex flex-wrap items-center justify-between gap-3"},C={class:"text-xs text-muted-foreground"},N={key:0,class:"mb-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},S={class:"grid gap-8 md:grid-cols-2"},V={class:"monitor-card__header"},j={class:"monitor-card__name"},A={class:"monitor-card__stats"},F={class:"monitor-card__value"},L={class:"monitor-card__value"},M={class:"monitor-card__value"},P={class:"monitor-card__beats"},U={key:0,class:"monitor-beat__tooltip"},$={key:0,class:"rounded-2xl border border-border bg-card p-4 text-xs text-muted-foreground"},I=h({__name:"PublicUptime",setup(z){const{services:c,updatedAt:x,errorMessage:d,refreshStatus:b}=g();return v(()=>{b()}),(D,e)=>(a(),o("div",y,[t("div",k,[t("section",w,[t("div",B,[e[0]||(e[0]=t("div",null,[t("p",{class:"text-sm font-medium text-foreground"},"服务状态"),t("p",{class:"mt-1 text-xs text-muted-foreground"},"Gemini Business2API 公开状态页")],-1)),t("p",C,"最近更新:"+r(n(x)||"未获取"),1)]),n(d)?(a(),o("div",N,r(n(d)),1)):i("",!0),t("div",S,[(a(!0),o(_,null,m(n(c),s=>(a(),o("div",{key:s.key,class:"monitor-card"},[t("div",V,[t("span",j,r(s.name),1),t("span",{class:p(["monitor-card__badge",s.statusClass])},r(s.statusLabel),3)]),t("div",A,[t("span",null,[e[1]||(e[1]=u("可用率 ",-1)),t("span",F,r(s.uptime)+"%",1)]),t("span",null,[e[2]||(e[2]=u("请求 ",-1)),t("span",L,r(s.total),1)]),t("span",null,[e[3]||(e[3]=u("成功 ",-1)),t("span",M,r(s.success),1)])]),t("div",P,[(a(!0),o(_,null,m(s.beats,(l,f)=>(a(),o("div",{key:`${s.key}-${f}`,class:p(["monitor-beat",l.className])},[l.tooltip?(a(),o("span",U,r(l.tooltip),1)):i("",!0)],2))),128))])]))),128)),!n(c).length&&!n(d)?(a(),o("div",$," 暂无监控数据。 ")):i("",!0)])])])]))}});export{I as default};
|
|
|
|
|
|
static/assets/SelectMenu.vue_vue_type_script_setup_true_lang-NT93P4h_.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as A,h as v,i as d,o as B,j as z,c as n,a as s,b,t as g,n as y,F as L,r as S,e as o}from"./index-koyNnZzO.js";const j={class:"truncate"},E=["onClick"],M={key:0,class:"text-xs"},F=A({__name:"SelectMenu",props:{modelValue:{},options:{},multiple:{type:Boolean},placeholder:{},placement:{}},emits:["update:modelValue"],setup(h,{emit:x}){const t=h,m=x,a=v(!1),c=v(null),i=d(()=>t.options.map(e=>typeof e=="string"?{label:e,value:e}:e)),V=d(()=>{if(t.multiple){const l=Array.isArray(t.modelValue)?t.modelValue:[];return l.length?l.length===1?i.value.find(u=>u.value===l[0])?.label||l[0]:`已选 ${l.length} 项`:t.placeholder||"请选择"}return i.value.find(l=>l.value===t.modelValue)?.label||String(t.modelValue??"")}),k=d(()=>t.placement==="up"?"bottom-full mb-2":"mt-2"),_=()=>{a.value=!a.value},p=e=>t.multiple?Array.isArray(t.modelValue)&&t.modelValue.includes(e):t.modelValue===e,w=e=>{if(t.multiple){const l=Array.isArray(t.modelValue)?t.modelValue:[],u=l.includes(e)?l.filter(C=>C!==e):[...l,e];m("update:modelValue",u);return}m("update:modelValue",e),a.value=!1},f=e=>{c.value&&(c.value.contains(e.target)||(a.value=!1))};return B(()=>{document.addEventListener("click",f)}),z(()=>{document.removeEventListener("click",f)}),(e,l)=>(o(),n("div",{ref_key:"root",ref:c,class:"relative w-full sm:w-44"},[s("button",{type:"button",class:"flex w-full items-center justify-between gap-2 rounded-full border border-input bg-background px-4 py-2 text-sm text-foreground transition-colors hover:border-primary",onClick:_},[s("span",j,g(V.value),1),l[0]||(l[0]=s("svg",{"aria-hidden":"true",viewBox:"0 0 20 20",class:"h-4 w-4",fill:"currentColor"},[s("path",{d:"M5 7l5 6 5-6H5z"})],-1))]),a.value?(o(),n("div",{key:0,class:y(["absolute right-0 z-30 w-full space-y-1 rounded-2xl border border-border bg-card p-2 shadow-lg",k.value])},[(o(!0),n(L,null,S(i.value,r=>(o(),n("button",{key:r.value,type:"button",class:y(["flex w-full items-center justify-between rounded-xl px-3 py-2.5 text-left text-sm transition-colors hover:bg-accent",p(r.value)?"bg-accent text-accent-foreground":"text-muted-foreground"]),onClick:u=>w(r.value)},[s("span",null,g(r.label),1),p(r.value)?(o(),n("span",M,"OK")):b("",!0)],10,E))),128))],2)):b("",!0)],512))}});export{F as _};
|
|
|
|
|
|
static/assets/Settings-Br2oo35p.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as V,E as w,h as m,i as U,x as S,o as N,c as a,u as O,a as t,b as x,t as B,w as s,p as r,y as b,B as G,f as P,e as d}from"./index-koyNnZzO.js";import{u as C}from"./settings-BSPhJbTu.js";import{_ as g}from"./SelectMenu.vue_vue_type_script_setup_true_lang-NT93P4h_.js";import{_ as M}from"./Checkbox.vue_vue_type_script_setup_true_lang-CuT0jx5F.js";const L={class:"space-y-8"},T={key:0,class:"rounded-3xl border border-border bg-card p-6 text-sm text-muted-foreground"},q={key:1,class:"rounded-3xl border border-border bg-card p-6"},A={class:"flex items-center justify-between"},D=["disabled"],E={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},F={key:1,class:"mt-6 space-y-8"},J={class:"grid gap-4 lg:grid-cols-3"},R={class:"space-y-4"},$={class:"rounded-2xl border border-border bg-card p-4"},j={class:"mt-4 space-y-3"},I={class:"rounded-2xl border border-border bg-card p-4"},z={class:"mt-4 space-y-3"},H={class:"rounded-2xl border border-border bg-card p-4"},K={class:"mt-4 grid grid-cols-2 gap-3 text-sm"},Q={class:"space-y-4"},W={class:"rounded-2xl border border-border bg-card p-4"},X={class:"mt-4 space-y-3"},oe=V({__name:"Settings",setup(Y){const i=C(),{settings:v,isLoading:y}=w(i),o=m(null),p=m(!1),n=m(""),c=[{label:"Base64 编码",value:"base64"},{label:"URL 链接",value:"url"}],f=U(()=>{const u=[{label:"Gemini 3 Pro Preview",value:"gemini-3-pro-preview"},{label:"Gemini 3 Flash Preview",value:"gemini-3-flash-preview"},{label:"Gemini 2.5 Pro",value:"gemini-2.5-pro"},{label:"Gemini 2.5 Flash",value:"gemini-2.5-flash"},{label:"Gemini Auto",value:"gemini-auto"}],e=o.value?.image_generation.supported_models||[];for(const l of e)u.some(k=>k.value===l)||u.push({label:l,value:l});return u});S(v,u=>{if(!u)return;const e=JSON.parse(JSON.stringify(u));e.image_generation=e.image_generation||{enabled:!1,supported_models:[],output_format:"base64"},e.image_generation.output_format||="base64",o.value=e}),N(async()=>{await i.loadSettings()});const _=async()=>{if(o.value){n.value="",p.value=!0;try{await i.updateSettings(o.value)}catch(u){n.value=u.message||"保存失败"}finally{p.value=!1}}};return(u,e)=>(d(),a("div",L,[O(y)?(d(),a("section",T," 正在加载设置... ")):(d(),a("section",q,[t("div",A,[e[15]||(e[15]=t("p",{class:"text-base font-semibold text-foreground"},"配置面板",-1)),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",disabled:p.value||!o.value,onClick:_}," 保存设置 ",8,D)]),n.value?(d(),a("div",E,B(n.value),1)):x("",!0),o.value?(d(),a("div",F,[t("div",J,[t("div",R,[t("div",$,[e[19]||(e[19]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"基础",-1)),t("div",j,[e[16]||(e[16]=t("label",{class:"block text-xs text-muted-foreground"},"API 密钥",-1)),s(t("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>o.value.basic.api_key=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"可选"},null,512),[[r,o.value.basic.api_key]]),e[17]||(e[17]=t("label",{class:"block text-xs text-muted-foreground"},"基础地址",-1)),s(t("input",{"onUpdate:modelValue":e[1]||(e[1]=l=>o.value.basic.base_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"自动检测或手动填写"},null,512),[[r,o.value.basic.base_url]]),e[18]||(e[18]=t("label",{class:"block text-xs text-muted-foreground"},"代理地址",-1)),s(t("input",{"onUpdate:modelValue":e[2]||(e[2]=l=>o.value.basic.proxy=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"http://127.0.0.1:7890"},null,512),[[r,o.value.basic.proxy]])])]),t("div",I,[e[23]||(e[23]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"图像生成",-1)),t("div",z,[b(M,{modelValue:o.value.image_generation.enabled,"onUpdate:modelValue":e[3]||(e[3]=l=>o.value.image_generation.enabled=l)},{default:G(()=>[...e[20]||(e[20]=[P(" 启用图像生成 ",-1)])]),_:1},8,["modelValue"]),e[21]||(e[21]=t("label",{class:"block text-xs text-muted-foreground"},"输出格式",-1)),b(g,{modelValue:o.value.image_generation.output_format,"onUpdate:modelValue":e[4]||(e[4]=l=>o.value.image_generation.output_format=l),options:c,placement:"up"},null,8,["modelValue"]),e[22]||(e[22]=t("label",{class:"block text-xs text-muted-foreground"},"支持模型",-1)),b(g,{modelValue:o.value.image_generation.supported_models,"onUpdate:modelValue":e[5]||(e[5]=l=>o.value.image_generation.supported_models=l),options:f.value,placeholder:"选择模型",placement:"up",multiple:""},null,8,["modelValue","options"])])])]),t("div",H,[e[30]||(e[30]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"重试",-1)),t("div",K,[e[24]||(e[24]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"新会话尝试次数",-1)),s(t("input",{"onUpdate:modelValue":e[6]||(e[6]=l=>o.value.retry.max_new_session_tries=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_new_session_tries,void 0,{number:!0}]]),e[25]||(e[25]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"请求重试次数",-1)),s(t("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>o.value.retry.max_request_retries=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_request_retries,void 0,{number:!0}]]),e[26]||(e[26]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"账号切换次数",-1)),s(t("input",{"onUpdate:modelValue":e[8]||(e[8]=l=>o.value.retry.max_account_switch_tries=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_account_switch_tries,void 0,{number:!0}]]),e[27]||(e[27]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"失败阈值",-1)),s(t("input",{"onUpdate:modelValue":e[9]||(e[9]=l=>o.value.retry.account_failure_threshold=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.account_failure_threshold,void 0,{number:!0}]]),e[28]||(e[28]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"限流冷却秒数",-1)),s(t("input",{"onUpdate:modelValue":e[10]||(e[10]=l=>o.value.retry.rate_limit_cooldown_seconds=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.rate_limit_cooldown_seconds,void 0,{number:!0}]]),e[29]||(e[29]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"会话缓存秒数",-1)),s(t("input",{"onUpdate:modelValue":e[11]||(e[11]=l=>o.value.retry.session_cache_ttl_seconds=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.session_cache_ttl_seconds,void 0,{number:!0}]])])]),t("div",Q,[t("div",W,[e[34]||(e[34]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"公开展示",-1)),t("div",X,[e[31]||(e[31]=t("label",{class:"block text-xs text-muted-foreground"},"Logo 地址",-1)),s(t("input",{"onUpdate:modelValue":e[12]||(e[12]=l=>o.value.public_display.logo_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"logo 地址"},null,512),[[r,o.value.public_display.logo_url]]),e[32]||(e[32]=t("label",{class:"block text-xs text-muted-foreground"},"聊天入口",-1)),s(t("input",{"onUpdate:modelValue":e[13]||(e[13]=l=>o.value.public_display.chat_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"聊天入口地址"},null,512),[[r,o.value.public_display.chat_url]]),e[33]||(e[33]=t("label",{class:"block text-xs text-muted-foreground"},"会话有效时长",-1)),s(t("input",{"onUpdate:modelValue":e[14]||(e[14]=l=>o.value.session.expire_hours=l),type:"number",min:"1",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[r,o.value.session.expire_hours,void 0,{number:!0}]])])]),e[35]||(e[35]=t("div",{class:"rounded-2xl border border-border bg-card p-4"},[t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"说明"),t("p",{class:"mt-4 text-sm text-muted-foreground"}," 保存后会直接写入配置文件并热更新。修改后请关注日志面板确认是否生效。 ")],-1))])])])):x("",!0)]))]))}});export{oe as default};
|
|
|
|
|
|
static/assets/index-BlnVds-t.css
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
@import"https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;600;700&family=Noto+Serif+SC:wght@600;700&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 97%;--foreground: 0 0% 10%;--card: 0 0% 100%;--card-foreground: 0 0% 10%;--primary: 0 0% 10%;--primary-foreground: 0 0% 100%;--secondary: 0 0% 92%;--secondary-foreground: 0 0% 10%;--muted: 0 0% 92%;--muted-foreground: 0 0% 40%;--accent: 0 0% 90%;--accent-foreground: 0 0% 10%;--destructive: 0 70% 45%;--destructive-foreground: 0 0% 100%;--border: 0 0% 86%;--input: 0 0% 86%;--ring: 0 0% 10%;--radius: 1rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Noto Sans SC,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;padding:0;overflow-x:hidden;background-image:radial-gradient(900px circle at 10% -20%,rgba(0,0,0,.04),transparent 45%),radial-gradient(700px circle at 90% 0%,rgba(0,0,0,.05),transparent 40%),linear-gradient(180deg,hsl(var(--background)) 0% 100%)}body:before{content:"";position:fixed;inset:0;background-image:linear-gradient(120deg,#ffffff8c,#fff0);opacity:.5;pointer-events:none;z-index:-1}h1,h2,h3{font-family:"Noto Serif SC",Georgia,serif;letter-spacing:-.01em}#app{min-height:100vh}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.top-full{top:100%}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-0{height:0px}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-full{height:100%}.max-h-\[60vh\]{max-height:60vh}.min-h-screen{min-height:100vh}.w-0{width:0px}.w-10{width:2.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-visible{overflow-y:visible}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-\[2\.5rem\]{border-radius:2.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-x-4{border-left-width:4px;border-right-width:4px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-4{border-top-width:4px}.border-border{border-color:hsl(var(--border))}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-input{border-color:hsl(var(--input))}.border-primary-foreground\/40{border-color:hsl(var(--primary-foreground) / .4)}.border-x-transparent{border-left-color:transparent;border-right-color:transparent}.border-t-foreground{border-top-color:hsl(var(--foreground))}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-200{--tw-bg-opacity: 1;background-color:rgb(253 230 138 / var(--tw-bg-opacity, 1))}.bg-amber-300{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-card\/70{background-color:hsl(var(--card) / .7)}.bg-card\/90{background-color:hsl(var(--card) / .9)}.bg-cyan-100{--tw-bg-opacity: 1;background-color:rgb(207 250 254 / var(--tw-bg-opacity, 1))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-foreground{background-color:hsl(var(--foreground))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/70{background-color:hsl(var(--muted) / .7)}.bg-primary{background-color:hsl(var(--primary))}.bg-primary-foreground\/15{background-color:hsl(var(--primary-foreground) / .15)}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/30{background-color:hsl(var(--secondary) / .3)}.bg-secondary\/40{background-color:hsl(var(--secondary) / .4)}.bg-secondary\/50{background-color:hsl(var(--secondary) / .5)}.bg-secondary\/60{background-color:hsl(var(--secondary) / .6)}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-violet-100{--tw-bg-opacity: 1;background-color:rgb(237 233 254 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pr-1{padding-right:.25rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.28em\]{letter-spacing:.28em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.3em\]{letter-spacing:.3em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-background{color:hsl(var(--background))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-cyan-700{--tw-text-opacity: 1;color:rgb(14 116 144 / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-green-200{--tw-text-opacity: 1;color:rgb(187 247 208 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/10{--tw-shadow-color: rgb(0 0 0 / .1);--tw-shadow: var(--tw-shadow-colored)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\,transform\]{transition-property:width,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.will-change-\[width\,transform\]{will-change:width,transform}html{scrollbar-gutter:stable}*{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:content-box}.scrollbar-slim::-webkit-scrollbar{width:6px;height:6px}.scrollbar-slim::-webkit-scrollbar-thumb{background-color:#0006}.monitor-badge--up{background:#d1fae5;color:#065f46}.monitor-badge--warn{background:#fef3c7;color:#b45309}.monitor-badge--down{background:#fee2e2;color:#991b1b}.monitor-badge--unknown{background:#f3f4f6;color:#6b7280}.monitor-card{border-radius:16px;padding:0;background:hsl(var(--card));box-shadow:none}.monitor-card__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.monitor-card__name{font-size:14px;font-weight:600;color:hsl(var(--foreground))}.monitor-card__badge{padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600}.monitor-card__stats{display:flex;flex-wrap:wrap;gap:16px;font-size:12px;color:hsl(var(--muted-foreground));margin-bottom:12px}.monitor-card__value{margin-left:4px;color:hsl(var(--foreground));font-weight:600}.monitor-card__beats{display:flex;gap:2px;height:24px;align-items:flex-end}.monitor-beat{flex:1;min-width:4px;max-width:8px;border-radius:2px;transition:all .2s;position:relative}.monitor-beat:hover{opacity:.8;transform:scaleY(1.1)}.monitor-beat--up{background:#34c759;height:100%}.monitor-beat--warn,.monitor-beat--slow{background:#f5c15b;height:100%}.monitor-beat--down{background:#ff3b30;height:100%}.monitor-beat--empty{background:#e5e5ea;height:40%}.monitor-beat__tooltip{position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#1d1d1f;color:#fff;padding:6px 10px;border-radius:6px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s;margin-bottom:6px;z-index:10}.monitor-beat__tooltip:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1d1d1f}.monitor-beat:hover .monitor-beat__tooltip{opacity:1}.help-dot{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:999px;border:1px solid hsl(var(--border));font-size:10px;line-height:1;color:hsl(var(--muted-foreground));cursor:default}@media(max-width:768px){.monitor-beat{min-width:3px;max-width:6px}}@media(min-width:1024px){.dashboard-split{flex-direction:row;flex-wrap:nowrap}.dashboard-split .dashboard-main{flex:0 0 66.6667%;max-width:66.6667%}.dashboard-split .dashboard-side{flex:0 0 33.3333%;max-width:33.3333%}}@keyframes logo-float{0%{transform:translateY(0)}25%{transform:translateY(6px)}50%{transform:translateY(0)}75%{transform:translateY(-6px)}to{transform:translateY(0)}}@keyframes logo-blink{0%,45%,55%,to{transform:scaleY(1);opacity:1}50%{transform:scaleY(.1);opacity:.6}}.logo-mark .logo-cat-wrapper{animation:logo-float 4s ease-in-out infinite;transform-origin:center}.logo-mark{transform:translateY(2px)}.logo-mark .logo-eye{fill:#00bcd4;filter:drop-shadow(0 0 2px #00bcd4);animation:logo-blink 5s infinite;transform-box:fill-box;transform-origin:center}.hover\:border-destructive:hover{border-color:hsl(var(--destructive))}.hover\:border-destructive\/40:hover{border-color:hsl(var(--destructive) / .4)}.hover\:border-destructive\/60:hover{border-color:hsl(var(--destructive) / .6)}.hover\:border-foreground:hover{border-color:hsl(var(--foreground))}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-secondary\/60:hover{background-color:hsl(var(--secondary) / .6)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-emerald-500:hover{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:opacity-90:hover{opacity:.9}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-accent-foreground{color:hsl(var(--accent-foreground))}.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:border-foreground{border-color:hsl(var(--foreground))}.peer:checked~.peer-checked\:bg-foreground{background-color:hsl(var(--foreground))}.peer:checked~.peer-checked\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.peer:disabled~.peer-disabled\:opacity-50{opacity:.5}@media(min-width:640px){.sm\:ml-0{margin-left:0}.sm\:flex{display:flex}.sm\:w-44{width:11rem}.sm\:w-48{width:12rem}.sm\:w-auto{width:auto}.sm\:min-w-0{min-width:0px}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}}@media(min-width:768px){.md\:w-auto{width:auto}.md\:flex-1{flex:1 1 0%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:static{position:static}.lg\:sticky{position:sticky}.lg\:top-0{top:0}.lg\:ml-0{margin-left:0}.lg\:hidden{display:none}.lg\:h-20{height:5rem}.lg\:h-64{height:16rem}.lg\:h-screen{height:100vh}.lg\:w-20{width:5rem}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:border-b-0{border-bottom-width:0px}.lg\:border-r{border-right-width:1px}.lg\:bg-card\/80{background-color:hsl(var(--card) / .8)}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:py-4{padding-top:1rem;padding-bottom:1rem}.lg\:pt-10{padding-top:2.5rem}.lg\:pt-5{padding-top:1.25rem}.lg\:pt-6{padding-top:1.5rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}}@media(min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}
|
|
|
|
|
|
static/assets/index-koyNnZzO.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
static/assets/settings-BSPhJbTu.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{g as a,D as g,h as n}from"./index-koyNnZzO.js";const i={get:()=>a.get("/admin/settings"),update:t=>a.put("/admin/settings",t)},r=g("settings",()=>{const t=n(null),e=n(!1);async function u(){e.value=!0;try{t.value=await i.get()}finally{e.value=!1}}async function o(s){await i.update(s),t.value=s}return{settings:t,isLoading:e,loadSettings:u,updateSettings:o}});export{r as u};
|
|
|
|
|
|
static/assets/useConfirmDialog-egiUdQHS.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{h as l}from"./index-koyNnZzO.js";function v(){const a=l(!1),c=l("确认操作"),s=l(""),t=l("确定"),r=l("取消");let e=null;return{open:a,title:c,message:s,confirmText:t,cancelText:r,ask:n=>new Promise(u=>{c.value=n.title||"确认操作",s.value=n.message,t.value=n.confirmText||"确定",r.value=n.cancelText||"取消",a.value=!0,e=u}),confirm:()=>{a.value=!1,e?.(!0),e=null},cancel:()=>{a.value=!1,e?.(!1),e=null}}}export{v as u};
|
|
|
|
|
|
static/assets/useUptimeStatus-nIwESkAy.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{g as d,h as r,i as c}from"./index-koyNnZzO.js";const f={uptime(t=90){return d.get("/public/uptime",{params:{days:t}})}},b=4e4,w=60,g=t=>t==="up"?"正常":t==="warn"?"注意":t==="down"?"异常":"未知",h=t=>t==="up"?"monitor-badge--up":t==="warn"?"monitor-badge--warn":t==="down"?"monitor-badge--down":"monitor-badge--unknown",v=(t=[])=>{const a=[];for(let s=0;s<w;s+=1)if(s<t.length){const e=t[s],u=e.latency_ms??null,l=e.success&&u!==null&&u>b,o=e.level??(l?"warn":e.success?"up":"down"),n=o==="warn"?"monitor-beat--warn":o==="up"?"monitor-beat--up":"monitor-beat--down",i=u!==null?` · 首响 ${(Math.max(u,0)/1e3).toFixed(1)}s`:"",m=e.status_code?` · HTTP ${e.status_code}`:"",p=o==="warn"?"警告":e.success?"成功":"失败";a.push({className:n,tooltip:`${e.time} · ${p}${m}${i}`})}else a.push({className:"monitor-beat--empty",tooltip:null});return a};function y(){const t=r(null),a=r(""),s=r(!1),e=c(()=>t.value?.updated_at??"");return{services:c(()=>t.value?Object.entries(t.value.services).map(([o,n])=>({key:o,name:n.name,statusLabel:g(n.status),statusClass:h(n.status),uptime:n.uptime,total:n.total,success:n.success,beats:v(n.heartbeats)})):[]),updatedAt:e,errorMessage:a,isLoading:s,refreshStatus:async()=>{if(!s.value){s.value=!0,a.value="";try{t.value=await f.uptime()}catch(o){a.value=o.message||"监控数据获取失败"}finally{s.value=!1}}}}}export{y as u};
|
|
|
|
|
|