ellm-proxy 0.0.11 → 0.0.13

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.
@@ -1 +1 @@
1
- import{u as Y}from"./useToast-C9BTyaBD.js";import{d as X,k as q,b as G,o as m,c as E,w as n,e as x,f as s,t as h,i as I,h as i,g as o,F as M,r,E as W,a as v,j as J,_ as Z,m as j,A as ee}from"./index-BmtcBnoW.js";import{u as te}from"./config-CHaFDQC7.js";import{m as S,w as le}from"./useManagerApi-PldAaNYo.js";const se={class:"flex-between"},ae={class:"muted-sm mb-8"},oe={class:"switch-row"},ne={class:"switch-info"},ie={class:"switch-title"},ue={class:"switch-row"},de={class:"switch-info"},re={class:"switch-title"},ce={class:"switch-row"},ve={class:"switch-info"},pe={class:"switch-title"},me=X({__name:"HarnessSwitches",setup(Q){const{toast:g}=Y(),$=r(!0),T=r(!1),p=r(null),V=r(null),u=r(null),P=r(null),w=r("success"),b=async _=>{_||(p.value?T.value=!0:$.value=!0);try{p.value=await S.harness(),V.value=null}catch(a){_||(V.value=a.message)}finally{_||($.value=!1,T.value=!1)}};q(()=>b(!1));const U={claudeCode:{label:"Claude Code",file:"~/.claude/settings.json",toggle:S.setClaudeCode},codex:{label:"Codex CLI",file:"~/.codex/config.toml",toggle:S.setCodex},dsh:{label:"DeepSeek Harness",file:"~/.dsh/settings.yaml",toggle:S.setDsh}},y=async(_,a)=>{if(!p.value||u.value)return;const C=U[_],D=a?`确定开启 ${C.label} 代理?将改写 ${C.file}(开启前自动备份,关闭时从备份还原)。`:`确定关闭 ${C.label} 代理?将从备份还原 ${C.file}(无备份时移除代理相关配置)。`;try{await W.confirm(D,a?"开启确认":"关闭确认",{confirmButtonText:a?"开启":"关闭",cancelButtonText:"取消",type:"warning"})}catch{return}u.value=_;try{const c=await C.toggle(a);P.value=c.note??null,w.value=a?"success":"info",g(a?"已开启代理":"已关闭代理","success")}catch(c){g(c.message||"操作失败","error")}finally{u.value=null,await b(!0)}};return(_,a)=>{const C=v("el-button"),D=v("el-alert"),c=v("el-tag"),t=v("el-switch"),z=v("el-divider"),R=v("el-empty"),L=v("el-card"),B=J("loading");return G((m(),E(L,{shadow:"never"},{header:n(()=>[s("div",se,[a[7]||(a[7]=s("span",{class:"fw-600"},"代理开关",-1)),o(C,{loading:T.value,onClick:a[0]||(a[0]=A=>b(!1))},{default:n(()=>[...a[6]||(a[6]=[i("刷新",-1)])]),_:1},8,["loading"])])]),default:n(()=>[p.value?(m(),x(M,{key:0},[s("div",ae," 将本机 CLI 工具的流量一键指向 ellm-proxy 网关("+h(p.value.gatewayBase)+")。 开启前自动备份原配置为 *.ellm-bak(保留最早的原始备份),关闭时从备份还原。 ",1),P.value?(m(),E(D,{key:0,title:P.value,type:w.value,"show-icon":"",class:"mb-8",onClose:a[1]||(a[1]=A=>P.value=null)},null,8,["title","type"])):I("",!0),s("div",oe,[s("div",ne,[s("div",ie,[a[8]||(a[8]=i(" Claude Code ",-1)),o(c,{type:p.value.claudeCode?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.claudeCode?"已开启":"未开启"),1)]),_:1},8,["type"])]),a[9]||(a[9]=s("div",{class:"switch-desc"},[i(" 写入 "),s("code",null,"~/.claude/settings.json"),i(" 的 env.ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN, 鉴权取网关配置的 masterKey(未设置将开启失败);其余字段原样保留,重启 Claude Code 会话后生效。 ")],-1))]),o(t,{"model-value":p.value.claudeCode,loading:u.value==="claudeCode",onChange:a[2]||(a[2]=A=>y("claudeCode",!!A))},null,8,["model-value","loading"])]),o(z,{class:"switch-divider"}),s("div",ue,[s("div",de,[s("div",re,[a[10]||(a[10]=i(" Codex CLI ",-1)),o(c,{type:p.value.codex?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.codex?"已开启":"未开启"),1)]),_:1},8,["type"])]),a[11]||(a[11]=s("div",{class:"switch-desc"},[i(" 写入 "),s("code",null,"~/.codex/config.toml"),i(" 的 model_provider 与 [model_providers.ellm-proxy] 段 (保留用户注释与排版);开启后需按提示设置环境变量 ELLM_PROXY_API_KEY 供 Codex 鉴权。 ")],-1))]),o(t,{"model-value":p.value.codex,loading:u.value==="codex",onChange:a[3]||(a[3]=A=>y("codex",!!A))},null,8,["model-value","loading"])]),o(z,{class:"switch-divider"}),s("div",ce,[s("div",ve,[s("div",pe,[a[12]||(a[12]=i(" DeepSeek Harness ",-1)),o(c,{type:p.value.dsh?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.dsh?"已开启":"未开启"),1)]),_:1},8,["type"])]),a[13]||(a[13]=s("div",{class:"switch-desc"},[i(" 写入 "),s("code",null,"~/.dsh/settings.yaml"),i(" 的 llm-deepseek.baseURL 与 "),s("code",null,"~/.dsh/.credentials.yaml"),i(" 的 DEEPSEEK_API_KEY(取网关 masterKey,未设置则写占位值);模型请在 dsh 内选择与网关部署名一致的模型。 dsh 为 developer preview,配置格式可能随版本变化。 ")],-1))]),o(t,{"model-value":p.value.dsh,loading:u.value==="dsh",onChange:a[4]||(a[4]=A=>y("dsh",!!A))},null,8,["model-value","loading"])])],64)):(m(),E(R,{key:1,description:V.value||"暂无开关状态"},{default:n(()=>[o(C,{type:"primary",onClick:a[5]||(a[5]=A=>b(!1))},{default:n(()=>[...a[14]||(a[14]=[i("重试",-1)])]),_:1})]),_:1},8,["description"]))]),_:1})),[[B,$.value]])}}}),fe=Z(me,[["__scopeId","data-v-65e65156"]]),_e={class:"service-settings"},ge={class:"flex-between"},ye={key:0,class:"switch-row"},we={class:"switch-info"},be={class:"switch-title"},Ce={key:0,class:"switch-row"},ke={class:"switch-info"},$e={class:"switch-title"},he={class:"switch-desc"},xe={key:0,class:"version-block"},Ve={class:"version-row"},Ae={class:"muted-sm"},Te={key:0,class:"muted-sm"},Ue={class:"version-actions"},Ee=X({__name:"ServiceUpdateSettings",setup(Q){const{toast:g}=Y(),$=r(!0),T=r(!1),p=r(null),V=r(null),u=r(null),P=r(null),w=r(null),b=r(!1),U=r(!1),y=r(null),_=async l=>{var e,d;if(!l){if(T.value)return;T.value=!0}try{const[f,K]=await Promise.allSettled([S.autostart(),S.update()]);p.value=f.status==="fulfilled"?f.value:null,V.value=f.status==="rejected"?(e=f.reason)==null?void 0:e.message:null,u.value=K.status==="fulfilled"?K.value:null,P.value=K.status==="rejected"?(d=K.reason)==null?void 0:d.message:null}finally{$.value=!1,T.value=!1}};q(()=>_(!1));const a=j(()=>{var l,e;return((e=(l=u.value)==null?void 0:l.lastCheck)==null?void 0:e.currentVersion)??null}),C=j(()=>{var l,e;return((e=(l=u.value)==null?void 0:l.lastCheck)==null?void 0:e.latestVersion)??null}),D=j(()=>{var l,e;return((e=(l=u.value)==null?void 0:l.lastCheck)==null?void 0:e.hasUpdate)===!0}),c=j(()=>{var e,d;const l=(d=(e=u.value)==null?void 0:e.lastCheck)==null?void 0:d.checkedAt;return l?new Date(l).toLocaleString():null}),t=j(()=>{var d;const l=(d=u.value)==null?void 0:d.lastApply;if(!l)return null;const e=l.appliedAt?new Date(l.appliedAt).toLocaleString():"";return`${l.fromVersion} → ${l.toVersion}${e?`(${e})`:""}`}),z=l=>l?new Date(l).toLocaleString():"",R=async l=>{if(!p.value||w.value)return;const e=l?"确定开启开机自启?将注册登录触发的自启项(登录时自动恢复服务)。":"确定关闭开机自启?将移除自启项,且此后首次启动不再自动注册。";try{await W.confirm(e,l?"开启确认":"关闭确认",{confirmButtonText:l?"开启":"关闭",cancelButtonText:"取消",type:"warning"})}catch{return}w.value="autostart";try{const d=await S.setAutostart(l);d.note?g(d.note,"success"):g(l?"开机自启已开启":"开机自启已关闭","success")}catch(d){g(d.message||"操作失败","error")}finally{w.value=null,await _(!0)}},L=async l=>{if(!u.value||w.value)return;const e=l?"确定开启自动更新?将每小时检查私有源,发现新版本自动安装并重启服务。":"确定关闭自动更新?不再自动检查(手动检查更新不受影响)。";try{await W.confirm(e,l?"开启确认":"关闭确认",{confirmButtonText:l?"开启":"关闭",cancelButtonText:"取消",type:"warning"})}catch{return}w.value="updateEnabled";try{const d=await S.setUpdateEnabled(l);d.note&&g(d.note,"success")}catch(d){g(d.message||"操作失败","error")}finally{w.value=null,await _(!0)}},B=async()=>{b.value=!0;try{const l=await S.checkUpdate();y.value=l.hasUpdate?`发现新版本 ${l.latestVersion}(当前 ${l.currentVersion}),可点击「立即更新」安装`:`已是最新版本 ${l.currentVersion}(检查于 ${z(l.checkedAt)})`,await _(!0)}catch(l){g(l.message||"检查更新失败","error")}finally{b.value=!1}},A=async()=>{var l;try{await W.confirm(`确定更新到 ${C.value}?服务将自动重启并在启动时安装新版本(期间界面请求会短暂失败,属正常现象)。`,"更新确认",{confirmButtonText:"立即更新",cancelButtonText:"取消",type:"warning"})}catch{return}U.value=!0;try{const e=await S.update(),d=await S.applyUpdate();if(!d.updated){y.value=`已是最新版本 ${d.toVersion}`;return}y.value=`正在重启服务并安装 ${d.toVersion},请稍候(预计 1~3 分钟)...`;const f=await le({targetVersion:d.toVersion,sinceAppliedAt:((l=e.lastApply)==null?void 0:l.appliedAt)??null});f&&!f.error?(g(`已更新到 ${f.toVersion}`,"success"),y.value=`已更新 ${f.fromVersion} → ${f.toVersion}`):f!=null&&f.error?(g(`更新失败:${f.error}`,"error"),y.value=`更新失败:${f.error}(服务已恢复旧版本)`):y.value="更新耗时较长,请稍后刷新页面查看结果"}catch(e){g(e.message||"更新失败","error")}finally{U.value=!1,await _(!0)}};return(l,e)=>{const d=v("el-button"),f=v("el-tag"),K=v("el-switch"),N=v("el-empty"),O=v("el-card"),F=v("el-alert"),k=J("loading");return G((m(),x("div",_e,[o(O,{shadow:"never",class:"mb-16"},{header:n(()=>[s("div",ge,[e[7]||(e[7]=s("span",{class:"fw-600"},"开机自启",-1)),o(d,{loading:T.value,onClick:e[0]||(e[0]=H=>_(!1))},{default:n(()=>[...e[6]||(e[6]=[i("刷新",-1)])]),_:1},8,["loading"])])]),default:n(()=>[p.value?(m(),x("div",ye,[s("div",we,[s("div",be,[e[8]||(e[8]=i(" 登录时自动启动服务 ",-1)),o(f,{type:p.value.enabled?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.enabled?"已开启":"未开启"),1)]),_:1},8,["type"])]),e[9]||(e[9]=s("div",{class:"switch-desc"},[i(" 登录操作系统时自动启动服务(无需管理员权限)。 关闭后首次启动 "),s("code",null,"ellm-proxy"),i(" 也不会再自动注册,重新开启即可解除。 ")],-1))]),o(K,{"model-value":p.value.enabled,loading:w.value==="autostart",onChange:e[1]||(e[1]=H=>R(!!H))},null,8,["model-value","loading"])])):(m(),E(N,{key:1,description:V.value||"暂无自启状态"},{default:n(()=>[o(d,{type:"primary",onClick:e[2]||(e[2]=H=>_(!1))},{default:n(()=>[...e[10]||(e[10]=[i("重试",-1)])]),_:1})]),_:1},8,["description"]))]),_:1}),o(O,{shadow:"never",class:"mb-16"},{header:n(()=>[...e[11]||(e[11]=[s("div",{class:"flex-between"},[s("span",{class:"fw-600"},"自动更新")],-1)])]),default:n(()=>[u.value?(m(),x("div",Ce,[s("div",ke,[s("div",$e,[e[12]||(e[12]=i(" 自动检查并安装新版本 ",-1)),o(f,{type:u.value.enabled?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(u.value.enabled?"已开启":"未开启"),1)]),_:1},8,["type"])]),s("div",he,[u.value.supported?(m(),x(M,{key:1},[i(" 每小时检查 npm 源,发现新版本自动重启服务并在启动时安装(更新期间服务短暂中断); 关闭后仍可在下方手动检查与更新。 ")],64)):(m(),x(M,{key:0},[i(" 当前为源码运行模式,更新功能不可用(仅 npm 全局安装的包支持自动更新)。 ")],64))])]),u.value.supported?(m(),E(K,{key:0,"model-value":u.value.enabled,loading:w.value==="updateEnabled",onChange:e[3]||(e[3]=H=>L(!!H))},null,8,["model-value","loading"])):I("",!0)])):(m(),E(N,{key:1,description:P.value||"暂无更新状态"},{default:n(()=>[o(d,{type:"primary",onClick:e[4]||(e[4]=H=>_(!1))},{default:n(()=>[...e[13]||(e[13]=[i("重试",-1)])]),_:1})]),_:1},8,["description"]))]),_:1}),o(O,{shadow:"never"},{header:n(()=>[...e[14]||(e[14]=[s("div",{class:"flex-between"},[s("span",{class:"fw-600"},"版本信息")],-1)])]),default:n(()=>[u.value?(m(),x("div",xe,[s("div",Ve,[e[17]||(e[17]=s("span",{class:"version-label"},"当前版本",-1)),o(f,{size:"small"},{default:n(()=>[i(h(a.value||"未知"),1)]),_:1}),C.value?(m(),x(M,{key:0},[e[16]||(e[16]=s("span",{class:"version-label"},"最新版本",-1)),o(f,{type:D.value?"warning":"success",size:"small","disable-transitions":""},{default:n(()=>[i(h(C.value),1)]),_:1},8,["type"]),D.value?(m(),E(f,{key:0,type:"warning",size:"small","disable-transitions":""},{default:n(()=>[...e[15]||(e[15]=[i("发现新版本",-1)])]),_:1})):I("",!0)],64)):I("",!0)]),s("div",Ae,[i(" 上次检查:"+h(c.value||"尚未检查")+" ",1),u.value.updating?(m(),x(M,{key:0},[i(" · 更新执行中...")],64)):I("",!0)]),t.value?(m(),x("div",Te,"上次更新:"+h(t.value),1)):I("",!0),s("div",Ue,[o(d,{loading:b.value,disabled:u.value.updating,onClick:B},{default:n(()=>[i(h(b.value?"检查中...":"检查更新"),1)]),_:1},8,["loading","disabled"]),D.value?(m(),E(d,{key:0,type:"primary",loading:U.value,disabled:u.value.updating,onClick:A},{default:n(()=>[i(h(U.value?"更新中...":`立即更新到 ${C.value}`),1)]),_:1},8,["loading","disabled"])):I("",!0)]),y.value?(m(),E(F,{key:1,title:y.value,type:"info","show-icon":"",class:"mt-8",onClose:e[5]||(e[5]=H=>y.value=null)},null,8,["title"])):I("",!0)])):(m(),E(N,{key:1,description:"更新状态不可用"}))]),_:1})])),[[k,$.value]])}}}),Se=Z(Ee,[["__scopeId","data-v-9366cd99"]]),Be={class:"flex-col-gap"},Ie={class:"flex-between"},Pe={class:"muted-sm"},De={key:0},Ke={class:"flex-end"},Re=X({__name:"SettingsView",setup(Q){const{toast:g}=Y(),$=te(),T=r("basic"),p=r(!0),V=r(!1),u=r(""),P=async()=>{if(u.value)try{await navigator.clipboard.writeText(u.value),g("已复制到剪贴板","success")}catch{g("复制失败","error")}},w=r(29770),b=r(null),U=r("passthrough"),y=r(!1),_=r(""),a=r(""),C=async()=>{var c;try{await $.load(),u.value=$.config.masterKey||"",w.value=$.config.port??29770,U.value=$.config.compression==="plain"?"plain":"passthrough",y.value=$.config.logContent===!0;const t=(c=$.config["web-ui"])==null?void 0:c["login-account"];_.value=(t==null?void 0:t.username)||"",a.value=(t==null?void 0:t.password)||"";try{b.value=await ee.get("/api/status").then(z=>z.listenPort)}catch{b.value=null}}catch(t){g(t.message,"error")}finally{p.value=!1}},D=async()=>{V.value=!0;try{await $.update(c=>{var t;c.masterKey=u.value.trim(),c.port=w.value,c.compression=U.value,c.logContent=y.value,c["web-ui"]??(c["web-ui"]={}),(t=c["web-ui"])["login-account"]??(t["login-account"]={}),c["web-ui"]["login-account"].username=_.value.trim(),c["web-ui"]["login-account"].password=a.value}),g("设置已保存并生效","success")}catch(c){g(c.message,"error")}finally{V.value=!1}};return q(C),(c,t)=>{const z=v("el-tag"),R=v("el-button"),L=v("el-input"),B=v("el-form-item"),A=v("el-input-number"),l=v("el-option"),e=v("el-select"),d=v("el-switch"),f=v("el-form"),K=v("el-card"),N=v("el-tab-pane"),O=v("el-tabs"),F=J("loading");return m(),E(O,{modelValue:T.value,"onUpdate:modelValue":t[6]||(t[6]=k=>T.value=k),class:"settings-tabs"},{default:n(()=>[o(N,{label:"基本设置",name:"basic"},{default:n(()=>[G((m(),x("div",Be,[o(K,{shadow:"never"},{header:n(()=>[s("div",Ie,[t[8]||(t[8]=s("span",{class:"fw-600"},"基本设置",-1)),o(z,{type:"success"},{default:n(()=>[...t[7]||(t[7]=[i("运行中",-1)])]),_:1})])]),default:n(()=>[o(f,{"label-position":"top"},{default:n(()=>[o(B,{label:"API 密钥 (masterKey)"},{default:n(()=>[o(L,{modelValue:u.value,"onUpdate:modelValue":t[0]||(t[0]=k=>u.value=k),placeholder:"sk-1234",clearable:""},{append:n(()=>[o(R,{onClick:P},{default:n(()=>[...t[9]||(t[9]=[i("复制",-1)])]),_:1})]),_:1},8,["modelValue"]),t[10]||(t[10]=s("div",{class:"muted-sm"}," 网关 API 认证密钥(/v1/* 请求需携带 Bearer <masterKey>;留空 = 本地放行) ",-1))]),_:1}),o(B,{label:"监听端口 (port)"},{default:n(()=>[o(A,{modelValue:w.value,"onUpdate:modelValue":t[1]||(t[1]=k=>w.value=k),min:1,max:65535,step:1,class:"full-width"},null,8,["modelValue"]),s("div",Pe,[t[12]||(t[12]=i(" 网关与管理台 API 的监听端口,保存后下次重启生效 ",-1)),b.value!==null?(m(),x(M,{key:0},[t[11]||(t[11]=i(" ;当前实际监听 ",-1)),s("b",null,h(b.value),1),b.value!==w.value?(m(),x("span",De,"(由 PORT 环境变量覆盖,此配置值不生效)")):I("",!0)],64)):I("",!0)])]),_:1}),o(B,{label:"压缩语义 (compression)"},{default:n(()=>[o(e,{modelValue:U.value,"onUpdate:modelValue":t[2]||(t[2]=k=>U.value=k),class:"full-width"},{default:n(()=>[o(l,{label:"透传 (passthrough)",value:"passthrough"}),o(l,{label:"明文 (plain)",value:"plain"})]),_:1},8,["modelValue"]),t[13]||(t[13]=s("div",{class:"muted-sm"},"上游响应压缩处理方式,保存后热更新生效",-1))]),_:1}),o(B,{label:"日志内容捕获 (logContent)"},{default:n(()=>[o(d,{modelValue:y.value,"onUpdate:modelValue":t[3]||(t[3]=k=>y.value=k)},null,8,["modelValue"]),t[14]||(t[14]=s("div",{class:"muted-sm"}," 记录完整请求/响应(含上游原始与转换后内容)进日志详情,用于排查定位问题;开启后有少量内存与存储开销,保存后热更新生效 ",-1))]),_:1}),o(B,{label:"管理台用户名 (web-ui.login-account.username)"},{default:n(()=>[o(L,{modelValue:_.value,"onUpdate:modelValue":t[4]||(t[4]=k=>_.value=k),placeholder:"请输入用户名"},null,8,["modelValue"]),t[15]||(t[15]=s("div",{class:"muted-sm"}," 管理台登录用户名,留空回退 WEBUI_USERNAME/WEBUI_PASSWORD 环境变量(两者都设置才生效) ",-1))]),_:1}),o(B,{label:"管理台密码 (web-ui.login-account.password)"},{default:n(()=>[o(L,{modelValue:a.value,"onUpdate:modelValue":t[5]||(t[5]=k=>a.value=k),type:"password",placeholder:"请输入密码(至少 6 位)","show-password":""},null,8,["modelValue"]),t[16]||(t[16]=s("div",{class:"muted-sm"}," 用户名与密码需同时填写才启用登录;都未提供 = 管理台免登录直接访问(纯本机使用)。修改保存后立即生效,需用新账号重新登录 ",-1))]),_:1})]),_:1})]),_:1}),s("div",Ke,[o(R,{type:"primary",loading:V.value,disabled:V.value,onClick:D},{default:n(()=>[i(h(V.value?"保存中...":"保存设置"),1)]),_:1},8,["loading","disabled"])])])),[[F,p.value]])]),_:1}),o(N,{label:"代理开关",name:"harness",lazy:""},{default:n(()=>[o(fe)]),_:1}),o(N,{label:"服务与更新",name:"service",lazy:""},{default:n(()=>[o(Se)]),_:1})]),_:1},8,["modelValue"])}}});export{Re as default};
1
+ import{u as Y}from"./useToast-BIVFyGJl.js";import{d as X,k as q,b as G,o as m,c as E,w as n,e as x,f as s,t as h,i as I,h as i,g as o,F as M,r,E as W,a as v,j as J,_ as Z,m as j,A as ee}from"./index-DzBTME5Z.js";import{u as te}from"./config-CFGI6BQU.js";import{m as S,w as le}from"./useManagerApi-C3X3JX66.js";const se={class:"flex-between"},ae={class:"muted-sm mb-8"},oe={class:"switch-row"},ne={class:"switch-info"},ie={class:"switch-title"},ue={class:"switch-row"},de={class:"switch-info"},re={class:"switch-title"},ce={class:"switch-row"},ve={class:"switch-info"},pe={class:"switch-title"},me=X({__name:"HarnessSwitches",setup(Q){const{toast:g}=Y(),$=r(!0),T=r(!1),p=r(null),V=r(null),u=r(null),P=r(null),w=r("success"),b=async _=>{_||(p.value?T.value=!0:$.value=!0);try{p.value=await S.harness(),V.value=null}catch(a){_||(V.value=a.message)}finally{_||($.value=!1,T.value=!1)}};q(()=>b(!1));const U={claudeCode:{label:"Claude Code",file:"~/.claude/settings.json",toggle:S.setClaudeCode},codex:{label:"Codex CLI",file:"~/.codex/config.toml",toggle:S.setCodex},dsh:{label:"DeepSeek Harness",file:"~/.dsh/settings.yaml",toggle:S.setDsh}},y=async(_,a)=>{if(!p.value||u.value)return;const C=U[_],D=a?`确定开启 ${C.label} 代理?将改写 ${C.file}(开启前自动备份,关闭时从备份还原)。`:`确定关闭 ${C.label} 代理?将从备份还原 ${C.file}(无备份时移除代理相关配置)。`;try{await W.confirm(D,a?"开启确认":"关闭确认",{confirmButtonText:a?"开启":"关闭",cancelButtonText:"取消",type:"warning"})}catch{return}u.value=_;try{const c=await C.toggle(a);P.value=c.note??null,w.value=a?"success":"info",g(a?"已开启代理":"已关闭代理","success")}catch(c){g(c.message||"操作失败","error")}finally{u.value=null,await b(!0)}};return(_,a)=>{const C=v("el-button"),D=v("el-alert"),c=v("el-tag"),t=v("el-switch"),z=v("el-divider"),R=v("el-empty"),L=v("el-card"),B=J("loading");return G((m(),E(L,{shadow:"never"},{header:n(()=>[s("div",se,[a[7]||(a[7]=s("span",{class:"fw-600"},"代理开关",-1)),o(C,{loading:T.value,onClick:a[0]||(a[0]=A=>b(!1))},{default:n(()=>[...a[6]||(a[6]=[i("刷新",-1)])]),_:1},8,["loading"])])]),default:n(()=>[p.value?(m(),x(M,{key:0},[s("div",ae," 将本机 CLI 工具的流量一键指向 ellm-proxy 网关("+h(p.value.gatewayBase)+")。 开启前自动备份原配置为 *.ellm-bak(保留最早的原始备份),关闭时从备份还原。 ",1),P.value?(m(),E(D,{key:0,title:P.value,type:w.value,"show-icon":"",class:"mb-8",onClose:a[1]||(a[1]=A=>P.value=null)},null,8,["title","type"])):I("",!0),s("div",oe,[s("div",ne,[s("div",ie,[a[8]||(a[8]=i(" Claude Code ",-1)),o(c,{type:p.value.claudeCode?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.claudeCode?"已开启":"未开启"),1)]),_:1},8,["type"])]),a[9]||(a[9]=s("div",{class:"switch-desc"},[i(" 写入 "),s("code",null,"~/.claude/settings.json"),i(" 的 env.ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN, 鉴权取网关配置的 masterKey(未设置将开启失败);其余字段原样保留,重启 Claude Code 会话后生效。 ")],-1))]),o(t,{"model-value":p.value.claudeCode,loading:u.value==="claudeCode",onChange:a[2]||(a[2]=A=>y("claudeCode",!!A))},null,8,["model-value","loading"])]),o(z,{class:"switch-divider"}),s("div",ue,[s("div",de,[s("div",re,[a[10]||(a[10]=i(" Codex CLI ",-1)),o(c,{type:p.value.codex?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.codex?"已开启":"未开启"),1)]),_:1},8,["type"])]),a[11]||(a[11]=s("div",{class:"switch-desc"},[i(" 写入 "),s("code",null,"~/.codex/config.toml"),i(" 的 model_provider 与 [model_providers.ellm-proxy] 段 (保留用户注释与排版);开启后需按提示设置环境变量 ELLM_PROXY_API_KEY 供 Codex 鉴权。 ")],-1))]),o(t,{"model-value":p.value.codex,loading:u.value==="codex",onChange:a[3]||(a[3]=A=>y("codex",!!A))},null,8,["model-value","loading"])]),o(z,{class:"switch-divider"}),s("div",ce,[s("div",ve,[s("div",pe,[a[12]||(a[12]=i(" DeepSeek Harness ",-1)),o(c,{type:p.value.dsh?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.dsh?"已开启":"未开启"),1)]),_:1},8,["type"])]),a[13]||(a[13]=s("div",{class:"switch-desc"},[i(" 写入 "),s("code",null,"~/.dsh/settings.yaml"),i(" 的 llm-deepseek.baseURL 与 "),s("code",null,"~/.dsh/.credentials.yaml"),i(" 的 DEEPSEEK_API_KEY(取网关 masterKey,未设置则写占位值);模型请在 dsh 内选择与网关部署名一致的模型。 dsh 为 developer preview,配置格式可能随版本变化。 ")],-1))]),o(t,{"model-value":p.value.dsh,loading:u.value==="dsh",onChange:a[4]||(a[4]=A=>y("dsh",!!A))},null,8,["model-value","loading"])])],64)):(m(),E(R,{key:1,description:V.value||"暂无开关状态"},{default:n(()=>[o(C,{type:"primary",onClick:a[5]||(a[5]=A=>b(!1))},{default:n(()=>[...a[14]||(a[14]=[i("重试",-1)])]),_:1})]),_:1},8,["description"]))]),_:1})),[[B,$.value]])}}}),fe=Z(me,[["__scopeId","data-v-65e65156"]]),_e={class:"service-settings"},ge={class:"flex-between"},ye={key:0,class:"switch-row"},we={class:"switch-info"},be={class:"switch-title"},Ce={key:0,class:"switch-row"},ke={class:"switch-info"},$e={class:"switch-title"},he={class:"switch-desc"},xe={key:0,class:"version-block"},Ve={class:"version-row"},Ae={class:"muted-sm"},Te={key:0,class:"muted-sm"},Ue={class:"version-actions"},Ee=X({__name:"ServiceUpdateSettings",setup(Q){const{toast:g}=Y(),$=r(!0),T=r(!1),p=r(null),V=r(null),u=r(null),P=r(null),w=r(null),b=r(!1),U=r(!1),y=r(null),_=async l=>{var e,d;if(!l){if(T.value)return;T.value=!0}try{const[f,K]=await Promise.allSettled([S.autostart(),S.update()]);p.value=f.status==="fulfilled"?f.value:null,V.value=f.status==="rejected"?(e=f.reason)==null?void 0:e.message:null,u.value=K.status==="fulfilled"?K.value:null,P.value=K.status==="rejected"?(d=K.reason)==null?void 0:d.message:null}finally{$.value=!1,T.value=!1}};q(()=>_(!1));const a=j(()=>{var l,e;return((e=(l=u.value)==null?void 0:l.lastCheck)==null?void 0:e.currentVersion)??null}),C=j(()=>{var l,e;return((e=(l=u.value)==null?void 0:l.lastCheck)==null?void 0:e.latestVersion)??null}),D=j(()=>{var l,e;return((e=(l=u.value)==null?void 0:l.lastCheck)==null?void 0:e.hasUpdate)===!0}),c=j(()=>{var e,d;const l=(d=(e=u.value)==null?void 0:e.lastCheck)==null?void 0:d.checkedAt;return l?new Date(l).toLocaleString():null}),t=j(()=>{var d;const l=(d=u.value)==null?void 0:d.lastApply;if(!l)return null;const e=l.appliedAt?new Date(l.appliedAt).toLocaleString():"";return`${l.fromVersion} → ${l.toVersion}${e?`(${e})`:""}`}),z=l=>l?new Date(l).toLocaleString():"",R=async l=>{if(!p.value||w.value)return;const e=l?"确定开启开机自启?将注册登录触发的自启项(登录时自动恢复服务)。":"确定关闭开机自启?将移除自启项,且此后首次启动不再自动注册。";try{await W.confirm(e,l?"开启确认":"关闭确认",{confirmButtonText:l?"开启":"关闭",cancelButtonText:"取消",type:"warning"})}catch{return}w.value="autostart";try{const d=await S.setAutostart(l);d.note?g(d.note,"success"):g(l?"开机自启已开启":"开机自启已关闭","success")}catch(d){g(d.message||"操作失败","error")}finally{w.value=null,await _(!0)}},L=async l=>{if(!u.value||w.value)return;const e=l?"确定开启自动更新?将每小时检查私有源,发现新版本自动安装并重启服务。":"确定关闭自动更新?不再自动检查(手动检查更新不受影响)。";try{await W.confirm(e,l?"开启确认":"关闭确认",{confirmButtonText:l?"开启":"关闭",cancelButtonText:"取消",type:"warning"})}catch{return}w.value="updateEnabled";try{const d=await S.setUpdateEnabled(l);d.note&&g(d.note,"success")}catch(d){g(d.message||"操作失败","error")}finally{w.value=null,await _(!0)}},B=async()=>{b.value=!0;try{const l=await S.checkUpdate();y.value=l.hasUpdate?`发现新版本 ${l.latestVersion}(当前 ${l.currentVersion}),可点击「立即更新」安装`:`已是最新版本 ${l.currentVersion}(检查于 ${z(l.checkedAt)})`,await _(!0)}catch(l){g(l.message||"检查更新失败","error")}finally{b.value=!1}},A=async()=>{var l;try{await W.confirm(`确定更新到 ${C.value}?服务将自动重启并在启动时安装新版本(期间界面请求会短暂失败,属正常现象)。`,"更新确认",{confirmButtonText:"立即更新",cancelButtonText:"取消",type:"warning"})}catch{return}U.value=!0;try{const e=await S.update(),d=await S.applyUpdate();if(!d.updated){y.value=`已是最新版本 ${d.toVersion}`;return}y.value=`正在重启服务并安装 ${d.toVersion},请稍候(预计 1~3 分钟)...`;const f=await le({targetVersion:d.toVersion,sinceAppliedAt:((l=e.lastApply)==null?void 0:l.appliedAt)??null});f&&!f.error?(g(`已更新到 ${f.toVersion}`,"success"),y.value=`已更新 ${f.fromVersion} → ${f.toVersion}`):f!=null&&f.error?(g(`更新失败:${f.error}`,"error"),y.value=`更新失败:${f.error}(服务已恢复旧版本)`):y.value="更新耗时较长,请稍后刷新页面查看结果"}catch(e){g(e.message||"更新失败","error")}finally{U.value=!1,await _(!0)}};return(l,e)=>{const d=v("el-button"),f=v("el-tag"),K=v("el-switch"),N=v("el-empty"),O=v("el-card"),F=v("el-alert"),k=J("loading");return G((m(),x("div",_e,[o(O,{shadow:"never",class:"mb-16"},{header:n(()=>[s("div",ge,[e[7]||(e[7]=s("span",{class:"fw-600"},"开机自启",-1)),o(d,{loading:T.value,onClick:e[0]||(e[0]=H=>_(!1))},{default:n(()=>[...e[6]||(e[6]=[i("刷新",-1)])]),_:1},8,["loading"])])]),default:n(()=>[p.value?(m(),x("div",ye,[s("div",we,[s("div",be,[e[8]||(e[8]=i(" 登录时自动启动服务 ",-1)),o(f,{type:p.value.enabled?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(p.value.enabled?"已开启":"未开启"),1)]),_:1},8,["type"])]),e[9]||(e[9]=s("div",{class:"switch-desc"},[i(" 登录操作系统时自动启动服务(无需管理员权限)。 关闭后首次启动 "),s("code",null,"ellm-proxy"),i(" 也不会再自动注册,重新开启即可解除。 ")],-1))]),o(K,{"model-value":p.value.enabled,loading:w.value==="autostart",onChange:e[1]||(e[1]=H=>R(!!H))},null,8,["model-value","loading"])])):(m(),E(N,{key:1,description:V.value||"暂无自启状态"},{default:n(()=>[o(d,{type:"primary",onClick:e[2]||(e[2]=H=>_(!1))},{default:n(()=>[...e[10]||(e[10]=[i("重试",-1)])]),_:1})]),_:1},8,["description"]))]),_:1}),o(O,{shadow:"never",class:"mb-16"},{header:n(()=>[...e[11]||(e[11]=[s("div",{class:"flex-between"},[s("span",{class:"fw-600"},"自动更新")],-1)])]),default:n(()=>[u.value?(m(),x("div",Ce,[s("div",ke,[s("div",$e,[e[12]||(e[12]=i(" 自动检查并安装新版本 ",-1)),o(f,{type:u.value.enabled?"success":"info",size:"small","disable-transitions":""},{default:n(()=>[i(h(u.value.enabled?"已开启":"未开启"),1)]),_:1},8,["type"])]),s("div",he,[u.value.supported?(m(),x(M,{key:1},[i(" 每小时检查 npm 源,发现新版本自动重启服务并在启动时安装(更新期间服务短暂中断); 关闭后仍可在下方手动检查与更新。 ")],64)):(m(),x(M,{key:0},[i(" 当前为源码运行模式,更新功能不可用(仅 npm 全局安装的包支持自动更新)。 ")],64))])]),u.value.supported?(m(),E(K,{key:0,"model-value":u.value.enabled,loading:w.value==="updateEnabled",onChange:e[3]||(e[3]=H=>L(!!H))},null,8,["model-value","loading"])):I("",!0)])):(m(),E(N,{key:1,description:P.value||"暂无更新状态"},{default:n(()=>[o(d,{type:"primary",onClick:e[4]||(e[4]=H=>_(!1))},{default:n(()=>[...e[13]||(e[13]=[i("重试",-1)])]),_:1})]),_:1},8,["description"]))]),_:1}),o(O,{shadow:"never"},{header:n(()=>[...e[14]||(e[14]=[s("div",{class:"flex-between"},[s("span",{class:"fw-600"},"版本信息")],-1)])]),default:n(()=>[u.value?(m(),x("div",xe,[s("div",Ve,[e[17]||(e[17]=s("span",{class:"version-label"},"当前版本",-1)),o(f,{size:"small"},{default:n(()=>[i(h(a.value||"未知"),1)]),_:1}),C.value?(m(),x(M,{key:0},[e[16]||(e[16]=s("span",{class:"version-label"},"最新版本",-1)),o(f,{type:D.value?"warning":"success",size:"small","disable-transitions":""},{default:n(()=>[i(h(C.value),1)]),_:1},8,["type"]),D.value?(m(),E(f,{key:0,type:"warning",size:"small","disable-transitions":""},{default:n(()=>[...e[15]||(e[15]=[i("发现新版本",-1)])]),_:1})):I("",!0)],64)):I("",!0)]),s("div",Ae,[i(" 上次检查:"+h(c.value||"尚未检查")+" ",1),u.value.updating?(m(),x(M,{key:0},[i(" · 更新执行中...")],64)):I("",!0)]),t.value?(m(),x("div",Te,"上次更新:"+h(t.value),1)):I("",!0),s("div",Ue,[o(d,{loading:b.value,disabled:u.value.updating,onClick:B},{default:n(()=>[i(h(b.value?"检查中...":"检查更新"),1)]),_:1},8,["loading","disabled"]),D.value?(m(),E(d,{key:0,type:"primary",loading:U.value,disabled:u.value.updating,onClick:A},{default:n(()=>[i(h(U.value?"更新中...":`立即更新到 ${C.value}`),1)]),_:1},8,["loading","disabled"])):I("",!0)]),y.value?(m(),E(F,{key:1,title:y.value,type:"info","show-icon":"",class:"mt-8",onClose:e[5]||(e[5]=H=>y.value=null)},null,8,["title"])):I("",!0)])):(m(),E(N,{key:1,description:"更新状态不可用"}))]),_:1})])),[[k,$.value]])}}}),Se=Z(Ee,[["__scopeId","data-v-9366cd99"]]),Be={class:"flex-col-gap"},Ie={class:"flex-between"},Pe={class:"muted-sm"},De={key:0},Ke={class:"flex-end"},Re=X({__name:"SettingsView",setup(Q){const{toast:g}=Y(),$=te(),T=r("basic"),p=r(!0),V=r(!1),u=r(""),P=async()=>{if(u.value)try{await navigator.clipboard.writeText(u.value),g("已复制到剪贴板","success")}catch{g("复制失败","error")}},w=r(29770),b=r(null),U=r("passthrough"),y=r(!1),_=r(""),a=r(""),C=async()=>{var c;try{await $.load(),u.value=$.config.masterKey||"",w.value=$.config.port??29770,U.value=$.config.compression==="plain"?"plain":"passthrough",y.value=$.config.logContent===!0;const t=(c=$.config["web-ui"])==null?void 0:c["login-account"];_.value=(t==null?void 0:t.username)||"",a.value=(t==null?void 0:t.password)||"";try{b.value=await ee.get("/api/status").then(z=>z.listenPort)}catch{b.value=null}}catch(t){g(t.message,"error")}finally{p.value=!1}},D=async()=>{V.value=!0;try{await $.update(c=>{var t;c.masterKey=u.value.trim(),c.port=w.value,c.compression=U.value,c.logContent=y.value,c["web-ui"]??(c["web-ui"]={}),(t=c["web-ui"])["login-account"]??(t["login-account"]={}),c["web-ui"]["login-account"].username=_.value.trim(),c["web-ui"]["login-account"].password=a.value}),g("设置已保存并生效","success")}catch(c){g(c.message,"error")}finally{V.value=!1}};return q(C),(c,t)=>{const z=v("el-tag"),R=v("el-button"),L=v("el-input"),B=v("el-form-item"),A=v("el-input-number"),l=v("el-option"),e=v("el-select"),d=v("el-switch"),f=v("el-form"),K=v("el-card"),N=v("el-tab-pane"),O=v("el-tabs"),F=J("loading");return m(),E(O,{modelValue:T.value,"onUpdate:modelValue":t[6]||(t[6]=k=>T.value=k),class:"settings-tabs"},{default:n(()=>[o(N,{label:"基本设置",name:"basic"},{default:n(()=>[G((m(),x("div",Be,[o(K,{shadow:"never"},{header:n(()=>[s("div",Ie,[t[8]||(t[8]=s("span",{class:"fw-600"},"基本设置",-1)),o(z,{type:"success"},{default:n(()=>[...t[7]||(t[7]=[i("运行中",-1)])]),_:1})])]),default:n(()=>[o(f,{"label-position":"top"},{default:n(()=>[o(B,{label:"API 密钥 (masterKey)"},{default:n(()=>[o(L,{modelValue:u.value,"onUpdate:modelValue":t[0]||(t[0]=k=>u.value=k),placeholder:"sk-1234",clearable:""},{append:n(()=>[o(R,{onClick:P},{default:n(()=>[...t[9]||(t[9]=[i("复制",-1)])]),_:1})]),_:1},8,["modelValue"]),t[10]||(t[10]=s("div",{class:"muted-sm"}," 网关 API 认证密钥(/v1/* 请求需携带 Bearer <masterKey>;留空 = 本地放行) ",-1))]),_:1}),o(B,{label:"监听端口 (port)"},{default:n(()=>[o(A,{modelValue:w.value,"onUpdate:modelValue":t[1]||(t[1]=k=>w.value=k),min:1,max:65535,step:1,class:"full-width"},null,8,["modelValue"]),s("div",Pe,[t[12]||(t[12]=i(" 网关与管理台 API 的监听端口,保存后下次重启生效 ",-1)),b.value!==null?(m(),x(M,{key:0},[t[11]||(t[11]=i(" ;当前实际监听 ",-1)),s("b",null,h(b.value),1),b.value!==w.value?(m(),x("span",De,"(由 PORT 环境变量覆盖,此配置值不生效)")):I("",!0)],64)):I("",!0)])]),_:1}),o(B,{label:"压缩语义 (compression)"},{default:n(()=>[o(e,{modelValue:U.value,"onUpdate:modelValue":t[2]||(t[2]=k=>U.value=k),class:"full-width"},{default:n(()=>[o(l,{label:"透传 (passthrough)",value:"passthrough"}),o(l,{label:"明文 (plain)",value:"plain"})]),_:1},8,["modelValue"]),t[13]||(t[13]=s("div",{class:"muted-sm"},"上游响应压缩处理方式,保存后热更新生效",-1))]),_:1}),o(B,{label:"日志内容捕获 (logContent)"},{default:n(()=>[o(d,{modelValue:y.value,"onUpdate:modelValue":t[3]||(t[3]=k=>y.value=k)},null,8,["modelValue"]),t[14]||(t[14]=s("div",{class:"muted-sm"}," 记录完整请求/响应(含上游原始与转换后内容)进日志详情,用于排查定位问题;开启后有少量内存与存储开销,保存后热更新生效 ",-1))]),_:1}),o(B,{label:"管理台用户名 (web-ui.login-account.username)"},{default:n(()=>[o(L,{modelValue:_.value,"onUpdate:modelValue":t[4]||(t[4]=k=>_.value=k),placeholder:"请输入用户名"},null,8,["modelValue"]),t[15]||(t[15]=s("div",{class:"muted-sm"}," 管理台登录用户名,留空回退 WEBUI_USERNAME/WEBUI_PASSWORD 环境变量(两者都设置才生效) ",-1))]),_:1}),o(B,{label:"管理台密码 (web-ui.login-account.password)"},{default:n(()=>[o(L,{modelValue:a.value,"onUpdate:modelValue":t[5]||(t[5]=k=>a.value=k),type:"password",placeholder:"请输入密码(至少 6 位)","show-password":""},null,8,["modelValue"]),t[16]||(t[16]=s("div",{class:"muted-sm"}," 用户名与密码需同时填写才启用登录;都未提供 = 管理台免登录直接访问(纯本机使用)。修改保存后立即生效,需用新账号重新登录 ",-1))]),_:1})]),_:1})]),_:1}),s("div",Ke,[o(R,{type:"primary",loading:V.value,disabled:V.value,onClick:D},{default:n(()=>[i(h(V.value?"保存中...":"保存设置"),1)]),_:1},8,["loading","disabled"])])])),[[F,p.value]])]),_:1}),o(N,{label:"代理开关",name:"harness",lazy:""},{default:n(()=>[o(fe)]),_:1}),o(N,{label:"服务与更新",name:"service",lazy:""},{default:n(()=>[o(Se)]),_:1})]),_:1},8,["modelValue"])}}});export{Re as default};
@@ -1 +1 @@
1
- import{d as M,k as N,l as E,e as I,g as l,w as t,r as d,a as u,o as y,f,h as m,c as x,i as C,a0 as T,ac as w,A as h,ad as L,n as P,_ as R}from"./index-BmtcBnoW.js";const $={class:"setup-wrap"},j={class:"account-row"},q=M({__name:"SetupView",setup(z){const S=P(),r=d(!1),i=d(""),c=d(""),p=d(""),_=d(!1),o=d("");N(async()=>{(await E()).masterKeySet||(i.value=A())});function A(){const s=new Uint8Array(32);crypto.getRandomValues(s);let e="";for(const a of s)e+=String.fromCharCode(a);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function B(){try{await navigator.clipboard.writeText(i.value),w.success("已复制到剪贴板")}catch{w.error("复制失败,请手动选择复制")}}async function V(){o.value="";const s=r.value?"server":"local",e=i.value.trim(),a=c.value.trim()!==""||p.value!=="";if(r.value&&e===""){o.value="服务器部署必须设置主密钥,防止 /v1 网关被他人盗用";return}if(r.value&&!a){o.value="服务器部署必须设置登录账号密码,防止管理台被陌生人登录";return}if(a){if(c.value.trim()===""||p.value===""){o.value="用户名和密码需同时填写";return}if(p.value.length<6){o.value="密码至少 6 位";return}}_.value=!0;try{e!==""&&await h.post("/api/setup/master-key",{mode:"custom",masterKey:e}),await h.post("/api/setup/finish",{deployment:s,...a?{username:c.value.trim(),password:p.value}:{}}),L(s,a),w.success(a?"初始化完成,请使用新账号登录":"初始化完成,免登录进入管理台"),await S.push(a?"/login":"/")}catch(v){o.value=v.message||"保存失败"}finally{_.value=!1}}return(s,e)=>{const a=u("el-checkbox"),v=u("el-alert"),g=u("el-button"),b=u("el-input"),k=u("el-form-item"),K=u("el-form"),U=u("el-card");return y(),I("div",$,[l(U,{shadow:"hover",class:"setup-card"},{default:t(()=>[e[9]||(e[9]=f("h2",{class:"setup-title"},"初始化 ELLM",-1)),l(a,{modelValue:r.value,"onUpdate:modelValue":e[0]||(e[0]=n=>r.value=n),class:"mb-16"},{default:t(()=>[...e[4]||(e[4]=[m(" 允许其他设备访问本服务(局域网 / 公网部署) ",-1)])]),_:1},8,["modelValue"]),r.value?(y(),x(v,{key:0,type:"warning","show-icon":"",closable:!1,title:"服务将对网络中的其他设备可见,请务必保留主密钥并修改默认账号",class:"mb-16"})):C("",!0),l(K,{"label-position":"top",onSubmit:T(V,["prevent"])},{default:t(()=>[l(k,null,{label:t(()=>[...e[5]||(e[5]=[m(" API 主密钥 ",-1),f("span",{class:"label-hint"},"调用 /v1/* 时的 Bearer Token;清空则不启用鉴权(仅建议纯本机使用)",-1)])]),default:t(()=>[l(b,{modelValue:i.value,"onUpdate:modelValue":e[1]||(e[1]=n=>i.value=n),placeholder:"已设置主密钥,留空保持不变",clearable:""},{append:t(()=>[l(g,{disabled:!i.value,onClick:B},{default:t(()=>[...e[6]||(e[6]=[m("复制",-1)])]),_:1},8,["disabled"])]),_:1},8,["modelValue"])]),_:1}),l(k,null,{label:t(()=>[...e[7]||(e[7]=[m(" 管理台登录(可选) ",-1),f("span",{class:"label-hint"},"不填 = 免登录直接进管理台(纯本机使用);勾选上方后必须填写",-1)])]),default:t(()=>[f("div",j,[l(b,{modelValue:c.value,"onUpdate:modelValue":e[2]||(e[2]=n=>c.value=n),placeholder:"用户名",clearable:""},null,8,["modelValue"]),l(b,{modelValue:p.value,"onUpdate:modelValue":e[3]||(e[3]=n=>p.value=n),type:"password","show-password":"",placeholder:"密码(至少 6 位)"},null,8,["modelValue"])])]),_:1}),o.value?(y(),x(v,{key:0,title:o.value,type:"error","show-icon":"",closable:!1,class:"mb-16"},null,8,["title"])):C("",!0),l(g,{type:"primary",class:"full-width",loading:_.value,onClick:V},{default:t(()=>[...e[8]||(e[8]=[m(" 完成初始化 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})])}}}),F=R(q,[["__scopeId","data-v-631b405c"]]);export{F as default};
1
+ import{d as M,k as N,l as E,e as I,g as l,w as t,r as d,a as u,o as y,f,h as m,c as x,i as C,a0 as T,ac as w,A as h,ad as L,n as P,_ as R}from"./index-DzBTME5Z.js";const $={class:"setup-wrap"},j={class:"account-row"},q=M({__name:"SetupView",setup(z){const S=P(),r=d(!1),i=d(""),c=d(""),p=d(""),_=d(!1),o=d("");N(async()=>{(await E()).masterKeySet||(i.value=A())});function A(){const s=new Uint8Array(32);crypto.getRandomValues(s);let e="";for(const a of s)e+=String.fromCharCode(a);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function B(){try{await navigator.clipboard.writeText(i.value),w.success("已复制到剪贴板")}catch{w.error("复制失败,请手动选择复制")}}async function V(){o.value="";const s=r.value?"server":"local",e=i.value.trim(),a=c.value.trim()!==""||p.value!=="";if(r.value&&e===""){o.value="服务器部署必须设置主密钥,防止 /v1 网关被他人盗用";return}if(r.value&&!a){o.value="服务器部署必须设置登录账号密码,防止管理台被陌生人登录";return}if(a){if(c.value.trim()===""||p.value===""){o.value="用户名和密码需同时填写";return}if(p.value.length<6){o.value="密码至少 6 位";return}}_.value=!0;try{e!==""&&await h.post("/api/setup/master-key",{mode:"custom",masterKey:e}),await h.post("/api/setup/finish",{deployment:s,...a?{username:c.value.trim(),password:p.value}:{}}),L(s,a),w.success(a?"初始化完成,请使用新账号登录":"初始化完成,免登录进入管理台"),await S.push(a?"/login":"/")}catch(v){o.value=v.message||"保存失败"}finally{_.value=!1}}return(s,e)=>{const a=u("el-checkbox"),v=u("el-alert"),g=u("el-button"),b=u("el-input"),k=u("el-form-item"),K=u("el-form"),U=u("el-card");return y(),I("div",$,[l(U,{shadow:"hover",class:"setup-card"},{default:t(()=>[e[9]||(e[9]=f("h2",{class:"setup-title"},"初始化 ELLM",-1)),l(a,{modelValue:r.value,"onUpdate:modelValue":e[0]||(e[0]=n=>r.value=n),class:"mb-16"},{default:t(()=>[...e[4]||(e[4]=[m(" 允许其他设备访问本服务(局域网 / 公网部署) ",-1)])]),_:1},8,["modelValue"]),r.value?(y(),x(v,{key:0,type:"warning","show-icon":"",closable:!1,title:"服务将对网络中的其他设备可见,请务必保留主密钥并修改默认账号",class:"mb-16"})):C("",!0),l(K,{"label-position":"top",onSubmit:T(V,["prevent"])},{default:t(()=>[l(k,null,{label:t(()=>[...e[5]||(e[5]=[m(" API 主密钥 ",-1),f("span",{class:"label-hint"},"调用 /v1/* 时的 Bearer Token;清空则不启用鉴权(仅建议纯本机使用)",-1)])]),default:t(()=>[l(b,{modelValue:i.value,"onUpdate:modelValue":e[1]||(e[1]=n=>i.value=n),placeholder:"已设置主密钥,留空保持不变",clearable:""},{append:t(()=>[l(g,{disabled:!i.value,onClick:B},{default:t(()=>[...e[6]||(e[6]=[m("复制",-1)])]),_:1},8,["disabled"])]),_:1},8,["modelValue"])]),_:1}),l(k,null,{label:t(()=>[...e[7]||(e[7]=[m(" 管理台登录(可选) ",-1),f("span",{class:"label-hint"},"不填 = 免登录直接进管理台(纯本机使用);勾选上方后必须填写",-1)])]),default:t(()=>[f("div",j,[l(b,{modelValue:c.value,"onUpdate:modelValue":e[2]||(e[2]=n=>c.value=n),placeholder:"用户名",clearable:""},null,8,["modelValue"]),l(b,{modelValue:p.value,"onUpdate:modelValue":e[3]||(e[3]=n=>p.value=n),type:"password","show-password":"",placeholder:"密码(至少 6 位)"},null,8,["modelValue"])])]),_:1}),o.value?(y(),x(v,{key:0,title:o.value,type:"error","show-icon":"",closable:!1,class:"mb-16"},null,8,["title"])):C("",!0),l(g,{type:"primary",class:"full-width",loading:_.value,onClick:V},{default:t(()=>[...e[8]||(e[8]=[m(" 完成初始化 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})])}}}),F=R(q,[["__scopeId","data-v-631b405c"]]);export{F as default};
@@ -1 +1 @@
1
- import{Z as p,r as u,m as n,A as i}from"./index-BmtcBnoW.js";const y=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{y as u};
1
+ import{Z as p,r as u,m as n,A as i}from"./index-DzBTME5Z.js";const y=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{y as u};
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LayoutView-BkUJgLW2.js","assets/useManagerApi-PldAaNYo.js","assets/useToast-C9BTyaBD.js","assets/LayoutView-CNd_MJt2.css","assets/DashboardView-BWPFis7P.js","assets/providers-Aw7T7j0r.js","assets/config-CHaFDQC7.js","assets/DashboardView-BTtCBA4g.css","assets/ProvidersView-B6fm2FPQ.js","assets/ProvidersView-Dpr8MI-p.css","assets/SettingsView-BHuXlGS1.js","assets/SettingsView-Ceyj-ZDZ.css","assets/LogsView-CtRfyOCZ.js","assets/LogsView-Dl50XQhG.css","assets/LoginView-C8E6nJw2.js","assets/LoginView-DrhfslIY.css","assets/SetupView-Oau3EJgh.js","assets/SetupView-BkBbUyaW.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LayoutView-VF0751s6.js","assets/useManagerApi-C3X3JX66.js","assets/useToast-BIVFyGJl.js","assets/LayoutView-CNd_MJt2.css","assets/DashboardView-C_UXsKRa.js","assets/providers-DN-6AbdJ.js","assets/config-CFGI6BQU.js","assets/DashboardView-BTtCBA4g.css","assets/ProvidersView-BisIWeCb.js","assets/ProvidersView-Dpr8MI-p.css","assets/SettingsView-2J7lJg6I.js","assets/SettingsView-Ceyj-ZDZ.css","assets/LogsView-Ddiqpn27.js","assets/LogsView-Dl50XQhG.css","assets/LoginView-9pRN4_jz.js","assets/LoginView-DrhfslIY.css","assets/SetupView-ByC3ZfGq.js","assets/SetupView-BkBbUyaW.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 ufe=()=>location.protocol+"//"+location.host;function d9(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),c3(s,"")}return c3(n,e)+a+l}function cfe(e,t,n,a){let l=[],o=[],r=null;const s=({state:p})=>{const m=d9(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:Y2.pop,direction:g?g>0?yp.forward:yp.back:yp.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:y0()}),"")}}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 v3(e,t,n,a=!1,l=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:l?y0():null}}function dfe(e){const{history:t,location:n}=window,a={value:d9(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:ufe()+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,v3(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:y0()});o(d.current,d,!0),o(u,cn({},v3(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:l,push:s,replace:r}}function ffe(e){e=Gde(e);const t=dfe(e),n=cfe(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:Zde.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 pfe(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),ffe(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 hfe={type:Tr.Static,value:""},vfe=/[a-zA-Z0-9_]/;function mfe(e){if(!e)return[[]];if(e==="/")return[[hfe]];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:vfe.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 m3="[^/]+?",gfe={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 yfe=/[.+*?^${}()[\]/\\]/g;function bfe(e,t){const n=cn({},gfe,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(yfe,"\\$&"),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||m3;if(b!==m3){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 wfe(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 f9(e,t){let n=0;const a=e.score,l=t.score;for(;n<a.length&&n<l.length;){const o=wfe(a[n],l[n]);if(o)return o;n++}if(Math.abs(l.length-a.length)===1){if(g3(a))return 1;if(g3(l))return-1}return l.length-a.length}function g3(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const _fe={strict:!1,end:!0,sensitive:!1};function Cfe(e,t,n){const a=bfe(mfe(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 Sfe(e,t){const n=[],a=new Map;t=u3(_fe,t);function l(f){return a.get(f)}function o(f,p,m){const v=!m,h=b3(f);h.aliasOf=m&&m.record;const g=u3(t,f),y=[h];if("alias"in f){const _=typeof f.alias=="string"?[f.alias]:f.alias;for(const C of _)y.push(b3(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=Cfe(_,p,g),m?m.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!w3(b)&&r(f.name)),p9(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)}:Ji}function r(f){if(u9(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=Efe(f,n);n.splice(p,0,f),f.record.name&&!w3(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 li(Rn.MATCHER_NOT_FOUND,{location:f});g=m.record.name,v=cn(y3(p.params,m.keys.filter(w=>!w.optional).concat(m.parent?m.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&y3(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 li(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:kfe(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 y3(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function b3(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:xfe(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 xfe(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 w3(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function kfe(e){return e.reduce((t,n)=>cn(t,n.meta),{})}function Efe(e,t){let n=0,a=t.length;for(;n!==a;){const o=n+a>>1;f9(e,t[o])<0?a=o:n=o+1}const l=Tfe(e);return l&&(a=t.lastIndexOf(l,a-1)),a}function Tfe(e){let t=e;for(;t=t.parent;)if(p9(t)&&f9(e,t)===0)return t}function p9({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function _3(e){const t=Le(b0),n=Le(f1),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(ai.bind(null,d));if(p>-1)return p;const m=C3(u[c-2]);return c>1&&C3(d)===m&&f[f.length-1].path!==m?f.findIndex(ai.bind(null,u[c-2])):p}),o=x(()=>l.value>-1&&$fe(n.params,a.value.params)),r=x(()=>l.value>-1&&l.value===n.matched.length-1&&i9(n.params,a.value.params));function s(u={}){if(Afe(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(Ji);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 Mfe(e){return e.length===1?e[0]:e}const Ofe=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:_3,setup(e,{slots:t}){const n=Dt(_3(e)),{options:a}=Le(b0),l=x(()=>({[S3(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[S3(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Mfe(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)}}}),Nfe=Ofe;function Afe(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 $fe(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 C3(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const S3=(e,t,n)=>e??t??n,Rfe=K({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=Le(X2),l=x(()=>e.route||a.value),o=Le(h3,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(h3,x(()=>r.value+1)),St(sfe,s),St(X2,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||!ai(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 x3(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 x3(n.default,{Component:g,route:c})||g}}});function x3(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Pfe=Rfe;function Ife(e){const t=Sfe(e.routes,e),n=e.parseQuery||ofe,a=e.stringifyQuery||p3,l=e.history,o=Oi(),r=Oi(),s=Oi(),u=Et(Bo);let c=Bo;Ss&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=mp.bind(null,Q=>""+Q),f=mp.bind(null,Fde),p=mp.bind(null,$u);function m(Q,ce){let de,Y;return u9(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=gp(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:$u(G.hash),redirectedFrom:void 0,href:he})}let de;if(Q.path!=null)de=cn({},Q,{path:gp(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=jde(a,cn({},Q,{hash:zde(Z),path:Y.path})),j=l.createHref(ie);return cn({fullPath:ie,hash:Z,query:a===p3?rfe(Q.query):Q.query||{}},Y,{redirectedFrom:void 0,href:j})}function b(Q){return typeof Q=="string"?gp(n,Q,u.value.path):cn({},Q)}function w(Q,ce){if(c!==Q)return li(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&&qde(a,Y,de)&&(he=li(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):V(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]=ife(Q,ce);de=bp(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=bp(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=bp(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(Ji);return}c=Y;const ie=u.value;Ss&&efe(f3(ie.fullPath,de.delta),y0()),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===Y2.pop&&l.go(-1,!1)}).catch(Ji),Promise.reject()):(de.delta&&l.go(-de.delta,!1),V(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===Y2.pop&&oo(j,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_DUPLICATED)&&l.go(-1,!1)),R(Y,ie,j)}).catch(Ji)}))}let H=Oi(),z=Oi(),L;function V(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 L&&u.value!==Bo?Promise.resolve():new Promise((Q,ce)=>{H.add([Q,ce])})}function D(Q){return L||(L=!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&&tfe(f3(Q.fullPath,0))||(Y||!de)&&history.state&&history.state.scroll||null;return Re().then(()=>Z(Q,ce,ie)).then(j=>j&&Qde(j)).catch(j=>V(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",Nfe),Q.component("RouterView",Pfe),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(b0,ne),Q.provide(f1,zu(ce)),Q.provide(X2,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,L=!1),de()}}};function le(Q){return Q.reduce((ce,de)=>ce.then(()=>M(de)),Promise.resolve())}return ne}function qfe(){return Le(b0)}function Ufe(e){return Le(f1)}var k3;const Lfe=((k3=window.__ELLM_CONFIG__)==null?void 0:k3.API_BASE)??"",Vfe=3e4;let Ed=null;function Bfe(){return Ed===null&&(Ed=localStorage.getItem("webui_token")),Ed}function zfe(){Ed=null,localStorage.removeItem("webui_token"),p1.push("/login")}async function Zc(e,t,n){const a={"Content-Type":"application/json"},l=Bfe();l&&(a.Authorization=`Bearer ${l}`);const o=new AbortController,r=setTimeout(()=>o.abort(),Vfe);try{const s=await fetch(`${Lfe}${t}`,{method:e,headers:a,body:n!==void 0?JSON.stringify(n):void 0,signal:o.signal});if(s.status===401){const d=await s.text();let f={};try{f=d?JSON.parse(d):{}}catch{}throw t==="/api/auth/login"?new Error(f.error||"用户名或密码错误"):(zfe(),new Error(f.error||"未登录"))}const u=await s.text();let c;try{c=u?JSON.parse(u):{}}catch{throw new Error(`响应格式错误 (HTTP ${s.status})`)}if(!s.ok)throw new Error(c.error||`HTTP ${s.status}`);return c}catch(s){throw s.name==="AbortError"?new Error("请求超时"):s}finally{clearTimeout(r)}}const Dfe={get:e=>Zc("GET",e),post:(e,t)=>Zc("POST",e,t),put:(e,t)=>Zc("PUT",e,t),del:e=>Zc("DELETE",e)},xs=B(null);async function Hfe(e=!1){if(xs.value&&!e)return xs.value;try{xs.value=await Dfe.get("/api/setup/status")}catch{xs.value={initialized:!0,masterKeySet:!0,authRequired:!0}}return xs.value}function Yfe(e,t){xs.value={initialized:!0,deployment:e,masterKeySet:!0,authRequired:t}}const p1=Ife({history:pfe(),routes:[{path:"/",component:()=>gr(()=>import("./LayoutView-BkUJgLW2.js"),__vite__mapDeps([0,1,2,3])),children:[{path:"",name:"Dashboard",component:()=>gr(()=>import("./DashboardView-BWPFis7P.js"),__vite__mapDeps([4,1,5,6,2,7]))},{path:"providers",name:"Providers",component:()=>gr(()=>import("./ProvidersView-B6fm2FPQ.js"),__vite__mapDeps([8,2,5,6,9]))},{path:"settings",name:"Settings",component:()=>gr(()=>import("./SettingsView-BHuXlGS1.js"),__vite__mapDeps([10,2,6,1,11]))},{path:"logs",name:"Logs",component:()=>gr(()=>import("./LogsView-CtRfyOCZ.js"),__vite__mapDeps([12,5,6,2,13]))}]},{path:"/login",name:"Login",component:()=>gr(()=>import("./LoginView-C8E6nJw2.js"),__vite__mapDeps([14,15]))},{path:"/setup",name:"Setup",component:()=>gr(()=>import("./SetupView-Oau3EJgh.js"),__vite__mapDeps([16,17]))},{path:"/:pathMatch(.*)*",redirect:"/"}]});p1.beforeEach(async e=>{const t=await Hfe();if(!t.initialized)return e.name==="Setup"?!0:{name:"Setup"};if(e.name==="Setup")return{name:"Dashboard"};if(t.authRequired===!1)return e.name==="Login"?{name:"Dashboard"}:!0;const n=localStorage.getItem("webui_token");if(e.name!=="Login"&&!n)return{name:"Login"}});const bc=cu(Ede);bc.use(pk());bc.use(_de,{locale:Cde});bc.use(p1);for(const[e,t]of Object.entries(iK))bc.component(e,t);bc.mount("#app");export{Dt as $,Dfe as A,Mn as B,$a as C,y9 as D,ode as E,Fe as F,Qr as G,en as H,st as I,vo as J,ge as K,oi as L,Qo as M,dt as N,K9 as O,D9 as P,H9 as Q,F9 as R,M3 as S,Ra as T,A9 as U,jfe as V,Kfe as W,Ffe as X,to as Y,Wfe as Z,Sde as _,Kt as a,Qe as a0,P as a1,i as a2,wD as a3,fe as a4,T8 as a5,rn as a6,lL as a7,OF as a8,_8 as a9,iv as aa,p1 as ab,jce as ac,Yfe as ad,ht as b,ue as c,K as d,A as e,O as f,J as g,bt as h,re as i,ph as j,gt as k,Hfe as l,x as m,qfe as n,S as o,Ufe as p,To as q,B as r,xs as s,Se as t,DS as u,_t as v,ae as w,sn as x,Ie as y,Z2 as z};
96
+ */let ufe=()=>location.protocol+"//"+location.host;function d9(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),c3(s,"")}return c3(n,e)+a+l}function cfe(e,t,n,a){let l=[],o=[],r=null;const s=({state:p})=>{const m=d9(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:Y2.pop,direction:g?g>0?yp.forward:yp.back:yp.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:y0()}),"")}}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 v3(e,t,n,a=!1,l=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:l?y0():null}}function dfe(e){const{history:t,location:n}=window,a={value:d9(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:ufe()+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,v3(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:y0()});o(d.current,d,!0),o(u,cn({},v3(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:l,push:s,replace:r}}function ffe(e){e=Gde(e);const t=dfe(e),n=cfe(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:Zde.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 pfe(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),ffe(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 hfe={type:Tr.Static,value:""},vfe=/[a-zA-Z0-9_]/;function mfe(e){if(!e)return[[]];if(e==="/")return[[hfe]];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:vfe.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 m3="[^/]+?",gfe={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 yfe=/[.+*?^${}()[\]/\\]/g;function bfe(e,t){const n=cn({},gfe,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(yfe,"\\$&"),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||m3;if(b!==m3){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 wfe(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 f9(e,t){let n=0;const a=e.score,l=t.score;for(;n<a.length&&n<l.length;){const o=wfe(a[n],l[n]);if(o)return o;n++}if(Math.abs(l.length-a.length)===1){if(g3(a))return 1;if(g3(l))return-1}return l.length-a.length}function g3(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const _fe={strict:!1,end:!0,sensitive:!1};function Cfe(e,t,n){const a=bfe(mfe(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 Sfe(e,t){const n=[],a=new Map;t=u3(_fe,t);function l(f){return a.get(f)}function o(f,p,m){const v=!m,h=b3(f);h.aliasOf=m&&m.record;const g=u3(t,f),y=[h];if("alias"in f){const _=typeof f.alias=="string"?[f.alias]:f.alias;for(const C of _)y.push(b3(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=Cfe(_,p,g),m?m.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!w3(b)&&r(f.name)),p9(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)}:Ji}function r(f){if(u9(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=Efe(f,n);n.splice(p,0,f),f.record.name&&!w3(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 li(Rn.MATCHER_NOT_FOUND,{location:f});g=m.record.name,v=cn(y3(p.params,m.keys.filter(w=>!w.optional).concat(m.parent?m.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&y3(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 li(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:kfe(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 y3(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function b3(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:xfe(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 xfe(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 w3(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function kfe(e){return e.reduce((t,n)=>cn(t,n.meta),{})}function Efe(e,t){let n=0,a=t.length;for(;n!==a;){const o=n+a>>1;f9(e,t[o])<0?a=o:n=o+1}const l=Tfe(e);return l&&(a=t.lastIndexOf(l,a-1)),a}function Tfe(e){let t=e;for(;t=t.parent;)if(p9(t)&&f9(e,t)===0)return t}function p9({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function _3(e){const t=Le(b0),n=Le(f1),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(ai.bind(null,d));if(p>-1)return p;const m=C3(u[c-2]);return c>1&&C3(d)===m&&f[f.length-1].path!==m?f.findIndex(ai.bind(null,u[c-2])):p}),o=x(()=>l.value>-1&&$fe(n.params,a.value.params)),r=x(()=>l.value>-1&&l.value===n.matched.length-1&&i9(n.params,a.value.params));function s(u={}){if(Afe(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(Ji);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 Mfe(e){return e.length===1?e[0]:e}const Ofe=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:_3,setup(e,{slots:t}){const n=Dt(_3(e)),{options:a}=Le(b0),l=x(()=>({[S3(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[S3(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Mfe(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)}}}),Nfe=Ofe;function Afe(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 $fe(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 C3(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const S3=(e,t,n)=>e??t??n,Rfe=K({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=Le(X2),l=x(()=>e.route||a.value),o=Le(h3,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(h3,x(()=>r.value+1)),St(sfe,s),St(X2,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||!ai(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 x3(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 x3(n.default,{Component:g,route:c})||g}}});function x3(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Pfe=Rfe;function Ife(e){const t=Sfe(e.routes,e),n=e.parseQuery||ofe,a=e.stringifyQuery||p3,l=e.history,o=Oi(),r=Oi(),s=Oi(),u=Et(Bo);let c=Bo;Ss&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=mp.bind(null,Q=>""+Q),f=mp.bind(null,Fde),p=mp.bind(null,$u);function m(Q,ce){let de,Y;return u9(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=gp(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:$u(G.hash),redirectedFrom:void 0,href:he})}let de;if(Q.path!=null)de=cn({},Q,{path:gp(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=jde(a,cn({},Q,{hash:zde(Z),path:Y.path})),j=l.createHref(ie);return cn({fullPath:ie,hash:Z,query:a===p3?rfe(Q.query):Q.query||{}},Y,{redirectedFrom:void 0,href:j})}function b(Q){return typeof Q=="string"?gp(n,Q,u.value.path):cn({},Q)}function w(Q,ce){if(c!==Q)return li(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&&qde(a,Y,de)&&(he=li(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):V(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]=ife(Q,ce);de=bp(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=bp(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=bp(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(Ji);return}c=Y;const ie=u.value;Ss&&efe(f3(ie.fullPath,de.delta),y0()),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===Y2.pop&&l.go(-1,!1)}).catch(Ji),Promise.reject()):(de.delta&&l.go(-de.delta,!1),V(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===Y2.pop&&oo(j,Rn.NAVIGATION_ABORTED|Rn.NAVIGATION_DUPLICATED)&&l.go(-1,!1)),R(Y,ie,j)}).catch(Ji)}))}let H=Oi(),z=Oi(),L;function V(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 L&&u.value!==Bo?Promise.resolve():new Promise((Q,ce)=>{H.add([Q,ce])})}function D(Q){return L||(L=!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&&tfe(f3(Q.fullPath,0))||(Y||!de)&&history.state&&history.state.scroll||null;return Re().then(()=>Z(Q,ce,ie)).then(j=>j&&Qde(j)).catch(j=>V(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",Nfe),Q.component("RouterView",Pfe),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(b0,ne),Q.provide(f1,zu(ce)),Q.provide(X2,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,L=!1),de()}}};function le(Q){return Q.reduce((ce,de)=>ce.then(()=>M(de)),Promise.resolve())}return ne}function qfe(){return Le(b0)}function Ufe(e){return Le(f1)}var k3;const Lfe=((k3=window.__ELLM_CONFIG__)==null?void 0:k3.API_BASE)??"",Vfe=3e4;let Ed=null;function Bfe(){return Ed===null&&(Ed=localStorage.getItem("webui_token")),Ed}function zfe(){Ed=null,localStorage.removeItem("webui_token"),p1.push("/login")}async function Zc(e,t,n){const a={"Content-Type":"application/json"},l=Bfe();l&&(a.Authorization=`Bearer ${l}`);const o=new AbortController,r=setTimeout(()=>o.abort(),Vfe);try{const s=await fetch(`${Lfe}${t}`,{method:e,headers:a,body:n!==void 0?JSON.stringify(n):void 0,signal:o.signal});if(s.status===401){const d=await s.text();let f={};try{f=d?JSON.parse(d):{}}catch{}throw t==="/api/auth/login"?new Error(f.error||"用户名或密码错误"):(zfe(),new Error(f.error||"未登录"))}const u=await s.text();let c;try{c=u?JSON.parse(u):{}}catch{throw new Error(`响应格式错误 (HTTP ${s.status})`)}if(!s.ok)throw new Error(c.error||`HTTP ${s.status}`);return c}catch(s){throw s.name==="AbortError"?new Error("请求超时"):s}finally{clearTimeout(r)}}const Dfe={get:e=>Zc("GET",e),post:(e,t)=>Zc("POST",e,t),put:(e,t)=>Zc("PUT",e,t),del:e=>Zc("DELETE",e)},xs=B(null);async function Hfe(e=!1){if(xs.value&&!e)return xs.value;try{xs.value=await Dfe.get("/api/setup/status")}catch{xs.value={initialized:!0,masterKeySet:!0,authRequired:!0}}return xs.value}function Yfe(e,t){xs.value={initialized:!0,deployment:e,masterKeySet:!0,authRequired:t}}const p1=Ife({history:pfe(),routes:[{path:"/",component:()=>gr(()=>import("./LayoutView-VF0751s6.js"),__vite__mapDeps([0,1,2,3])),children:[{path:"",name:"Dashboard",component:()=>gr(()=>import("./DashboardView-C_UXsKRa.js"),__vite__mapDeps([4,1,5,6,2,7]))},{path:"providers",name:"Providers",component:()=>gr(()=>import("./ProvidersView-BisIWeCb.js"),__vite__mapDeps([8,2,5,6,9]))},{path:"settings",name:"Settings",component:()=>gr(()=>import("./SettingsView-2J7lJg6I.js"),__vite__mapDeps([10,2,6,1,11]))},{path:"logs",name:"Logs",component:()=>gr(()=>import("./LogsView-Ddiqpn27.js"),__vite__mapDeps([12,5,6,2,13]))}]},{path:"/login",name:"Login",component:()=>gr(()=>import("./LoginView-9pRN4_jz.js"),__vite__mapDeps([14,15]))},{path:"/setup",name:"Setup",component:()=>gr(()=>import("./SetupView-ByC3ZfGq.js"),__vite__mapDeps([16,17]))},{path:"/:pathMatch(.*)*",redirect:"/"}]});p1.beforeEach(async e=>{const t=await Hfe();if(!t.initialized)return e.name==="Setup"?!0:{name:"Setup"};if(e.name==="Setup")return{name:"Dashboard"};if(t.authRequired===!1)return e.name==="Login"?{name:"Dashboard"}:!0;const n=localStorage.getItem("webui_token");if(e.name!=="Login"&&!n)return{name:"Login"}});const bc=cu(Ede);bc.use(pk());bc.use(_de,{locale:Cde});bc.use(p1);for(const[e,t]of Object.entries(iK))bc.component(e,t);bc.mount("#app");export{Dt as $,Dfe as A,Mn as B,$a as C,y9 as D,ode as E,Fe as F,Qr as G,en as H,st as I,vo as J,ge as K,oi as L,Qo as M,dt as N,K9 as O,D9 as P,H9 as Q,F9 as R,M3 as S,Ra as T,A9 as U,jfe as V,Kfe as W,Ffe as X,to as Y,Wfe as Z,Sde as _,Kt as a,Qe as a0,P as a1,i as a2,wD as a3,fe as a4,T8 as a5,rn as a6,lL as a7,OF as a8,_8 as a9,iv as aa,p1 as ab,jce as ac,Yfe as ad,ht as b,ue as c,K as d,A as e,O as f,J as g,bt as h,re as i,ph as j,gt as k,Hfe as l,x as m,qfe as n,S as o,Ufe as p,To as q,B as r,xs as s,Se as t,DS as u,_t as v,ae as w,sn as x,Ie as y,Z2 as z};
@@ -1 +1 @@
1
- import{Z as w,r as u,m as i}from"./index-BmtcBnoW.js";import{u as C}from"./config-CHaFDQC7.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{Z as w,r as u,m as i}from"./index-DzBTME5Z.js";import{u as C}from"./config-CFGI6BQU.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{ab as h}from"./index-BmtcBnoW.js";var w;const T=((w=window.__ELLM_CONFIG__)==null?void 0:w.API_BASE)??"",f=3e4;let u=null;function E(){return u===null&&(u=localStorage.getItem("webui_token")),u}function m(){u=null,localStorage.removeItem("webui_token"),h.push("/login")}async function e(t,c,s,p=f){const i={"Content-Type":"application/json"},a=E();a&&(i.Authorization=`Bearer ${a}`);const n=new AbortController,r=setTimeout(()=>n.abort(),p);try{const o=await fetch(`${T}${c}`,{method:t,headers:i,body:s!==void 0?JSON.stringify(s):void 0,signal:n.signal});if(o.status===401)throw m(),new Error("未登录");const d=await o.text();let l;try{l=d?JSON.parse(d):{}}catch{throw new Error(`响应格式错误 (HTTP ${o.status})`)}if(!o.ok||l.ok===!1)throw new Error(l.error||`HTTP ${o.status}`);return l}catch(o){throw o.name==="AbortError"?new Error("请求超时"):o instanceof TypeError?new Error("服务不可达(未启动或更新重启窗口期,请稍后重试)"):o}finally{clearTimeout(r)}}const A={status:()=>e("GET","/status"),processes:()=>e("GET","/processes").then(t=>t.processes),autostart:()=>e("GET","/autostart"),setAutostart:t=>e("POST","/autostart",{enabled:t}),update:()=>e("GET","/update"),setUpdateEnabled:t=>e("POST","/update/enabled",{enabled:t}),checkUpdate:()=>e("POST","/update/check"),applyUpdate:()=>e("POST","/update/apply"),harness:()=>e("GET","/harness"),setClaudeCode:t=>e("POST","/harness/claude-code",{enabled:t}),setCodex:t=>e("POST","/harness/codex",{enabled:t}),setDsh:t=>e("POST","/harness/dsh",{enabled:t})};async function S(t){const{targetVersion:c,sinceAppliedAt:s,timeoutMs:p=600*1e3,pollMs:i=3e3}=t,a=Date.now()+p;for(;;){if(Date.now()>=a)return null;await new Promise(o=>setTimeout(o,i));let n=null;try{n=await A.update()}catch{continue}const r=n.lastApply;if(r&&r.toVersion===c&&(r.appliedAt??0)>(s??0))return r;if(Date.now()>=a)return null}}export{A as m,S as w};
1
+ import{ab as h}from"./index-DzBTME5Z.js";var w;const T=((w=window.__ELLM_CONFIG__)==null?void 0:w.API_BASE)??"",f=3e4;let u=null;function E(){return u===null&&(u=localStorage.getItem("webui_token")),u}function m(){u=null,localStorage.removeItem("webui_token"),h.push("/login")}async function e(t,c,s,p=f){const i={"Content-Type":"application/json"},a=E();a&&(i.Authorization=`Bearer ${a}`);const n=new AbortController,r=setTimeout(()=>n.abort(),p);try{const o=await fetch(`${T}${c}`,{method:t,headers:i,body:s!==void 0?JSON.stringify(s):void 0,signal:n.signal});if(o.status===401)throw m(),new Error("未登录");const d=await o.text();let l;try{l=d?JSON.parse(d):{}}catch{throw new Error(`响应格式错误 (HTTP ${o.status})`)}if(!o.ok||l.ok===!1)throw new Error(l.error||`HTTP ${o.status}`);return l}catch(o){throw o.name==="AbortError"?new Error("请求超时"):o instanceof TypeError?new Error("服务不可达(未启动或更新重启窗口期,请稍后重试)"):o}finally{clearTimeout(r)}}const A={status:()=>e("GET","/status"),processes:()=>e("GET","/processes").then(t=>t.processes),autostart:()=>e("GET","/autostart"),setAutostart:t=>e("POST","/autostart",{enabled:t}),update:()=>e("GET","/update"),setUpdateEnabled:t=>e("POST","/update/enabled",{enabled:t}),checkUpdate:()=>e("POST","/update/check"),applyUpdate:()=>e("POST","/update/apply"),harness:()=>e("GET","/harness"),setClaudeCode:t=>e("POST","/harness/claude-code",{enabled:t}),setCodex:t=>e("POST","/harness/codex",{enabled:t}),setDsh:t=>e("POST","/harness/dsh",{enabled:t})};async function S(t){const{targetVersion:c,sinceAppliedAt:s,timeoutMs:p=600*1e3,pollMs:i=3e3}=t,a=Date.now()+p;for(;;){if(Date.now()>=a)return null;await new Promise(o=>setTimeout(o,i));let n=null;try{n=await A.update()}catch{continue}const r=n.lastApply;if(r&&r.toVersion===c&&(r.appliedAt??0)>(s??0))return r;if(Date.now()>=a)return null}}export{A as m,S as w};
@@ -1 +1 @@
1
- import{ac as a}from"./index-BmtcBnoW.js";function u(){function s(t,o="success"){a({message:t,type:o,duration:3e3})}return{toast:s}}export{u};
1
+ import{ac as a}from"./index-DzBTME5Z.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-BmtcBnoW.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-DzBTME5Z.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="/assets/index-BecfPmag.css">
11
11
  </head>
12
12
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ellm-proxy",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "description": "Self-hosted LLM gateway with admin web UI (single process, built-in process management)",
5
5
  "license": "MIT",
6
6
  "type": "module",