ellm-proxy 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ import{u as D}from"./useToast-B3quFZyv.js";import{A as q}from"./useApi-C1Ngt_o5.js";import{u as G}from"./config-BRaXq0LL.js";import{d as N,i as H,n as R,o as x,j as T,w as o,c as U,b as t,t as A,k as B,e as n,a as s,F as L,l as d,a1 as J,r as i,m as M,_ as Q}from"./index-dPeMJjrz.js";import{m as P}from"./useManagerApi-BDWJz5o6.js";const Z={class:"flex-between"},ee={class:"muted-sm mb-8"},le={class:"switch-row"},se={class:"switch-info"},te={class:"switch-title"},oe={class:"switch-row"},ae={class:"switch-info"},ne={class:"switch-title"},ie={class:"switch-row"},ue={class:"switch-info"},de={class:"switch-title"},re=N({__name:"HarnessSwitches",setup(O){const{toast:h}=D(),v=d(!0),k=d(!1),u=d(null),g=d(null),c=d(null),p=d(null),y=d("success"),w=async m=>{m||(u.value?k.value=!0:v.value=!0);try{u.value=await P.harness(),g.value=null}catch(l){m||(g.value=l.message)}finally{m||(v.value=!1,k.value=!1)}};H(()=>w(!1));const E={claudeCode:{label:"Claude Code",file:"~/.claude/settings.json",toggle:P.setClaudeCode},codex:{label:"Codex CLI",file:"~/.codex/config.toml",toggle:P.setCodex},dsh:{label:"DeepSeek Harness",file:"~/.dsh/settings.yaml",toggle:P.setDsh}},b=async(m,l)=>{if(!u.value||c.value)return;const _=E[m],a=l?`确定开启 ${_.label} 代理?将改写 ${_.file}(开启前自动备份,关闭时从备份还原)。`:`确定关闭 ${_.label} 代理?将从备份还原 ${_.file}(无备份时移除代理相关配置)。`;try{await J.confirm(a,l?"开启确认":"关闭确认",{confirmButtonText:l?"开启":"关闭",cancelButtonText:"取消",type:"warning"})}catch{return}c.value=m;try{const e=await _.toggle(l);p.value=e.note??null,y.value=l?"success":"info",h(l?"已开启代理":"已关闭代理","success")}catch(e){h(e.message||"操作失败","error")}finally{c.value=null,await w(!0)}};return(m,l)=>{const _=i("el-button"),a=i("el-alert"),e=i("el-tag"),V=i("el-switch"),S=i("el-divider"),C=i("el-empty"),$=i("el-card"),I=M("loading");return R((x(),T($,{shadow:"never"},{header:o(()=>[t("div",Z,[l[7]||(l[7]=t("span",{class:"fw-600"},"代理开关",-1)),s(_,{loading:k.value,onClick:l[0]||(l[0]=f=>w(!1))},{default:o(()=>[...l[6]||(l[6]=[n("刷新",-1)])]),_:1},8,["loading"])])]),default:o(()=>[u.value?(x(),U(L,{key:0},[t("div",ee," 将本机 CLI 工具的流量一键指向 ellm-proxy 网关("+A(u.value.gatewayBase)+")。 开启前自动备份原配置为 *.ellm-bak(保留最早的原始备份),关闭时从备份还原。 ",1),p.value?(x(),T(a,{key:0,title:p.value,type:y.value,"show-icon":"",class:"mb-8",onClose:l[1]||(l[1]=f=>p.value=null)},null,8,["title","type"])):B("",!0),t("div",le,[t("div",se,[t("div",te,[l[8]||(l[8]=n(" Claude Code ",-1)),s(e,{type:u.value.claudeCode?"success":"info",size:"small","disable-transitions":""},{default:o(()=>[n(A(u.value.claudeCode?"已开启":"未开启"),1)]),_:1},8,["type"])]),l[9]||(l[9]=t("div",{class:"switch-desc"},[n(" 写入 "),t("code",null,"~/.claude/settings.json"),n(" 的 env.ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN, 鉴权取网关配置的 masterKey(未设置将开启失败);其余字段原样保留,重启 Claude Code 会话后生效。 ")],-1))]),s(V,{"model-value":u.value.claudeCode,loading:c.value==="claudeCode",onChange:l[2]||(l[2]=f=>b("claudeCode",!!f))},null,8,["model-value","loading"])]),s(S,{class:"switch-divider"}),t("div",oe,[t("div",ae,[t("div",ne,[l[10]||(l[10]=n(" Codex CLI ",-1)),s(e,{type:u.value.codex?"success":"info",size:"small","disable-transitions":""},{default:o(()=>[n(A(u.value.codex?"已开启":"未开启"),1)]),_:1},8,["type"])]),l[11]||(l[11]=t("div",{class:"switch-desc"},[n(" 写入 "),t("code",null,"~/.codex/config.toml"),n(" 的 model_provider 与 [model_providers.ellm-proxy] 段 (保留用户注释与排版);开启后需按提示设置环境变量 ELLM_PROXY_API_KEY 供 Codex 鉴权。 ")],-1))]),s(V,{"model-value":u.value.codex,loading:c.value==="codex",onChange:l[3]||(l[3]=f=>b("codex",!!f))},null,8,["model-value","loading"])]),s(S,{class:"switch-divider"}),t("div",ie,[t("div",ue,[t("div",de,[l[12]||(l[12]=n(" DeepSeek Harness ",-1)),s(e,{type:u.value.dsh?"success":"info",size:"small","disable-transitions":""},{default:o(()=>[n(A(u.value.dsh?"已开启":"未开启"),1)]),_:1},8,["type"])]),l[13]||(l[13]=t("div",{class:"switch-desc"},[n(" 写入 "),t("code",null,"~/.dsh/settings.yaml"),n(" 的 llm-deepseek.baseURL 与 "),t("code",null,"~/.dsh/.credentials.yaml"),n(" 的 DEEPSEEK_API_KEY(取网关 masterKey,未设置则写占位值);模型请在 dsh 内选择与网关部署名一致的模型。 dsh 为 developer preview,配置格式可能随版本变化。 ")],-1))]),s(V,{"model-value":u.value.dsh,loading:c.value==="dsh",onChange:l[4]||(l[4]=f=>b("dsh",!!f))},null,8,["model-value","loading"])])],64)):(x(),T(C,{key:1,description:g.value||"暂无开关状态"},{default:o(()=>[s(_,{type:"primary",onClick:l[5]||(l[5]=f=>w(!1))},{default:o(()=>[...l[14]||(l[14]=[n("重试",-1)])]),_:1})]),_:1},8,["description"]))]),_:1})),[[I,v.value]])}}}),me=Q(re,[["__scopeId","data-v-e8a0f661"]]),ve={class:"flex-col-gap"},ce={class:"flex-between"},pe={class:"muted-sm"},_e={key:0},fe={class:"flex-end"},xe=N({__name:"SettingsView",setup(O){const{toast:h}=D(),v=G(),k=d("basic"),u=d(!0),g=d(!1),c=d(""),p=d(29770),y=d(null),w=d("passthrough"),E=d(!1),b=d(""),m=d(""),l=async()=>{var a;try{await v.load(),c.value=v.config.masterKey||"",p.value=v.config.port??29770,w.value=v.config.compression==="plain"?"plain":"passthrough",E.value=v.config.logContent===!0;const e=(a=v.config["web-ui"])==null?void 0:a["login-account"];b.value=(e==null?void 0:e.username)||"",m.value=(e==null?void 0:e.password)||"";try{y.value=await q.get("/api/status").then(V=>V.listenPort)}catch{y.value=null}}catch(e){h(e.message,"error")}finally{u.value=!1}},_=async()=>{g.value=!0;try{await v.update(a=>{var e;a.masterKey=c.value.trim(),a.port=p.value,a.compression=w.value,a.logContent=E.value,a["web-ui"]??(a["web-ui"]={}),(e=a["web-ui"])["login-account"]??(e["login-account"]={}),a["web-ui"]["login-account"].username=b.value.trim(),a["web-ui"]["login-account"].password=m.value}),h("设置已保存并生效","success")}catch(a){h(a.message,"error")}finally{g.value=!1}};return H(l),(a,e)=>{const V=i("el-tag"),S=i("el-input"),C=i("el-form-item"),$=i("el-input-number"),I=i("el-option"),f=i("el-select"),z=i("el-switch"),W=i("el-form"),j=i("el-card"),Y=i("el-button"),K=i("el-tab-pane"),F=i("el-tabs"),X=M("loading");return x(),T(F,{modelValue:k.value,"onUpdate:modelValue":e[6]||(e[6]=r=>k.value=r),class:"settings-tabs"},{default:o(()=>[s(K,{label:"基本设置",name:"basic"},{default:o(()=>[R((x(),U("div",ve,[s(j,{shadow:"never"},{header:o(()=>[t("div",ce,[e[8]||(e[8]=t("span",{class:"fw-600"},"基本设置",-1)),s(V,{type:"success"},{default:o(()=>[...e[7]||(e[7]=[n("运行中",-1)])]),_:1})])]),default:o(()=>[s(W,{"label-position":"top"},{default:o(()=>[s(C,{label:"Master Key"},{default:o(()=>[s(S,{modelValue:c.value,"onUpdate:modelValue":e[0]||(e[0]=r=>c.value=r),type:"password",placeholder:"sk-1234","show-password":""},null,8,["modelValue"]),e[9]||(e[9]=t("div",{class:"muted-sm"}," 网关 API 认证密钥(/v1/* 请求需携带 Bearer <masterKey>;留空 = 本地放行) ",-1))]),_:1}),s(C,{label:"监听端口 (port)"},{default:o(()=>[s($,{modelValue:p.value,"onUpdate:modelValue":e[1]||(e[1]=r=>p.value=r),min:1,max:65535,step:1,class:"full-width"},null,8,["modelValue"]),t("div",pe,[e[11]||(e[11]=n(" 网关与管理台 API 的监听端口,保存后下次重启生效 ",-1)),y.value!==null?(x(),U(L,{key:0},[e[10]||(e[10]=n(" ;当前实际监听 ",-1)),t("b",null,A(y.value),1),y.value!==p.value?(x(),U("span",_e,"(由 PORT 环境变量覆盖,此配置值不生效)")):B("",!0)],64)):B("",!0)])]),_:1}),s(C,{label:"压缩语义 (compression)"},{default:o(()=>[s(f,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=r=>w.value=r),class:"full-width"},{default:o(()=>[s(I,{label:"透传 (passthrough)",value:"passthrough"}),s(I,{label:"明文 (plain)",value:"plain"})]),_:1},8,["modelValue"]),e[12]||(e[12]=t("div",{class:"muted-sm"},"上游响应压缩处理方式,保存后热更新生效",-1))]),_:1}),s(C,{label:"日志内容捕获 (logContent)"},{default:o(()=>[s(z,{modelValue:E.value,"onUpdate:modelValue":e[3]||(e[3]=r=>E.value=r)},null,8,["modelValue"]),e[13]||(e[13]=t("div",{class:"muted-sm"}," 记录完整请求/响应(含上游原始与转换后内容)进日志详情,用于排查定位问题;开启后有少量内存与存储开销,保存后热更新生效 ",-1))]),_:1}),s(C,{label:"管理台用户名 (web-ui.login-account.username)"},{default:o(()=>[s(S,{modelValue:b.value,"onUpdate:modelValue":e[4]||(e[4]=r=>b.value=r),placeholder:"admin"},null,8,["modelValue"]),e[14]||(e[14]=t("div",{class:"muted-sm"}," 管理台登录用户名,留空回退 WEBUI_USERNAME 环境变量或默认 admin ",-1))]),_:1}),s(C,{label:"管理台密码 (web-ui.login-account.password)"},{default:o(()=>[s(S,{modelValue:m.value,"onUpdate:modelValue":e[5]||(e[5]=r=>m.value=r),type:"password",placeholder:"admin","show-password":""},null,8,["modelValue"]),e[15]||(e[15]=t("div",{class:"muted-sm"}," 管理台登录密码,留空回退 WEBUI_PASSWORD 环境变量或默认 admin;修改保存后立即生效,需用新账号重新登录 ",-1))]),_:1})]),_:1})]),_:1}),t("div",fe,[s(Y,{type:"primary",loading:g.value,disabled:g.value,onClick:_},{default:o(()=>[n(A(g.value?"保存中...":"保存设置"),1)]),_:1},8,["loading","disabled"])])])),[[X,u.value]])]),_:1}),s(K,{label:"代理开关",name:"harness",lazy:""},{default:o(()=>[s(me)]),_:1})]),_:1},8,["modelValue"])}}});export{xe as default};
@@ -1 +1 @@
1
- import{U as p,l as u,f as n}from"./index-DFlUx18F.js";import{A as i}from"./useApi-BRPinb_2.js";const m=p("config",()=>{const e=u({}),o=u(!1),t=n(()=>Array.isArray(e.value.providers)?e.value.providers:[]),l=n(()=>t.value.length),c=n(()=>t.value.reduce((a,d)=>{var s;return a+(((s=d.models)==null?void 0:s.length)??0)},0));async function f(){o.value=!0;try{e.value=await i.get("/api/config")}finally{o.value=!1}}async function r(){return await i.put("/api/config",e.value)}async function v(a){return a(e.value),await r()}return{config:e,loading:o,providers:t,providerCount:l,totalModelCount:c,load:f,save:r,update:v}});export{m as u};
1
+ import{U as p,l as u,f as n}from"./index-dPeMJjrz.js";import{A as i}from"./useApi-C1Ngt_o5.js";const m=p("config",()=>{const e=u({}),o=u(!1),t=n(()=>Array.isArray(e.value.providers)?e.value.providers:[]),l=n(()=>t.value.length),c=n(()=>t.value.reduce((a,d)=>{var s;return a+(((s=d.models)==null?void 0:s.length)??0)},0));async function f(){o.value=!0;try{e.value=await i.get("/api/config")}finally{o.value=!1}}async function r(){return await i.put("/api/config",e.value)}async function v(a){return a(e.value),await r()}return{config:e,loading:o,providers:t,providerCount:l,totalModelCount:c,load:f,save:r,update:v}});export{m as u};
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardView-CQdlgirS.js","assets/useApi-BRPinb_2.js","assets/providers-CGEmOxne.js","assets/config-DNn5cjYY.js","assets/useToast-D7xlwSg6.js","assets/DashboardView-qrQrkgLA.css","assets/ProvidersView-GQENcvJS.js","assets/ProvidersView-BxAxDRFH.css","assets/SettingsView-BrAiaskZ.js","assets/useManagerApi-BDWJz5o6.js","assets/SettingsView-BDkymsrS.css","assets/LogsView-B-bIj36j.js","assets/LogsView-Wl3_adHm.css","assets/ProcessView-0x_ShSwV.js","assets/ProcessView-DzMqBJmd.css","assets/LoginView-CPvz1Ylx.js","assets/LoginView-Dg0mB6ok.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardView-B71Dy3px.js","assets/useApi-C1Ngt_o5.js","assets/providers-Dmz2p4Wd.js","assets/config-BRaXq0LL.js","assets/useToast-B3quFZyv.js","assets/DashboardView-qrQrkgLA.css","assets/ProvidersView-mb0KU16n.js","assets/ProvidersView-Dpr8MI-p.css","assets/SettingsView-BgLQVC2H.js","assets/useManagerApi-BDWJz5o6.js","assets/SettingsView-BDkymsrS.css","assets/LogsView-B2ctrpv4.js","assets/LogsView-Dl50XQhG.css","assets/ProcessView-DmbVABQV.js","assets/ProcessView-DzMqBJmd.css","assets/LoginView-XTF5dHvd.js","assets/LoginView-Dg0mB6ok.css"])))=>i.map(i=>d[i]);
2
2
  (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))a(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&a(r)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function a(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();/**
3
3
  * @vue/shared v3.5.42
4
4
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
@@ -93,4 +93,4 @@ usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,curr
93
93
  * vue-router v4.6.4
94
94
  * (c) 2025 Eduardo San Martin Morote
95
95
  * @license MIT
96
- */let ofe=()=>location.protocol+"//"+location.host;function r9(e,t){const{pathname:n,search:a,hash:l}=t,o=e.indexOf("#");if(o>-1){let r=l.includes(e.slice(o))?e.slice(o).length:1,s=l.slice(r);return s[0]!=="/"&&(s="/"+s),r3(s,"")}return r3(n,e)+a+l}function rfe(e,t,n,a){let l=[],o=[],r=null;const s=({state:p})=>{const m=r9(e,location),v=n.value,h=t.value;let g=0;if(p){if(n.value=m,t.value=p,r&&r===v){r=null;return}g=h?p.position-h.position:0}else a(m);l.forEach(y=>{y(n.value,v,{delta:g,type:j2.pop,direction:g?g>0?vp.forward:vp.back:vp.unknown})})};function u(){r=n.value}function c(p){l.push(p);const m=()=>{const v=l.indexOf(p);v>-1&&l.splice(v,1)};return o.push(m),m}function d(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(cn({},p.state,{scroll:v0()}),"")}}function f(){for(const p of o)p();o=[],window.removeEventListener("popstate",s),window.removeEventListener("pagehide",d),document.removeEventListener("visibilitychange",d)}return window.addEventListener("popstate",s),window.addEventListener("pagehide",d),document.addEventListener("visibilitychange",d),{pauseListeners:u,listen:c,destroy:f}}function d3(e,t,n,a=!1,l=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:l?v0():null}}function sfe(e){const{history:t,location:n}=window,a={value:r9(e,n)},l={value:t.state};l.value||o(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(u,c,d){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+u:ofe()+e+u;try{t[d?"replaceState":"pushState"](c,"",p),l.value=c}catch(m){console.error(m),n[d?"replace":"assign"](p)}}function r(u,c){o(u,cn({},t.state,d3(l.value.back,u,l.value.forward,!0),c,{position:l.value.position}),!0),a.value=u}function s(u,c){const d=cn({},l.value,t.state,{forward:u,scroll:v0()});o(d.current,d,!0),o(u,cn({},d3(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:l,push:s,replace:r}}function ife(e){e=jde(e);const t=sfe(e),n=rfe(e,t.state,t.location,t.replace);function a(o,r=!0){r||n.pauseListeners(),history.go(o)}const l=cn({location:"",base:e,go:a,createHref:Ude.bind(null,e)},t,n);return Object.defineProperty(l,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(l,"state",{enumerable:!0,get:()=>t.state.value}),l}function ufe(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),ife(e)}let Tr=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Wn=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Wn||{});const cfe={type:Tr.Static,value:""},dfe=/[a-zA-Z0-9_]/;function ffe(e){if(!e)return[[]];if(e==="/")return[[cfe]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${c}": ${m}`)}let n=Wn.Static,a=n;const l=[];let o;function r(){o&&l.push(o),o=[]}let s=0,u,c="",d="";function f(){c&&(n===Wn.Static?o.push({type:Tr.Static,value:c}):n===Wn.Param||n===Wn.ParamRegExp||n===Wn.ParamRegExpEnd?(o.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),o.push({type:Tr.Param,value:c,regexp:d,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=u}for(;s<e.length;){if(u=e[s++],u==="\\"&&n!==Wn.ParamRegExp){a=n,n=Wn.EscapeNext;continue}switch(n){case Wn.Static:u==="/"?(c&&f(),r()):u===":"?(f(),n=Wn.Param):p();break;case Wn.EscapeNext:p(),n=a;break;case Wn.Param:u==="("?n=Wn.ParamRegExp:dfe.test(u)?p():(f(),n=Wn.Static,u!=="*"&&u!=="?"&&u!=="+"&&s--);break;case Wn.ParamRegExp:u===")"?d[d.length-1]=="\\"?d=d.slice(0,-1)+u:n=Wn.ParamRegExpEnd:d+=u;break;case Wn.ParamRegExpEnd:f(),n=Wn.Static,u!=="*"&&u!=="?"&&u!=="+"&&s--,d="";break;default:t("Unknown state");break}}return n===Wn.ParamRegExp&&t(`Unfinished custom RegExp for param "${c}"`),f(),r(),l}const f3="[^/]+?",pfe={sensitive:!1,strict:!1,start:!0,end:!0};var ga=(function(e){return e[e._multiplier=10]="_multiplier",e[e.Root=90]="Root",e[e.Segment=40]="Segment",e[e.SubSegment=30]="SubSegment",e[e.Static=40]="Static",e[e.Dynamic=20]="Dynamic",e[e.BonusCustomRegExp=10]="BonusCustomRegExp",e[e.BonusWildcard=-50]="BonusWildcard",e[e.BonusRepeatable=-20]="BonusRepeatable",e[e.BonusOptional=-8]="BonusOptional",e[e.BonusStrict=.7000000000000001]="BonusStrict",e[e.BonusCaseSensitive=.25]="BonusCaseSensitive",e})(ga||{});const hfe=/[.+*?^${}()[\]/\\]/g;function vfe(e,t){const n=cn({},pfe,t),a=[];let l=n.start?"^":"";const o=[];for(const c of e){const d=c.length?[]:[ga.Root];n.strict&&!c.length&&(l+="/");for(let f=0;f<c.length;f++){const p=c[f];let m=ga.Segment+(n.sensitive?ga.BonusCaseSensitive:0);if(p.type===Tr.Static)f||(l+="/"),l+=p.value.replace(hfe,"\\$&"),m+=ga.Static;else if(p.type===Tr.Param){const{value:v,repeatable:h,optional:g,regexp:y}=p;o.push({name:v,repeatable:h,optional:g});const b=y||f3;if(b!==f3){m+=ga.BonusCustomRegExp;try{`${b}`}catch(_){throw new Error(`Invalid custom RegExp for param "${v}" (${b}): `+_.message)}}let w=h?`((?:${b})(?:/(?:${b}))*)`:`(${b})`;f||(w=g&&c.length<2?`(?:/${w})`:"/"+w),g&&(w+="?"),l+=w,m+=ga.Dynamic,g&&(m+=ga.BonusOptional),h&&(m+=ga.BonusRepeatable),b===".*"&&(m+=ga.BonusWildcard)}d.push(m)}a.push(d)}if(n.strict&&n.end){const c=a.length-1;a[c][a[c].length-1]+=ga.BonusStrict}n.strict||(l+="/?"),n.end?l+="$":n.strict&&!l.endsWith("/")&&(l+="(?:/|$)");const r=new RegExp(l,n.sensitive?"":"i");function s(c){const d=c.match(r),f={};if(!d)return null;for(let p=1;p<d.length;p++){const m=d[p]||"",v=o[p-1];f[v.name]=m&&v.repeatable?m.split("/"):m}return f}function u(c){let d="",f=!1;for(const p of e){(!f||!d.endsWith("/"))&&(d+="/"),f=!1;for(const m of p)if(m.type===Tr.Static)d+=m.value;else if(m.type===Tr.Param){const{value:v,repeatable:h,optional:g}=m,y=v in c?c[v]:"";if(Cl(y)&&!h)throw new Error(`Provided param "${v}" is an array but it is not repeatable (* or + modifiers)`);const b=Cl(y)?y.join("/"):y;if(!b)if(g)p.length<2&&(d.endsWith("/")?d=d.slice(0,-1):f=!0);else throw new Error(`Missing required param "${v}"`);d+=b}}return d||"/"}return{re:r,score:a,keys:o,parse:s,stringify:u}}function mfe(e,t){let n=0;for(;n<e.length&&n<t.length;){const a=t[n]-e[n];if(a)return a;n++}return e.length<t.length?e.length===1&&e[0]===ga.Static+ga.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===ga.Static+ga.Segment?1:-1:0}function s9(e,t){let n=0;const a=e.score,l=t.score;for(;n<a.length&&n<l.length;){const o=mfe(a[n],l[n]);if(o)return o;n++}if(Math.abs(l.length-a.length)===1){if(p3(a))return 1;if(p3(l))return-1}return l.length-a.length}function p3(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const gfe={strict:!1,end:!0,sensitive:!1};function yfe(e,t,n){const a=vfe(ffe(e.path),n),l=cn(a,{record:e,parent:t,children:[],alias:[]});return t&&!l.record.aliasOf==!t.record.aliasOf&&t.children.push(l),l}function bfe(e,t){const n=[],a=new Map;t=o3(gfe,t);function l(f){return a.get(f)}function o(f,p,m){const v=!m,h=v3(f);h.aliasOf=m&&m.record;const g=o3(t,f),y=[h];if("alias"in f){const _=typeof f.alias=="string"?[f.alias]:f.alias;for(const C of _)y.push(v3(cn({},h,{components:m?m.record.components:h.components,path:C,aliasOf:m?m.record:h})))}let b,w;for(const _ of y){const{path:C}=_;if(p&&C[0]!=="/"){const k=p.record.path,T=k[k.length-1]==="/"?"":"/";_.path=p.record.path+(C&&T+C)}if(b=yfe(_,p,g),m?m.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!m3(b)&&r(f.name)),i9(b)&&u(b),h.children){const k=h.children;for(let T=0;T<k.length;T++)o(k[T],b,m&&m.children[T])}m=m||b}return w?()=>{r(w)}:Zi}function r(f){if(l9(f)){const p=a.get(f);p&&(a.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(r),p.alias.forEach(r))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&a.delete(f.record.name),f.children.forEach(r),f.alias.forEach(r))}}function s(){return n}function u(f){const p=Cfe(f,n);n.splice(p,0,f),f.record.name&&!m3(f)&&a.set(f.record.name,f)}function c(f,p){let m,v={},h,g;if("name"in f&&f.name){if(m=a.get(f.name),!m)throw ai(Rn.MATCHER_NOT_FOUND,{location:f});g=m.record.name,v=cn(h3(p.params,m.keys.filter(w=>!w.optional).concat(m.parent?m.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&h3(f.params,m.keys.map(w=>w.name))),h=m.stringify(v)}else if(f.path!=null)h=f.path,m=n.find(w=>w.re.test(h)),m&&(v=m.parse(h),g=m.record.name);else{if(m=p.name?a.get(p.name):n.find(w=>w.re.test(p.path)),!m)throw ai(Rn.MATCHER_NOT_FOUND,{location:f,currentLocation:p});g=m.record.name,v=cn({},p.params,f.params),h=m.stringify(v)}const y=[];let b=m;for(;b;)y.unshift(b.record),b=b.parent;return{name:g,path:h,params:v,matched:y,meta:_fe(y)}}e.forEach(f=>o(f));function d(){n.length=0,a.clear()}return{addRoute:o,resolve:c,removeRoute:r,clearRoutes:d,getRoutes:s,getRecordMatcher:l}}function h3(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function v3(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:wfe(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function wfe(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]=typeof n=="object"?n[a]:n;return t}function m3(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function _fe(e){return e.reduce((t,n)=>cn(t,n.meta),{})}function Cfe(e,t){let n=0,a=t.length;for(;n!==a;){const o=n+a>>1;s9(e,t[o])<0?a=o:n=o+1}const l=Sfe(e);return l&&(a=t.lastIndexOf(l,a-1)),a}function Sfe(e){let t=e;for(;t=t.parent;)if(i9(t)&&s9(e,t)===0)return t}function i9({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function g3(e){const t=Ve(m0),n=Ve(u1),a=x(()=>{const u=i(e.to);return t.resolve(u)}),l=x(()=>{const{matched:u}=a.value,{length:c}=u,d=u[c-1],f=n.matched;if(!d||!f.length)return-1;const p=f.findIndex(ni.bind(null,d));if(p>-1)return p;const m=y3(u[c-2]);return c>1&&y3(d)===m&&f[f.length-1].path!==m?f.findIndex(ni.bind(null,u[c-2])):p}),o=x(()=>l.value>-1&&Mfe(n.params,a.value.params)),r=x(()=>l.value>-1&&l.value===n.matched.length-1&&a9(n.params,a.value.params));function s(u={}){if(Tfe(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(Zi);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:a,href:x(()=>a.value.href),isActive:o,isExactActive:r,navigate:s}}function xfe(e){return e.length===1?e[0]:e}const kfe=K({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:g3,setup(e,{slots:t}){const n=Dt(g3(e)),{options:a}=Ve(m0),l=x(()=>({[b3(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[b3(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&xfe(t.default(n));return e.custom?o:Ze("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:l.value},o)}}}),Efe=kfe;function Tfe(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Mfe(e,t){for(const n in t){const a=t[n],l=e[n];if(typeof a=="string"){if(a!==l)return!1}else if(!Cl(l)||l.length!==a.length||a.some((o,r)=>o.valueOf()!==l[r].valueOf()))return!1}return!0}function y3(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const b3=(e,t,n)=>e??t??n,Ofe=K({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=Ve(U2),l=x(()=>e.route||a.value),o=Ve(c3,0),r=x(()=>{let c=i(o);const{matched:d}=l.value;let f;for(;(f=d[c])&&!f.components;)c++;return c}),s=x(()=>l.value.matched[r.value]);St(c3,x(()=>r.value+1)),St(afe,s),St(U2,l);const u=B();return fe(()=>[u.value,s.value,e.name],([c,d,f],[p,m,v])=>{d&&(d.instances[f]=c,m&&m!==d&&c&&c===p&&(d.leaveGuards.size||(d.leaveGuards=m.leaveGuards),d.updateGuards.size||(d.updateGuards=m.updateGuards))),c&&d&&(!m||!ni(d,m)||!p)&&(d.enterCallbacks[f]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=l.value,d=e.name,f=s.value,p=f&&f.components[d];if(!p)return w3(n.default,{Component:p,route:c});const m=f.props[d],v=m?m===!0?c.params:typeof m=="function"?m(c):m:null,g=Ze(p,cn({},v,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(f.instances[d]=null)},ref:u}));return w3(n.default,{Component:g,route:c})||g}}});function w3(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Nfe=Ofe;function Afe(e){const t=bfe(e.routes,e),n=e.parseQuery||tfe,a=e.stringifyQuery||u3,l=e.history,o=Mi(),r=Mi(),s=Mi(),u=Et(Bo);let c=Bo;Ss&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=pp.bind(null,Q=>""+Q),f=pp.bind(null,Bde),p=pp.bind(null,Au);function m(Q,ce){let de,Y;return l9(Q)?(de=t.getRecordMatcher(Q),Y=ce):Y=Q,t.addRoute(Y,de)}function v(Q){const ce=t.getRecordMatcher(Q);ce&&t.removeRoute(ce)}function h(){return t.getRoutes().map(Q=>Q.record)}function g(Q){return!!t.getRecordMatcher(Q)}function y(Q,ce){if(ce=cn({},ce||u.value),typeof Q=="string"){const G=hp(n,Q,ce.path),se=t.resolve({path:G.path},ce),he=l.createHref(G.fullPath);return cn(G,se,{params:p(se.params),hash:Au(G.hash),redirectedFrom:void 0,href:he})}let de;if(Q.path!=null)de=cn({},Q,{path:hp(n,Q.path,ce.path).path});else{const G=cn({},Q.params);for(const se in G)G[se]==null&&delete G[se];de=cn({},Q,{params:f(G)}),ce.params=f(ce.params)}const Y=t.resolve(de,ce),Z=Q.hash||"";Y.params=d(p(Y.params));const ie=Hde(a,cn({},Q,{hash:Ide(Z),path:Y.path})),j=l.createHref(ie);return cn({fullPath:ie,hash:Z,query:a===u3?nfe(Q.query):Q.query||{}},Y,{redirectedFrom:void 0,href:j})}function b(Q){return typeof Q=="string"?hp(n,Q,u.value.path):cn({},Q)}function w(Q,ce){if(c!==Q)return ai(Rn.NAVIGATION_CANCELLED,{from:ce,to:Q})}function _(Q){return T(Q)}function C(Q){return _(cn(b(Q),{replace:!0}))}function k(Q,ce){const de=Q.matched[Q.matched.length-1];if(de&&de.redirect){const{redirect:Y}=de;let Z=typeof Y=="function"?Y(Q,ce):Y;return typeof Z=="string"&&(Z=Z.includes("?")||Z.includes("#")?Z=b(Z):{path:Z},Z.params={}),cn({query:Q.query,hash:Q.hash,params:Z.path!=null?{}:Q.params},Z)}}function T(Q,ce){const de=c=y(Q),Y=u.value,Z=Q.state,ie=Q.force,j=Q.replace===!0,G=k(de,Y);if(G)return T(cn(b(G),{state:typeof G=="object"?cn({},Z,G.state):Z,force:ie,replace:j}),ce||de);const se=de;se.redirectedFrom=ce;let he;return!ie&&Fde(a,Y,de)&&(he=ai(Rn.NAVIGATION_DUPLICATED,{to:se,from:Y}),q(Y,Y,!0,!1)),(he?Promise.resolve(he):N(se,Y)).catch(ve=>oo(ve)?oo(ve,Rn.NAVIGATION_GUARD_REDIRECT)?ve:D(ve):L(ve,se,Y)).then(ve=>{if(ve){if(oo(ve,Rn.NAVIGATION_GUARD_REDIRECT))return T(cn({replace:j},b(ve.to),{state:typeof ve.to=="object"?cn({},Z,ve.to.state):Z,force:ie}),ce||se)}else ve=$(se,Y,!0,j,Z);return R(se,Y,ve),ve})}function E(Q,ce){const de=w(Q,ce);return de?Promise.reject(de):Promise.resolve()}function M(Q){const ce=ee.values().next().value;return ce&&typeof ce.runWithContext=="function"?ce.runWithContext(Q):Q()}function N(Q,ce){let de;const[Y,Z,ie]=lfe(Q,ce);de=mp(Y.reverse(),"beforeRouteLeave",Q,ce);for(const G of Y)G.leaveGuards.forEach(se=>{de.push(Yo(se,Q,ce))});const j=E.bind(null,Q,ce);return de.push(j),le(de).then(()=>{de=[];for(const G of o.list())de.push(Yo(G,Q,ce));return de.push(j),le(de)}).then(()=>{de=mp(Z,"beforeRouteUpdate",Q,ce);for(const G of Z)G.updateGuards.forEach(se=>{de.push(Yo(se,Q,ce))});return de.push(j),le(de)}).then(()=>{de=[];for(const G of ie)if(G.beforeEnter)if(Cl(G.beforeEnter))for(const se of G.beforeEnter)de.push(Yo(se,Q,ce));else de.push(Yo(G.beforeEnter,Q,ce));return de.push(j),le(de)}).then(()=>(Q.matched.forEach(G=>G.enterCallbacks={}),de=mp(ie,"beforeRouteEnter",Q,ce,M),de.push(j),le(de))).then(()=>{de=[];for(const G of r.list())de.push(Yo(G,Q,ce));return de.push(j),le(de)}).catch(G=>oo(G,Rn.NAVIGATION_CANCELLED)?G:Promise.reject(G))}function R(Q,ce,de){s.list().forEach(Y=>M(()=>Y(Q,ce,de)))}function $(Q,ce,de,Y,Z){const ie=w(Q,ce);if(ie)return ie;const j=ce===Bo,G=Ss?history.state:{};de&&(Y||j?l.replace(Q.fullPath,cn({scroll:j&&G&&G.scroll},Z)):l.push(Q.fullPath,Z)),u.value=Q,q(Q,ce,de,j),D()}let I;function W(){I||(I=l.listen((Q,ce,de)=>{if(!ne.listening)return;const Y=y(Q),Z=k(Y,ne.currentRoute.value);if(Z){T(cn(Z,{replace:!0,force:!0}),Y).catch(Zi);return}c=Y;const ie=u.value;Ss&&Xde(i3(ie.fullPath,de.delta),v0()),N(Y,ie).catch(j=>oo(j,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_CANCELLED)?j:oo(j,Rn.NAVIGATION_GUARD_REDIRECT)?(T(cn(b(j.to),{force:!0}),Y).then(G=>{oo(G,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_DUPLICATED)&&!de.delta&&de.type===j2.pop&&l.go(-1,!1)}).catch(Zi),Promise.reject()):(de.delta&&l.go(-de.delta,!1),L(j,Y,ie))).then(j=>{j=j||$(Y,ie,!1),j&&(de.delta&&!oo(j,Rn.NAVIGATION_CANCELLED)?l.go(-de.delta,!1):de.type===j2.pop&&oo(j,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_DUPLICATED)&&l.go(-1,!1)),R(Y,ie,j)}).catch(Zi)}))}let H=Mi(),z=Mi(),V;function L(Q,ce,de){D(Q);const Y=z.list();return Y.length?Y.forEach(Z=>Z(Q,ce,de)):console.error(Q),Promise.reject(Q)}function F(){return V&&u.value!==Bo?Promise.resolve():new Promise((Q,ce)=>{H.add([Q,ce])})}function D(Q){return V||(V=!Q,W(),H.list().forEach(([ce,de])=>Q?de(Q):ce()),H.reset()),Q}function q(Q,ce,de,Y){const{scrollBehavior:Z}=e;if(!Ss||!Z)return Promise.resolve();const ie=!de&&Zde(i3(Q.fullPath,0))||(Y||!de)&&history.state&&history.state.scroll||null;return Re().then(()=>Z(Q,ce,ie)).then(j=>j&&Gde(j)).catch(j=>L(j,Q,ce))}const U=Q=>l.go(Q);let te;const ee=new Set,ne={currentRoute:u,listening:!0,addRoute:m,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:g,getRoutes:h,resolve:y,options:e,push:_,replace:C,go:U,back:()=>U(-1),forward:()=>U(1),beforeEach:o.add,beforeResolve:r.add,afterEach:s.add,onError:z.add,isReady:F,install(Q){Q.component("RouterLink",Efe),Q.component("RouterView",Nfe),Q.config.globalProperties.$router=ne,Object.defineProperty(Q.config.globalProperties,"$route",{enumerable:!0,get:()=>i(u)}),Ss&&!te&&u.value===Bo&&(te=!0,_(l.location).catch(Y=>{}));const ce={};for(const Y in Bo)Object.defineProperty(ce,Y,{get:()=>u.value[Y],enumerable:!0});Q.provide(m0,ne),Q.provide(u1,Bu(ce)),Q.provide(U2,u);const de=Q.unmount;ee.add(Q),Q.unmount=function(){ee.delete(Q),ee.size<1&&(c=Bo,I&&I(),I=null,u.value=Bo,te=!1,V=!1),de()}}};function le(Q){return Q.reduce((ce,de)=>ce.then(()=>M(de)),Promise.resolve())}return ne}function Vfe(){return Ve(m0)}function Lfe(e){return Ve(u1)}const u9=Afe({history:ufe(),routes:[{path:"/",component:()=>gr(()=>import("./LayoutView-BaY4Pz9W.js"),[]),children:[{path:"",name:"Dashboard",component:()=>gr(()=>import("./DashboardView-CQdlgirS.js"),__vite__mapDeps([0,1,2,3,4,5]))},{path:"providers",name:"Providers",component:()=>gr(()=>import("./ProvidersView-GQENcvJS.js"),__vite__mapDeps([6,4,2,3,1,7]))},{path:"settings",name:"Settings",component:()=>gr(()=>import("./SettingsView-BrAiaskZ.js"),__vite__mapDeps([8,4,1,3,9,10]))},{path:"logs",name:"Logs",component:()=>gr(()=>import("./LogsView-B-bIj36j.js"),__vite__mapDeps([11,1,2,3,4,12]))},{path:"process",name:"Process",component:()=>gr(()=>import("./ProcessView-0x_ShSwV.js"),__vite__mapDeps([13,9,4,14]))}]},{path:"/login",name:"Login",component:()=>gr(()=>import("./LoginView-CPvz1Ylx.js"),__vite__mapDeps([15,1,16]))},{path:"/:pathMatch(.*)*",redirect:"/"}]});u9.beforeEach(e=>{const t=localStorage.getItem("webui_token");if(e.name!=="Login"&&!t)return{name:"Login"}});const yc=uu(Cde);yc.use(uk());yc.use(gde,{locale:yde});yc.use(u9);for(const[e,t]of Object.entries(lK))yc.component(e,t);yc.mount("#app");export{tde as $,Qr as A,st as B,vo as C,ge as D,en as E,Fe as F,li as G,Qo as H,z9 as I,V9 as J,L9 as K,B9 as L,S3 as M,dt as N,Ra as O,T9 as P,Ife as Q,Rfe as R,$fe as S,to as T,Pfe as U,Dt as V,fe as W,rn as X,P as Y,Qe as Z,bde as _,J as a,To as a0,Hce as a1,u9 as a2,O as b,A as c,K as d,bt as e,x as f,Vfe as g,Lfe as h,gt as i,ue as j,re as k,B as l,ch as m,ht as n,S as o,_t as p,sn as q,Kt as r,Ie as s,Se as t,i as u,Y2 as v,ae as w,Mn as x,$a as y,h9 as z};
96
+ */let ofe=()=>location.protocol+"//"+location.host;function r9(e,t){const{pathname:n,search:a,hash:l}=t,o=e.indexOf("#");if(o>-1){let r=l.includes(e.slice(o))?e.slice(o).length:1,s=l.slice(r);return s[0]!=="/"&&(s="/"+s),r3(s,"")}return r3(n,e)+a+l}function rfe(e,t,n,a){let l=[],o=[],r=null;const s=({state:p})=>{const m=r9(e,location),v=n.value,h=t.value;let g=0;if(p){if(n.value=m,t.value=p,r&&r===v){r=null;return}g=h?p.position-h.position:0}else a(m);l.forEach(y=>{y(n.value,v,{delta:g,type:j2.pop,direction:g?g>0?vp.forward:vp.back:vp.unknown})})};function u(){r=n.value}function c(p){l.push(p);const m=()=>{const v=l.indexOf(p);v>-1&&l.splice(v,1)};return o.push(m),m}function d(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(cn({},p.state,{scroll:v0()}),"")}}function f(){for(const p of o)p();o=[],window.removeEventListener("popstate",s),window.removeEventListener("pagehide",d),document.removeEventListener("visibilitychange",d)}return window.addEventListener("popstate",s),window.addEventListener("pagehide",d),document.addEventListener("visibilitychange",d),{pauseListeners:u,listen:c,destroy:f}}function d3(e,t,n,a=!1,l=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:l?v0():null}}function sfe(e){const{history:t,location:n}=window,a={value:r9(e,n)},l={value:t.state};l.value||o(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(u,c,d){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+u:ofe()+e+u;try{t[d?"replaceState":"pushState"](c,"",p),l.value=c}catch(m){console.error(m),n[d?"replace":"assign"](p)}}function r(u,c){o(u,cn({},t.state,d3(l.value.back,u,l.value.forward,!0),c,{position:l.value.position}),!0),a.value=u}function s(u,c){const d=cn({},l.value,t.state,{forward:u,scroll:v0()});o(d.current,d,!0),o(u,cn({},d3(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:l,push:s,replace:r}}function ife(e){e=jde(e);const t=sfe(e),n=rfe(e,t.state,t.location,t.replace);function a(o,r=!0){r||n.pauseListeners(),history.go(o)}const l=cn({location:"",base:e,go:a,createHref:Ude.bind(null,e)},t,n);return Object.defineProperty(l,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(l,"state",{enumerable:!0,get:()=>t.state.value}),l}function ufe(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),ife(e)}let Tr=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Wn=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Wn||{});const cfe={type:Tr.Static,value:""},dfe=/[a-zA-Z0-9_]/;function ffe(e){if(!e)return[[]];if(e==="/")return[[cfe]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${c}": ${m}`)}let n=Wn.Static,a=n;const l=[];let o;function r(){o&&l.push(o),o=[]}let s=0,u,c="",d="";function f(){c&&(n===Wn.Static?o.push({type:Tr.Static,value:c}):n===Wn.Param||n===Wn.ParamRegExp||n===Wn.ParamRegExpEnd?(o.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),o.push({type:Tr.Param,value:c,regexp:d,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=u}for(;s<e.length;){if(u=e[s++],u==="\\"&&n!==Wn.ParamRegExp){a=n,n=Wn.EscapeNext;continue}switch(n){case Wn.Static:u==="/"?(c&&f(),r()):u===":"?(f(),n=Wn.Param):p();break;case Wn.EscapeNext:p(),n=a;break;case Wn.Param:u==="("?n=Wn.ParamRegExp:dfe.test(u)?p():(f(),n=Wn.Static,u!=="*"&&u!=="?"&&u!=="+"&&s--);break;case Wn.ParamRegExp:u===")"?d[d.length-1]=="\\"?d=d.slice(0,-1)+u:n=Wn.ParamRegExpEnd:d+=u;break;case Wn.ParamRegExpEnd:f(),n=Wn.Static,u!=="*"&&u!=="?"&&u!=="+"&&s--,d="";break;default:t("Unknown state");break}}return n===Wn.ParamRegExp&&t(`Unfinished custom RegExp for param "${c}"`),f(),r(),l}const f3="[^/]+?",pfe={sensitive:!1,strict:!1,start:!0,end:!0};var ga=(function(e){return e[e._multiplier=10]="_multiplier",e[e.Root=90]="Root",e[e.Segment=40]="Segment",e[e.SubSegment=30]="SubSegment",e[e.Static=40]="Static",e[e.Dynamic=20]="Dynamic",e[e.BonusCustomRegExp=10]="BonusCustomRegExp",e[e.BonusWildcard=-50]="BonusWildcard",e[e.BonusRepeatable=-20]="BonusRepeatable",e[e.BonusOptional=-8]="BonusOptional",e[e.BonusStrict=.7000000000000001]="BonusStrict",e[e.BonusCaseSensitive=.25]="BonusCaseSensitive",e})(ga||{});const hfe=/[.+*?^${}()[\]/\\]/g;function vfe(e,t){const n=cn({},pfe,t),a=[];let l=n.start?"^":"";const o=[];for(const c of e){const d=c.length?[]:[ga.Root];n.strict&&!c.length&&(l+="/");for(let f=0;f<c.length;f++){const p=c[f];let m=ga.Segment+(n.sensitive?ga.BonusCaseSensitive:0);if(p.type===Tr.Static)f||(l+="/"),l+=p.value.replace(hfe,"\\$&"),m+=ga.Static;else if(p.type===Tr.Param){const{value:v,repeatable:h,optional:g,regexp:y}=p;o.push({name:v,repeatable:h,optional:g});const b=y||f3;if(b!==f3){m+=ga.BonusCustomRegExp;try{`${b}`}catch(_){throw new Error(`Invalid custom RegExp for param "${v}" (${b}): `+_.message)}}let w=h?`((?:${b})(?:/(?:${b}))*)`:`(${b})`;f||(w=g&&c.length<2?`(?:/${w})`:"/"+w),g&&(w+="?"),l+=w,m+=ga.Dynamic,g&&(m+=ga.BonusOptional),h&&(m+=ga.BonusRepeatable),b===".*"&&(m+=ga.BonusWildcard)}d.push(m)}a.push(d)}if(n.strict&&n.end){const c=a.length-1;a[c][a[c].length-1]+=ga.BonusStrict}n.strict||(l+="/?"),n.end?l+="$":n.strict&&!l.endsWith("/")&&(l+="(?:/|$)");const r=new RegExp(l,n.sensitive?"":"i");function s(c){const d=c.match(r),f={};if(!d)return null;for(let p=1;p<d.length;p++){const m=d[p]||"",v=o[p-1];f[v.name]=m&&v.repeatable?m.split("/"):m}return f}function u(c){let d="",f=!1;for(const p of e){(!f||!d.endsWith("/"))&&(d+="/"),f=!1;for(const m of p)if(m.type===Tr.Static)d+=m.value;else if(m.type===Tr.Param){const{value:v,repeatable:h,optional:g}=m,y=v in c?c[v]:"";if(Cl(y)&&!h)throw new Error(`Provided param "${v}" is an array but it is not repeatable (* or + modifiers)`);const b=Cl(y)?y.join("/"):y;if(!b)if(g)p.length<2&&(d.endsWith("/")?d=d.slice(0,-1):f=!0);else throw new Error(`Missing required param "${v}"`);d+=b}}return d||"/"}return{re:r,score:a,keys:o,parse:s,stringify:u}}function mfe(e,t){let n=0;for(;n<e.length&&n<t.length;){const a=t[n]-e[n];if(a)return a;n++}return e.length<t.length?e.length===1&&e[0]===ga.Static+ga.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===ga.Static+ga.Segment?1:-1:0}function s9(e,t){let n=0;const a=e.score,l=t.score;for(;n<a.length&&n<l.length;){const o=mfe(a[n],l[n]);if(o)return o;n++}if(Math.abs(l.length-a.length)===1){if(p3(a))return 1;if(p3(l))return-1}return l.length-a.length}function p3(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const gfe={strict:!1,end:!0,sensitive:!1};function yfe(e,t,n){const a=vfe(ffe(e.path),n),l=cn(a,{record:e,parent:t,children:[],alias:[]});return t&&!l.record.aliasOf==!t.record.aliasOf&&t.children.push(l),l}function bfe(e,t){const n=[],a=new Map;t=o3(gfe,t);function l(f){return a.get(f)}function o(f,p,m){const v=!m,h=v3(f);h.aliasOf=m&&m.record;const g=o3(t,f),y=[h];if("alias"in f){const _=typeof f.alias=="string"?[f.alias]:f.alias;for(const C of _)y.push(v3(cn({},h,{components:m?m.record.components:h.components,path:C,aliasOf:m?m.record:h})))}let b,w;for(const _ of y){const{path:C}=_;if(p&&C[0]!=="/"){const k=p.record.path,T=k[k.length-1]==="/"?"":"/";_.path=p.record.path+(C&&T+C)}if(b=yfe(_,p,g),m?m.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!m3(b)&&r(f.name)),i9(b)&&u(b),h.children){const k=h.children;for(let T=0;T<k.length;T++)o(k[T],b,m&&m.children[T])}m=m||b}return w?()=>{r(w)}:Zi}function r(f){if(l9(f)){const p=a.get(f);p&&(a.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(r),p.alias.forEach(r))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&a.delete(f.record.name),f.children.forEach(r),f.alias.forEach(r))}}function s(){return n}function u(f){const p=Cfe(f,n);n.splice(p,0,f),f.record.name&&!m3(f)&&a.set(f.record.name,f)}function c(f,p){let m,v={},h,g;if("name"in f&&f.name){if(m=a.get(f.name),!m)throw ai(Rn.MATCHER_NOT_FOUND,{location:f});g=m.record.name,v=cn(h3(p.params,m.keys.filter(w=>!w.optional).concat(m.parent?m.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&h3(f.params,m.keys.map(w=>w.name))),h=m.stringify(v)}else if(f.path!=null)h=f.path,m=n.find(w=>w.re.test(h)),m&&(v=m.parse(h),g=m.record.name);else{if(m=p.name?a.get(p.name):n.find(w=>w.re.test(p.path)),!m)throw ai(Rn.MATCHER_NOT_FOUND,{location:f,currentLocation:p});g=m.record.name,v=cn({},p.params,f.params),h=m.stringify(v)}const y=[];let b=m;for(;b;)y.unshift(b.record),b=b.parent;return{name:g,path:h,params:v,matched:y,meta:_fe(y)}}e.forEach(f=>o(f));function d(){n.length=0,a.clear()}return{addRoute:o,resolve:c,removeRoute:r,clearRoutes:d,getRoutes:s,getRecordMatcher:l}}function h3(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function v3(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:wfe(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function wfe(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]=typeof n=="object"?n[a]:n;return t}function m3(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function _fe(e){return e.reduce((t,n)=>cn(t,n.meta),{})}function Cfe(e,t){let n=0,a=t.length;for(;n!==a;){const o=n+a>>1;s9(e,t[o])<0?a=o:n=o+1}const l=Sfe(e);return l&&(a=t.lastIndexOf(l,a-1)),a}function Sfe(e){let t=e;for(;t=t.parent;)if(i9(t)&&s9(e,t)===0)return t}function i9({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function g3(e){const t=Ve(m0),n=Ve(u1),a=x(()=>{const u=i(e.to);return t.resolve(u)}),l=x(()=>{const{matched:u}=a.value,{length:c}=u,d=u[c-1],f=n.matched;if(!d||!f.length)return-1;const p=f.findIndex(ni.bind(null,d));if(p>-1)return p;const m=y3(u[c-2]);return c>1&&y3(d)===m&&f[f.length-1].path!==m?f.findIndex(ni.bind(null,u[c-2])):p}),o=x(()=>l.value>-1&&Mfe(n.params,a.value.params)),r=x(()=>l.value>-1&&l.value===n.matched.length-1&&a9(n.params,a.value.params));function s(u={}){if(Tfe(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(Zi);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:a,href:x(()=>a.value.href),isActive:o,isExactActive:r,navigate:s}}function xfe(e){return e.length===1?e[0]:e}const kfe=K({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:g3,setup(e,{slots:t}){const n=Dt(g3(e)),{options:a}=Ve(m0),l=x(()=>({[b3(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[b3(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&xfe(t.default(n));return e.custom?o:Ze("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:l.value},o)}}}),Efe=kfe;function Tfe(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Mfe(e,t){for(const n in t){const a=t[n],l=e[n];if(typeof a=="string"){if(a!==l)return!1}else if(!Cl(l)||l.length!==a.length||a.some((o,r)=>o.valueOf()!==l[r].valueOf()))return!1}return!0}function y3(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const b3=(e,t,n)=>e??t??n,Ofe=K({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=Ve(U2),l=x(()=>e.route||a.value),o=Ve(c3,0),r=x(()=>{let c=i(o);const{matched:d}=l.value;let f;for(;(f=d[c])&&!f.components;)c++;return c}),s=x(()=>l.value.matched[r.value]);St(c3,x(()=>r.value+1)),St(afe,s),St(U2,l);const u=B();return fe(()=>[u.value,s.value,e.name],([c,d,f],[p,m,v])=>{d&&(d.instances[f]=c,m&&m!==d&&c&&c===p&&(d.leaveGuards.size||(d.leaveGuards=m.leaveGuards),d.updateGuards.size||(d.updateGuards=m.updateGuards))),c&&d&&(!m||!ni(d,m)||!p)&&(d.enterCallbacks[f]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=l.value,d=e.name,f=s.value,p=f&&f.components[d];if(!p)return w3(n.default,{Component:p,route:c});const m=f.props[d],v=m?m===!0?c.params:typeof m=="function"?m(c):m:null,g=Ze(p,cn({},v,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(f.instances[d]=null)},ref:u}));return w3(n.default,{Component:g,route:c})||g}}});function w3(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Nfe=Ofe;function Afe(e){const t=bfe(e.routes,e),n=e.parseQuery||tfe,a=e.stringifyQuery||u3,l=e.history,o=Mi(),r=Mi(),s=Mi(),u=Et(Bo);let c=Bo;Ss&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=pp.bind(null,Q=>""+Q),f=pp.bind(null,Bde),p=pp.bind(null,Au);function m(Q,ce){let de,Y;return l9(Q)?(de=t.getRecordMatcher(Q),Y=ce):Y=Q,t.addRoute(Y,de)}function v(Q){const ce=t.getRecordMatcher(Q);ce&&t.removeRoute(ce)}function h(){return t.getRoutes().map(Q=>Q.record)}function g(Q){return!!t.getRecordMatcher(Q)}function y(Q,ce){if(ce=cn({},ce||u.value),typeof Q=="string"){const G=hp(n,Q,ce.path),se=t.resolve({path:G.path},ce),he=l.createHref(G.fullPath);return cn(G,se,{params:p(se.params),hash:Au(G.hash),redirectedFrom:void 0,href:he})}let de;if(Q.path!=null)de=cn({},Q,{path:hp(n,Q.path,ce.path).path});else{const G=cn({},Q.params);for(const se in G)G[se]==null&&delete G[se];de=cn({},Q,{params:f(G)}),ce.params=f(ce.params)}const Y=t.resolve(de,ce),Z=Q.hash||"";Y.params=d(p(Y.params));const ie=Hde(a,cn({},Q,{hash:Ide(Z),path:Y.path})),j=l.createHref(ie);return cn({fullPath:ie,hash:Z,query:a===u3?nfe(Q.query):Q.query||{}},Y,{redirectedFrom:void 0,href:j})}function b(Q){return typeof Q=="string"?hp(n,Q,u.value.path):cn({},Q)}function w(Q,ce){if(c!==Q)return ai(Rn.NAVIGATION_CANCELLED,{from:ce,to:Q})}function _(Q){return T(Q)}function C(Q){return _(cn(b(Q),{replace:!0}))}function k(Q,ce){const de=Q.matched[Q.matched.length-1];if(de&&de.redirect){const{redirect:Y}=de;let Z=typeof Y=="function"?Y(Q,ce):Y;return typeof Z=="string"&&(Z=Z.includes("?")||Z.includes("#")?Z=b(Z):{path:Z},Z.params={}),cn({query:Q.query,hash:Q.hash,params:Z.path!=null?{}:Q.params},Z)}}function T(Q,ce){const de=c=y(Q),Y=u.value,Z=Q.state,ie=Q.force,j=Q.replace===!0,G=k(de,Y);if(G)return T(cn(b(G),{state:typeof G=="object"?cn({},Z,G.state):Z,force:ie,replace:j}),ce||de);const se=de;se.redirectedFrom=ce;let he;return!ie&&Fde(a,Y,de)&&(he=ai(Rn.NAVIGATION_DUPLICATED,{to:se,from:Y}),q(Y,Y,!0,!1)),(he?Promise.resolve(he):N(se,Y)).catch(ve=>oo(ve)?oo(ve,Rn.NAVIGATION_GUARD_REDIRECT)?ve:D(ve):L(ve,se,Y)).then(ve=>{if(ve){if(oo(ve,Rn.NAVIGATION_GUARD_REDIRECT))return T(cn({replace:j},b(ve.to),{state:typeof ve.to=="object"?cn({},Z,ve.to.state):Z,force:ie}),ce||se)}else ve=$(se,Y,!0,j,Z);return R(se,Y,ve),ve})}function E(Q,ce){const de=w(Q,ce);return de?Promise.reject(de):Promise.resolve()}function M(Q){const ce=ee.values().next().value;return ce&&typeof ce.runWithContext=="function"?ce.runWithContext(Q):Q()}function N(Q,ce){let de;const[Y,Z,ie]=lfe(Q,ce);de=mp(Y.reverse(),"beforeRouteLeave",Q,ce);for(const G of Y)G.leaveGuards.forEach(se=>{de.push(Yo(se,Q,ce))});const j=E.bind(null,Q,ce);return de.push(j),le(de).then(()=>{de=[];for(const G of o.list())de.push(Yo(G,Q,ce));return de.push(j),le(de)}).then(()=>{de=mp(Z,"beforeRouteUpdate",Q,ce);for(const G of Z)G.updateGuards.forEach(se=>{de.push(Yo(se,Q,ce))});return de.push(j),le(de)}).then(()=>{de=[];for(const G of ie)if(G.beforeEnter)if(Cl(G.beforeEnter))for(const se of G.beforeEnter)de.push(Yo(se,Q,ce));else de.push(Yo(G.beforeEnter,Q,ce));return de.push(j),le(de)}).then(()=>(Q.matched.forEach(G=>G.enterCallbacks={}),de=mp(ie,"beforeRouteEnter",Q,ce,M),de.push(j),le(de))).then(()=>{de=[];for(const G of r.list())de.push(Yo(G,Q,ce));return de.push(j),le(de)}).catch(G=>oo(G,Rn.NAVIGATION_CANCELLED)?G:Promise.reject(G))}function R(Q,ce,de){s.list().forEach(Y=>M(()=>Y(Q,ce,de)))}function $(Q,ce,de,Y,Z){const ie=w(Q,ce);if(ie)return ie;const j=ce===Bo,G=Ss?history.state:{};de&&(Y||j?l.replace(Q.fullPath,cn({scroll:j&&G&&G.scroll},Z)):l.push(Q.fullPath,Z)),u.value=Q,q(Q,ce,de,j),D()}let I;function W(){I||(I=l.listen((Q,ce,de)=>{if(!ne.listening)return;const Y=y(Q),Z=k(Y,ne.currentRoute.value);if(Z){T(cn(Z,{replace:!0,force:!0}),Y).catch(Zi);return}c=Y;const ie=u.value;Ss&&Xde(i3(ie.fullPath,de.delta),v0()),N(Y,ie).catch(j=>oo(j,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_CANCELLED)?j:oo(j,Rn.NAVIGATION_GUARD_REDIRECT)?(T(cn(b(j.to),{force:!0}),Y).then(G=>{oo(G,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_DUPLICATED)&&!de.delta&&de.type===j2.pop&&l.go(-1,!1)}).catch(Zi),Promise.reject()):(de.delta&&l.go(-de.delta,!1),L(j,Y,ie))).then(j=>{j=j||$(Y,ie,!1),j&&(de.delta&&!oo(j,Rn.NAVIGATION_CANCELLED)?l.go(-de.delta,!1):de.type===j2.pop&&oo(j,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_DUPLICATED)&&l.go(-1,!1)),R(Y,ie,j)}).catch(Zi)}))}let H=Mi(),z=Mi(),V;function L(Q,ce,de){D(Q);const Y=z.list();return Y.length?Y.forEach(Z=>Z(Q,ce,de)):console.error(Q),Promise.reject(Q)}function F(){return V&&u.value!==Bo?Promise.resolve():new Promise((Q,ce)=>{H.add([Q,ce])})}function D(Q){return V||(V=!Q,W(),H.list().forEach(([ce,de])=>Q?de(Q):ce()),H.reset()),Q}function q(Q,ce,de,Y){const{scrollBehavior:Z}=e;if(!Ss||!Z)return Promise.resolve();const ie=!de&&Zde(i3(Q.fullPath,0))||(Y||!de)&&history.state&&history.state.scroll||null;return Re().then(()=>Z(Q,ce,ie)).then(j=>j&&Gde(j)).catch(j=>L(j,Q,ce))}const U=Q=>l.go(Q);let te;const ee=new Set,ne={currentRoute:u,listening:!0,addRoute:m,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:g,getRoutes:h,resolve:y,options:e,push:_,replace:C,go:U,back:()=>U(-1),forward:()=>U(1),beforeEach:o.add,beforeResolve:r.add,afterEach:s.add,onError:z.add,isReady:F,install(Q){Q.component("RouterLink",Efe),Q.component("RouterView",Nfe),Q.config.globalProperties.$router=ne,Object.defineProperty(Q.config.globalProperties,"$route",{enumerable:!0,get:()=>i(u)}),Ss&&!te&&u.value===Bo&&(te=!0,_(l.location).catch(Y=>{}));const ce={};for(const Y in Bo)Object.defineProperty(ce,Y,{get:()=>u.value[Y],enumerable:!0});Q.provide(m0,ne),Q.provide(u1,Bu(ce)),Q.provide(U2,u);const de=Q.unmount;ee.add(Q),Q.unmount=function(){ee.delete(Q),ee.size<1&&(c=Bo,I&&I(),I=null,u.value=Bo,te=!1,V=!1),de()}}};function le(Q){return Q.reduce((ce,de)=>ce.then(()=>M(de)),Promise.resolve())}return ne}function Vfe(){return Ve(m0)}function Lfe(e){return Ve(u1)}const u9=Afe({history:ufe(),routes:[{path:"/",component:()=>gr(()=>import("./LayoutView-C03GVB3X.js"),[]),children:[{path:"",name:"Dashboard",component:()=>gr(()=>import("./DashboardView-B71Dy3px.js"),__vite__mapDeps([0,1,2,3,4,5]))},{path:"providers",name:"Providers",component:()=>gr(()=>import("./ProvidersView-mb0KU16n.js"),__vite__mapDeps([6,4,2,3,1,7]))},{path:"settings",name:"Settings",component:()=>gr(()=>import("./SettingsView-BgLQVC2H.js"),__vite__mapDeps([8,4,1,3,9,10]))},{path:"logs",name:"Logs",component:()=>gr(()=>import("./LogsView-B2ctrpv4.js"),__vite__mapDeps([11,1,2,3,4,12]))},{path:"process",name:"Process",component:()=>gr(()=>import("./ProcessView-DmbVABQV.js"),__vite__mapDeps([13,9,4,14]))}]},{path:"/login",name:"Login",component:()=>gr(()=>import("./LoginView-XTF5dHvd.js"),__vite__mapDeps([15,1,16]))},{path:"/:pathMatch(.*)*",redirect:"/"}]});u9.beforeEach(e=>{const t=localStorage.getItem("webui_token");if(e.name!=="Login"&&!t)return{name:"Login"}});const yc=uu(Cde);yc.use(uk());yc.use(gde,{locale:yde});yc.use(u9);for(const[e,t]of Object.entries(lK))yc.component(e,t);yc.mount("#app");export{C8 as $,Qr as A,st as B,vo as C,ge as D,en as E,Fe as F,li as G,Qo as H,z9 as I,V9 as J,L9 as K,B9 as L,S3 as M,dt as N,Ra as O,T9 as P,Ife as Q,Rfe as R,$fe as S,to as T,Pfe as U,Dt as V,Qe as W,P as X,mD as Y,fe as Z,bde as _,J as a,rn as a0,tde as a1,eV as a2,kF as a3,m8 as a4,ov as a5,To as a6,Hce as a7,u9 as a8,O as b,A as c,K as d,bt as e,x as f,Vfe as g,Lfe as h,gt as i,ue as j,re as k,B as l,ch as m,ht as n,S as o,_t as p,sn as q,Kt as r,Ie as s,Se as t,i as u,Y2 as v,ae as w,Mn as x,$a as y,h9 as z};
@@ -1 +1 @@
1
- import{U as w,l as u,f as i}from"./index-DFlUx18F.js";import{u as C}from"./config-DNn5cjYY.js";const J=w("providers",()=>{const s=C(),c=u(!1),n=i(()=>s.providers),v=i(()=>s.loading),f=i(()=>n.value.length),m=i(()=>n.value.reduce((e,o)=>{var r;return e+(((r=o.models)==null?void 0:r.length)??0)},0)),t=u([]);function p(){try{const e=localStorage.getItem("provider_order");e&&(t.value=JSON.parse(e))}catch{}}function d(){try{localStorage.setItem("provider_order",JSON.stringify(t.value))}catch{}}const g=i(()=>{const e=t.value.map(r=>n.value.find(a=>a.name===r)).filter(r=>!!r);for(const r of n.value)e.find(a=>a.name===r.name)||e.push(r);const o=e.map(r=>r.name);return(o.length!==t.value.length||o.some((r,a)=>t.value[a]!==r))&&(t.value=o,d()),e});function S(e){t.value=e.map(o=>o.name),d()}function h(e){t.value=[e,...t.value.filter(o=>o!==e)],d()}async function y(){p(),await s.load()}async function l(e){return s.config.providers=e,await s.save()}async function P(e){const o=n.value.filter(r=>r.name!==e.name);return await l(o)}async function O(e){const o=n.value.map(r=>({...r,models:(r.models??[]).filter(a=>a.modelName!==e)}));return await l(o)}return{suppliers:n,loading:v,restarting:c,orderedProviders:g,providerCount:f,totalModelCount:m,loadProviders:y,saveProviders:l,deleteProvider:P,deleteModel:O,reorderProviders:S,moveProviderToTop:h}});export{J as u};
1
+ import{U as w,l as u,f as i}from"./index-dPeMJjrz.js";import{u as C}from"./config-BRaXq0LL.js";const J=w("providers",()=>{const s=C(),c=u(!1),n=i(()=>s.providers),v=i(()=>s.loading),f=i(()=>n.value.length),m=i(()=>n.value.reduce((e,o)=>{var r;return e+(((r=o.models)==null?void 0:r.length)??0)},0)),t=u([]);function p(){try{const e=localStorage.getItem("provider_order");e&&(t.value=JSON.parse(e))}catch{}}function d(){try{localStorage.setItem("provider_order",JSON.stringify(t.value))}catch{}}const g=i(()=>{const e=t.value.map(r=>n.value.find(a=>a.name===r)).filter(r=>!!r);for(const r of n.value)e.find(a=>a.name===r.name)||e.push(r);const o=e.map(r=>r.name);return(o.length!==t.value.length||o.some((r,a)=>t.value[a]!==r))&&(t.value=o,d()),e});function S(e){t.value=e.map(o=>o.name),d()}function h(e){t.value=[e,...t.value.filter(o=>o!==e)],d()}async function y(){p(),await s.load()}async function l(e){return s.config.providers=e,await s.save()}async function P(e){const o=n.value.filter(r=>r.name!==e.name);return await l(o)}async function O(e){const o=n.value.map(r=>({...r,models:(r.models??[]).filter(a=>a.modelName!==e)}));return await l(o)}return{suppliers:n,loading:v,restarting:c,orderedProviders:g,providerCount:f,totalModelCount:m,loadProviders:y,saveProviders:l,deleteProvider:P,deleteModel:O,reorderProviders:S,moveProviderToTop:h}});export{J as u};
@@ -1 +1 @@
1
- import{a2 as f}from"./index-DFlUx18F.js";var h;const g=((h=window.__ELLM_CONFIG__)==null?void 0:h.API_BASE)??"",p=3e4;let n=null;function _(){return n===null&&(n=localStorage.getItem("webui_token")),n}function m(){n=null,localStorage.removeItem("webui_token"),f.push("/login")}async function e(t,o,s){const l={"Content-Type":"application/json"},c=_();c&&(l.Authorization=`Bearer ${c}`);const u=new AbortController,E=setTimeout(()=>u.abort(),p);try{const r=await fetch(`${g}${o}`,{method:t,headers:l,body:s!==void 0?JSON.stringify(s):void 0,signal:u.signal});if(r.status===401){const T=await r.text();let i={};try{i=T?JSON.parse(T):{}}catch{}throw o==="/api/auth/login"?new Error(i.error||"用户名或密码错误"):(m(),new Error(i.error||"未登录"))}const w=await r.text();let a;try{a=w?JSON.parse(w):{}}catch{throw new Error(`响应格式错误 (HTTP ${r.status})`)}if(!r.ok)throw new Error(a.error||`HTTP ${r.status}`);return a}catch(r){throw r.name==="AbortError"?new Error("请求超时"):r}finally{clearTimeout(E)}}const S={get:t=>e("GET",t),post:(t,o)=>e("POST",t,o),put:(t,o)=>e("PUT",t,o),del:t=>e("DELETE",t)};export{S as A};
1
+ import{a8 as f}from"./index-dPeMJjrz.js";var h;const g=((h=window.__ELLM_CONFIG__)==null?void 0:h.API_BASE)??"",p=3e4;let n=null;function _(){return n===null&&(n=localStorage.getItem("webui_token")),n}function m(){n=null,localStorage.removeItem("webui_token"),f.push("/login")}async function e(t,o,s){const l={"Content-Type":"application/json"},c=_();c&&(l.Authorization=`Bearer ${c}`);const u=new AbortController,E=setTimeout(()=>u.abort(),p);try{const r=await fetch(`${g}${o}`,{method:t,headers:l,body:s!==void 0?JSON.stringify(s):void 0,signal:u.signal});if(r.status===401){const T=await r.text();let i={};try{i=T?JSON.parse(T):{}}catch{}throw o==="/api/auth/login"?new Error(i.error||"用户名或密码错误"):(m(),new Error(i.error||"未登录"))}const w=await r.text();let a;try{a=w?JSON.parse(w):{}}catch{throw new Error(`响应格式错误 (HTTP ${r.status})`)}if(!r.ok)throw new Error(a.error||`HTTP ${r.status}`);return a}catch(r){throw r.name==="AbortError"?new Error("请求超时"):r}finally{clearTimeout(E)}}const S={get:t=>e("GET",t),post:(t,o)=>e("POST",t,o),put:(t,o)=>e("PUT",t,o),del:t=>e("DELETE",t)};export{S as A};
@@ -1 +1 @@
1
- import{a1 as a}from"./index-DFlUx18F.js";function u(){function s(t,o="success"){a({message:t,type:o,duration:3e3})}return{toast:s}}export{u};
1
+ import{a7 as a}from"./index-dPeMJjrz.js";function u(){function s(t,o="success"){a({message:t,type:o,duration:3e3})}return{toast:s}}export{u};
@@ -6,7 +6,7 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
7
  <title>ELLM - 网关管理台</title>
8
8
  <script src="/config.js"></script>
9
- <script type="module" crossorigin src="/assets/index-DFlUx18F.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-dPeMJjrz.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="/assets/index-BecfPmag.css">
11
11
  </head>
12
12
  <body>
package/package.json CHANGED
@@ -1,40 +1,41 @@
1
- {
2
- "name": "ellm-proxy",
3
- "version": "0.0.2",
4
- "description": "Self-hosted LLM gateway with admin web UI (pm2-managed)",
5
- "license": "MIT",
6
- "type": "module",
7
- "engines": {
8
- "node": ">=22.13.0"
9
- },
10
- "bin": {
11
- "ellm-proxy": "bin/ellm-proxy.js"
12
- },
13
- "files": [
14
- "bin",
15
- "manager",
16
- "utils",
17
- "dist",
18
- "docs",
19
- "ellm.config.example.json",
20
- "README.md",
21
- "LICENSE"
22
- ],
23
- "scripts": {
24
- "build": "node scripts/build-package.mjs",
25
- "prepack": "node scripts/build-package.mjs"
26
- },
27
- "devDependencies": {
28
- "@types/node": "^22.12.1"
29
- },
30
- "dependencies": {
31
- "@hono/node-server": "^1.19.17",
32
- "cac": "^6.7.14",
33
- "get-node": "^15.0.4",
34
- "hono": "^4.13.5",
35
- "mri": "^1.2.0",
36
- "pm2": "^7.0.4",
37
- "smol-toml": "^1.8.0",
38
- "yaml": "^2.9.0"
39
- }
40
- }
1
+ {
2
+ "name": "ellm-proxy",
3
+ "version": "0.0.3",
4
+ "description": "Self-hosted LLM gateway with admin web UI (pm2-managed)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=22.13.0"
9
+ },
10
+ "bin": {
11
+ "ellm-proxy": "bin/ellm-proxy.js"
12
+ },
13
+ "files": [
14
+ "bin",
15
+ "manager",
16
+ "utils",
17
+ "dist",
18
+ "docs",
19
+ "ellm.config.example.json",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "scripts": {
24
+ "build": "node scripts/build-package.mjs",
25
+ "prepack": "node scripts/build-package.mjs",
26
+ "release": "node scripts/release.mjs"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^22.12.1"
30
+ },
31
+ "dependencies": {
32
+ "@hono/node-server": "^1.19.17",
33
+ "cac": "^6.7.14",
34
+ "get-node": "^15.0.4",
35
+ "hono": "^4.13.5",
36
+ "mri": "^1.2.0",
37
+ "pm2": "^7.0.4",
38
+ "smol-toml": "^1.8.0",
39
+ "yaml": "^2.9.0"
40
+ }
41
+ }
@@ -1 +0,0 @@
1
- import{d as b,c as h,a as o,w as l,r as a,o as _,b as k,Z as x,X as f,j as C,k as L,e as B,l as i,g as N,_ as I}from"./index-DFlUx18F.js";import{A as K}from"./useApi-BRPinb_2.js";const A={class:"login-wrap"},E=b({__name:"LoginView",setup(M){const v=N(),n=i(""),s=i(""),t=i(""),d=i(!1);async function r(){if(!n.value){t.value="请输入用户名";return}if(!s.value){t.value="请输入密码";return}d.value=!0,t.value="";try{const u=await K.post("/api/auth/login",{username:n.value.trim(),password:s.value});localStorage.setItem("webui_token",u.token),v.push("/")}catch(u){t.value=u.message||"登录失败"}finally{d.value=!1}}return(u,e)=>{const c=a("el-input"),m=a("el-form-item"),w=a("el-alert"),g=a("el-button"),V=a("el-form"),y=a("el-card");return _(),h("div",A,[o(y,{shadow:"hover",class:"login-card"},{default:l(()=>[e[3]||(e[3]=k("h2",{class:"login-title"},"ELLM",-1)),o(V,{"label-position":"top",onSubmit:x(r,["prevent"])},{default:l(()=>[o(m,{label:"用户名"},{default:l(()=>[o(c,{modelValue:n.value,"onUpdate:modelValue":e[0]||(e[0]=p=>n.value=p),placeholder:"请输入用户名",onKeyup:f(r,["enter"])},null,8,["modelValue"])]),_:1}),o(m,{label:"密码"},{default:l(()=>[o(c,{modelValue:s.value,"onUpdate:modelValue":e[1]||(e[1]=p=>s.value=p),type:"password",placeholder:"请输入密码","show-password":"",onKeyup:f(r,["enter"])},null,8,["modelValue"])]),_:1}),t.value?(_(),C(w,{key:0,title:t.value,type:"error","show-icon":"",class:"mb-16"},null,8,["title"])):L("",!0),o(g,{type:"primary",class:"full-width",loading:d.value,onClick:r},{default:l(()=>[...e[2]||(e[2]=[B(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})])}}}),j=I(E,[["__scopeId","data-v-d5b6a90c"]]);export{j as default};
@@ -1,9 +0,0 @@
1
- import{d as he,i as xe,c,a as l,w as a,l as v,r as p,o as d,b as i,F as T,p as we,X as Ce,e as u,n as te,j as C,t as r,k as $,f as De,m as Ve,_ as $e}from"./index-DFlUx18F.js";import{A as J}from"./useApi-BRPinb_2.js";import{u as Se}from"./providers-CGEmOxne.js";import{u as Ie}from"./useToast-D7xlwSg6.js";import"./config-DNn5cjYY.js";const qe={class:"logs-page"},ze={class:"filter-bar"},Ue={class:"table-wrap"},je=["onClick"],Re={key:1},Te={class:"pagination-bar"},Ne={key:0,class:"detail-content"},Me={key:0,class:"ip-link"},Ye={class:"ip-pop"},Ee={class:"ip-pop-row"},Pe={key:0,class:"ip-pop-row"},Fe={key:1,class:"ip-pop-error"},Le={key:2},Be=["href"],Je={key:1},Ke={key:1},Oe={class:"error-text"},Ae={class:"pane-bar"},Ge={class:"json-block"},He={class:"pane-bar"},Xe={class:"json-block"},Qe={class:"pane-bar"},We={class:"json-block"},Ze={class:"pane-bar"},et={class:"json-block"},tt={class:"pane-bar"},lt={class:"json-block"},at={class:"pane-bar"},st={class:"json-block"},ot={class:"pane-bar"},nt={class:"json-block"},rt={class:"pane-bar"},ut={class:"json-block"},it=he({__name:"LogsView",setup(dt){const K=Se(),{toast:N}=Ie(),D=v(""),f=v(null),S=v("2xx"),I=v("model"),q=v(""),z=v(""),M=v([]),O=v(0),U=v(1),j=v(50),Y=v(!1),E=v(!1),s=v(null),P=v("info"),A=t=>{if(!t)return"-";const e=new Date(t),n=w=>String(w).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`},b=t=>t?typeof t=="string"?t:JSON.stringify(t,null,2):"-",le=t=>{if(!t)return"-";try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}},V=t=>t.toLocaleString(),G=t=>t==null||t<=0?"-":t>=1e3?(t/1e3).toFixed(2)+"s":Math.round(t)+"ms",g=async t=>{try{await navigator.clipboard.writeText(t),N("已复制到剪贴板","success")}catch{const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select();try{document.execCommand("copy"),N("已复制到剪贴板","success")}catch{N("复制失败","error")}document.body.removeChild(e)}},H=t=>{const e=t.input_tokens||0,n=t.cache_read_tokens||0;return e<=0?"-":(n/e*100).toFixed(1)+"%"},F=v(!1),ae=async t=>{if(!(t._ipInfo||t._ipInfoError)){F.value=!0;try{const e=await J.get(`/api/logs/ipinfo?ip=${encodeURIComponent(t.ip)}`);e.error?t._ipInfoError=e.error:t._ipInfo=e}catch{t._ipInfoError="查询失败"}finally{F.value=!1}}},se=t=>[t.country,t.region,t.city].filter(Boolean).join(" · ")||"-",oe=async t=>{E.value=!0,s.value=null,P.value="info";try{const e=t.id?`?id=${t.id}`:`?_file=${encodeURIComponent(t._file)}`,n=await J.get("/api/logs/detail"+e);n&&n.detail?s.value={...n.detail,...n.meta}:s.value=n}catch(e){console.error(e)}},ne=De(()=>{const t=new Set;for(const e of K.suppliers)for(const n of e.models)t.add(n.modelName);for(const e of M.value)e.model&&t.add(e.model);return[...t].sort()}),X=t=>{const e=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${e(t.getMonth()+1)}-${e(t.getDate())}`},L=t=>{D.value=t;const e=new Date,n=new Date(e);if(t==="today")n.setDate(e.getDate());else if(t==="yesterday")n.setDate(e.getDate()-1),e.setDate(e.getDate()-1);else if(t==="beforeYesterday")n.setDate(e.getDate()-2),e.setDate(e.getDate()-2);else if(t==="last3days")n.setDate(e.getDate()-2);else if(t==="week"){const w=(e.getDay()+6)%7;n.setDate(e.getDate()-w)}else n.setDate(1);f.value=[X(n),X(e)],x()},re=t=>{t?L(t):(D.value="",f.value=null,x())},ue=t=>{D.value="",f.value=t||null,x()},B=async()=>{Y.value=!0;try{const t={page:String(U.value),pageSize:String(j.value),sort:"time",order:"desc"};f.value&&f.value.length===2&&(t.startDate=f.value[0],t.endDate=f.value[1]),S.value&&(t.status=S.value),I.value&&(t.pathGroup=I.value),q.value&&(t.model=q.value),z.value&&(t.keyword=z.value);const e=new URLSearchParams(t).toString(),n=await J.get("/api/logs?"+e);M.value=n.items||[],O.value=n.total||0}catch(t){console.error(t)}finally{Y.value=!1}},x=()=>{U.value=1,B()},ie=()=>{D.value="today",f.value=null,S.value="2xx",I.value="model",q.value="",z.value="",U.value=1,j.value=50,L("today")};return xe(()=>{K.loadProviders(),L("today")}),(t,e)=>{const n=p("el-option"),w=p("el-select"),de=p("el-date-picker"),pe=p("el-input"),m=p("el-button"),Q=p("el-card"),y=p("el-table-column"),W=p("el-tag"),ce=p("el-table"),_e=p("el-pagination"),_=p("el-descriptions-item"),ve=p("el-divider"),me=p("el-popover"),fe=p("el-descriptions"),be=p("el-alert"),h=p("el-tab-pane"),ge=p("el-tabs"),ye=p("el-dialog"),Z=Ve("loading");return d(),c("div",qe,[l(Q,{shadow:"never"},{default:a(()=>[i("div",ze,[l(w,{modelValue:D.value,"onUpdate:modelValue":e[0]||(e[0]=o=>D.value=o),placeholder:"时间范围",clearable:"",style:{width:"130px"},onChange:re},{default:a(()=>[l(n,{label:"今天",value:"today"}),l(n,{label:"昨天",value:"yesterday"}),l(n,{label:"前天",value:"beforeYesterday"}),l(n,{label:"近三天",value:"last3days"}),l(n,{label:"本周",value:"week"}),l(n,{label:"本月",value:"month"})]),_:1},8,["modelValue"]),l(de,{modelValue:f.value,"onUpdate:modelValue":e[1]||(e[1]=o=>f.value=o),type:"daterange","value-format":"YYYY-MM-DD","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",style:{width:"260px"},onChange:ue},null,8,["modelValue"]),l(w,{modelValue:S.value,"onUpdate:modelValue":e[2]||(e[2]=o=>S.value=o),placeholder:"全部状态",clearable:"",style:{width:"120px"},onChange:x},{default:a(()=>[l(n,{label:"成功 (2xx)",value:"2xx"}),l(n,{label:"3xx",value:"3xx"}),l(n,{label:"4xx",value:"4xx"}),l(n,{label:"5xx",value:"5xx"}),l(n,{label:"错误 (4xx+)",value:"err"})]),_:1},8,["modelValue"]),l(w,{modelValue:I.value,"onUpdate:modelValue":e[3]||(e[3]=o=>I.value=o),placeholder:"全部路径",clearable:"",style:{width:"130px"},onChange:x},{default:a(()=>[l(n,{label:"模型接口",value:"model"}),l(n,{label:"其他",value:"other"})]),_:1},8,["modelValue"]),l(w,{modelValue:q.value,"onUpdate:modelValue":e[4]||(e[4]=o=>q.value=o),placeholder:"全部模型",clearable:"",filterable:"",style:{width:"220px"},onChange:x},{default:a(()=>[(d(!0),c(T,null,we(ne.value,o=>(d(),C(n,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),l(pe,{modelValue:z.value,"onUpdate:modelValue":e[5]||(e[5]=o=>z.value=o),class:"keyword-input",placeholder:"关键字搜索(请求/响应内容)",clearable:"",onKeyup:Ce(x,["enter"])},null,8,["modelValue"]),l(m,{type:"primary",class:"push-right",onClick:x},{default:a(()=>[...e[20]||(e[20]=[u("搜索",-1)])]),_:1}),l(m,{onClick:ie},{default:a(()=>[...e[21]||(e[21]=[u("重置",-1)])]),_:1})])]),_:1}),l(Q,{shadow:"never",class:"mt-16 table-card"},{default:a(()=>[i("div",Ue,[te((d(),C(ce,{data:M.value,border:"",stripe:"",height:"100%"},{default:a(()=>[l(y,{prop:"request_id",label:"请求ID","min-width":"140"},{default:a(({row:o})=>[o.request_id?(d(),c("span",{key:0,class:"request-id",title:"点击复制(可用于关联控制台日志与检索)",onClick:R=>g(o.request_id)},r(o.request_id),9,je)):(d(),c("span",Re,"-"))]),_:1}),l(y,{prop:"time",label:"时间",width:"180"},{default:a(({row:o})=>[u(r(A(o.time)),1)]),_:1}),l(y,{prop:"model",label:"模型","min-width":"180"}),l(y,{prop:"status",label:"状态",width:"70",align:"center"},{default:a(({row:o})=>[l(W,{type:o.status>=400?"danger":o.status>=300?"warning":"success"},{default:a(()=>[u(r(o.status),1)]),_:2},1032,["type"])]),_:1}),l(y,{label:"输入",width:"110",align:"center"},{default:a(({row:o})=>[u(r(V(o.input_tokens??0)),1)]),_:1}),l(y,{label:"输出",width:"110",align:"center"},{default:a(({row:o})=>[u(r(V(o.output_tokens??0)),1)]),_:1}),l(y,{label:"缓存读取",width:"90",align:"center"},{default:a(({row:o})=>[u(r(V(o.cache_read_tokens??0)),1)]),_:1}),l(y,{label:"缓存命中率",width:"105",align:"center"},{default:a(({row:o})=>[i("span",null,r(H(o)),1)]),_:1}),l(y,{label:"请求耗时",width:"90",align:"center"},{default:a(({row:o})=>[u(r(G(o.duration)),1)]),_:1}),l(y,{label:"详情",width:"70",align:"center"},{default:a(({row:o})=>[l(m,{link:"",type:"primary",onClick:R=>oe(o)},{default:a(()=>[...e[22]||(e[22]=[u("查看",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[Z,Y.value]])]),i("div",Te,[l(_e,{"current-page":U.value,"onUpdate:currentPage":e[6]||(e[6]=o=>U.value=o),"page-size":j.value,"onUpdate:pageSize":e[7]||(e[7]=o=>j.value=o),total:O.value,"page-sizes":[20,50,100,200],layout:"total, sizes, prev, pager, next",onCurrentChange:B,onSizeChange:B},null,8,["current-page","page-size","total"])])]),_:1}),l(ye,{modelValue:E.value,"onUpdate:modelValue":e[19]||(e[19]=o=>E.value=o),title:"日志详情",width:"80%",top:"5vh","destroy-on-close":""},{default:a(()=>[s.value?(d(),c("div",Ne,[l(ge,{modelValue:P.value,"onUpdate:modelValue":e[18]||(e[18]=o=>P.value=o)},{default:a(()=>{var o,R,ee;return[l(h,{label:"基本信息",name:"info"},{default:a(()=>{var k;return[l(fe,{column:2,border:""},{default:a(()=>[l(_,{label:"时间"},{default:a(()=>[u(r(A(s.value.time)),1)]),_:1}),l(_,{label:"模型"},{default:a(()=>[u(r(s.value.model),1)]),_:1}),l(_,{label:"方法"},{default:a(()=>[u(r(s.value.method),1)]),_:1}),l(_,{label:"路径"},{default:a(()=>[u(r(s.value.path),1)]),_:1}),l(_,{label:"状态码"},{default:a(()=>[u(r(s.value.status),1)]),_:1}),l(_,{label:"流式"},{default:a(()=>[l(W,{type:s.value.stream?"warning":"info"},{default:a(()=>[u(r(s.value.stream?"是":"否"),1)]),_:1},8,["type"])]),_:1}),l(_,{label:"IP"},{default:a(()=>[s.value.ip?(d(),c("span",Me,[l(me,{placement:"right",width:"240",trigger:"click",onShow:e[8]||(e[8]=ke=>ae(s.value))},{reference:a(()=>[i("span",null,r(s.value.ip),1)]),default:a(()=>[te((d(),c("div",Ye,[s.value._ipInfo?(d(),c(T,{key:0},[i("div",Ee,[e[23]||(e[23]=i("span",{class:"ip-pop-label"},"归属地",-1)),i("span",null,r(se(s.value._ipInfo)),1)]),s.value._ipInfo.isp?(d(),c("div",Pe,[e[24]||(e[24]=i("span",{class:"ip-pop-label"},"运营商",-1)),i("span",null,r(s.value._ipInfo.isp),1)])):$("",!0)],64)):s.value._ipInfoError?(d(),c("div",Fe,r(s.value._ipInfoError),1)):(d(),c("span",Le,"查询中...")),l(ve,{style:{margin:"8px 0"}}),i("a",{class:"ip-pop-link",href:`https://m.ip138.com/iplookup.php?ip=${encodeURIComponent(s.value.ip)}`,target:"_blank"},"在 ip138 查看",8,Be)])),[[Z,F.value]])]),_:1})])):(d(),c("span",Je,"-"))]),_:1}),l(_,{label:"Session"},{default:a(()=>[u(r(s.value.session_id||"-"),1)]),_:1}),l(_,{label:"Request ID"},{default:a(()=>[s.value.request_id?(d(),c("span",{key:0,class:"request-id",title:"点击复制(可用于关联控制台日志与检索)",onClick:e[9]||(e[9]=ke=>g(s.value.request_id))},r(s.value.request_id),1)):(d(),c("span",Ke,"-"))]),_:1}),l(_,{label:"输入 Token(含缓存读取)"},{default:a(()=>[u(r(V(s.value.input_tokens??0)),1)]),_:1}),l(_,{label:"输出 Token"},{default:a(()=>[u(r(V(s.value.output_tokens??0)),1)]),_:1}),l(_,{label:"缓存读取"},{default:a(()=>[u(r(V(s.value.cache_read_tokens??0)),1)]),_:1}),l(_,{label:"请求耗时"},{default:a(()=>[u(r(G(s.value.duration)),1)]),_:1}),l(_,{label:"缓存命中率"},{default:a(()=>[u(r(H(s.value)),1)]),_:1}),s.value.error?(d(),C(_,{key:0,label:"错误",span:2},{default:a(()=>[i("span",Oe,r(s.value.error),1)]),_:1})):$("",!0)]),_:1}),(k=s.value.response)!=null&&k.truncated?(d(),C(be,{key:0,class:"mt-16",type:"warning",closable:!1,title:"内容超过单请求捕获上限,已截断"})):$("",!0)]}),_:1}),(o=s.value.response)!=null&&o._capture?(d(),c(T,{key:0},[l(h,{label:"客户端请求",name:"inbound"},{default:a(()=>[i("div",Ae,[l(m,{size:"small",class:"copy-btn",onClick:e[10]||(e[10]=k=>g(b(s.value.response.inbound_request)))},{default:a(()=>[...e[25]||(e[25]=[u(" 复制 ",-1)])]),_:1})]),i("pre",Ge,r(b(s.value.response.inbound_request)),1)]),_:1}),l(h,{label:"转发上游的请求",name:"upstreamReq"},{default:a(()=>[i("div",He,[l(m,{size:"small",class:"copy-btn",onClick:e[11]||(e[11]=k=>g(b(s.value.response.upstream_request)))},{default:a(()=>[...e[26]||(e[26]=[u(" 复制 ",-1)])]),_:1})]),i("pre",Xe,r(b(s.value.response.upstream_request)),1)]),_:1}),s.value.response.upstream_response_text?(d(),C(h,{key:0,label:"上游响应(原始)",name:"upstreamRes"},{default:a(()=>[i("div",Qe,[l(m,{size:"small",class:"copy-btn",onClick:e[12]||(e[12]=k=>g(s.value.response.upstream_response_text))},{default:a(()=>[...e[27]||(e[27]=[u(" 复制 ",-1)])]),_:1})]),i("pre",We,r(le(s.value.response.upstream_response_text)),1)]),_:1})):(R=s.value.response.upstream_stream_frames)!=null&&R.length?(d(),C(h,{key:1,label:`上游响应(原始流,${s.value.response.upstream_stream_frames.length} 帧)`,name:"upstreamStream"},{default:a(()=>[i("div",Ze,[l(m,{size:"small",class:"copy-btn",onClick:e[13]||(e[13]=k=>g(s.value.response.upstream_stream_frames.join(`
2
-
3
- `)))},{default:a(()=>[...e[28]||(e[28]=[u(" 复制 ",-1)])]),_:1})]),i("pre",et,r(s.value.response.upstream_stream_frames.join(`
4
-
5
- `)),1)]),_:1},8,["label"])):$("",!0),s.value.response.client_response!==void 0&&s.value.response.client_response!==null?(d(),C(h,{key:2,label:"回写客户端(转换后)",name:"clientRes"},{default:a(()=>[i("div",tt,[l(m,{size:"small",class:"copy-btn",onClick:e[14]||(e[14]=k=>g(b(s.value.response.client_response)))},{default:a(()=>[...e[29]||(e[29]=[u(" 复制 ",-1)])]),_:1})]),i("pre",lt,r(b(s.value.response.client_response)),1)]),_:1})):(ee=s.value.response.client_stream_frames)!=null&&ee.length?(d(),C(h,{key:3,label:`回写客户端(${s.value.response.client_stream_frames.length} 帧)`,name:"clientStream"},{default:a(()=>[i("div",at,[l(m,{size:"small",class:"copy-btn",onClick:e[15]||(e[15]=k=>g(s.value.response.client_stream_frames.join(`
6
-
7
- `)))},{default:a(()=>[...e[30]||(e[30]=[u(" 复制 ",-1)])]),_:1})]),i("pre",st,r(s.value.response.client_stream_frames.join(`
8
-
9
- `)),1)]),_:1},8,["label"])):$("",!0)],64)):(d(),c(T,{key:1},[l(h,{label:"请求体",name:"request"},{default:a(()=>[i("div",ot,[l(m,{size:"small",class:"copy-btn",onClick:e[16]||(e[16]=k=>g(b(s.value.request)))},{default:a(()=>[...e[31]||(e[31]=[u(" 复制 ",-1)])]),_:1})]),i("pre",nt,r(b(s.value.request)),1)]),_:1}),l(h,{label:"响应体",name:"response"},{default:a(()=>[i("div",rt,[l(m,{size:"small",class:"copy-btn",onClick:e[17]||(e[17]=k=>g(b(s.value.response)))},{default:a(()=>[...e[32]||(e[32]=[u(" 复制 ",-1)])]),_:1})]),i("pre",ut,r(b(s.value.response)),1)]),_:1})],64))]}),_:1},8,["modelValue"])])):$("",!0)]),_:1},8,["modelValue"])])}}}),ft=$e(it,[["__scopeId","data-v-f853bf75"]]);export{ft as default};
@@ -1 +0,0 @@
1
- .logs-page[data-v-f853bf75]{height:calc(100vh - 124px);display:flex;flex-direction:column;overflow:hidden}.request-id[data-v-f853bf75]{cursor:pointer;font-family:ui-monospace,Consolas,monospace;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.request-id[data-v-f853bf75]:hover{color:var(--el-color-primary)}.filter-bar[data-v-f853bf75]{display:flex;gap:12px;align-items:center;flex-wrap:nowrap}.filter-bar .keyword-input[data-v-f853bf75]{flex:1;min-width:160px}.filter-bar .push-right[data-v-f853bf75]{margin-left:auto}.filter-bar[data-v-f853bf75] .el-button+.el-button{margin-left:0}.mt-16[data-v-f853bf75]{margin-top:16px}.table-card[data-v-f853bf75]{flex:1;min-height:0;overflow:hidden}.table-card[data-v-f853bf75] .el-card__body{height:100%;display:flex;flex-direction:column}.table-wrap[data-v-f853bf75]{flex:1;min-height:0}.pagination-bar[data-v-f853bf75]{margin-top:16px;display:flex;justify-content:flex-end;flex-shrink:0}.ip-link[data-v-f853bf75]{color:#409eff;cursor:pointer}.ip-link[data-v-f853bf75]:hover{text-decoration:underline}.ip-pop[data-v-f853bf75]{font-size:13px;min-height:20px}.ip-pop-row[data-v-f853bf75]{display:flex;gap:8px;margin-bottom:4px}.ip-pop-label[data-v-f853bf75]{color:#909399;flex-shrink:0}.ip-pop-error[data-v-f853bf75]{color:#f56c6c}.ip-pop-link[data-v-f853bf75]{color:#409eff;font-size:13px}.session-text[data-v-f853bf75]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;max-width:100%}.error-text[data-v-f853bf75]{color:#f56c6c}.pane-bar[data-v-f853bf75]{display:flex;justify-content:flex-end;margin-bottom:8px;flex-shrink:0}.json-block[data-v-f853bf75]{background:#f5f7fa;border:1px solid #e4e7ed;border-radius:4px;padding:12px;font-size:13px;line-height:1.5;overflow:auto;white-space:pre-wrap;word-break:break-all;flex:1;min-height:0}.detail-content[data-v-f853bf75]{height:78vh;display:flex;flex-direction:column;overflow:hidden}.detail-content[data-v-f853bf75] .el-tabs{flex:1;min-height:0;display:flex;flex-direction:column}.detail-content[data-v-f853bf75] .el-tabs__content{flex:1;min-height:0}.detail-content[data-v-f853bf75] .el-tab-pane{height:100%;display:flex;flex-direction:column;overflow:auto}.copy-btn[data-v-f853bf75]{margin-left:8px;padding:2px 10px;font-size:12px}
@@ -1 +0,0 @@
1
- import{d as X,i as Y,a0 as q,n as H,c as D,a as n,w as l,l as i,r as c,m as J,o as w,b as d,Y as Q,e as o,t as r,j as W,$ as Z,_ as ee}from"./index-DFlUx18F.js";import{m as I}from"./useManagerApi-BDWJz5o6.js";import{u as te}from"./useToast-D7xlwSg6.js";const ae={class:"flex-col-gap"},le={class:"flex-between"},ne={class:"proc-name"},se={class:"proc-sub"},oe=["onClick"],re={key:1,class:"muted-sm"},ie={class:"desc-full"},de=X({__name:"ProcessView",setup(ue){const{toast:b}=te(),v=i(!0),g=i(!1),y=i([]),x=i(null),p=i(null),h=i(Date.now()),P={daemon:"pm2 守护进程",manager:"管理服务",main:"代理服务"},C=e=>P[e.role]??e.role,k={daemon:"pm2 守护进程:托管代理服务与管理服务的后台守护,进程崩溃时自动拉起;自身不监听端口、不处理业务请求,不允许远程操控(停止它将失去自动恢复能力)。",manager:"管理服务(ellm-proxy-manager):独立常驻的轻量服务,提供进程启停接口与代理开关接口;代理服务停止时保持存活,保证还能在本页远程拉起代理服务。",main:"代理服务(ellm-proxy):网关本体,转发 /v1/* 模型请求,同时承载管理台页面与 API;本页的重启操作即作用于该进程,重启期间网关与管理台 API 短暂不可用(代理服务停止时重启等效于启动)。"},A=e=>k[e.role],_=i(!1),T=i(""),$=i(""),E=e=>{T.value=`${C(e)}(${M(e)})`,$.value=k[e.role],_.value=!0},M=e=>e.role==="daemon"?"pm2":e.role==="manager"?"ellm-proxy-manager":"ellm-proxy",O=e=>e.status==="online",N=e=>e.status?e.status==="online"?"running":e.status==="errored"?"abnormal":"stopped":"stopped",V=e=>{switch(e.status){case"online":return{text:"运行中",type:"success"};case"stopped":return{text:"已停止",type:"info"};case"errored":return{text:"异常",type:"danger"};case"waiting restart":case"launching":return{text:"重启中",type:"warning"};default:return{text:e.status||"未知",type:"info"}}},R=e=>{if(!O(e)||!e.startedAt)return"-";let t=Math.max(0,Math.floor((h.value-e.startedAt)/1e3));const m=Math.floor(t/86400);t-=m*86400;const u=Math.floor(t/3600);t-=u*3600;const s=Math.floor(t/60);return t-=s*60,[m?`${m}天`:"",u?`${u}时`:"",s?`${s}分`:"",`${t}秒`].filter(Boolean).join(" ")},S=e=>e?e>=1024**3?(e/1024**3).toFixed(1)+"G":e>=1024**2?(e/1024**2).toFixed(1)+"M":Math.round(e/1024)+"K":"-",f=async e=>{e||(y.value.length?g.value=!0:v.value=!0);try{y.value=await I.processes(),h.value=Date.now(),x.value=null}catch(t){e||(x.value=t.message)}finally{e||(v.value=!1,g.value=!1)}};let B;const j=()=>{p.value||document.hidden||f(!0)};Y(()=>{f(!1),B=window.setInterval(j,5e3)}),q(()=>window.clearInterval(B));const z=async()=>{try{await Z.confirm("确定重启 ellm-proxy 代理服务?重启期间网关与管理台 API 将短暂不可用(代理服务已停止时重启等效于启动)。","重启确认",{confirmButtonText:"重启",cancelButtonText:"取消",type:"warning"})}catch{return}p.value="restart";try{await I.restart(),b("重启完成","success")}catch(e){b(e.message||"操作失败","error")}finally{p.value=null,await f(!0)}};return(e,t)=>{const m=c("el-tag"),u=c("el-button"),s=c("el-table-column"),F=c("el-empty"),L=c("el-table"),U=c("el-card"),G=c("el-dialog"),K=J("loading");return H((w(),D("div",ae,[n(U,{shadow:"never"},{header:l(()=>[d("div",le,[t[6]||(t[6]=d("span",{class:"fw-600"},"进程管理",-1)),d("div",null,[n(m,{type:"info",class:"mr-8"},{default:l(()=>[...t[4]||(t[4]=[o("刷新间隔 5s",-1)])]),_:1}),n(u,{loading:g.value,onClick:t[0]||(t[0]=a=>f(!1))},{default:l(()=>[...t[5]||(t[5]=[o("刷新",-1)])]),_:1},8,["loading"])])])]),default:l(()=>[n(L,{data:y.value,border:"",stripe:"",class:"full-width"},{empty:l(()=>[n(F,{description:x.value||"暂无进程数据"},{default:l(()=>[n(u,{type:"primary",onClick:t[1]||(t[1]=a=>f(!1))},{default:l(()=>[...t[8]||(t[8]=[o("重试",-1)])]),_:1})]),_:1},8,["description"])]),default:l(()=>[n(s,{label:"进程","min-width":"180"},{default:l(({row:a})=>[d("div",ne,[d("span",{class:Q(["status-dot",N(a)])},null,2),o(" "+r(C(a))+" ",1),d("span",se,r(M(a)),1)])]),_:1}),n(s,{label:"运行状态",width:"100",align:"center"},{default:l(({row:a})=>[n(m,{type:V(a).type,"disable-transitions":""},{default:l(()=>[o(r(V(a).text),1)]),_:2},1032,["type"])]),_:1}),n(s,{label:"PID",width:"90",align:"center"},{default:l(({row:a})=>[o(r(a.pid??"-"),1)]),_:1}),n(s,{label:"端口",width:"90",align:"center"},{default:l(({row:a})=>[o(r(a.port??"-"),1)]),_:1}),n(s,{label:"运行时长",width:"130",align:"center"},{default:l(({row:a})=>[o(r(R(a)),1)]),_:1}),n(s,{label:"地址","min-width":"170"},{default:l(({row:a})=>[o(r(a.address??"-"),1)]),_:1}),n(s,{label:"内存",width:"90",align:"center"},{default:l(({row:a})=>[o(r(S(a.memory)),1)]),_:1}),n(s,{label:"描述","min-width":"220"},{default:l(({row:a})=>[d("span",{class:"desc-cell",title:"点击查看详情",onClick:ce=>E(a)},r(A(a)),9,oe)]),_:1}),n(s,{label:"操作",width:"90",align:"center"},{default:l(({row:a})=>[a.role==="main"?(w(),W(u,{key:0,type:"primary",size:"small",loading:p.value==="restart",disabled:p.value!==null,onClick:z},{default:l(()=>[...t[7]||(t[7]=[o(" 重启 ",-1)])]),_:1},8,["loading","disabled"])):(w(),D("span",re,"不可操作"))]),_:1})]),_:1},8,["data"]),t[9]||(t[9]=d("div",{class:"muted-sm"}," 进程控制由管理服务(manager)执行,仅代理服务(ellm-proxy)可重启(已停止时重启等效于启动): 重启期间网关与管理台 API 短暂不可用。 pm2 守护进程与管理服务不允许远程操控(停止它们将失去远程恢复能力)。 ",-1))]),_:1}),n(G,{modelValue:_.value,"onUpdate:modelValue":t[3]||(t[3]=a=>_.value=a),title:T.value,width:"520px"},{footer:l(()=>[n(u,{type:"primary",onClick:t[2]||(t[2]=a=>_.value=!1)},{default:l(()=>[...t[10]||(t[10]=[o("知道了",-1)])]),_:1})]),default:l(()=>[d("p",ie,r($.value),1)]),_:1},8,["modelValue","title"])])),[[K,v.value]])}}}),_e=ee(de,[["__scopeId","data-v-1404bf7a"]]);export{_e as default};
@@ -1 +0,0 @@
1
- .dialog-body[data-v-3a42733f]{max-height:80vh;overflow-y:auto;overflow-x:hidden;padding-bottom:100px}.test-ok-text[data-v-3a42733f]{font-size:12px;color:#16a34a;max-width:140px;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.test-fail-text[data-v-3a42733f]{font-size:12px;color:#dc2626;max-width:140px;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.model-select-wrap[data-v-3a42733f]{width:400px;flex-shrink:0}.flex-gap-8.full-width[data-v-3a42733f]{width:100%}.key-input[data-v-3a42733f]{flex:1;min-width:0}.key-test-btn[data-v-3a42733f]{flex-shrink:0}.test-result-link[data-v-3a42733f]{font-size:12px}.detail-body[data-v-3a42733f]{max-height:70vh;overflow-y:auto}.detail-head[data-v-3a42733f]{display:flex;align-items:center;gap:12px;margin-bottom:12px}.detail-name[data-v-3a42733f]{font-weight:600;font-size:14px}.detail-pre[data-v-3a42733f]{background:#f5f7fa;border:1px solid #e4e7ed;border-radius:6px;padding:12px;font-size:12px;line-height:1.6;color:#303133;max-height:300px;overflow:auto;margin:0;white-space:pre-wrap;word-break:break-all}.ghost[data-v-7afb29d5]{opacity:.4}.provider-grid[data-v-7afb29d5]{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.provider-card[data-v-7afb29d5]{min-width:0}.provider-card[data-v-7afb29d5] .el-card__body{padding:14px 16px}.provider-card.is-expanded[data-v-7afb29d5]{grid-column:1/-1}.card-header[data-v-7afb29d5]{display:flex;justify-content:space-between;align-items:center;min-width:0}.card-title[data-v-7afb29d5]{min-width:0}.card-title .alias-title[data-v-7afb29d5]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drag-grip[data-v-7afb29d5]{flex-shrink:0;color:#c0c4cc;cursor:grab;padding:4px}.drag-grip[data-v-7afb29d5]:hover{color:#909399}.card-tags[data-v-7afb29d5]{margin-top:8px}.card-actions[data-v-7afb29d5]{margin-top:12px;padding-top:10px;border-top:1px solid #f0f2f5}.line-ellipsis[data-v-7afb29d5]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rotate-90[data-v-7afb29d5]{transform:rotate(90deg)}.error-tag[data-v-7afb29d5]{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cursor-pointer[data-v-7afb29d5]{cursor:pointer}